News for hackers. Stuff that matters.
Re:Neat Rust Tricks: Passing Closures to C by rabidferret on Monday November 25, 2019 @06:23PM (#21633988)
Anything that doesn't require W+X would need an entire page allocated per closure, wouldn't it?
Re:Neat Rust Tricks: Passing Closures to C by devit on Monday November 25, 2019 @07:58PM (#21634706)
No, you can of course allocate W+X pages from the OS and put multiple closures in them using a standard userspace memory allocator.

Or if the OS doesn't support W+X allocation at all, then you can have a bunch of tightly packed pregenerated trampolines in the binary.

Re:Neat Rust Tricks: Passing Closures to C by saagarjha on Monday November 25, 2019 @08:26PM (#21634861)
Right, this is how Objective-C's implementation works, except it keeps around one page of trampolines and remaps that around when necessary to be able to "create" more trampolines on the fly, I believe.
Re:Neat Rust Tricks: Passing Closures to C by a1369209993 on Monday November 25, 2019 @10:58PM (#21635551)
Nope! You'd do something to the effect of:

  clo_code:
  4C8B1501100000  mov r10 [rel clo_code+0x1008]
  FF25F30F0000    jmp [rel clo_code+0x1000]
  0F1F00          nop3
  # one page away...
  struct clo_slot {
    void (*func)(void* _R10,...);
    void* data;
    };
Edit: to use r10 rather than rotating all the argument registers.