Actions
Bug #10687
closed
ArgumentError in certain cases of instance_exec (new bug in 2.2)
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
Backport:
Description
a.rb:
foo = ->(a = nil) do
p(a)
end
instance_exec(["a", "b", "c", "d"], &foo)
#=> rvm use 2.1 && ruby -v && ruby a.rb
Using /home/micaeked/.rvm/gems/ruby-2.1.5
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
["a", "b", "c", "d"]
#=> rvm use 2.2 && ruby -v && ruby a.rb
Using /home/micaeked/.rvm/gems/ruby-2.2.0
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
a.rb:1:in `block in <main>': wrong number of arguments (4 for 0..1) (ArgumentError)
from a.rb:5:in `instance_exec'
from a.rb:5:in `<main>'
Files
Updated by stoodfarback (stood far back) over 10 years ago
Still broken in 2.2.1:
#=> ruby -v && ruby a.rb
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
a.rb:1:in `block in <main>': wrong number of arguments (4 for 0..1) (ArgumentError)
from a.rb:4:in `instance_exec'
from a.rb:4:in `<main>'
Actions
#2
Updated by hanachin (Seiei Miyagi) over 10 years ago
- File relaxed.patch relaxed.patch added
- File test_lambda_relaxed.rb test_lambda_relaxed.rb added
It seems broken at r48239
$ ./ruby -v --disable-gems a.rb
ruby 2.2.0dev (2014-11-03 trunk 48238) [x86_64-darwin14]
["a", "b", "c", "d"]
$ ./ruby -v --disable-gems a.rb
ruby 2.2.0dev (2014-11-03 trunk 48239) [x86_64-darwin14]
a.rb:1:in `block in <main>': wrong number of arguments (4 for 0..1) (ArgumentError)
from a.rb:4:in `instance_exec'
from a.rb:4:in `<main>'
I wrote a patch for fix this issue.
diff --git vm_args.c vm_args.c
index e4ade6b..cd52227 100644
--- vm_args.c
+++ vm_args.c
@@ -562,10 +562,14 @@ setup_parameters_complex(rb_thread_t * const th, const rb_iseq_t * const iseq, r
break;
case arg_setup_lambda:
if (given_argc == 1 &&
- given_argc != iseq->param.lead_num &&
+ given_argc != min_argc &&
+ (min_argc > 0 || iseq->param.flags.has_block) &&
!iseq->param.flags.has_rest &&
args_check_block_arg0(args, th, msl)) {
- given_argc = RARRAY_LENINT(args->rest);
+ int len = RARRAY_LENINT(args->rest);
+ if (len >= min_argc && len <= max_argc) {
+ given_argc = len;
+ }
}
}
And I wrote some test, passing a lambda as a block, then yield an array.
All test cases passed at r48238, But failed in trunk, and with this patch too.
Updated by stoodfarback (stood far back) almost 10 years ago
Still broken at 2.3.0:
$ ruby -v a.rb
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
a.rb:1:in `block in <main>': wrong number of arguments (given 4, expected 0..1) (ArgumentError)
from a.rb:4:in `instance_exec'
from a.rb:4:in `<main>'
Updated by nobu (Nobuyoshi Nakada) over 8 years ago
- Has duplicate Bug #12568: wrong ArgumentError if an array is given for instance_exec with optional argument added
Updated by nobu (Nobuyoshi Nakada) over 8 years ago
- Status changed from Open to Closed
Actions
Like0
Like0Like0Like0Like0Like0