[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]