summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-09-07 07:33:28 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-09-07 07:33:28 +0900
commit6fc6880f1fa84991e6b4d7e9b961d34568835dd5 (patch)
tree9d562e5b576c82367288168822fd0dd0308df300 /mrbgems/mruby-compiler/core/codegen.c
parent2fb06aabe6221468ddaeaa61056e4d487b97541a (diff)
downloadmruby-6fc6880f1fa84991e6b4d7e9b961d34568835dd5.tar.gz
mruby-6fc6880f1fa84991e6b4d7e9b961d34568835dd5.zip
codegen.c: improve exception handling in `generate_code`.
- remove `mrb_jmpbuf` from `codegen_scope` - unify exception handling of `mrb_state` and `codegen_scope`
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 9eb23fab7..693bdb4a0 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -48,7 +48,6 @@ struct loopinfo {
typedef struct scope {
mrb_state *mrb;
mrb_pool *mpool;
- struct mrb_jmpbuf jmp;
struct scope *prev;
@@ -146,7 +145,7 @@ codegen_error(codegen_scope *s, const char *message)
fprintf(stderr, "%s\n", message);
}
#endif
- MRB_THROW(&s->jmp);
+ MRB_THROW(s->mrb->jmp);
}
static void*
@@ -3680,16 +3679,18 @@ static struct RProc*
generate_code(mrb_state *mrb, parser_state *p, int val)
{
codegen_scope *scope = scope_new(mrb, 0, 0);
- struct RProc *proc;
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
+ struct mrb_jmpbuf jmpbuf;
+ struct RProc *proc;
+
+ mrb->jmp = &jmpbuf;
scope->mrb = mrb;
scope->parser = p;
scope->filename_sym = p->filename_sym;
scope->filename_index = p->current_filename_index;
- MRB_TRY(&scope->jmp) {
- mrb->jmp = &scope->jmp;
+ MRB_TRY(mrb->jmp) {
/* prepare irep */
codegen(scope, p->tree, val);
proc = mrb_proc_new(mrb, scope->irep);
@@ -3702,13 +3703,13 @@ generate_code(mrb_state *mrb, parser_state *p, int val)
mrb->jmp = prev_jmp;
return proc;
}
- MRB_CATCH(&scope->jmp) {
+ MRB_CATCH(mrb->jmp) {
mrb_irep_decref(mrb, scope->irep);
mrb_pool_close(scope->mpool);
mrb->jmp = prev_jmp;
return NULL;
}
- MRB_END_EXC(&scope->jmp);
+ MRB_END_EXC(mrb->jmp);
}
MRB_API struct RProc*