summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 1aa14ef46..7f7ba52f0 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -87,12 +87,14 @@ static void codegen(codegen_scope *s, node *tree, int val);
static void
codegen_error(codegen_scope *s, const char *message)
{
+ jmp_buf jmp;
+
if (!s) return;
while (s->prev) {
+ codegen_scope *tmp = s->prev;
mrb_pool_close(s->mpool);
- s = s->prev;
+ s = tmp;
}
- mrb_pool_close(s->mpool);
#ifdef ENABLE_STDIO
if (s->filename && s->lineno) {
fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
@@ -101,7 +103,9 @@ codegen_error(codegen_scope *s, const char *message)
fprintf(stderr, "codegen error: %s\n", message);
}
#endif
- longjmp(s->jmp, 1);
+ memcpy(&jmp, &s->jmp, sizeof(jmp_buf));
+ mrb_pool_close(s->mpool);
+ longjmp(jmp, 1);
}
static void*