summaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-02-25 18:47:28 +0900
committertake_cheeze <[email protected]>2014-03-01 20:05:29 +0900
commit78915f96017a12e8c3c40a4a2714543c10d0d070 (patch)
tree9db022c63ebd09aec5d1164141a0bdb85cc93d3f /src/codegen.c
parent5ff9c1d2861609fc98f03ec2d768e0b4f1559a09 (diff)
downloadmruby-78915f96017a12e8c3c40a4a2714543c10d0d070.tar.gz
mruby-78915f96017a12e8c3c40a4a2714543c10d0d070.zip
support c++ exception
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 29890f3b3..77bc5e34e 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -16,6 +16,7 @@
#include "node.h"
#include "opcode.h"
#include "re.h"
+#include "mrb_throw.h"
typedef mrb_ast_node node;
typedef struct mrb_parser_state parser_state;
@@ -38,7 +39,7 @@ struct loopinfo {
typedef struct scope {
mrb_state *mrb;
mrb_pool *mpool;
- jmp_buf jmp;
+ struct mrb_jmpbuf jmp;
struct scope *prev;
@@ -101,7 +102,7 @@ codegen_error(codegen_scope *s, const char *message)
fprintf(stderr, "codegen error: %s\n", message);
}
#endif
- longjmp(s->jmp, 1);
+ MRB_THROW(&s->jmp);
}
static void*
@@ -2487,7 +2488,7 @@ scope_finish(codegen_scope *s)
mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
fname_len = strlen(s->filename);
- fname = codegen_malloc(s, fname_len + 1);
+ fname = (char*)codegen_malloc(s, fname_len + 1);
memcpy(fname, s->filename, fname_len);
fname[fname_len] = '\0';
irep->filename = fname;
@@ -2920,7 +2921,8 @@ mrb_generate_code(mrb_state *mrb, parser_state *p)
scope->parser = p;
scope->filename = p->filename;
scope->filename_index = p->current_filename_index;
- if (setjmp(scope->jmp) == 0) {
+
+ MRB_TRY(&scope->jmp) {
/* prepare irep */
codegen(scope, p->tree, NOVAL);
proc = mrb_proc_new(mrb, scope->irep);
@@ -2928,7 +2930,7 @@ mrb_generate_code(mrb_state *mrb, parser_state *p)
mrb_pool_close(scope->mpool);
return proc;
}
- else {
+ MRB_CATCH(&scope->jmp) {
if (scope->filename == scope->irep->filename) {
scope->irep->filename = NULL;
}
@@ -2936,4 +2938,5 @@ mrb_generate_code(mrb_state *mrb, parser_state *p)
mrb_pool_close(scope->mpool);
return NULL;
}
+ MRB_END_EXC(&scope->jmp);
}