summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-eval
diff options
context:
space:
mode:
authorSatoshi Odawara <[email protected]>2014-09-29 16:41:51 +0900
committerSatoshi Odawara <[email protected]>2014-09-29 16:41:51 +0900
commit2551d14ff119a4395e544561ecffffee3473c200 (patch)
tree46017853a2d2c6faf58f34a687024362ca029c56 /mrbgems/mruby-eval
parentb090f43251ec8e3fffafa98932f359f053db4f90 (diff)
downloadmruby-2551d14ff119a4395e544561ecffffee3473c200.tar.gz
mruby-2551d14ff119a4395e544561ecffffee3473c200.zip
fixed. closures scope in eval(string)
Diffstat (limited to 'mrbgems/mruby-eval')
-rw-r--r--mrbgems/mruby-eval/src/eval.c17
-rw-r--r--mrbgems/mruby-eval/test/eval.rb5
2 files changed, 18 insertions, 4 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c
index 8ee651718..e97a09e80 100644
--- a/mrbgems/mruby-eval/src/eval.c
+++ b/mrbgems/mruby-eval/src/eval.c
@@ -53,13 +53,22 @@ patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest)
size_t i;
mrb_code c;
- for (i = 0; i < irep->rlen; i++) {
- patch_irep(mrb, irep->reps[i], bnest + 1);
- }
-
for (i = 0; i < irep->ilen; i++) {
c = irep->iseq[i];
switch(GET_OPCODE(c)){
+ case OP_EPUSH:
+ patch_irep(mrb, irep->reps[GETARG_Bx(c)], bnest + 1);
+ break;
+
+ case OP_LAMBDA:
+ {
+ int arg_c = GETARG_c(c);
+ if (arg_c & OP_L_CAPTURE) {
+ patch_irep(mrb, irep->reps[GETARG_b(c)], bnest + 1);
+ }
+ }
+ break;
+
case OP_SEND:
if (GETARG_C(c) != 0) {
break;
diff --git a/mrbgems/mruby-eval/test/eval.rb b/mrbgems/mruby-eval/test/eval.rb
index a4e7786da..e5d3bde18 100644
--- a/mrbgems/mruby-eval/test/eval.rb
+++ b/mrbgems/mruby-eval/test/eval.rb
@@ -32,6 +32,11 @@ assert('Kernel.eval', '15.3.1.2.3') do
}.call
c
}
+ assert_equal(2) {
+ a = 10
+ Kernel.eval 'def f(a); b=a.send(:+, 1); end'
+ f(1)
+ }
end
assert('Kernel#eval', '15.3.1.3.12') do