提交 5f382d41 编写于 作者: C Charles Oliver Nutter

Explicitly unpack the expanded args to avoid execution order diff.

In https://bugs.ruby-lang.org/issues/12860 I argue that MRI's
execution order here is incorrect. The splatting of the 'c' args
should happen before the shift, but it happens after. On JRuby, it
behaves the way you would expect, leading to the 'c' args splat
still containing the block and producing an error like "cannot
convert proc to symbol" when the send attempts to coerce
it.

This patch makes the unpacking order explicit with a multi-assign,
which behaves properly on all implementations I tested.
上级 f2c6db41
......@@ -410,8 +410,8 @@ def expand(target, value, block)
# values.
def make_lambda
lambda do |target, value, &block|
c = expand(target, value, block)
c.shift.send(*c, &c.shift)
target, block, method, *arguments = expand(target, value, block)
target.send(method, *arguments, &block)
end
end
......@@ -419,8 +419,8 @@ def make_lambda
# values, but then return the boolean inverse of that result.
def inverted_lambda
lambda do |target, value, &block|
c = expand(target, value, block)
! c.shift.send(*c, &c.shift)
target, block, method, *arguments = expand(target, value, block)
! target.send(method, *arguments, &block)
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册