summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-07-22 23:08:15 +0900
committertake_cheeze <[email protected]>2014-07-28 16:34:01 +0900
commite926b532eec971a5822c71cf47dca6c25ee33e6a (patch)
tree78ab732b5c0010651c22be0f0db3e45a3b4da11b /src/gc.c
parent23b6e22cf05db5add8a08e7d1c1c847594446729 (diff)
downloadmruby-e926b532eec971a5822c71cf47dca6c25ee33e6a.tar.gz
mruby-e926b532eec971a5822c71cf47dca6c25ee33e6a.zip
Store exception message to `mesg` field of `struct RException`.
Diffstat (limited to 'src/gc.c')
-rw-r--r--src/gc.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/gc.c b/src/gc.c
index bdcbc5208..6fcac6c2f 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -515,7 +515,6 @@ 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;
@@ -581,6 +580,13 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
}
break;
+ case MRB_TT_EXCEPTION:
+ mrb_gc_mark_iv(mrb, (struct RObject*)obj);
+ if ((obj->flags & MRB_EXC_MESG_INIT_FLAG) != 0) {
+ mrb_gc_mark_value(mrb, ((struct RException*)obj)->mesg);
+ }
+ break;
+
default:
break;
}
@@ -751,7 +757,6 @@ 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;
@@ -801,6 +806,13 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
children+=2;
break;
+ case MRB_TT_EXCEPTION:
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+ if ((obj->flags & MRB_EXC_MESG_INIT_FLAG) != 0) {
+ children++;
+ }
+ break;
+
default:
break;
}