summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/boxing_word.h10
-rw-r--r--include/mruby/error.h7
-rw-r--r--include/mruby/object.h10
-rw-r--r--include/mruby/value.h3
-rw-r--r--mrbgems/mruby-eval/src/eval.c7
-rw-r--r--src/error.c2
-rw-r--r--src/gc.c5
-rw-r--r--src/kernel.c1
-rw-r--r--src/state.c4
-rw-r--r--src/variable.c1
-rw-r--r--src/vm.c3
-rw-r--r--test/assert.rb6
-rw-r--r--test/init_mrbtest.c1
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());
diff --git a/src/gc.c b/src/gc.c
index 84dee4958..bdcbc5208 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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;
diff --git a/src/vm.c b/src/vm.c
index 33e8eefb3..d4a8fd68d 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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);
}