summaryrefslogtreecommitdiffhomepage
path: root/src/load.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-08-29 09:29:14 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-08-29 09:29:14 +0900
commitc08224983867481e49a6ba23722c6bbe90107a9b (patch)
tree0635ce8c94b2c7dc11832cefde6e2563e018dec6 /src/load.c
parent786cbf06c3e305bfe837951e1846d8b7fb089b3e (diff)
downloadmruby-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.c32
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