From a194f30f62d5d746e133c1c7a784b6eb3b5b7cb0 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 04:03:46 +0900 Subject: Add test for Struct#==. --- test/t/struct.rb | 7 +++++++ 1 file changed, 7 insertions(+) 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) -- cgit v1.2.3 From 7a17377c644d421fae71bd8d61e6f7dc744faf62 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 04:06:53 +0900 Subject: Fix Struct.new and Struct.[]. Instances of Struct's subclass should have MRB_TT_STRUCT. --- src/struct.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); -- cgit v1.2.3 From 7778b5ca1c82062e29eb41b22839a1d174dd82e1 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 06:28:17 +0900 Subject: Implement garbage collection for struct. --- src/gc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gc.c b/src/gc.c index a7537a015..a17cd64c8 100644 --- a/src/gc.c +++ b/src/gc.c @@ -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; ilen; i++){ + mrb_gc_mark_value(mrb, s->ptr[i]); + } + } + break; +#endif + default: break; } -- cgit v1.2.3