diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backtrace.c | 3 | ||||
| -rw-r--r-- | src/class.c | 40 | ||||
| -rw-r--r-- | src/dump.c | 4 | ||||
| -rw-r--r-- | src/error.c | 3 | ||||
| -rw-r--r-- | src/gc.c | 11 | ||||
| -rw-r--r-- | src/kernel.c | 1 | ||||
| -rw-r--r-- | src/proc.c | 4 | ||||
| -rw-r--r-- | src/state.c | 6 | ||||
| -rw-r--r-- | src/string.c | 2 | ||||
| -rw-r--r-- | src/symbol.c | 4 | ||||
| -rw-r--r-- | src/variable.c | 3 | ||||
| -rw-r--r-- | src/vm.c | 5 |
12 files changed, 68 insertions, 18 deletions
diff --git a/src/backtrace.c b/src/backtrace.c index 1e1f9fa1a..d02d11350 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -147,6 +147,9 @@ exc_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun void mrb_print_backtrace(mrb_state *mrb) { + if (!mrb->exc || mrb_obj_is_kind_of(mrb, mrb_obj_value(mrb->exc), E_SYSSTACK_ERROR)) { + return; + } exc_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr); } diff --git a/src/class.c b/src/class.c index 2b42a6a92..4522e4529 100644 --- a/src/class.c +++ b/src/class.c @@ -1206,7 +1206,7 @@ mrb_bob_missing(mrb_state *mrb, mrb_value mod) /* method missing in inspect; avoid recursion */ repr = mrb_any_to_s(mrb, mod); } - else if (mrb_respond_to(mrb, mod, inspect)) { + else if (mrb_respond_to(mrb, mod, inspect) && mrb->c->ci - mrb->c->cibase < 64) { repr = mrb_funcall_argv(mrb, mod, inspect, 0, 0); if (RSTRING_LEN(repr) > 64) { repr = mrb_any_to_s(mrb, mod); @@ -1946,6 +1946,43 @@ mrb_mod_eqq(mrb_state *mrb, mrb_value mod) return mrb_bool_value(eqq); } +mrb_value +mrb_mod_module_function(mrb_state *mrb, mrb_value mod) +{ + mrb_value *argv; + mrb_int argc, i; + mrb_sym mid; + struct RProc *method_rproc; + struct RClass *rclass; + int ai; + + mrb_check_type(mrb, mod, MRB_TT_MODULE); + + mrb_get_args(mrb, "*", &argv, &argc); + if(argc == 0) { + /* set MODFUNC SCOPE if implemented */ + return mod; + } + + /* set PRIVATE method visibility if implemented */ + /* mrb_mod_dummy_visibility(mrb, mod); */ + + for (i=0; i<argc; i++) { + mrb_check_type(mrb, argv[i], MRB_TT_SYMBOL); + + mid = mrb_symbol(argv[i]); + rclass = mrb_class_ptr(mod); + method_rproc = mrb_method_search(mrb, rclass, mid); + + prepare_singleton_class(mrb, (struct RBasic*)rclass); + ai = mrb_gc_arena_save(mrb); + mrb_define_method_raw(mrb, rclass->c, mid, method_rproc); + mrb_gc_arena_restore(mrb, ai); + } + + return mod; +} + void mrb_init_class(mrb_state *mrb) { @@ -2009,6 +2046,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */ mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */ + mrb_define_method(mrb, mod, "module_function", mrb_mod_module_function, MRB_ARGS_ANY()); mrb_define_method(mrb, mod, "private", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.36 */ mrb_define_method(mrb, mod, "protected", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.37 */ mrb_define_method(mrb, mod, "public", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.38 */ diff --git a/src/dump.c b/src/dump.c index b820f1a68..e019baa99 100644 --- a/src/dump.c +++ b/src/dump.c @@ -952,7 +952,9 @@ mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE* fp) result = mrb_dump_irep(mrb, irep, debug_info, &bin, &bin_size); if (result == MRB_DUMP_OK) { - fwrite(bin, bin_size, 1, fp); + if (fwrite(bin, sizeof(bin[0]), bin_size, fp) != bin_size) { + result = MRB_DUMP_WRITE_FAULT; + } } mrb_free(mrb, bin); diff --git a/src/error.c b/src/error.c index dcb6063f8..223e2137e 100644 --- a/src/error.c +++ b/src/error.c @@ -15,6 +15,7 @@ #include "mruby/variable.h" #include "mruby/debug.h" #include "mruby/error.h" +#include "mruby/class.h" #include "mrb_throw.h" mrb_value @@ -442,6 +443,7 @@ mrb_init_exception(mrb_state *mrb) struct RClass *exception, *runtime_error, *script_error; mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ + MRB_SET_INSTANCE_TT(exception, MRB_TT_EXCEPTION); mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_ANY()); mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ANY()); mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_ANY()); @@ -455,4 +457,5 @@ mrb_init_exception(mrb_state *mrb) mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str(mrb, runtime_error, mrb_str_new_lit(mrb, "Out of memory"))); script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ mrb_define_class(mrb, "SyntaxError", script_error); /* 15.2.38 */ + mrb_define_class(mrb, "SystemStackError", exception); } @@ -16,6 +16,7 @@ #include "mruby/string.h" #include "mruby/variable.h" #include "mruby/gc.h" +#include "mruby/error.h" /* = Tri-color Incremental Garbage Collection @@ -107,6 +108,7 @@ typedef struct { struct RRange range; struct RData data; struct RProc proc; + struct RException exc; #ifdef MRB_WORD_BOXING struct RFloat floatv; struct RCptr cptr; @@ -171,10 +173,10 @@ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) { void *p2; - p2 = (mrb->allocf)(mrb, p, len, mrb->ud); + p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud); if (!p2 && len > 0 && mrb->heaps) { mrb_full_gc(mrb); - p2 = (mrb->allocf)(mrb, p, len, mrb->ud); + p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud); } return p2; @@ -240,7 +242,7 @@ mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) void mrb_free(mrb_state *mrb, void *p) { - (mrb->allocf)(mrb, p, 0, mrb->ud); + (mrb->allocf)(mrb, p, 0, mrb->allocf_ud); } #ifndef MRB_HEAP_PAGE_SIZE @@ -513,6 +515,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) case MRB_TT_OBJECT: case MRB_TT_DATA: + case MRB_TT_EXCEPTION: mrb_gc_mark_iv(mrb, (struct RObject*)obj); break; @@ -612,6 +615,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj) #endif case MRB_TT_OBJECT: + case MRB_TT_EXCEPTION: mrb_gc_free_iv(mrb, (struct RObject*)obj); break; @@ -747,6 +751,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) case MRB_TT_OBJECT: case MRB_TT_DATA: + case MRB_TT_EXCEPTION: children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj); break; diff --git a/src/kernel.c b/src/kernel.c index 0258e5c15..5ba318b1d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -275,6 +275,7 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) case MRB_TT_SCLASS: case MRB_TT_HASH: case MRB_TT_DATA: + case MRB_TT_EXCEPTION: mrb_iv_copy(mrb, dest, obj); break; diff --git a/src/proc.c b/src/proc.c index 1511725d9..9e63e5f08 100644 --- a/src/proc.c +++ b/src/proc.c @@ -153,11 +153,11 @@ mrb_proc_arity(mrb_state *mrb, mrb_value self) int ma, ra, pa, arity; if (MRB_PROC_CFUNC_P(p)) { - // TODO cfunc aspec not implemented yet + /* TODO cfunc aspec not implemented yet */ return mrb_fixnum_value(-1); } - // arity is depend on OP_ENTER + /* arity is depend on OP_ENTER */ if (GET_OPCODE(*iseq) != OP_ENTER) { return mrb_fixnum_value(0); } diff --git a/src/state.c b/src/state.c index ff0182f22..9c40c842c 100644 --- a/src/state.c +++ b/src/state.c @@ -29,15 +29,11 @@ mrb_open_core(mrb_allocf f, void *ud) static const struct mrb_context mrb_context_zero = { 0 }; mrb_state *mrb; -#ifdef MRB_NAN_BOXING - mrb_static_assert(sizeof(void*) == 4, "when using NaN boxing sizeof pointer must be 4 byte"); -#endif - mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); if (mrb == NULL) return NULL; *mrb = mrb_state_zero; - mrb->ud = ud; + mrb->allocf_ud = ud; mrb->allocf = f; mrb->current_white_part = MRB_GC_WHITE_A; mrb->atexit_stack_len = 0; diff --git a/src/string.c b/src/string.c index a22060e37..16e7f9ffd 100644 --- a/src/string.c +++ b/src/string.c @@ -1799,7 +1799,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) } } else if (split_type == string) { - char *ptr = RSTRING_PTR(str); // s->as.ary + char *ptr = RSTRING_PTR(str); /* s->as.ary */ char *temp = ptr; char *eptr = RSTRING_END(str); mrb_int slen = RSTRING_LEN(spat); diff --git a/src/symbol.c b/src/symbol.c index 148adc6fe..cf4945185 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -216,12 +216,10 @@ static mrb_value sym_equal(mrb_state *mrb, mrb_value sym1) { mrb_value sym2; - mrb_bool equal_p; mrb_get_args(mrb, "o", &sym2); - equal_p = mrb_obj_equal(mrb, sym1, sym2); - return mrb_bool_value(equal_p); + return mrb_bool_value(mrb_obj_equal(mrb, sym1, sym2)); } /* 15.2.11.3.2 */ diff --git a/src/variable.c b/src/variable.c index 74bb591cf..58cd08304 100644 --- a/src/variable.c +++ b/src/variable.c @@ -459,6 +459,7 @@ obj_iv_p(mrb_value obj) case MRB_TT_SCLASS: case MRB_TT_HASH: case MRB_TT_DATA: + case MRB_TT_EXCEPTION: return TRUE; default: return FALSE; @@ -1085,7 +1086,7 @@ retry: return FALSE; } -int +mrb_bool mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id) { return mrb_const_defined_0(mrb, klass, id, TRUE, FALSE); @@ -160,7 +160,7 @@ stack_extend_alloc(mrb_state *mrb, int room, int keep) to prevent infinite recursion. However, do this only after resizing the stack, so mrb_raise has stack space to work with. */ if (size > MRB_STACK_MAX) { init_new_stack_space(mrb, room, keep); - mrb_raise(mrb, E_RUNTIME_ERROR, "stack level too deep. (limit=" TO_STR(MRB_STACK_MAX) ")"); + mrb_raise(mrb, E_SYSSTACK_ERROR, "stack level too deep. (limit=" TO_STR(MRB_STACK_MAX) ")"); } } @@ -484,6 +484,9 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c) struct RProc *p; mrb_callinfo *ci; + if (mrb_nil_p(blk)) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); + } ci = mrb->c->ci; if (ci->acc == CI_ACC_DIRECT) { return mrb_yield_with_class(mrb, blk, 0, 0, self, c); |
