[#68478] Looking for MRI projects for Ruby Google Summer of Code 2015 — Tony Arcieri <bascule@...>

Hi ruby-core,

10 messages 2015/03/10

[ruby-core:68530] [Ruby trunk - Bug #10687] ArgumentError in certain cases of instance_exec (new bug in 2.2)

From: hanachin@...
Date: 2015-03-15 13:18:05 UTC
List: ruby-core #68530
Issue #10687 has been updated by Seiei Higa.

File relaxed.patch added
File test_lambda_relaxed.rb added

It seems broken at r48239

```console
$ ./ruby -v --disable-gems a.rb
ruby 2.2.0dev (2014-11-03 trunk 48238) [x86_64-darwin14]
["a", "b", "c", "d"]
```

```console
$ ./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
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.


----------------------------------------
Bug #10687: ArgumentError in certain cases of instance_exec (new bug in 2.2)
https://bugs.ruby-lang.org/issues/10687#change-51851

* Author: Anonymous
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
* Backport: 
----------------------------------------
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--------------------------------
relaxed.patch (654 Bytes)
test_lambda_relaxed.rb (10.6 KB)


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

In This Thread

Prev Next