diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-01-23 06:04:13 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-01-23 06:04:13 +0000 |
| commit | 145b0de7023adeb4730210ec8e7404c4abe06d88 (patch) | |
| tree | 41e21e35c7e13ca5d540430fdaee2cabfe1baf85 /string.c | |
| parent | bab10f0e74fe89d53dd900290c09bbee292c863c (diff) | |
| download | ruby-145b0de7023adeb4730210ec8e7404c4abe06d88.tar.gz ruby-145b0de7023adeb4730210ec8e7404c4abe06d88.tar.xz ruby-145b0de7023adeb4730210ec8e7404c4abe06d88.zip | |
* 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.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@15180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
| -rw-r--r-- | string.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -742,6 +742,7 @@ str_make_independent(VALUE str) 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 @@ rb_str_associate(VALUE str, VALUE add) 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 @@ VALUE 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 @@ rb_str_substr(VALUE str, long beg, long len) 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); } |
