diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-08-29 09:29:14 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-08-29 09:29:14 +0900 |
| commit | c08224983867481e49a6ba23722c6bbe90107a9b (patch) | |
| tree | 0635ce8c94b2c7dc11832cefde6e2563e018dec6 /src/load.c | |
| parent | 786cbf06c3e305bfe837951e1846d8b7fb089b3e (diff) | |
| download | mruby-c08224983867481e49a6ba23722c6bbe90107a9b.tar.gz mruby-c08224983867481e49a6ba23722c6bbe90107a9b.zip | |
Exclude the top-level closure from `each_object`; fix #3793
Diffstat (limited to 'src/load.c')
| -rw-r--r-- | src/load.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/src/load.c b/src/load.c index dd06d5c21..8ae607ffa 100644 --- a/src/load.c +++ b/src/load.c @@ -623,10 +623,11 @@ irep_error(mrb_state *mrb) mrb_exc_set(mrb, mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "irep load error")); } -MRB_API mrb_value -mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) +void mrb_codedump_all(mrb_state*, struct RProc*); + +static mrb_value +load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c) { - mrb_irep *irep = mrb_read_irep(mrb, bin); struct RProc *proc; if (!irep) { @@ -634,12 +635,20 @@ mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) return mrb_nil_value(); } proc = mrb_proc_new(mrb, irep); + proc->c = NULL; mrb_irep_decref(mrb, irep); + if (c && c->dump_result) mrb_codedump_all(mrb, proc); if (c && c->no_exec) return mrb_obj_value(proc); return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); } MRB_API mrb_value +mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) +{ + return load_irep(mrb, mrb_read_irep(mrb, bin), c); +} + +MRB_API mrb_value mrb_load_irep(mrb_state *mrb, const uint8_t *bin) { return mrb_load_irep_cxt(mrb, bin, NULL); @@ -681,25 +690,10 @@ irep_exit: return irep; } -void mrb_codedump_all(mrb_state*, struct RProc*); - MRB_API mrb_value mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c) { - mrb_irep *irep = mrb_read_irep_file(mrb, fp); - mrb_value val; - struct RProc *proc; - - if (!irep) { - irep_error(mrb); - return mrb_nil_value(); - } - proc = mrb_proc_new(mrb, irep); - mrb_irep_decref(mrb, irep); - if (c && c->dump_result) mrb_codedump_all(mrb, proc); - if (c && c->no_exec) return mrb_obj_value(proc); - val = mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); - return val; + return load_irep(mrb, mrb_read_irep_file(mrb, fp), c); } MRB_API mrb_value |
