mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
refactor out longjmp() to a function
This commit is contained in:
+7
-5
@@ -2842,13 +2842,15 @@ codegen_start(mrb_state *mrb, parser_state *p)
|
||||
if (p->filename) {
|
||||
scope->filename = p->filename;
|
||||
}
|
||||
if (setjmp(scope->jmp) != 0) {
|
||||
if (setjmp(scope->jmp) == 0) {
|
||||
// prepare irep
|
||||
codegen(scope, p->tree, NOVAL);
|
||||
mrb_pool_close(scope->mpool);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
// prepare irep
|
||||
codegen(scope, p->tree, NOVAL);
|
||||
mrb_pool_close(scope->mpool);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
+1
-2
@@ -5,7 +5,6 @@
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -219,7 +218,7 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc)
|
||||
mrb_p(mrb, exc);
|
||||
abort();
|
||||
}
|
||||
longjmp(*(jmp_buf*)mrb->jmp, 1);
|
||||
mrb_longjmp(mrb);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -14,5 +14,6 @@ mrb_value make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr);
|
||||
mrb_value mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv);
|
||||
mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
|
||||
void mrb_exc_print(mrb_state *mrb, struct RObject *exc);
|
||||
void mrb_longjmp(mrb_state *mrb);
|
||||
|
||||
#endif /* MRUBY_ERROR_H */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
** vm.c - virtual machine for mruby
|
||||
**
|
||||
** See Copyright Notice in mruby.h
|
||||
@@ -1261,7 +1261,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
|
||||
mrb->c->stack = mrb->c->stbase + ci[1].stackidx;
|
||||
if (ci[1].acc < 0 && prev_jmp) {
|
||||
mrb->jmp = prev_jmp;
|
||||
longjmp(*(jmp_buf*)mrb->jmp, 1);
|
||||
mrb_longjmp(mrb);
|
||||
}
|
||||
while (eidx > ci->eidx) {
|
||||
ecall(mrb, --eidx);
|
||||
@@ -2127,3 +2127,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
|
||||
}
|
||||
END_DISPATCH;
|
||||
}
|
||||
|
||||
void
|
||||
mrb_longjmp(mrb_state *mrb)
|
||||
{
|
||||
longjmp(*(jmp_buf*)mrb->jmp, 1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user