protect returning irep (in proc) from GC

parent de790bdc
...@@ -2906,6 +2906,7 @@ mrb_generate_code(mrb_state *mrb, parser_state *p) ...@@ -2906,6 +2906,7 @@ mrb_generate_code(mrb_state *mrb, parser_state *p)
// prepare irep // prepare irep
codegen(scope, p->tree, NOVAL); codegen(scope, p->tree, NOVAL);
proc = mrb_proc_new(mrb, scope->irep); proc = mrb_proc_new(mrb, scope->irep);
mrb_irep_decref(mrb, scope->irep);
mrb_pool_close(scope->mpool); mrb_pool_close(scope->mpool);
return proc; return proc;
} }
......
...@@ -462,12 +462,15 @@ mrb_value ...@@ -462,12 +462,15 @@ mrb_value
mrb_load_irep(mrb_state *mrb, const uint8_t *bin) mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
{ {
mrb_irep *irep = mrb_read_irep(mrb, bin); mrb_irep *irep = mrb_read_irep(mrb, bin);
mrb_value val;
if (!irep) { if (!irep) {
irep_error(mrb); irep_error(mrb);
return mrb_nil_value(); return mrb_nil_value();
} }
return mrb_context_run(mrb, mrb_proc_new(mrb, irep), mrb_top_self(mrb), 0); val = mrb_context_run(mrb, mrb_proc_new(mrb, irep), mrb_top_self(mrb), 0);
mrb_irep_decref(mrb, irep);
return val;
} }
#ifdef ENABLE_STDIO #ifdef ENABLE_STDIO
...@@ -694,11 +697,14 @@ mrb_value ...@@ -694,11 +697,14 @@ mrb_value
mrb_load_irep_file(mrb_state *mrb, FILE* fp) mrb_load_irep_file(mrb_state *mrb, FILE* fp)
{ {
mrb_irep *irep = mrb_read_irep_file(mrb, fp); mrb_irep *irep = mrb_read_irep_file(mrb, fp);
mrb_value val;
if (!irep) { if (!irep) {
irep_error(mrb); irep_error(mrb);
return mrb_nil_value(); return mrb_nil_value();
} }
return mrb_context_run(mrb, mrb_proc_new(mrb, irep), mrb_top_self(mrb), 0); val = mrb_context_run(mrb, mrb_proc_new(mrb, irep), mrb_top_self(mrb), 0);
mrb_irep_decref(mrb, irep);
return val;
} }
#endif /* ENABLE_STDIO */ #endif /* ENABLE_STDIO */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment