summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-19 01:35:04 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-19 01:35:04 +0000
commit0493b1ce3a43a33bb6298762d67e1a1b4f0a9657 (patch)
tree7553612b4b68a8f6bf2572936af3d40ecf6d11ac /string.c
parent13155d4df577a2b5fc57c6b16cd92515c2d56870 (diff)
revert r59359, r59356, r59355, r59354
These caused numerous CI failures I haven't been able to reproduce [ruby-core:82102] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59364 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c120
1 files changed, 7 insertions, 113 deletions
diff --git a/string.c b/string.c
index 932ed5e85f..2012a281d6 100644
--- a/string.c
+++ b/string.c
@@ -301,79 +301,27 @@ fstr_update_callback(st_data_t *key, st_data_t *value, st_data_t arg, int existi
}
}
-static int
-tainted_fstr_update(st_data_t *key, st_data_t *val, st_data_t arg, int existing)
-{
- VALUE *fstr = (VALUE *)arg;
- VALUE str = (VALUE)*key;
-
- if (existing) {
- /* because of lazy sweep, str may be unmarked already and swept
- * at next time */
- if (rb_objspace_garbage_object_p(str)) {
- *fstr = Qundef;
- return ST_DELETE;
- }
-
- *fstr = str;
- return ST_STOP;
- }
- else {
- str = rb_str_resurrect(str);
- RB_OBJ_TAINT_RAW(str);
- RB_FL_SET_RAW(str, RSTRING_FSTR);
- RB_OBJ_FREEZE_RAW(str);
-
- *key = *val = *fstr = str;
- return ST_CONTINUE;
- }
-}
-
-static VALUE
-register_fstring_tainted(VALUE str, st_table *tfstrings)
-{
- st_data_t fstr;
-
- do {
- fstr = (st_data_t)str;
- st_update(tfstrings, fstr, tainted_fstr_update, (st_data_t)&fstr);
- } while ((VALUE)fstr == Qundef);
-
- str = (VALUE)fstr;
- assert(OBJ_FROZEN_RAW(str));
- assert(!FL_TEST_RAW(str, STR_FAKESTR));
- assert(!FL_TEST_RAW(str, FL_EXIVAR));
- assert(FL_TEST_RAW(str, RSTRING_FSTR));
- assert(FL_TEST_RAW(str, FL_TAINT));
- assert(RBASIC_CLASS(str) == rb_cString);
-
- return str;
-}
-
RUBY_FUNC_EXPORTED
VALUE
rb_fstring(VALUE str)
{
VALUE fstr;
- int bare_ish;
+ int bare;
Check_Type(str, T_STRING);
if (FL_TEST(str, RSTRING_FSTR))
return str;
- bare_ish = !FL_TEST_RAW(str, FL_EXIVAR) && RBASIC_CLASS(str) == rb_cString;
- if (STR_EMBED_P(str) && !bare_ish) {
+ bare = BARE_STRING_P(str);
+ if (STR_EMBED_P(str) && !bare) {
OBJ_FREEZE_RAW(str);
return str;
}
- if (!FL_TEST_RAW(str, FL_TAINT)) {
- fstr = register_fstring(str);
- }
- else {
- fstr = register_fstring_tainted(str, rb_vm_tfstring_table());
- }
- if (!bare_ish) {
+
+ fstr = register_fstring(str);
+
+ if (!bare) {
str_replace_shared_without_enc(str, fstr);
OBJ_FREEZE_RAW(str);
return str;
@@ -402,59 +350,6 @@ register_fstring(VALUE str)
}
static VALUE
-rb_fstring_existing0(VALUE str)
-{
- st_table *frozen_strings = rb_vm_fstring_table();
- st_data_t fstr;
-
- if (st_lookup(frozen_strings, str, &fstr)) {
- if (rb_objspace_garbage_object_p(fstr)) {
- return register_fstring(str);
- }
- else {
- return (VALUE)fstr;
- }
- }
- return Qnil;
-}
-
-static VALUE
-rb_tainted_fstring_existing(VALUE str)
-{
- VALUE ret;
- st_data_t fstr;
- st_table *tfstrings = rb_vm_tfstring_table();
-
- if (st_lookup(tfstrings, str, &fstr)) {
- ret = (VALUE)fstr;
- if (!rb_objspace_garbage_object_p(ret)) {
- return ret;
- }
- }
- ret = rb_fstring_existing0(str);
- if (NIL_P(ret)) {
- return Qnil;
- }
- if (!RB_FL_TEST_RAW(ret, RSTRING_FSTR)) {
- return Qnil;
- }
-
- return register_fstring_tainted(str, tfstrings);
-}
-
-VALUE
-rb_fstring_existing(VALUE str)
-{
- if (FL_TEST_RAW(str, RSTRING_FSTR))
- return str;
-
- if (!RB_OBJ_TAINTED_RAW(str))
- return rb_fstring_existing0(str);
-
- return rb_tainted_fstring_existing(str);
-}
-
-static VALUE
setup_fake_str(struct RString *fake_str, const char *name, long len, int encidx)
{
fake_str->basic.flags = T_STRING|RSTRING_NOEMBED|STR_NOFREE|STR_FAKESTR;
@@ -1416,7 +1311,6 @@ rb_str_free(VALUE str)
if (FL_TEST(str, RSTRING_FSTR)) {
st_data_t fstr = (st_data_t)str;
st_delete(rb_vm_fstring_table(), &fstr, NULL);
- st_delete(rb_vm_tfstring_table(), &fstr, NULL);
RB_DEBUG_COUNTER_INC(obj_str_fstr);
}