ruby-changes:50957
From: nobu <ko1@a...>
Date: Mon, 16 Apr 2018 16:12:10 +0900 (JST)
Subject: [ruby-changes:50957] nobu:r63164 (trunk): string.c: fix dumped suffix
nobu 2018-04-16 16:12:06 +0900 (Mon, 16 Apr 2018) New Revision: 63164 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63164 Log: string.c: fix dumped suffix * string.c (rb_str_dump): get rid of an error on evaling with frozen-string-literal enabled. [ruby-core:86539] [Bug #14687] Modified files: trunk/spec/ruby/core/string/dump_spec.rb trunk/string.c trunk/test/ruby/test_m17n.rb Index: spec/ruby/core/string/dump_spec.rb =================================================================== --- spec/ruby/core/string/dump_spec.rb (revision 63163) +++ spec/ruby/core/string/dump_spec.rb (revision 63164) @@ -418,7 +418,7 @@ describe "String#dump" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/string/dump_spec.rb#L418 end it "includes .force_encoding(name) if the encoding isn't ASCII compatible" do - "\u{876}".encode('utf-16be').dump.should == "\"\\bv\".force_encoding(\"UTF-16BE\")" - "\u{876}".encode('utf-16le').dump.should == "\"v\\b\".force_encoding(\"UTF-16LE\")" + "\u{876}".encode('utf-16be').dump.end_with?(".force_encoding(\"UTF-16BE\")").should be_true + "\u{876}".encode('utf-16le').dump.end_with?(".force_encoding(\"UTF-16LE\")").should be_true end end Index: test/ruby/test_m17n.rb =================================================================== --- test/ruby/test_m17n.rb (revision 63163) +++ test/ruby/test_m17n.rb (revision 63164) @@ -358,7 +358,10 @@ class TestM17N < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_m17n.rb#L358 "\u3042".encode("UTF-16LE"), "\u3042".encode("UTF-16BE"), ].each do |str| - assert_equal(str, eval(str.dump), "[ruby-dev:33142]") + dump = str.dump + assert_equal(str, eval(dump), "[ruby-dev:33142]") + assert_equal(str, dump.undump) + assert_equal(str, eval("# frozen-string-literal: true\n#{dump}"), '[Bug #14687]') end end Index: string.c =================================================================== --- string.c (revision 63163) +++ string.c (revision 63164) @@ -5966,7 +5966,7 @@ rb_str_dump(VALUE str) https://github.com/ruby/ruby/blob/trunk/string.c#L5966 char *q, *qend; VALUE result; int u8 = (encidx == rb_utf8_encindex()); - static const char nonascii_suffix[] = ".force_encoding(\"%s\")"; + static const char nonascii_suffix[] = ".dup.force_encoding(\"%s\")"; len = 2; /* "" */ if (!rb_enc_asciicompat(enc)) { @@ -6285,13 +6285,19 @@ str_undump(VALUE str) https://github.com/ruby/ruby/blob/trunk/string.c#L6285 break; } else { + static const char force_encoding_suffix[] = ".force_encoding\(\""; + static const char dup_suffix[] = ".dup"; const char *encname; int encidx; ptrdiff_t size; - size = rb_strlen_lit(".force_encoding(\""); + /* check separately for strings dumped by older versions */ + size = sizeof(dup_suffix) - 1; + if (s_end - s > size && memcmp(s, dup_suffix, size) == 0) s += size; + + size = sizeof(force_encoding_suffix) - 1; if (s_end - s <= size) goto invalid_format; - if (memcmp(s, ".force_encoding(\"", size) != 0) goto invalid_format; + if (memcmp(s, force_encoding_suffix, size) != 0) goto invalid_format; s += size; if (utf8) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/