diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backtrace.c | 4 | ||||
| -rw-r--r-- | src/error.c | 7 | ||||
| -rw-r--r-- | src/gc.c | 1 | ||||
| -rw-r--r-- | src/kernel.c | 4 | ||||
| -rw-r--r-- | src/mruby_core.rake | 4 | ||||
| -rw-r--r-- | src/vm.c | 40 |
6 files changed, 40 insertions, 20 deletions
diff --git a/src/backtrace.c b/src/backtrace.c index 529b0b1c9..deb3f8469 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -229,10 +229,11 @@ print_backtrace(mrb_state *mrb, mrb_value backtrace) static void print_backtrace_saved(mrb_state *mrb) { - int i; + int i, ai; FILE *stream = stderr; fprintf(stream, "trace:\n"); + ai = mrb_gc_arena_save(mrb); for (i = 0; i < mrb->backtrace.n; i++) { mrb_backtrace_entry *entry; @@ -252,6 +253,7 @@ print_backtrace_saved(mrb_state *mrb) else { fprintf(stream, ":in %s", method_name); } + mrb_gc_arena_restore(mrb, ai); } fprintf(stream, "\n"); diff --git a/src/error.c b/src/error.c index 3fa18fcb3..931361763 100644 --- a/src/error.c +++ b/src/error.c @@ -519,12 +519,15 @@ MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt, ...) { mrb_value exc; + mrb_value argv[3]; va_list ap; va_start(ap, fmt); - exc = mrb_funcall(mrb, mrb_obj_value(E_NOMETHOD_ERROR), "new", 3, - mrb_vformat(mrb, fmt, ap), mrb_symbol_value(id), args); + argv[0] = mrb_vformat(mrb, fmt, ap); + argv[1] = mrb_symbol_value(id); + argv[2] = args; va_end(ap); + exc = mrb_obj_new(mrb, E_NOMETHOD_ERROR, 3, argv); mrb_exc_raise(mrb, exc); } @@ -639,6 +639,7 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) struct REnv *e = (struct REnv*)obj; mrb_int i, len; + if MRB_ENV_STACK_SHARED_P(e) break; len = MRB_ENV_STACK_LEN(e); for (i=0; i<len; i++) { mrb_gc_mark_value(mrb, e->stack[i]); diff --git a/src/kernel.c b/src/kernel.c index 7497f955b..3377f5a11 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -969,7 +969,7 @@ mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args) * r.xxiii #=> 23 * r.mm #=> 2000 */ -#ifndef MRB_DEFAULT_METHOD_MISSING +#ifdef MRB_DEFAULT_METHOD_MISSING static mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod) { @@ -1216,7 +1216,7 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */ mrb_define_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 */ -#ifndef MRB_DEFAULT_METHOD_MISSING +#ifdef MRB_DEFAULT_METHOD_MISSING mrb_define_method(mrb, krn, "method_missing", mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ #endif mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */ diff --git a/src/mruby_core.rake b/src/mruby_core.rake index abde441d5..4558493d9 100644 --- a/src/mruby_core.rake +++ b/src/mruby_core.rake @@ -4,11 +4,11 @@ MRuby.each_target do current_build_dir = "#{build_dir}/#{relative_from_root}" objs = Dir.glob("#{current_dir}/*.c").map { |f| - next nil if cxx_abi_enabled? and f =~ /(error|vm).c$/ + next nil if cxx_exception_enabled? and f =~ /(error|vm).c$/ objfile(f.pathmap("#{current_build_dir}/%n")) }.compact - if cxx_abi_enabled? + if cxx_exception_enabled? objs += %w(vm error).map { |v| compile_as_cxx "#{current_dir}/#{v}.c", "#{current_build_dir}/#{v}.cxx" } end self.libmruby << objs @@ -292,6 +292,9 @@ ecall(mrb_state *mrb, int i) ptrdiff_t nstk; if (i<0) return; + if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { + mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); + } p = mrb->c->ensure[i]; if (!p) return; if (mrb->c->ci->eidx > i) @@ -1188,19 +1191,13 @@ RETRY_TRY_BLOCK: mrb_method_missing(mrb, mid, recv, args); } mid = missing; - if (n == CALL_MAXARGS-1) { + if (n != CALL_MAXARGS) { + mrb_value blk = regs[bidx]; regs[a+1] = mrb_ary_new_from_values(mrb, n, regs+a+1); - SET_NIL_VALUE(regs[bidx]); - n++; - } - if (n == CALL_MAXARGS) { - mrb_ary_unshift(mrb, regs[a+1], sym); - } - else { - value_move(regs+a+2, regs+a+1, n+1); - regs[a+1] = sym; - n++; + regs[a+2] = blk; + n = CALL_MAXARGS; } + mrb_ary_unshift(mrb, regs[a+1], sym); } /* push callinfo */ @@ -1387,6 +1384,8 @@ RETRY_TRY_BLOCK: ci->mid = mid; ci->proc = m; ci->stackent = mrb->c->stack; + ci->target_class = c; + ci->pc = pc + 1; { int bidx; mrb_value blk; @@ -1402,10 +1401,9 @@ RETRY_TRY_BLOCK: blk = regs[bidx]; if (!mrb_nil_p(blk) && mrb_type(blk) != MRB_TT_PROC) { regs[bidx] = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc"); + ci = mrb->c->ci; } } - ci->target_class = c; - ci->pc = pc + 1; /* prepare stack */ mrb->c->stack += a; @@ -1678,6 +1676,9 @@ RETRY_TRY_BLOCK: ce = mrb->c->cibase + e->cioff; while (--ci > ce) { + if (ci->env) { + mrb_env_unshare(mrb, ci->env); + } if (ci->acc < 0) { localjump_error(mrb, LOCALJUMP_ERROR_RETURN); goto L_RAISE; @@ -1729,6 +1730,9 @@ RETRY_TRY_BLOCK: mrb->c->ci = ci; break; } + if (ci->env) { + mrb_env_unshare(mrb, ci->env); + } ci--; } break; @@ -2582,3 +2586,13 @@ mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int sta return v; } + +#if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus) +# if !defined(MRB_ENABLE_CXX_ABI) +} /* end of extern "C" */ +# endif +mrb_int mrb_jmpbuf::jmpbuf_id = 0; +# if !defined(MRB_ENABLE_CXX_ABI) +extern "C" { +# endif +#endif |
