mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63164 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
bfbf7a350a
commit
cea438b0ca
3 changed files with 15 additions and 6 deletions
|
@ -418,7 +418,7 @@ describe "String#dump" do
|
|||
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
|
||||
|
|
12
string.c
12
string.c
|
@ -5966,7 +5966,7 @@ rb_str_dump(VALUE str)
|
|||
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)
|
|||
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) {
|
||||
|
|
|
@ -358,7 +358,10 @@ class TestM17N < Test::Unit::TestCase
|
|||
"\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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue