summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/class.c2
-rw-r--r--src/gc.c14
-rw-r--r--src/struct.c4
-rw-r--r--test/t/struct.rb7
4 files changed, 23 insertions, 4 deletions
diff --git a/src/class.c b/src/class.c
index 881a0072e..16fb36617 100644
--- a/src/class.c
+++ b/src/class.c
@@ -37,7 +37,7 @@ mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c)
if (kh_exist(h, k)){
struct RProc *m = kh_value(h, k);
if (m) {
- paint_black(m);
+ mrb_gc_mark(mrb, (struct RBasic*)m);
}
}
}
diff --git a/src/gc.c b/src/gc.c
index a7537a015..bf45ffcd3 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -345,8 +345,8 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
break;
case MRB_TT_CLASS:
- case MRB_TT_SCLASS:
case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
{
struct RClass *c = (struct RClass*)obj;
@@ -430,6 +430,18 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
break;
#endif
+#ifdef ENABLE_STRUCT
+ case MRB_TT_STRUCT:
+ {
+ struct RStruct *s = (struct RStruct*)obj;
+ long i;
+ for (i=0; i<s->len; i++){
+ mrb_gc_mark_value(mrb, s->ptr[i]);
+ }
+ }
+ break;
+#endif
+
default:
break;
}
diff --git a/src/struct.c b/src/struct.c
index 855974182..25cd02d3d 100644
--- a/src/struct.c
+++ b/src/struct.c
@@ -286,8 +286,8 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k
nstr = mrb_obj_value(c);
mrb_iv_set(mrb, nstr, mrb_intern(mrb, "__members__"), members);
- mrb_define_class_method(mrb, c, "new", mrb_class_new_instance_m, ARGS_ANY());
- mrb_define_class_method(mrb, c, "[]", mrb_class_new_instance_m, ARGS_ANY());
+ mrb_define_class_method(mrb, c, "new", mrb_instance_new, ARGS_ANY());
+ mrb_define_class_method(mrb, c, "[]", mrb_instance_new, ARGS_ANY());
mrb_define_class_method(mrb, c, "members", mrb_struct_s_members_m, ARGS_NONE());
//RSTRUCT(nstr)->basic.c->super = c->c;
ptr_members = RARRAY_PTR(members);
diff --git a/test/t/struct.rb b/test/t/struct.rb
index fff02ee56..5cf6929b8 100644
--- a/test/t/struct.rb
+++ b/test/t/struct.rb
@@ -16,6 +16,13 @@ if Object.const_defined?(:Struct)
c.members == [:m1,:m2]
end
+ assert('Struct#==', '15.2.18.4.1') do
+ c = Struct.new(:m1, :m2)
+ cc1 = c.new(1,2)
+ cc2 = c.new(1,2)
+ cc1 == cc2
+ end
+
assert('Struct#[]', '15.2.18.4.2') do
c = Struct.new(:m1, :m2)
cc = c.new(1,2)