diff options
| -rw-r--r-- | include/mruby/boxing_word.h | 10 | ||||
| -rw-r--r-- | include/mruby/error.h | 7 | ||||
| -rw-r--r-- | include/mruby/object.h | 10 | ||||
| -rw-r--r-- | include/mruby/value.h | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 7 | ||||
| -rw-r--r-- | src/error.c | 2 | ||||
| -rw-r--r-- | src/gc.c | 5 | ||||
| -rw-r--r-- | src/kernel.c | 1 | ||||
| -rw-r--r-- | src/state.c | 4 | ||||
| -rw-r--r-- | src/variable.c | 1 | ||||
| -rw-r--r-- | src/vm.c | 3 | ||||
| -rw-r--r-- | test/assert.rb | 6 | ||||
| -rw-r--r-- | test/init_mrbtest.c | 1 |
13 files changed, 42 insertions, 18 deletions
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index 6057311a8..92e6ae6de 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -11,6 +11,16 @@ # error MRB_INT16 is too small for MRB_WORD_BOXING. #endif +struct RFloat { + MRB_OBJECT_HEADER; + mrb_float f; +}; + +struct RCptr { + MRB_OBJECT_HEADER; + void *p; +}; + #define MRB_FIXNUM_SHIFT 1 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT diff --git a/include/mruby/error.h b/include/mruby/error.h index 4d37f1701..210ae3449 100644 --- a/include/mruby/error.h +++ b/include/mruby/error.h @@ -11,6 +11,13 @@ extern "C" { #endif +struct RException { + MRB_OBJECT_HEADER; + struct iv_tbl *iv; +}; + +#define mrb_exc_ptr(v) ((struct RException*)mrb_ptr(v)) + void mrb_sys_fail(mrb_state *mrb, const char *mesg); mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str); #define mrb_exc_new_str_lit(mrb, c, lit) mrb_exc_new_str(mrb, c, mrb_str_new_lit(mrb, lit)) diff --git a/include/mruby/object.h b/include/mruby/object.h index f6a9f4081..56917a021 100644 --- a/include/mruby/object.h +++ b/include/mruby/object.h @@ -55,14 +55,4 @@ struct RFiber { struct mrb_context *cxt; }; -struct RFloat { - MRB_OBJECT_HEADER; - mrb_float f; -}; - -struct RCptr { - MRB_OBJECT_HEADER; - void *p; -}; - #endif /* MRUBY_OBJECT_H */ diff --git a/include/mruby/value.h b/include/mruby/value.h index f16fa20a6..ae75f9c23 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -122,6 +122,7 @@ enum mrb_vtype { #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING) #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH) #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR) +#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION) #define mrb_test(o) mrb_bool(o) mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value); @@ -129,6 +130,7 @@ static inline mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f) { mrb_value v; + (void) mrb; SET_FLOAT_VALUE(mrb, v, f); return v; } @@ -137,6 +139,7 @@ static inline mrb_value mrb_cptr_value(struct mrb_state *mrb, void *p) { mrb_value v; + (void) mrb; SET_CPTR_VALUE(mrb,v,p); return v; } diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 06baad531..ece769faf 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -175,6 +175,8 @@ f_eval(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self); +#define CI_ACC_SKIP -1 + static mrb_value f_instance_eval(mrb_state *mrb, mrb_value self) { @@ -190,9 +192,10 @@ f_instance_eval(mrb_state *mrb, mrb_value self) mrb_int line = 1; mrb_get_args(mrb, "s|zi", &s, &len, &file, &line); - + mrb->c->ci->acc = CI_ACC_SKIP; return mrb_run(mrb, create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line), self); - } else { + } + else { mrb_get_args(mrb, "&", &b); return mrb_obj_instance_eval(mrb, self); } diff --git a/src/error.c b/src/error.c index d472f7f95..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()); @@ -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; @@ -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/state.c b/src/state.c index bd6e7e553..9c40c842c 100644 --- a/src/state.c +++ b/src/state.c @@ -29,10 +29,6 @@ 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; diff --git a/src/variable.c b/src/variable.c index e98075632..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; @@ -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); diff --git a/test/assert.rb b/test/assert.rb index a4ee00299..72e4d3b37 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -21,7 +21,7 @@ end ## # Create the assertion in a readable way -def assertion_string(err, str, iso=nil, e=nil) +def assertion_string(err, str, iso=nil, e=nil, bt=nil) msg = "#{err}#{str}" msg += " [#{iso}]" if iso && iso != '' msg += " => #{e.message}" if e @@ -31,6 +31,7 @@ def assertion_string(err, str, iso=nil, e=nil) msg += "\n - Assertion[#{idx}] Failed: #{str}\n#{diff}" end end + msg += "\nbacktrace:\n\t#{bt.join("\n\t")}" if bt msg end @@ -56,11 +57,12 @@ def assert(str = 'Assertion failed', iso = '') t_print('.') end rescue Exception => e + bt = e.backtrace if $mrbtest_verbose if e.class.to_s == 'MRubyTestSkip' $asserts.push "Skip: #{str} #{iso} #{e.cause}" t_print('?') else - $asserts.push(assertion_string("#{e.class}: ", str, iso, e)) + $asserts.push(assertion_string("#{e.class}: ", str, iso, e, bt)) $kill_test += 1 t_print('X') end diff --git a/test/init_mrbtest.c b/test/init_mrbtest.c index cc75a5a5e..2a32f4930 100644 --- a/test/init_mrbtest.c +++ b/test/init_mrbtest.c @@ -31,5 +31,6 @@ mrb_init_mrbtest(mrb_state *mrb) mrb_print_error(mrb); exit(EXIT_FAILURE); } + mrb_close(core_test); } |
