From d75a907edf761b823d83aa658025de52508b8966 Mon Sep 17 00:00:00 2001 From: fleuria Date: Sun, 3 Nov 2013 11:32:59 +0800 Subject: introduce mrb_context_run() currently there are two scnenario to call mrb_run(), the first is calling a proc, in this case mrb should create a new environment, discarding all the variables except args, reciever and block. the second is calling the newly generated irep, like in mirb. in this case, the variables should be kept after mrb_run(). so we introduce mrb_context_run() to handle this seperately. --- include/mruby.h | 1 + 1 file changed, 1 insertion(+) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index b3dc59a08..a374bf429 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -261,6 +261,7 @@ void mrb_close(mrb_state*); mrb_value mrb_top_self(mrb_state *); mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value); +mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value); void mrb_p(mrb_state*, mrb_value); mrb_int mrb_obj_id(mrb_value obj); -- cgit v1.2.3 From a511957ec8f075d24d971987ebe2cf41ce332629 Mon Sep 17 00:00:00 2001 From: fleuria Date: Sun, 3 Nov 2013 12:05:25 +0800 Subject: refactor mrb_context_run() --- include/mruby.h | 2 +- mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 2 +- mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 2 +- src/load.c | 4 ++-- src/parse.y | 2 +- src/vm.c | 12 +++--------- 6 files changed, 9 insertions(+), 15 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index a374bf429..445bc5e11 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -261,7 +261,7 @@ void mrb_close(mrb_state*); mrb_value mrb_top_self(mrb_state *); mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value); -mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value); +mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int); void mrb_p(mrb_state*, mrb_value); mrb_int mrb_obj_id(mrb_value obj); diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 5779104c2..b27654e0b 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -367,7 +367,7 @@ main(int argc, char **argv) result = mrb_context_run(mrb, /* pass a proc for evaulation */ mrb_proc_new(mrb, mrb->irep[n]), - mrb_top_self(mrb)); + mrb_top_self(mrb), 0); /* did an exception occur? */ if (mrb->exc) { p(mrb, mrb_obj_value(mrb->exc), 0); diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index f1d6bea56..290f9e25d 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -203,7 +203,7 @@ main(int argc, char **argv) fprintf(stderr, "failed to load mrb file: %s\n", args.cmdline); } else if (!args.check_syntax) { - mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0); n = 0; if (mrb->exc) { mrb_print_error(mrb); diff --git a/src/load.c b/src/load.c index 3d7b54eef..d6397d652 100644 --- a/src/load.c +++ b/src/load.c @@ -510,7 +510,7 @@ mrb_load_irep(mrb_state *mrb, const uint8_t *bin) irep_error(mrb, n); return mrb_nil_value(); } - return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0); } #ifdef ENABLE_STDIO @@ -760,6 +760,6 @@ mrb_load_irep_file(mrb_state *mrb, FILE* fp) irep_error(mrb, n); return mrb_nil_value(); } - return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0); } #endif /* ENABLE_STDIO */ diff --git a/src/parse.y b/src/parse.y index 12dcfa471..5f6a286ab 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5388,7 +5388,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) if (mrb->c->ci) { mrb->c->ci->target_class = target; } - v = mrb_run(mrb, proc, mrb_top_self(mrb)); + v = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0); if (mrb->exc) return mrb_nil_value(); return v; } diff --git a/src/vm.c b/src/vm.c index d15358d42..d35ab59f2 100644 --- a/src/vm.c +++ b/src/vm.c @@ -546,8 +546,8 @@ void mrb_gv_val_set(mrb_state *mrb, mrb_sym sym, mrb_value val); #define CALL_MAXARGS 127 -static mrb_value -run_proc(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) +mrb_value +mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) { /* mrb_assert(mrb_proc_cfunc_p(proc)) */ mrb_irep *irep = proc->body.irep; @@ -2148,13 +2148,7 @@ run_proc(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_ mrb_value mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) { - return run_proc(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */ -} - -mrb_value -mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self) -{ - return run_proc(mrb, proc, self, proc->body.irep->nregs); + return mrb_context_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */ } void -- cgit v1.2.3