From: Nobuyoshi Nakada Date: 2008-01-23T02:07:00+09:00 Subject: [ruby-dev:33282] fronzen string cannot unpack("p") なかだです。 1.9で、pack("p")してできたStringをfreezeすると、unpackできなくな ります。1.8ではできます。 $ ruby19 -v -e '[""].pack("p").freeze.unpack("p")' ruby 1.9.0 (2008-01-22 revision 15165) [i686-linux] -e:1:in `unpack': no associated pointer (ArgumentError) from -e:1:in `
' Index: string.c =================================================================== --- string.c (revision 15173) +++ string.c (working copy) @@ -772,4 +772,5 @@ rb_str_associate(VALUE str, VALUE add) } FL_SET(str, STR_ASSOC); + RBASIC(add)->klass = 0; RSTRING(str)->as.heap.aux.shared = add; } @@ -780,6 +781,7 @@ rb_str_associated(VALUE str) { if (STR_ASSOC_P(str)) { - if (OBJ_FROZEN(str)) return Qfalse; - return RSTRING(str)->as.heap.aux.shared; + VALUE ary = RSTRING(str)->as.heap.aux.shared; + if (OBJ_FROZEN(str)) OBJ_FREEZE(ary); + return ary; } return Qfalse; @@ -954,4 +956,8 @@ VALUE rb_str_freeze(VALUE str) { + if (STR_ASSOC_P(str)) { + VALUE ary = RSTRING(str)->as.heap.aux.shared; + OBJ_FREEZE(ary); + } return rb_obj_freeze(str); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦