cvs: ZendEngine2(PHP_5_3) / zend_compile.c zend_highlight.c zend_language_parser.y zend_language_scanner.l /tests heredoc_001.phpt heredoc_002.phpt heredoc_003.phpt heredoc_004.phpt heredoc_005.phpt heredoc_006.phpt heredoc_007.phpt heredoc_008.phpt heredoc_009.phpt heredoc_010.phpt heredoc_011.phpt nowdoc.inc nowdoc_001.phpt nowdoc_002.phpt nowdoc_003.phpt nowdoc_004.phpt nowdoc_005.phpt nowdoc_006.phpt nowdoc_007.phpt nowdoc_008.phpt nowdoc_009.phpt nowdoc_010.phpt nowdoc_011.phpt nowdoc_012.phpt nowdoc_013.phpt nowdoc_014.phpt nowdoc_015.phpt php-src NEWS
[email protected] ("Dmitry Stogov")
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsdmitry1202808466@cvsserver> |
dmitry Tue Feb 12 09:27:46 2008 UTC
Added files: (Branch: PHP_5_3)
/ZendEngine2/tests heredoc_001.phpt heredoc_002.phpt
heredoc_003.phpt heredoc_004.phpt
heredoc_005.phpt heredoc_006.phpt
heredoc_007.phpt heredoc_008.phpt
heredoc_009.phpt heredoc_010.phpt
heredoc_011.phpt nowdoc.inc nowdoc_001.phpt
nowdoc_002.phpt nowdoc_003.phpt nowdoc_004.phpt
nowdoc_005.phpt nowdoc_006.phpt nowdoc_007.phpt
nowdoc_008.phpt nowdoc_009.phpt nowdoc_010.phpt
nowdoc_011.phpt nowdoc_012.phpt nowdoc_013.phpt
nowdoc_014.phpt nowdoc_015.phpt
Modified files:
/php-src NEWS
/ZendEngine2 zend_compile.c zend_highlight.c zend_language_parser.y
zend_language_scanner.l
Log:
Added NEWDOC
dmitry-20080212092746.txt
(text/plain, 12.1 KB)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.110&r2=1.2027.2.547.2.965.2.111&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.110 php-src/NEWS:1.2027.2.547.2.965.2.111
--- php-src/NEWS:1.2027.2.547.2.965.2.110 Tue Feb 12 00:24:12 2008
+++ php-src/NEWS Tue Feb 12 09:27:45 2008
@@ -2,6 +2,7 @@
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 20??, PHP 5.3.0
- Added and improved PHP syntax and semantics:
+ . Added NOWDOC. (Gwynne Raskind, Stas, Dmitry)
. Added "?:" operator. (Marcus)
. Added support for namespaces. (Dmitry, Stas, Gregory)
. Added support for Late Static Binding. (Dmitry, Etienne Kneuss)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.41&r2=1.647.2.27.2.41.2.42&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.41 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.42
--- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.41 Tue Feb 12 01:17:48 2008
+++ ZendEngine2/zend_compile.c Tue Feb 12 09:27:45 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.41 2008/02/12 01:17:48 stas Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.42 2008/02/12 09:27:45 dmitry Exp $ */
#include <zend_language_parser.h>
#include "zend.h"
@@ -4642,6 +4642,7 @@
retval = T_ECHO;
break;
case T_END_HEREDOC:
+ case T_END_NOWDOC:
efree(Z_STRVAL(zendlval->u.constant));
break;
case EOF:
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_highlight.c?r1=1.49.2.3.2.2.2.1&r2=1.49.2.3.2.2.2.2&diff_format=u
Index: ZendEngine2/zend_highlight.c
diff -u ZendEngine2/zend_highlight.c:1.49.2.3.2.2.2.1 ZendEngine2/zend_highlight.c:1.49.2.3.2.2.2.2
--- ZendEngine2/zend_highlight.c:1.49.2.3.2.2.2.1 Mon Dec 31 07:17:04 2007
+++ ZendEngine2/zend_highlight.c Tue Feb 12 09:27:45 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_highlight.c,v 1.49.2.3.2.2.2.1 2007/12/31 07:17:04 sebastian Exp $ */
+/* $Id: zend_highlight.c,v 1.49.2.3.2.2.2.2 2008/02/12 09:27:45 dmitry Exp $ */
#include "zend.h"
#include <zend_language_parser.h>
@@ -150,6 +150,7 @@
}
switch (token_type) {
case T_END_HEREDOC:
+ case T_END_NOWDOC:
zend_html_puts(token.value.str.val, token.value.str.len TSRMLS_CC);
break;
default:
@@ -172,7 +173,7 @@
efree(token.value.str.val);
break;
}
- } else if (token_type == T_END_HEREDOC) {
+ } else if (token_type == T_END_HEREDOC || token_type == T_END_NOWDOC) {
efree(token.value.str.val);
}
token.type = 0;
@@ -222,6 +223,7 @@
return;
case T_END_HEREDOC:
+ case T_END_NOWDOC:
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
efree(token.value.str.val);
/* read the following character, either newline or ; */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.8.2.16&r2=1.160.2.4.2.8.2.17&diff_format=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.16 ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.17
--- ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.16 Tue Feb 12 08:49:08 2008
+++ ZendEngine2/zend_language_parser.y Tue Feb 12 09:27:45 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.16 2008/02/12 08:49:08 dmitry Exp $ */
+/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.17 2008/02/12 09:27:45 dmitry Exp $ */
/*
* LALR shift/reduce conflicts and how they are resolved:
@@ -146,6 +146,8 @@
%token T_NAMESPACE
%token T_NS_C
%token T_DIR
+%token T_START_NOWDOC
+%token T_END_NOWDOC
%% /* Rules */
@@ -721,6 +723,7 @@
| T_METHOD_C { $$ = $1; }
| T_FUNC_C { $$ = $1; }
| T_NS_C { $$ = $1; }
+ | T_START_NOWDOC T_ENCAPSED_AND_WHITESPACE T_END_NOWDOC { $$ = $2; }
;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.l?r1=1.131.2.11.2.13.2.5&r2=1.131.2.11.2.13.2.6&diff_format=u
Index: ZendEngine2/zend_language_scanner.l
diff -u ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.5 ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.6
--- ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.5 Tue Feb 12 00:20:33 2008
+++ ZendEngine2/zend_language_scanner.l Tue Feb 12 09:27:45 2008
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_scanner.l,v 1.131.2.11.2.13.2.5 2008/02/12 00:20:33 stas Exp $ */
+/* $Id: zend_language_scanner.l,v 1.131.2.11.2.13.2.6 2008/02/12 09:27:45 dmitry Exp $ */
#define yyleng SCNG(yy_leng)
#define yytext SCNG(yy_text)
@@ -39,6 +39,9 @@
%x ST_HEREDOC
%x ST_START_HEREDOC
%x ST_END_HEREDOC
+%x ST_NOWDOC
+%x ST_START_NOWDOC
+%x ST_END_NOWDOC
%x ST_LOOKING_FOR_PROPERTY
%x ST_LOOKING_FOR_VARNAME
%x ST_VAR_OFFSET
@@ -965,6 +968,8 @@
BACKQUOTE_CHARS ("{"*([^$`\\{]|("\\"{ANY_CHAR}))|{BACKQUOTE_LITERAL_DOLLAR})
HEREDOC_CHARS ("{"*([^$\n\r\\{]|("\\"[^\n\r]))|{HEREDOC_LITERAL_DOLLAR}|({HEREDOC_NEWLINE}+({HEREDOC_NON_LABEL}|{HEREDOC_LABEL_NO_NEWLINE})))
+NOWDOC_CHARS ({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_\x7f-\xff;\n\r][^\n\r]*)|({LABEL}[;][^\n\r]+)))
+
%option noyylineno
%option noyywrap
%%
@@ -2065,6 +2070,102 @@
}
+%{
+/* BEGIN nowdoc */
+%}
+<ST_IN_SCRIPTING>b?"<<<"{TABS_AND_SPACES}[']{LABEL}[']{NEWLINE} {
+ int bprefix = (yytext[0] != '<') ? 1 : 0;
+ char *s;
+ CG(zend_lineno)++;
+ /* 3 is <<<, 2 is quotes, 1 is newline */
+ CG(heredoc_len) = yyleng-bprefix-3-2-1-(yytext[yyleng-2]=='\r'?1:0);
+ s = yytext+bprefix+3;
+ while ((*s == ' ') || (*s == '\t')) {
+ s++;
+ CG(heredoc_len)--;
+ }
+ s++; /* first quote */
+ CG(heredoc) = estrndup(s, CG(heredoc_len));
+ BEGIN(ST_START_NOWDOC);
+ return T_START_NOWDOC;
+}
+
+<ST_START_NOWDOC>{ANY_CHAR} {
+ yyless(0);
+ BEGIN(ST_NOWDOC);
+}
+
+<ST_START_NOWDOC>{LABEL}";"?[\r\n] {
+ int label_len = yyleng - 1;
+
+ if (yytext[label_len-1]==';') {
+ label_len--;
+ }
+
+ if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) {
+ yyless(label_len-1);
+ yyleng = 0;
+ BEGIN(ST_END_NOWDOC);
+ ZVAL_EMPTY_STRING(zendlval);
+ return T_ENCAPSED_AND_WHITESPACE;
+ } else {
+ yyless(label_len);
+ yymore();
+ BEGIN(ST_NOWDOC);
+ }
+}
+
+<ST_NOWDOC>{NOWDOC_CHARS}*{NEWLINE}+{LABEL}";"?[\n\r] {
+ char *end = yytext + yyleng - 1;
+
+ if (end[-1] == ';') {
+ end--;
+ yyleng--;
+ }
+
+ if (yyleng > CG(heredoc_len) && !memcmp(end - CG(heredoc_len), CG(heredoc), CG(heredoc_len))) {
+ int len = yyleng - CG(heredoc_len) - 2; /* 2 for newline before and after label */
+
+ if (len > 0 && yytext[len - 1] == '\r' && yytext[len] == '\n') {
+ len--;
+ }
+
+ /* Go back before last label char, to match in ST_END_HEREDOC state */
+ yyless(yyleng - 2);
+
+ /* Subtract the remaining label length. yyleng must include newline
+ * before label, for zend_highlight/strip, tokenizer, etc. */
+ yyleng -= CG(heredoc_len) - 1;
+
+ CG(increment_lineno) = 1; /* For newline before label */
+ BEGIN(ST_END_NOWDOC);
+
+ HANDLE_NEWLINES(yytext, len);
+ zend_copy_value(zendlval, yytext, len);
+ zendlval->type = IS_STRING;
+ return T_ENCAPSED_AND_WHITESPACE;
+ } else {
+ /* Go back to end of label, so the next match works correctly in case of
+ * a variable or another label at the beginning of the next line */
+ yyless(yyleng - 1);
+ yymore();
+ }
+}
+
+<ST_END_NOWDOC>{ANY_CHAR} {
+ Z_STRVAL_P(zendlval) = CG(heredoc);
+ Z_STRLEN_P(zendlval) = CG(heredoc_len);
+ yytext = CG(heredoc);
+ yyleng = CG(heredoc_len);
+ CG(heredoc) = NULL;
+ CG(heredoc_len) = 0;
+ BEGIN(ST_IN_SCRIPTING);
+ return T_END_NOWDOC;
+}
+%{
+/* END nowdoc */
+%}
+
<ST_DOUBLE_QUOTES>["] {
BEGIN(ST_IN_SCRIPTING);
return '"';
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_001.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_001.phpt
+++ ZendEngine2/tests/heredoc_001.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_002.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_002.phpt
+++ ZendEngine2/tests/heredoc_002.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_003.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_003.phpt
+++ ZendEngine2/tests/heredoc_003.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_004.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_004.phpt
+++ ZendEngine2/tests/heredoc_004.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_005.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_005.phpt
+++ ZendEngine2/tests/heredoc_005.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_006.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_006.phpt
+++ ZendEngine2/tests/heredoc_006.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_007.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_007.phpt
+++ ZendEngine2/tests/heredoc_007.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_008.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_008.phpt
+++ ZendEngine2/tests/heredoc_008.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_009.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_009.phpt
+++ ZendEngine2/tests/heredoc_009.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_010.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_010.phpt
+++ ZendEngine2/tests/heredoc_010.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/heredoc_011.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/heredoc_011.phpt
+++ ZendEngine2/tests/heredoc_011.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc.inc?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc.inc
+++ ZendEngine2/tests/nowdoc.inc
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_001.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_001.phpt
+++ ZendEngine2/tests/nowdoc_001.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_002.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_002.phpt
+++ ZendEngine2/tests/nowdoc_002.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_003.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_003.phpt
+++ ZendEngine2/tests/nowdoc_003.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_004.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_004.phpt
+++ ZendEngine2/tests/nowdoc_004.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_005.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_005.phpt
+++ ZendEngine2/tests/nowdoc_005.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_006.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_006.phpt
+++ ZendEngine2/tests/nowdoc_006.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_007.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_007.phpt
+++ ZendEngine2/tests/nowdoc_007.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_008.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_008.phpt
+++ ZendEngine2/tests/nowdoc_008.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_009.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_009.phpt
+++ ZendEngine2/tests/nowdoc_009.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_010.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_010.phpt
+++ ZendEngine2/tests/nowdoc_010.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_011.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_011.phpt
+++ ZendEngine2/tests/nowdoc_011.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_012.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_012.phpt
+++ ZendEngine2/tests/nowdoc_012.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_013.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_013.phpt
+++ ZendEngine2/tests/nowdoc_013.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_014.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_014.phpt
+++ ZendEngine2/tests/nowdoc_014.phpt
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/nowdoc_015.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/nowdoc_015.phpt
+++ ZendEngine2/tests/nowdoc_015.phpt