diff --git a/ChangeLog b/ChangeLog index 95ad54934d..0f84d98906 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun May 30 03:40:44 2010 Nobuyoshi Nakada + + * parse.y (parser_tokadd_utf8, parser_tokadd_string): allow NUL + containing symbol literals, as well as String#to_sym. + [ruby-dev:41447] + Sun May 30 03:03:20 2010 NARUSE, Yui * lib/rdoc/generator/template/darkfish/classpage.rhtml: diff --git a/parse.y b/parse.y index b230edfa46..de675a2998 100644 --- a/parse.y +++ b/parse.y @@ -5487,11 +5487,6 @@ parser_tokadd_utf8(struct parser_params *parser, rb_encoding **encp, if (string_literal) tokaddmbc(codepoint, *encp); } else if (string_literal) { - if (codepoint == 0 && symbol_literal) { - yyerror("symbol cannot contain '\\u{0}'"); - return 0; - } - tokadd(codepoint); } } while (string_literal && (peek(' ') || peek('\t'))); @@ -5519,11 +5514,6 @@ parser_tokadd_utf8(struct parser_params *parser, rb_encoding **encp, if (string_literal) tokaddmbc(codepoint, *encp); } else if (string_literal) { - if (codepoint == 0 && symbol_literal) { - yyerror("symbol cannot contain '\\u0000'"); - return 0; - } - tokadd(codepoint); } } @@ -5879,11 +5869,6 @@ parser_tokadd_string(struct parser_params *parser, pushback(c); break; } - if (!c && (func & STR_FUNC_SYMBOL)) { - func &= ~STR_FUNC_SYMBOL; - compile_error(PARSER_ARG "symbol cannot contain '\\0'"); - continue; - } if (c & 0x80) { has_nonascii = 1; if (enc != *encp) { diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index 49ecfc56ed..14990be12c 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -491,14 +491,16 @@ class TestParse < Test::Unit::TestCase end def test_symbol - assert_raise(SyntaxError) do - eval ":'foo\0bar'" + bug = '[ruby-dev:41447]' + sym = "foo\0bar".to_sym + assert_nothing_raised(SyntaxError, bug) do + assert_equal(sym, eval(":'foo\0bar'")) end - assert_raise(SyntaxError) do - eval ':"foo\u0000bar"' + assert_nothing_raised(SyntaxError, bug) do + assert_equal(sym, eval(':"foo\u0000bar"')) end - assert_raise(SyntaxError) do - eval ':"foo\u{0}bar"' + assert_nothing_raised(SyntaxError, bug) do + assert_equal(sym, eval(':"foo\u{0}bar"')) end assert_raise(SyntaxError) do eval ':"foo\u{}bar"' diff --git a/test/ruby/test_unicode_escape.rb b/test/ruby/test_unicode_escape.rb index 5887dbc3dc..088f81ce14 100644 --- a/test/ruby/test_unicode_escape.rb +++ b/test/ruby/test_unicode_escape.rb @@ -57,12 +57,14 @@ EOS assert_equal(:"\u{41}", :"\u0041") assert_equal(:ΓΌ, :"\u{fc}") - # the NUL character is not allowed in symbols - assert_raise(SyntaxError) { eval %q(:"\u{0}")} - assert_raise(SyntaxError) { eval %q(:"\u0000")} - assert_raise(SyntaxError) { eval %q(:"\u{fc 0 0041}")} - assert_raise(SyntaxError) { eval %q(:"\x00")} - assert_raise(SyntaxError) { eval %q(:"\0")} + # the NUL character is allowed in symbols + bug = '[ruby-dev:41447]' + sym = "\0".to_sym + assert_nothing_raised(SyntaxError, bug) {assert_equal(sym, eval(%q(:"\u{0}")))} + assert_nothing_raised(SyntaxError, bug) {assert_equal(sym, eval(%q(:"\u0000")))} + assert_nothing_raised(SyntaxError, bug) {assert_equal("\u{fc}\0A".to_sym, eval(%q(:"\u{fc 0 0041}")))} + assert_nothing_raised(SyntaxError, bug) {assert_equal(sym, eval(%q(:"\x00")))} + assert_nothing_raised(SyntaxError, bug) {assert_equal(sym, eval(%q(:"\0")))} end def test_regexp