[ruby-dev:24352] Re: `dump': uninitialized struct (TypeError)

From: nobu@...
Date: 2004-09-27 02:46:18 UTC
List: ruby-dev #24352
なかだです。

At Sat, 25 Sep 2004 11:10:02 +0900,
Tanaka Akira wrote in [ruby-dev:24342]:
> 次のように struct を dump できません。
> 
> % ./ruby -ve 'Marshal.dump(Struct.new("A", :a).new)'
> ruby 1.9.0 (2004-09-24) [i686-linux]
> -e:1:in `dump': uninitialized struct (TypeError)
>         from -e:1

__member__から__members__に変更になったのにmarshal.cが追従して
ないんですが、むしろstruct_members()をexternにしたほうがいいん
じゃないでしょうか。


Index: intern.h
===================================================================
RCS file: /cvs/ruby/src/ruby/intern.h,v
retrieving revision 1.152
diff -U2 -p -d -r1.152 intern.h
--- intern.h	24 Sep 2004 05:53:41 -0000	1.152
+++ intern.h	27 Sep 2004 02:40:17 -0000
@@ -445,4 +445,6 @@ VALUE rb_struct_aset _((VALUE, VALUE, VA
 VALUE rb_struct_getmember _((VALUE, ID));
 VALUE rb_struct_iv_get _((VALUE, char*));
+VALUE rb_struct_s_members _((VALUE));
+VALUE rb_struct_members _((VALUE));
 /* time.c */
 VALUE rb_time_new _((time_t, time_t));
Index: marshal.c
===================================================================
RCS file: /cvs/ruby/src/ruby/marshal.c,v
retrieving revision 1.115
diff -U2 -p -d -r1.115 marshal.c
--- marshal.c	17 Aug 2004 09:02:40 -0000	1.115
+++ marshal.c	27 Sep 2004 02:38:20 -0000
@@ -636,8 +636,5 @@ w_object(obj, arg, limit)
 
 		w_long(len, arg);
-		mem = rb_struct_iv_get(rb_obj_class(obj), "__member__");
-		if (mem == Qnil) {
-		    rb_raise(rb_eTypeError, "uninitialized struct");
-		}
+		mem = rb_struct_members(obj);
 		for (i=0; i<len; i++) {
 		    w_symbol(SYM2ID(RARRAY(mem)->ptr[i]), arg);
Index: struct.c
===================================================================
RCS file: /cvs/ruby/src/ruby/struct.c,v
retrieving revision 1.59
diff -U2 -p -d -r1.59 struct.c
--- struct.c	24 Sep 2004 16:58:50 -0000	1.59
+++ struct.c	27 Sep 2004 02:43:56 -0000
@@ -34,6 +34,6 @@ rb_struct_iv_get(c, name)
 }
 
-static VALUE
-struct_s_members(klass)
+VALUE
+rb_struct_s_members(klass)
     VALUE klass;
 {
@@ -46,13 +46,10 @@ struct_s_members(klass)
 }
 
-static VALUE
-struct_members(s)
+VALUE
+rb_struct_members(s)
     VALUE s;
 {
-    VALUE members = struct_s_members(rb_obj_class(s));
+    VALUE members = rb_struct_s_members(rb_obj_class(s));
 
-    if (NIL_P(members)) {
-	rb_bug("non-initialized struct");
-    }
     if (RSTRUCT(s)->len != RARRAY(members)->len) {
 	rb_raise(rb_eTypeError, "struct size differs (%d required %d given)",
@@ -63,5 +60,5 @@ struct_members(s)
 
 static VALUE
-rb_struct_s_members(klass)
+rb_struct_s_members_m(klass)
     VALUE klass;
 {
@@ -69,5 +66,5 @@ rb_struct_s_members(klass)
     VALUE *p, *pend;
 
-    members = struct_s_members(klass);
+    members = rb_struct_s_members(klass);
     ary = rb_ary_new2(RARRAY(members)->len);
     p = RARRAY(members)->ptr; pend = p + RARRAY(members)->len;
@@ -93,8 +90,8 @@ rb_struct_s_members(klass)
 
 static VALUE
-rb_struct_members(obj)
+rb_struct_members_m(obj)
     VALUE obj;
 {
-    return rb_struct_s_members(rb_obj_class(obj));
+    return rb_struct_s_members_m(rb_obj_class(obj));
 }
 
@@ -107,5 +104,5 @@ rb_struct_getmember(obj, id)
     long i;
 
-    members = struct_members(obj);
+    members = rb_struct_members(obj);
     slot = ID2SYM(id);
     for (i=0; i<RARRAY(members)->len; i++) {
@@ -165,5 +162,5 @@ rb_struct_set(obj, val)
     long i;
 
-    members = struct_members(obj);
+    members = rb_struct_members(obj);
     rb_struct_modify(obj);
     for (i=0; i<RARRAY(members)->len; i++) {
@@ -210,5 +207,5 @@ make_struct(name, members, klass)
     rb_define_singleton_method(nstr, "new", rb_class_new_instance, -1);
     rb_define_singleton_method(nstr, "[]", rb_class_new_instance, -1);
-    rb_define_singleton_method(nstr, "members", rb_struct_s_members, 0);
+    rb_define_singleton_method(nstr, "members", rb_struct_s_members_m, 0);
     for (i=0; i< RARRAY(members)->len; i++) {
 	ID id = SYM2ID(RARRAY(members)->ptr[i]);
@@ -458,5 +455,5 @@ rb_struct_each_pair(s)
     long i;
 
-    members = struct_members(s);
+    members = rb_struct_members(s);
     for (i=0; i<RSTRUCT(s)->len; i++) {
 	rb_yield_values(2, rb_ary_entry(members, i), RSTRUCT(s)->ptr[i]);
@@ -473,5 +470,5 @@ inspect_struct(s)
     long i;
 
-    members = struct_members(s);
+    members = rb_struct_members(s);
     str = rb_str_buf_new2("#<struct ");
     rb_str_cat2(str, cname);
@@ -564,5 +561,5 @@ rb_struct_aref_id(s, id)
     long i, len;
 
-    members = struct_members(s);
+    members = rb_struct_members(s);
     len = RARRAY(members)->len;
     for (i=0; i<len; i++) {
@@ -623,5 +620,5 @@ rb_struct_aset_id(s, id, val)
     long i, len;
 
-    members = struct_members(s);
+    members = rb_struct_members(s);
     rb_struct_modify(s);
     len = RARRAY(members)->len;
@@ -910,4 +907,4 @@ Init_Struct()
     rb_define_method(rb_cStruct, "values_at", rb_struct_values_at, -1);
 
-    rb_define_method(rb_cStruct, "members", rb_struct_members, 0);
+    rb_define_method(rb_cStruct, "members", rb_struct_members_m, 0);
 }


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread