Alan Wu 85a337f986 Kernel#lambda: return forwarded block as non-lambda proc
Before this commit, Kernel#lambda can't tell the difference between a
directly passed literal block and one passed with an ampersand.

A block passed with an ampersand is semantically speaking already a
non-lambda proc. When Kernel#lambda receives a non-lambda proc, it
should simply return it.

Implementation wise, when the VM calls a method with a literal block, it
places the code for the block on the calling control frame and passes a
pointer (block handler) to the callee. Before this commit, the VM
forwards block arguments by simply forwarding the block handler, which
leaves the slot for block code unused when a control frame forwards its
block argument. I use the vacant space to indicate that a frame has
forwarded its block argument and inspect that in Kernel#lambda to detect
forwarded blocks.

This is a very ad-hoc solution and relies *heavily* on the way block
passing works in the VM. However, it's the most self-contained solution
I have.

[Bug #15620]
2019-12-21 09:08:52 -05:00
..
2019-12-20 12:19:45 +09:00
2019-12-20 12:19:45 +09:00
2019-12-12 09:14:09 +09:00
2019-12-20 12:19:45 +09:00
2019-12-04 13:36:41 +09:00
2019-12-20 12:19:45 +09:00
2019-11-12 10:35:47 +09:00
2019-12-20 12:19:45 +09:00
2019-12-20 12:19:45 +09:00
2019-12-17 13:10:39 +09:00
2019-12-09 13:46:23 +09:00
2019-12-20 11:50:32 +09:00
2019-12-06 16:03:16 +09:00