[#18440] racc segv revisited — "Akinori MUSHA" <knu@...>

 次のバグの件なんですが、現時点では原因究明を含めて未解決という

24 messages 2002/10/02
[#18617] Re: racc segv revisited — "Akinori MUSHA" <knu@...> 2002/11/02

At Wed, 2 Oct 2002 23:19:59 +0900,

[ruby-dev:18537] symbol literal with non-alphanumeric

From: nobu.nakada@...
Date: 2002-10-18 14:27:28 UTC
List: ruby-dev #18537
なかだです。

以前シンボルリテラル記法の拡張の話があったような気がしますが、
どこにいったのか分からないのであらためて提案してみます。

  :'abc-def' == 'abc-def'.intern
  :"abc\xa1\xa1" == "abc\xa1\xa1".intern
  %s{abc-def} == 'abc-def'.intern

の三つです。


Index: parse.y
===================================================================
RCS file: /cvs/ruby/src/ruby/parse.y,v
retrieving revision 1.223
diff -u -2 -p -r1.223 parse.y
--- parse.y	18 Oct 2002 14:13:41 -0000	1.223
+++ parse.y	18 Oct 2002 14:14:17 -0000
@@ -1956,4 +1956,13 @@ sym		: fname
 		| tGVAR
 		| tCVAR
+		| tSTRING_CONTENT tSTRING_END
+		    {
+			$$ = rb_intern(RSTRING($1->nd_lit)->ptr);
+			rb_gc_force_recycle((VALUE)$1);
+		    }
+		| tSTRING_END
+		    {
+			yyerror("empty symbol literal");
+		    }
 		;
 
@@ -2771,4 +2780,5 @@ regx_options()
 #define STR_FUNC_REGEXP 0x04
 #define STR_FUNC_QWORDS 0x08
+#define STR_FUNC_SYMBOL 0x10
 #define STR_FUNC_INDENT 0x20
 
@@ -2780,4 +2790,6 @@ enum string_type {
     str_sword  = (STR_FUNC_QWORDS),
     str_dword  = (STR_FUNC_QWORDS|STR_FUNC_EXPAND),
+    str_ssym   = (STR_FUNC_SYMBOL),
+    str_dsym   = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND),
 };
 
@@ -2852,4 +2864,9 @@ tokadd_string(func, term, paren)
 	    break;
 	}
+	if (!c && (func & STR_FUNC_SYMBOL)) {
+	    func &= ~STR_FUNC_SYMBOL;
+	    rb_compile_error("symbol cannot contain '\\0'");
+	    continue;
+	}
 	tokadd(c);
     }
@@ -3763,9 +3780,20 @@ yylex()
 	    return tCOLON2;
 	}
-	pushback(c);
 	if (lex_state == EXPR_END || lex_state == EXPR_ENDARG || ISSPACE(c)) {
+	    pushback(c);
 	    lex_state = EXPR_BEG;
 	    return ':';
 	}
+	switch (c) {
+	  case '\'':
+	    lex_strterm = NEW_STRTERM(str_ssym, c, 0);
+	    break;
+	  case '"':
+	    lex_strterm = NEW_STRTERM(str_dsym, c, 0);
+	    break;
+	  default:
+	    pushback(c);
+	    break;
+	}
 	lex_state = EXPR_FNAME;
 	return tSYMBEG;
@@ -3968,4 +3996,9 @@ yylex()
 		lex_strterm = NEW_STRTERM(str_regexp, term, paren);
 		return tREGEXP_BEG;
+
+	      case 's':
+		lex_strterm = NEW_STRTERM(str_ssym, term, paren);
+		lex_state = EXPR_FNAME;
+		return tSYMBEG;
 
 	      default:


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next