Issue #12705 has been updated by Koichi Sasada.


This is working memo. Now I can't find out the solution.

(1) auto splat for lambda with `yield ary` is allowed [Bug #9605]. So #4 is intentional change.
(2) However, lambda generated by Method#to_proc is not allowed (reported by this ticket)
(3) The reason of (2) is, MRI splat ary only for ISeq level proc (splat at `vm_callee_setup_block_arg()` for lambda, called by `vm_invoke_iseq_block()`), but `bmcall()` (specified by `ifunc->func`) doesn't care it.

Possible solution (just now I can make) is `vm_invoke_ifunc_block()` checks it, but not clean.
Fundamentally, the spec is not clean, so code should not be clean.


----------------------------------------
Bug #12705: yielding args to a lambda uses block/proc rather than lambda/method semantics
https://bugs.ruby-lang.org/issues/12705#change-61222

* Author: bug hit
* Status: Assigned
* Priority: Normal
* Assignee: Koichi Sasada
* ruby -v: 
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
```ruby
def yield_test
  yield 1, 2
  yield [1, 2]
end

def foo(a, b)
  p a, b
end

method_lambda = method(:foo).to_proc
normal_lambda = ->a, b{p a, b}

yield_test(&normal_lambda)

yield_test(&method_lambda)
```

the yield of [1, 2] to the method_lambda produces an argument error as you would expect
but the same yield to the normal_lamda does not, the single array arg is slpatted per block/proc semantics




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>