ruby-changes:3691
From: ko1@a...
Date: Wed, 23 Jan 2008 15:04:28 +0900 (JST)
Subject: [ruby-changes:3691] nobu - Ruby:r15180 (trunk): * string.c (str_make_independent): should set length.
nobu 2008-01-23 15:04:13 +0900 (Wed, 23 Jan 2008) New Revision: 15180 Modified files: trunk/ChangeLog trunk/string.c trunk/test/ruby/test_pack.rb Log: * string.c (str_make_independent): should set length. * string.c (rb_str_associate): hide associated array from ObjectSpace. * string.c (rb_str_associated): return associated array with freezing instead of false. [ruby-dev:33282] * string.c (rb_str_freeze): freeze associated array together. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_pack.rb?r1=15180&r2=15179&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15180&r2=15179&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15180&r2=15179&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15179) +++ ChangeLog (revision 15180) @@ -1,3 +1,14 @@ +Wed Jan 23 15:04:11 2008 Nobuyoshi Nakada <nobu@r...> + + * string.c (str_make_independent): should set length. + + * string.c (rb_str_associate): hide associated array from ObjectSpace. + + * string.c (rb_str_associated): return associated array with freezing + instead of false. [ruby-dev:33282] + + * string.c (rb_str_freeze): freeze associated array together. + Wed Jan 23 13:39:48 2008 Tanaka Akira <akr@f...> * re.c (rb_reg_prepare_re): fix SEGV by Index: string.c =================================================================== --- string.c (revision 15179) +++ string.c (revision 15180) @@ -742,6 +742,7 @@ STR_SET_NOEMBED(str); ptr[len] = 0; RSTRING(str)->as.heap.ptr = ptr; + RSTRING(str)->as.heap.len = len; RSTRING(str)->as.heap.aux.capa = len; STR_UNSET_NOCAPA(str); } @@ -771,6 +772,7 @@ RESIZE_CAPA(str, RSTRING_LEN(str)); } FL_SET(str, STR_ASSOC); + RBASIC(add)->klass = 0; RSTRING(str)->as.heap.aux.shared = add; } } @@ -779,8 +781,9 @@ 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; } @@ -953,6 +956,10 @@ 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); } Index: test/ruby/test_pack.rb =================================================================== --- test/ruby/test_pack.rb (revision 15179) +++ test/ruby/test_pack.rb (revision 15180) @@ -57,4 +57,18 @@ assert_raises(RangeError) { [0x80000000].pack("U") } assert_raises(RangeError) { [0x100000000].pack("U") } end + + def test_pack_P + a = ["abc"] + assert_equal a, a.pack("P").unpack("P*") + assert_equal "a", a.pack("P").unpack("P")[0] + assert_equal a, a.pack("P").freeze.unpack("P*") + end + + def test_pack_p + a = ["abc"] + assert_equal a, a.pack("p").unpack("p*") + assert_equal a[0], a.pack("p").unpack("p")[0] + assert_equal a, a.pack("p").freeze.unpack("p*") + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/