summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-07-22 15:35:16 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-07-22 15:35:16 +0900
commit6d742ef93aaa2cb6fe682f05c7e04cfb9be11353 (patch)
tree87f12b0e80d96436842a6dec3b09d83a6beea5f0
parent4b691212846930ccc501e9050589a495901cc25c (diff)
parent3c9660257464bb78a5b094e3f7fb1621bb9577ba (diff)
downloadmruby-6d742ef93aaa2cb6fe682f05c7e04cfb9be11353.tar.gz
mruby-6d742ef93aaa2cb6fe682f05c7e04cfb9be11353.zip
Merge pull request #2482 from take-cheeze/exc_tt
Use MRB_TT_EXCEPTION in exception object.
-rw-r--r--include/mruby/error.h7
-rw-r--r--include/mruby/value.h1
-rw-r--r--src/error.c2
-rw-r--r--src/gc.c5
-rw-r--r--src/kernel.c1
-rw-r--r--src/variable.c1
6 files changed, 17 insertions, 0 deletions
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/value.h b/include/mruby/value.h
index f16fa20a6..20b6008c4 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);
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 8e982de6d..e9b4668df 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/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;