なかだです。 At Sun, 19 Dec 2004 01:00:03 +0900, Tanaka Akira wrote in [ruby-dev:25249]: > 次のようにすると core を吐きます。 > > % ./ruby -e ' > name = "A" * 0x20000 > S1 = Struct.new(name, :a) > class << $stderr; self end.send(:define_method, :write) {|s| > name.clear > } > S2 = Struct.new(name, :a) > ' > -e:7: [BUG] Segmentation fault > ruby 1.9.0 (2004-12-18) [i686-linux] make_struct()の引数をIDにしちゃうというのはどうでしょうか。 * struct.c (make_struct): use ID as name. fixed: [ruby-dev:25249]
Index: struct.c =================================================================== RCS file: /cvs/ruby/src/ruby/struct.c,v retrieving revision 1.60 diff -U2 -p -r1.60 struct.c --- struct.c 27 Sep 2004 04:46:54 -0000 1.60 +++ struct.c 18 Dec 2004 19:52:01 -0000 @@ -176,13 +176,13 @@ rb_struct_set(obj, val) static VALUE -make_struct(name, members, klass) - VALUE name, members, klass; +make_struct(id, members, klass) + ID id; + VALUE members, klass; { VALUE nstr; - ID id; long i; OBJ_FREEZE(members); - if (NIL_P(name)) { + if (!id) { nstr = rb_class_new(klass); rb_make_metaclass(nstr, RBASIC(klass)->klass); @@ -190,6 +190,5 @@ make_struct(name, members, klass) } else { - char *cname = StringValuePtr(name); - id = rb_intern(cname); + char *cname = rb_id2name(id); if (!rb_is_const_id(id)) { rb_name_error(id, "identifier %s needs to be constant", cname); @@ -209,5 +208,5 @@ make_struct(name, members, klass) 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]); + id = SYM2ID(RARRAY(members)->ptr[i]); if (i<10) { rb_define_method_id(nstr, id, ref_func[i], 0); @@ -240,9 +239,10 @@ rb_struct_define(name, va_alist) { va_list ar; - VALUE nm, ary; + ID nm; + VALUE ary; char *mem; if (!name) nm = Qnil; - else nm = rb_str_new2(name); + else nm = rb_intern(name); ary = rb_ary_new(); @@ -307,14 +307,15 @@ rb_struct_s_def(argc, argv, klass) RARRAY(rest)->ptr[i] = ID2SYM(id); } + id = 0; if (!NIL_P(name)) { VALUE tmp = rb_check_string_type(name); + id = rb_to_id(name); if (NIL_P(tmp)) { - id = rb_to_id(name); rb_ary_unshift(rest, ID2SYM(id)); - name = Qnil; + id = 0; } } - st = make_struct(name, rest, klass); + st = make_struct(id, rest, klass); if (rb_block_given_p()) { rb_mod_module_eval(0, 0, st);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦