diff options
-rwxr-xr-x | Zend/tests/bug31341.phpt | 2 | ||||
-rwxr-xr-x | Zend/tests/bug35411.phpt | 19 | ||||
-rw-r--r-- | Zend/zend_compile.c | 2 | ||||
-rw-r--r-- | Zend/zend_highlight.c | 6 | ||||
-rw-r--r-- | Zend/zend_language_scanner.l | 18 |
5 files changed, 37 insertions, 10 deletions
diff --git a/Zend/tests/bug31341.phpt b/Zend/tests/bug31341.phpt index 2f68006a07..309a54d76b 100755 --- a/Zend/tests/bug31341.phpt +++ b/Zend/tests/bug31341.phpt @@ -20,7 +20,7 @@ foreach ($a as $v) { --EXPECT-- '$ \{ ' ' \{ $' -' {$ ' +' \{$ ' ' $\{ ' ' $\{ ' ' \{$ ' diff --git a/Zend/tests/bug35411.phpt b/Zend/tests/bug35411.phpt new file mode 100755 index 0000000000..90957aa57c --- /dev/null +++ b/Zend/tests/bug35411.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #35411 (Regression with \{$ handling) +--FILE-- +<?php +$abc = "bar"; +echo "foo\{$abc}baz\n"; +echo "foo\{ $abc}baz\n"; +echo <<<TEST +foo{$abc}baz +foo\{$abc}baz +foo\{ $abc}baz +TEST; +?> +--EXPECT-- +foo\{bar}baz +foo\{ bar}baz +foobarbaz +foo\{bar}baz +foo\{ bar}baz diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d0642735bf..c40b4845e6 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3998,6 +3998,8 @@ again: case T_END_HEREDOC: efree(zendlval->u.constant.value.str.val); break; + case EOF: + return EOF; } INIT_PZVAL(&zendlval->u.constant); diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index cbd269ed29..d32b79c7b5 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -164,6 +164,8 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini if (token.type == IS_STRING) { switch (token_type) { + case EOF: + goto done; case T_OPEN_TAG: case T_OPEN_TAG_WITH_ECHO: case T_CLOSE_TAG: @@ -180,6 +182,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini } token.type = 0; } +done: if (last_color != syntax_highlighter_ini->highlight_html) { zend_printf("</span>\n"); } @@ -208,6 +211,9 @@ ZEND_API void zend_strip(TSRMLS_D) case T_DOC_COMMENT: token.type = 0; continue; + + case EOF: + return; case T_END_HEREDOC: { char *ptr = LANG_SCNG(yy_text); diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index a5738c37a2..332e5c0bf8 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1469,8 +1469,8 @@ NEWLINE ("\r"|"\n"|"\r\n") zendlval->value.str.val = yytext; /* no copying - intentional */ zendlval->value.str.len = yyleng; zendlval->type = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_COMMENT; + BEGIN(INITIAL); + return EOF; } <ST_ONE_LINE_COMMENT>{NEWLINE} { @@ -1806,6 +1806,13 @@ NEWLINE ("\r"|"\n"|"\r\n") return yytext[0]; } +<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\{" { + zendlval->value.str.val = estrndup("\\{", sizeof("\\{") - 1); + zendlval->value.str.len = sizeof("\\{") - 1; + zendlval->type = IS_STRING; + return T_STRING; +} + <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"{$" { zendlval->value.lval = (long) yytext[0]; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1844,13 +1851,6 @@ NEWLINE ("\r"|"\n"|"\r\n") return T_CHARACTER; } -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\{$" { - zendlval->value.str.val = estrndup("{$", sizeof("{$")-1); - zendlval->value.str.len = sizeof("{$")-1; - zendlval->type = IS_STRING; - return T_STRING; -} - <ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\"{ANY_CHAR} { switch (yytext[1]) { case 'n': |