From: Ilia Alshanetsky Date: Tue, 13 Dec 2005 21:00:49 +0000 (+0000) Subject: MFB51: Fixed bug #35655 (whitespace following end of heredoc is lost). X-Git-Tag: RELEASE_1_0_4~395 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4cb1bf0e9e6a056ae3426e947ff9921e886983b1;p=php MFB51: Fixed bug #35655 (whitespace following end of heredoc is lost). --- 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-- + +--EXPECT-- +foo\{bar}baz +foo\{ bar}baz +foobarbaz +foo\{bar}baz +foo\{ bar}baz diff --git a/Zend/tests/bug35655.phpt b/Zend/tests/bug35655.phpt new file mode 100755 index 0000000000..30f00cb32e --- /dev/null +++ b/Zend/tests/bug35655.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #35655 (whitespace following end of heredoc is lost) +--FILE-- +'; +highlight_string($code); +?> +--EXPECT-- + +
<? 
  $x 
= <<<EOT
some string    
EOT
  
$y 2;
?> +
+
diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index 30d7e6fce6..62f082234d 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -78,7 +78,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini int token_type; char *last_color = syntax_highlighter_ini->highlight_html; char *next_color; - int in_string=0, post_heredoc = 0; + int in_string=0; CG(literal_type) = IS_STRING; zend_printf(""); @@ -136,14 +136,9 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini switch (token_type) { case T_END_HEREDOC: zend_html_puts(token.value.str.val, token.value.str.len TSRMLS_CC); - post_heredoc = 1; break; default: zend_html_puts(LANG_SCNG(yy_text), LANG_SCNG(yy_leng) TSRMLS_CC); - if (post_heredoc) { - zend_html_putc('\n'); - post_heredoc = 0; - } break; } @@ -196,19 +191,21 @@ 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); - - zend_write(ptr, LANG_SCNG(yy_leng) - 1); - /* The ensure that we only write one ; and that it followed by the required newline */ - zend_write("\n", sizeof("\n") - 1); - if (ptr[LANG_SCNG(yy_leng) - 1] == ';') { - lex_scan(&token TSRMLS_CC); - } - efree(Z_UNIVAL(token)); - } - break; + case T_END_HEREDOC: + zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng)); + efree(token.value.str.val); + /* read the following character, either newline or ; */ + if (lex_scan(&token TSRMLS_CC) != T_WHITESPACE) { + zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng)); + } + zend_write("\n", sizeof("\n") - 1); + prev_space = 1; + token.type = 0; + continue; default: zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng)); diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 57a6330ac2..a3cd55ef9f 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -2285,7 +2285,6 @@ NEWLINE ("\r"|"\n"|"\r\n") ^{LABEL}(";")?{NEWLINE} { int label_len; - unsigned char unput_semicolon; CG(zend_lineno)++; if (yytext[yyleng-2]=='\r') { @@ -2296,17 +2295,12 @@ NEWLINE ("\r"|"\n"|"\r\n") if (yytext[label_len-1]==';') { label_len--; - unput_semicolon=1; - } else{ - unput_semicolon=0; } if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) { zendlval->value.str.val = estrndup(yytext, label_len); /* unput destroys yytext */ zendlval->value.str.len = label_len; - if (unput_semicolon) { - unput(';'); - } + yyless(yyleng - (yyleng - label_len)); efree(CG(heredoc)); CG(heredoc)=NULL; CG(heredoc_len)=0; diff --git a/ext/tokenizer/tests/bug26463.phpt b/ext/tokenizer/tests/bug26463.phpt index 7480aa2f59..679ffe3c37 100644 --- a/ext/tokenizer/tests/bug26463.phpt +++ b/ext/tokenizer/tests/bug26463.phpt @@ -14,11 +14,11 @@ DDDD; var_dump(token_get_all($str)); ?> --EXPECTF-- -array(17) { +array(19) { [0]=> array(2) { [0]=> - int(%d) + int(367) [1]=> string(6) " array(2) { [0]=> - int(%d) + int(309) [1]=> string(2) "$x" } @@ -35,7 +35,7 @@ array(17) { [3]=> array(2) { [0]=> - int(%d) + int(371) [1]=> string(6) "<<
array(2) { [0]=> - int(%d) + int(307) [1]=> string(13) "jhdsjkfhjdsh " @@ -51,67 +51,83 @@ array(17) { [5]=> array(2) { [0]=> - int(%d) + int(372) [1]=> string(2) "DD" } [6]=> - string(1) "." + array(2) { + [0]=> + int(370) + [1]=> + string(1) " +" + } [7]=> + string(1) "." + [8]=> array(2) { [0]=> - int(%d) + int(315) [1]=> string(2) """" } - [8]=> - string(1) ";" [9]=> + string(1) ";" + [10]=> array(2) { [0]=> - int(%d) + int(370) [1]=> string(1) " " } - [10]=> + [11]=> array(2) { [0]=> - int(%d) + int(309) [1]=> string(2) "$a" } - [11]=> - string(1) "=" [12]=> + string(1) "=" + [13]=> array(2) { [0]=> - int(%d) + int(371) [1]=> string(8) "<< + [14]=> array(2) { [0]=> - int(%d) + int(307) [1]=> string(13) "jhdsjkfhjdsh " } - [14]=> + [15]=> array(2) { [0]=> - int(%d) + int(372) [1]=> string(4) "DDDD" } - [15]=> - string(1) ";" [16]=> + string(1) ";" + [17]=> + array(2) { + [0]=> + int(370) + [1]=> + string(1) " +" + } + [18]=> array(2) { [0]=> - int(%d) + int(369) [1]=> string(2) "?>" }