diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-07-19 01:35:04 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-07-19 01:35:04 +0000 |
commit | 0493b1ce3a43a33bb6298762d67e1a1b4f0a9657 (patch) | |
tree | 7553612b4b68a8f6bf2572936af3d40ecf6d11ac /string.c | |
parent | 13155d4df577a2b5fc57c6b16cd92515c2d56870 (diff) | |
download | ruby-0493b1ce3a43a33bb6298762d67e1a1b4f0a9657.tar.gz |
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.c | 120 |
1 files changed, 7 insertions, 113 deletions
@@ -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); } |