diff options
| author | Satoshi Odawara <[email protected]> | 2014-09-29 16:41:51 +0900 |
|---|---|---|
| committer | Satoshi Odawara <[email protected]> | 2014-09-29 16:41:51 +0900 |
| commit | 2551d14ff119a4395e544561ecffffee3473c200 (patch) | |
| tree | 46017853a2d2c6faf58f34a687024362ca029c56 /mrbgems/mruby-eval | |
| parent | b090f43251ec8e3fffafa98932f359f053db4f90 (diff) | |
| download | mruby-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.c | 17 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/test/eval.rb | 5 |
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 |
