diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-01-08 09:07:58 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-01-08 09:07:58 +0900 |
| commit | fb2e0b721fdcf5a65b907ee69ad8e09763632db2 (patch) | |
| tree | 406f630d63d7cda37a6dc8df9e4e5b65333e0090 /mrbgems/mruby-eval/src/eval.c | |
| parent | 00001927107c8b8cebbda35311d122317ed6a918 (diff) | |
| download | mruby-fb2e0b721fdcf5a65b907ee69ad8e09763632db2.tar.gz mruby-fb2e0b721fdcf5a65b907ee69ad8e09763632db2.zip | |
fixed a problem with upvar access from instance_eval; ref #3072
Diffstat (limited to 'mrbgems/mruby-eval/src/eval.c')
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index fdc9d6464..7c5b08d1a 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -133,7 +133,7 @@ patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest) void mrb_codedump_all(mrb_state*, struct RProc*); static struct RProc* -create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, char *file, mrb_int line, mrb_bool nest) +create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, char *file, mrb_int line) { mrbc_context *cxt; struct mrb_parser_state *p; @@ -185,12 +185,7 @@ create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, cha e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)e); e->mid = c->ci[-1].mid; e->cioff = c->ci - c->cibase - 1; - if (nest) { - e->stack = c->stack; - } - else { - e->stack = c->ci->stackent; - } + e->stack = c->ci->stackent; MRB_SET_ENV_STACK_LEN(e, c->ci[-1].proc->body.irep->nlocals); c->ci->env = e; proc->env = e; @@ -215,7 +210,7 @@ f_eval(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "s|ozi", &s, &len, &binding, &file, &line); - proc = create_proc_from_string(mrb, s, len, binding, file, line, FALSE); + proc = create_proc_from_string(mrb, s, len, binding, file, line); ret = mrb_top_run(mrb, proc, mrb->c->stack[0], 0); if (mrb->exc) { mrb_exc_raise(mrb, mrb_obj_value(mrb->exc)); @@ -249,8 +244,8 @@ f_instance_eval(mrb_state *mrb, mrb_value self) c->ci->acc = CI_ACC_SKIP; cv = mrb_singleton_class(mrb, self); c->ci->target_class = mrb_class_ptr(cv); - proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line, TRUE); - return mrb_run(mrb, proc, self); + proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line); + return mrb_top_run(mrb, proc, mrb->c->stack[0], 0); } else { mrb_get_args(mrb, "&", &b); |
