summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-16 04:55:14 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-16 04:55:14 +0000
commitb93479b8d9b8f0f95844d8e53ad954445177af00 (patch)
tree2ab3eafa7c7820209707824cabea6de573c1244e /string.c
parentc2b7884076865795a309a93eda6589a66150e968 (diff)
* string.c (str_mod_check): frozen check should be separated.
[ruby-core:3742] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7280 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/string.c b/string.c
index bf95d610c1..7648e446aa 100644
--- a/string.c
+++ b/string.c
@@ -45,11 +45,20 @@ str_mod_check(s, p, len)
char *p;
long len;
{
- if (RSTRING(s)->ptr != p || RSTRING(s)->len != len || OBJ_FROZEN(s)) {
+ if (RSTRING(s)->ptr != p || RSTRING(s)->len != len){
rb_raise(rb_eRuntimeError, "string modified");
}
}
+static inline void
+str_frozen_check(s)
+ VALUE s;
+{
+ if (OBJ_FROZEN(s)) {
+ rb_raise(rb_eRuntimeError, "string frozen");
+ }
+}
+
static VALUE str_alloc _((VALUE));
static VALUE
str_alloc(klass)
@@ -1963,6 +1972,7 @@ rb_str_sub_bang(argc, argv, str)
rb_match_busy(match);
repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match)));
str_mod_check(str, p, len);
+ str_frozen_check(str);
rb_backref_set(match);
}
else {
@@ -2082,6 +2092,7 @@ str_gsub(argc, argv, str, bang)
rb_match_busy(match);
val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match)));
str_mod_check(str, sp, slen);
+ str_frozen_check(str);
if (val == dest) { /* paranoid chack [ruby-dev:24827] */
rb_raise(rb_eRuntimeError, "block should not cheat");
}