]> granicus.if.org Git - php/commitdiff
PHP scanner optimization
authorDmitry Stogov <dmitry@zend.com>
Wed, 14 Mar 2018 22:33:17 +0000 (01:33 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 14 Mar 2018 22:33:17 +0000 (01:33 +0300)
Zend/zend_language_scanner.c
Zend/zend_language_scanner.l

index 62bb7b576c10ab75fdaf12e20899c3f9c6c984ee..d0a6ce212642593cb5240b158ddd33860a770650 100644 (file)
@@ -876,6 +876,8 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
                SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); \
                ZVAL_STRINGL(zendlval, s, sz); \
                efree(s); \
+       } else if (yyleng == 1) { \
+               ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext))); \
        } else { \
                ZVAL_STRINGL(zendlval, yytext, yyleng); \
        }
@@ -885,11 +887,38 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
        register char *s, *t;
        char *end;
 
+       if (len <= 1) {
+               if (len < 1) {
+                       ZVAL_EMPTY_STRING(zendlval);
+               } else {
+                       zend_uchar c = (zend_uchar)*str;
+                       if (c == '\n' || c == '\r') {
+                               CG(zend_lineno)++;
+                       }
+                       ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+               }
+               goto skip_escape_conversion;
+       }
+
        ZVAL_STRINGL(zendlval, str, len);
 
        /* convert escape sequences */
-       s = t = Z_STRVAL_P(zendlval);
+       s = Z_STRVAL_P(zendlval);
        end = s+Z_STRLEN_P(zendlval);
+       while (1) {
+               if (UNEXPECTED(*s=='\\')) {
+                       break;
+               }
+               if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+                       CG(zend_lineno)++;
+               }
+               s++;
+               if (s == end) {
+                       goto skip_escape_conversion;
+               }
+       }
+
+       t = s;
        while (s<end) {
                if (*s=='\\') {
                        s++;
@@ -901,23 +930,18 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                        switch(*s) {
                                case 'n':
                                        *t++ = '\n';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'r':
                                        *t++ = '\r';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 't':
                                        *t++ = '\t';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'f':
                                        *t++ = '\f';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'v':
                                        *t++ = '\v';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'e':
 #ifdef ZEND_WIN32
@@ -925,7 +949,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
 #else
                                        *t++ = '\e';
 #endif
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case '"':
                                case '`':
@@ -937,20 +960,15 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                                case '\\':
                                case '$':
                                        *t++ = *s;
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'x':
                                case 'X':
                                        if (ZEND_IS_HEX(*(s+1))) {
                                                char hex_buf[3] = { 0, 0, 0 };
 
-                                               Z_STRLEN_P(zendlval)--; /* for the 'x' */
-
                                                hex_buf[0] = *(++s);
-                                               Z_STRLEN_P(zendlval)--;
                                                if (ZEND_IS_HEX(*(s+1))) {
                                                        hex_buf[1] = *(++s);
-                                                       Z_STRLEN_P(zendlval)--;
                                                }
                                                *t++ = (char) ZEND_STRTOL(hex_buf, NULL, 16);
                                        } else {
@@ -966,7 +984,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                                                size_t len = 0;
                                                zend_bool valid = 1;
                                                unsigned long codepoint;
-                                               size_t byte_len = 0;
 
                                                if (*start != '{') {
                                                        /* we silently let this pass to avoid breaking code
@@ -1022,27 +1039,20 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
 
                                                /* based on https://en.wikipedia.org/wiki/UTF-8#Sample_code */
                                                if (codepoint < 0x80) {
-                                                       byte_len = 1;
                                                        *t++ = codepoint;
                                                } else if (codepoint <= 0x7FF) {
-                                                       byte_len = 2;
                                                        *t++ = (codepoint >> 6) + 0xC0;
                                                        *t++ = (codepoint & 0x3F) + 0x80;
                                                } else if (codepoint <= 0xFFFF) {
-                                                       byte_len = 3;
                                                        *t++ = (codepoint >> 12) + 0xE0;
                                                        *t++ = ((codepoint >> 6) & 0x3F) + 0x80;
                                                        *t++ = (codepoint & 0x3F) + 0x80;
                                                } else if (codepoint <= 0x10FFFF) {
-                                                       byte_len = 4;
                                                        *t++ = (codepoint >> 18) + 0xF0;
                                                        *t++ = ((codepoint >> 12) & 0x3F) + 0x80;
                                                        *t++ = ((codepoint >> 6) & 0x3F) + 0x80;
                                                        *t++ = (codepoint & 0x3F) + 0x80;
                                                }
-
-                                               Z_STRLEN_P(zendlval) -= 2; /* \u */
-                                               Z_STRLEN_P(zendlval) -= (len - byte_len);
                                        }
                                        break;
                                default:
@@ -1051,13 +1061,10 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                                                char octal_buf[4] = { 0, 0, 0, 0 };
 
                                                octal_buf[0] = *s;
-                                               Z_STRLEN_P(zendlval)--;
                                                if (ZEND_IS_OCT(*(s+1))) {
                                                        octal_buf[1] = *(++s);
-                                                       Z_STRLEN_P(zendlval)--;
                                                        if (ZEND_IS_OCT(*(s+1))) {
                                                                octal_buf[2] = *(++s);
-                                                               Z_STRLEN_P(zendlval)--;
                                                        }
                                                }
                                                if (octal_buf[2] &&
@@ -1083,6 +1090,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                s++;
        }
        *t = 0;
+       Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+
+skip_escape_conversion:
        if (SCNG(output_filter)) {
                size_t sz = 0;
                unsigned char *str;
@@ -1131,7 +1141,7 @@ restart:
        SCNG(yy_text) = YYCURSOR;
 
 
-#line 1135 "Zend/zend_language_scanner.c"
+#line 1145 "Zend/zend_language_scanner.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -1183,7 +1193,7 @@ yyc_INITIAL:
 yy4:
        YYDEBUG(4, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 1840 "Zend/zend_language_scanner.l"
+#line 1854 "Zend/zend_language_scanner.l"
        {
        if (YYCURSOR > YYLIMIT) {
                RETURN_TOKEN(END);
@@ -1222,13 +1232,15 @@ inline_char_handler:
                if (readsize < yyleng) {
                        yyless(readsize);
                }
+       } else if (yyleng == 1) {
+               ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext));
        } else {
-         ZVAL_STRINGL(zendlval, yytext, yyleng);
+               ZVAL_STRINGL(zendlval, yytext, yyleng);
        }
        HANDLE_NEWLINES(yytext, yyleng);
        RETURN_TOKEN_WITH_VAL(T_INLINE_HTML);
 }
-#line 1232 "Zend/zend_language_scanner.c"
+#line 1244 "Zend/zend_language_scanner.c"
 yy5:
        YYDEBUG(5, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -1244,7 +1256,7 @@ yy5:
 yy7:
        YYDEBUG(7, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1842 "Zend/zend_language_scanner.l"
        {
        if (CG(short_tags)) {
                BEGIN(ST_IN_SCRIPTING);
@@ -1256,13 +1268,13 @@ yy7:
                goto inline_char_handler;
        }
 }
-#line 1260 "Zend/zend_language_scanner.c"
+#line 1272 "Zend/zend_language_scanner.c"
 yy8:
        YYDEBUG(8, *YYCURSOR);
        ++YYCURSOR;
        YYDEBUG(9, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 1809 "Zend/zend_language_scanner.l"
+#line 1823 "Zend/zend_language_scanner.l"
        {
        BEGIN(ST_IN_SCRIPTING);
        if (PARSER_MODE()) {
@@ -1270,7 +1282,7 @@ yy8:
        }
        RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO);
 }
-#line 1274 "Zend/zend_language_scanner.c"
+#line 1286 "Zend/zend_language_scanner.c"
 yy10:
        YYDEBUG(10, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -1301,7 +1313,7 @@ yy14:
 yy15:
        YYDEBUG(15, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 1818 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
        {
        HANDLE_NEWLINE(yytext[yyleng-1]);
        BEGIN(ST_IN_SCRIPTING);
@@ -1310,7 +1322,7 @@ yy15:
        }
        RETURN_TOKEN(T_OPEN_TAG);
 }
-#line 1314 "Zend/zend_language_scanner.c"
+#line 1326 "Zend/zend_language_scanner.c"
 yy16:
        YYDEBUG(16, *YYCURSOR);
        ++YYCURSOR;
@@ -1367,7 +1379,7 @@ yyc_ST_BACKQUOTE:
 yy20:
                YYDEBUG(20, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2268 "Zend/zend_language_scanner.l"
+#line 2305 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                RETURN_TOKEN(END);
@@ -1412,7 +1424,7 @@ yy20:
                RETURN_TOKEN(T_ERROR);
        }
 }
-#line 1416 "Zend/zend_language_scanner.c"
+#line 1428 "Zend/zend_language_scanner.c"
 yy21:
                YYDEBUG(21, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1436,12 +1448,12 @@ yy22:
                ++YYCURSOR;
                YYDEBUG(23, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2208 "Zend/zend_language_scanner.l"
+#line 2245 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        RETURN_TOKEN('`');
 }
-#line 1445 "Zend/zend_language_scanner.c"
+#line 1457 "Zend/zend_language_scanner.c"
 yy24:
                YYDEBUG(24, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1462,34 +1474,34 @@ yy25:
 yy27:
                YYDEBUG(27, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1903 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1470 "Zend/zend_language_scanner.c"
+#line 1482 "Zend/zend_language_scanner.c"
 yy28:
                YYDEBUG(28, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(29, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1609 "Zend/zend_language_scanner.l"
+#line 1619 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME);
        RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
 }
-#line 1481 "Zend/zend_language_scanner.c"
+#line 1493 "Zend/zend_language_scanner.c"
 yy30:
                YYDEBUG(30, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(31, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2196 "Zend/zend_language_scanner.l"
+#line 2233 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING);
        yyless(1);
        RETURN_TOKEN(T_CURLY_OPEN);
 }
-#line 1493 "Zend/zend_language_scanner.c"
+#line 1505 "Zend/zend_language_scanner.c"
 yy32:
                YYDEBUG(32, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1503,13 +1515,13 @@ yy34:
                ++YYCURSOR;
                YYDEBUG(35, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1897 "Zend/zend_language_scanner.l"
+#line 1913 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET);
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1513 "Zend/zend_language_scanner.c"
+#line 1525 "Zend/zend_language_scanner.c"
 yy36:
                YYDEBUG(36, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1527,13 +1539,13 @@ yy37:
                ++YYCURSOR;
                YYDEBUG(38, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1889 "Zend/zend_language_scanner.l"
+#line 1905 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY);
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1537 "Zend/zend_language_scanner.c"
+#line 1549 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_DOUBLE_QUOTES:
@@ -1586,7 +1598,7 @@ yyc_ST_DOUBLE_QUOTES:
 yy42:
                YYDEBUG(42, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2214 "Zend/zend_language_scanner.l"
+#line 2251 "Zend/zend_language_scanner.l"
                {
        if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
                YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -1639,18 +1651,18 @@ double_quotes_scan_done:
                RETURN_TOKEN(T_ERROR);
        }
 }
-#line 1643 "Zend/zend_language_scanner.c"
+#line 1655 "Zend/zend_language_scanner.c"
 yy43:
                YYDEBUG(43, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(44, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2203 "Zend/zend_language_scanner.l"
+#line 2240 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        RETURN_TOKEN('"');
 }
-#line 1654 "Zend/zend_language_scanner.c"
+#line 1666 "Zend/zend_language_scanner.c"
 yy45:
                YYDEBUG(45, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1689,34 +1701,34 @@ yy47:
 yy49:
                YYDEBUG(49, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1903 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1697 "Zend/zend_language_scanner.c"
+#line 1709 "Zend/zend_language_scanner.c"
 yy50:
                YYDEBUG(50, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(51, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1609 "Zend/zend_language_scanner.l"
+#line 1619 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME);
        RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
 }
-#line 1708 "Zend/zend_language_scanner.c"
+#line 1720 "Zend/zend_language_scanner.c"
 yy52:
                YYDEBUG(52, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(53, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2196 "Zend/zend_language_scanner.l"
+#line 2233 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING);
        yyless(1);
        RETURN_TOKEN(T_CURLY_OPEN);
 }
-#line 1720 "Zend/zend_language_scanner.c"
+#line 1732 "Zend/zend_language_scanner.c"
 yy54:
                YYDEBUG(54, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1730,13 +1742,13 @@ yy56:
                ++YYCURSOR;
                YYDEBUG(57, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1897 "Zend/zend_language_scanner.l"
+#line 1913 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET);
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1740 "Zend/zend_language_scanner.c"
+#line 1752 "Zend/zend_language_scanner.c"
 yy58:
                YYDEBUG(58, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1754,13 +1766,13 @@ yy59:
                ++YYCURSOR;
                YYDEBUG(60, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1889 "Zend/zend_language_scanner.l"
+#line 1905 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY);
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1764 "Zend/zend_language_scanner.c"
+#line 1776 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_END_HEREDOC:
@@ -1771,7 +1783,7 @@ yyc_ST_END_HEREDOC:
        ++YYCURSOR;
        YYDEBUG(64, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2182 "Zend/zend_language_scanner.l"
+#line 2219 "Zend/zend_language_scanner.l"
        {
        zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack));
 
@@ -1784,7 +1796,7 @@ yyc_ST_END_HEREDOC:
        BEGIN(ST_IN_SCRIPTING);
        RETURN_TOKEN(T_END_HEREDOC);
 }
-#line 1788 "Zend/zend_language_scanner.c"
+#line 1800 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_HEREDOC:
        {
@@ -1832,7 +1844,7 @@ yyc_ST_HEREDOC:
 yy68:
                YYDEBUG(68, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2314 "Zend/zend_language_scanner.l"
+#line 2351 "Zend/zend_language_scanner.l"
                {
        int newline = 0;
 
@@ -1909,7 +1921,7 @@ heredoc_scan_done:
                RETURN_TOKEN(T_ERROR);
        }
 }
-#line 1913 "Zend/zend_language_scanner.c"
+#line 1925 "Zend/zend_language_scanner.c"
 yy69:
                YYDEBUG(69, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1948,34 +1960,34 @@ yy71:
 yy73:
                YYDEBUG(73, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1903 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1956 "Zend/zend_language_scanner.c"
+#line 1968 "Zend/zend_language_scanner.c"
 yy74:
                YYDEBUG(74, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(75, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1609 "Zend/zend_language_scanner.l"
+#line 1619 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME);
        RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES);
 }
-#line 1967 "Zend/zend_language_scanner.c"
+#line 1979 "Zend/zend_language_scanner.c"
 yy76:
                YYDEBUG(76, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(77, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2196 "Zend/zend_language_scanner.l"
+#line 2233 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING);
        yyless(1);
        RETURN_TOKEN(T_CURLY_OPEN);
 }
-#line 1979 "Zend/zend_language_scanner.c"
+#line 1991 "Zend/zend_language_scanner.c"
 yy78:
                YYDEBUG(78, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1989,13 +2001,13 @@ yy80:
                ++YYCURSOR;
                YYDEBUG(81, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1897 "Zend/zend_language_scanner.l"
+#line 1913 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET);
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 1999 "Zend/zend_language_scanner.c"
+#line 2011 "Zend/zend_language_scanner.c"
 yy82:
                YYDEBUG(82, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2013,13 +2025,13 @@ yy83:
                ++YYCURSOR;
                YYDEBUG(84, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1889 "Zend/zend_language_scanner.l"
+#line 1905 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY);
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 2023 "Zend/zend_language_scanner.c"
+#line 2035 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_IN_SCRIPTING:
@@ -2188,7 +2200,7 @@ yy87:
                ++YYCURSOR;
                YYDEBUG(88, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2449 "Zend/zend_language_scanner.l"
+#line 2486 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                RETURN_TOKEN(END);
@@ -2197,7 +2209,7 @@ yy87:
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 2201 "Zend/zend_language_scanner.c"
+#line 2213 "Zend/zend_language_scanner.c"
 yy89:
                YYDEBUG(89, *YYCURSOR);
                ++YYCURSOR;
@@ -2209,11 +2221,11 @@ yy89:
                }
                YYDEBUG(91, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1315 "Zend/zend_language_scanner.l"
+#line 1325 "Zend/zend_language_scanner.l"
                {
        goto return_whitespace;
 }
-#line 2217 "Zend/zend_language_scanner.c"
+#line 2229 "Zend/zend_language_scanner.c"
 yy92:
                YYDEBUG(92, *YYCURSOR);
                ++YYCURSOR;
@@ -2221,17 +2233,17 @@ yy92:
 yy93:
                YYDEBUG(93, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1598 "Zend/zend_language_scanner.l"
+#line 1608 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(yytext[0]);
 }
-#line 2229 "Zend/zend_language_scanner.c"
+#line 2241 "Zend/zend_language_scanner.c"
 yy94:
                YYDEBUG(94, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(95, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2082 "Zend/zend_language_scanner.l"
+#line 2119 "Zend/zend_language_scanner.l"
                {
        int bprefix = (yytext[0] != '"') ? 1 : 0;
 
@@ -2276,13 +2288,13 @@ yy94:
        BEGIN(ST_DOUBLE_QUOTES);
        RETURN_TOKEN('"');
 }
-#line 2280 "Zend/zend_language_scanner.c"
+#line 2292 "Zend/zend_language_scanner.c"
 yy96:
                YYDEBUG(96, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(97, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1930 "Zend/zend_language_scanner.l"
+#line 1946 "Zend/zend_language_scanner.l"
                {
        while (YYCURSOR < YYLIMIT) {
                switch (*YYCURSOR++) {
@@ -2314,7 +2326,7 @@ yy96:
        }
        RETURN_TOKEN(T_COMMENT);
 }
-#line 2318 "Zend/zend_language_scanner.c"
+#line 2330 "Zend/zend_language_scanner.c"
 yy98:
                YYDEBUG(98, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2345,7 +2357,7 @@ yy101:
                ++YYCURSOR;
                YYDEBUG(102, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2013 "Zend/zend_language_scanner.l"
+#line 2029 "Zend/zend_language_scanner.l"
                {
        register char *s, *t;
        char *end;
@@ -2372,37 +2384,58 @@ yy101:
                }
        }
 
+       if (yyleng-bprefix-2 <= 1) {
+               if (yyleng-bprefix-2 < 1) {
+                       ZVAL_EMPTY_STRING(zendlval);
+               } else {
+                       zend_uchar c = (zend_uchar)*(yytext+bprefix+1);
+                       if (c == '\n' || c == '\r') {
+                               CG(zend_lineno)++;
+                       }
+                       ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+               }
+               goto skip_escape_conversion;
+       }
        ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2);
 
        /* convert escape sequences */
-       s = t = Z_STRVAL_P(zendlval);
+       s = Z_STRVAL_P(zendlval);
        end = s+Z_STRLEN_P(zendlval);
+       while (1) {
+               if (UNEXPECTED(*s=='\\')) {
+                       break;
+               }
+               if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+                       CG(zend_lineno)++;
+               }
+               s++;
+               if (s == end) {
+                       goto skip_escape_conversion;
+               }
+       }
+
+       t = s;
        while (s<end) {
                if (*s=='\\') {
                        s++;
-
-                       switch(*s) {
-                               case '\\':
-                               case '\'':
-                                       *t++ = *s;
-                                       Z_STRLEN_P(zendlval)--;
-                                       break;
-                               default:
-                                       *t++ = '\\';
-                                       *t++ = *s;
-                                       break;
+                       if (*s == '\\' || *s == '\'') {
+                               *t++ = *s;
+                       } else {
+                               *t++ = '\\';
+                               *t++ = *s;
                        }
                } else {
                        *t++ = *s;
                }
-
                if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
                        CG(zend_lineno)++;
                }
                s++;
        }
        *t = 0;
+       Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
 
+skip_escape_conversion:
        if (SCNG(output_filter)) {
                size_t sz = 0;
                char *str = NULL;
@@ -2413,7 +2446,7 @@ yy101:
        }
        RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING);
 }
-#line 2417 "Zend/zend_language_scanner.c"
+#line 2450 "Zend/zend_language_scanner.c"
 yy103:
                YYDEBUG(103, *YYCURSOR);
                yyaccept = 0;
@@ -2543,7 +2576,7 @@ yy110:
 yy111:
                YYDEBUG(111, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1667 "Zend/zend_language_scanner.l"
+#line 1677 "Zend/zend_language_scanner.l"
                {
        char *end;
        if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
@@ -2594,7 +2627,7 @@ yy111:
        ZEND_ASSERT(!errno);
        RETURN_TOKEN_WITH_VAL(T_LNUMBER);
 }
-#line 2598 "Zend/zend_language_scanner.c"
+#line 2631 "Zend/zend_language_scanner.c"
 yy112:
                YYDEBUG(112, *YYCURSOR);
                yyaccept = 1;
@@ -2675,11 +2708,11 @@ yy119:
 yy120:
                YYDEBUG(120, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1925 "Zend/zend_language_scanner.l"
+#line 1941 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_STRING, 0);
 }
-#line 2683 "Zend/zend_language_scanner.c"
+#line 2716 "Zend/zend_language_scanner.c"
 yy121:
                YYDEBUG(121, *YYCURSOR);
                yyaccept = 2;
@@ -2964,11 +2997,11 @@ yy142:
                ++YYCURSOR;
                YYDEBUG(143, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1338 "Zend/zend_language_scanner.l"
+#line 1348 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_NS_SEPARATOR);
 }
-#line 2972 "Zend/zend_language_scanner.c"
+#line 3005 "Zend/zend_language_scanner.c"
 yy144:
                YYDEBUG(144, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2984,23 +3017,23 @@ yy146:
                ++YYCURSOR;
                YYDEBUG(147, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2176 "Zend/zend_language_scanner.l"
+#line 2213 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_BACKQUOTE);
        RETURN_TOKEN('`');
 }
-#line 2993 "Zend/zend_language_scanner.c"
+#line 3026 "Zend/zend_language_scanner.c"
 yy148:
                YYDEBUG(148, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(149, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1603 "Zend/zend_language_scanner.l"
+#line 1613 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING);
        RETURN_TOKEN('{');
 }
-#line 3004 "Zend/zend_language_scanner.c"
+#line 3037 "Zend/zend_language_scanner.c"
 yy150:
                YYDEBUG(150, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3012,7 +3045,7 @@ yy151:
                ++YYCURSOR;
                YYDEBUG(152, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1615 "Zend/zend_language_scanner.l"
+#line 1625 "Zend/zend_language_scanner.l"
                {
        RESET_DOC_COMMENT();
        if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -3020,7 +3053,7 @@ yy151:
        }
        RETURN_TOKEN('}');
 }
-#line 3024 "Zend/zend_language_scanner.c"
+#line 3057 "Zend/zend_language_scanner.c"
 yy153:
                YYDEBUG(153, *YYCURSOR);
                ++YYCURSOR;
@@ -3028,11 +3061,11 @@ yy153:
 yy154:
                YYDEBUG(154, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1502 "Zend/zend_language_scanner.l"
+#line 1512 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IS_NOT_EQUAL);
 }
-#line 3036 "Zend/zend_language_scanner.c"
+#line 3069 "Zend/zend_language_scanner.c"
 yy155:
                YYDEBUG(155, *YYCURSOR);
                ++YYCURSOR;
@@ -3057,41 +3090,41 @@ yy155:
 yy157:
                YYDEBUG(157, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1903 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 3065 "Zend/zend_language_scanner.c"
+#line 3098 "Zend/zend_language_scanner.c"
 yy158:
                YYDEBUG(158, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(159, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1546 "Zend/zend_language_scanner.l"
+#line 1556 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_MOD_EQUAL);
 }
-#line 3075 "Zend/zend_language_scanner.c"
+#line 3108 "Zend/zend_language_scanner.c"
 yy160:
                YYDEBUG(160, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(161, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1574 "Zend/zend_language_scanner.l"
+#line 1584 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_BOOLEAN_AND);
 }
-#line 3085 "Zend/zend_language_scanner.c"
+#line 3118 "Zend/zend_language_scanner.c"
 yy162:
                YYDEBUG(162, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(163, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1558 "Zend/zend_language_scanner.l"
+#line 1568 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_AND_EQUAL);
 }
-#line 3095 "Zend/zend_language_scanner.c"
+#line 3128 "Zend/zend_language_scanner.c"
 yy164:
                YYDEBUG(164, *YYCURSOR);
                ++YYCURSOR;
@@ -3221,72 +3254,72 @@ yy176:
                if ((yych = *YYCURSOR) == '=') goto yy289;
                YYDEBUG(177, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1530 "Zend/zend_language_scanner.l"
+#line 1540 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_POW);
 }
-#line 3229 "Zend/zend_language_scanner.c"
+#line 3262 "Zend/zend_language_scanner.c"
 yy178:
                YYDEBUG(178, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(179, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1526 "Zend/zend_language_scanner.l"
+#line 1536 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_MUL_EQUAL);
 }
-#line 3239 "Zend/zend_language_scanner.c"
+#line 3272 "Zend/zend_language_scanner.c"
 yy180:
                YYDEBUG(180, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(181, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1482 "Zend/zend_language_scanner.l"
+#line 1492 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_INC);
 }
-#line 3249 "Zend/zend_language_scanner.c"
+#line 3282 "Zend/zend_language_scanner.c"
 yy182:
                YYDEBUG(182, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(183, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1518 "Zend/zend_language_scanner.l"
+#line 1528 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_PLUS_EQUAL);
 }
-#line 3259 "Zend/zend_language_scanner.c"
+#line 3292 "Zend/zend_language_scanner.c"
 yy184:
                YYDEBUG(184, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(185, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1486 "Zend/zend_language_scanner.l"
+#line 1496 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DEC);
 }
-#line 3269 "Zend/zend_language_scanner.c"
+#line 3302 "Zend/zend_language_scanner.c"
 yy186:
                YYDEBUG(186, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(187, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1522 "Zend/zend_language_scanner.l"
+#line 1532 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_MINUS_EQUAL);
 }
-#line 3279 "Zend/zend_language_scanner.c"
+#line 3312 "Zend/zend_language_scanner.c"
 yy188:
                YYDEBUG(188, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(189, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1310 "Zend/zend_language_scanner.l"
+#line 1320 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_PROPERTY);
        RETURN_TOKEN(T_OBJECT_OPERATOR);
 }
-#line 3290 "Zend/zend_language_scanner.c"
+#line 3323 "Zend/zend_language_scanner.c"
 yy190:
                YYDEBUG(190, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3309,7 +3342,7 @@ yy191:
 yy193:
                YYDEBUG(193, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1767 "Zend/zend_language_scanner.l"
+#line 1781 "Zend/zend_language_scanner.l"
                {
        const char *end;
 
@@ -3318,17 +3351,17 @@ yy193:
        ZEND_ASSERT(end == yytext + yyleng);
        RETURN_TOKEN_WITH_VAL(T_DNUMBER);
 }
-#line 3322 "Zend/zend_language_scanner.c"
+#line 3355 "Zend/zend_language_scanner.c"
 yy194:
                YYDEBUG(194, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(195, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1542 "Zend/zend_language_scanner.l"
+#line 1552 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CONCAT_EQUAL);
 }
-#line 3332 "Zend/zend_language_scanner.c"
+#line 3365 "Zend/zend_language_scanner.c"
 yy196:
                YYDEBUG(196, *YYCURSOR);
                yyaccept = 4;
@@ -3337,7 +3370,7 @@ yy196:
 yy197:
                YYDEBUG(197, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1962 "Zend/zend_language_scanner.l"
+#line 1978 "Zend/zend_language_scanner.l"
                {
        int doc_com;
 
@@ -3376,17 +3409,17 @@ yy197:
        }
        RETURN_TOKEN(T_COMMENT);
 }
-#line 3380 "Zend/zend_language_scanner.c"
+#line 3413 "Zend/zend_language_scanner.c"
 yy198:
                YYDEBUG(198, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(199, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1538 "Zend/zend_language_scanner.l"
+#line 1548 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DIV_EQUAL);
 }
-#line 3390 "Zend/zend_language_scanner.c"
+#line 3423 "Zend/zend_language_scanner.c"
 yy200:
                YYDEBUG(200, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3418,11 +3451,11 @@ yy203:
                ++YYCURSOR;
                YYDEBUG(204, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1334 "Zend/zend_language_scanner.l"
+#line 1344 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM);
 }
-#line 3426 "Zend/zend_language_scanner.c"
+#line 3459 "Zend/zend_language_scanner.c"
 yy205:
                YYDEBUG(205, *YYCURSOR);
                yyaccept = 5;
@@ -3433,22 +3466,22 @@ yy205:
 yy206:
                YYDEBUG(206, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1590 "Zend/zend_language_scanner.l"
+#line 1600 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_SL);
 }
-#line 3441 "Zend/zend_language_scanner.c"
+#line 3474 "Zend/zend_language_scanner.c"
 yy207:
                YYDEBUG(207, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '>') goto yy307;
                YYDEBUG(208, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1510 "Zend/zend_language_scanner.l"
+#line 1520 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL);
 }
-#line 3452 "Zend/zend_language_scanner.c"
+#line 3485 "Zend/zend_language_scanner.c"
 yy209:
                YYDEBUG(209, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3459,42 +3492,42 @@ yy210:
                if ((yych = *YYCURSOR) == '=') goto yy309;
                YYDEBUG(211, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1498 "Zend/zend_language_scanner.l"
+#line 1508 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IS_EQUAL);
 }
-#line 3467 "Zend/zend_language_scanner.c"
+#line 3500 "Zend/zend_language_scanner.c"
 yy212:
                YYDEBUG(212, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(213, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1466 "Zend/zend_language_scanner.l"
+#line 1476 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DOUBLE_ARROW);
 }
-#line 3477 "Zend/zend_language_scanner.c"
+#line 3510 "Zend/zend_language_scanner.c"
 yy214:
                YYDEBUG(214, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(215, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1514 "Zend/zend_language_scanner.l"
+#line 1524 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IS_GREATER_OR_EQUAL);
 }
-#line 3487 "Zend/zend_language_scanner.c"
+#line 3520 "Zend/zend_language_scanner.c"
 yy216:
                YYDEBUG(216, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy311;
                YYDEBUG(217, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1594 "Zend/zend_language_scanner.l"
+#line 1604 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_SR);
 }
-#line 3498 "Zend/zend_language_scanner.c"
+#line 3531 "Zend/zend_language_scanner.c"
 yy218:
                YYDEBUG(218, *YYCURSOR);
                ++YYCURSOR;
@@ -3503,7 +3536,7 @@ yy218:
 yy219:
                YYDEBUG(219, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2001 "Zend/zend_language_scanner.l"
+#line 2017 "Zend/zend_language_scanner.l"
                {
        BEGIN(INITIAL);
        if (yytext[yyleng-1] != '>') {
@@ -3514,17 +3547,17 @@ yy219:
        }
        RETURN_TOKEN(T_CLOSE_TAG);
 }
-#line 3518 "Zend/zend_language_scanner.c"
+#line 3551 "Zend/zend_language_scanner.c"
 yy220:
                YYDEBUG(220, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(221, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1346 "Zend/zend_language_scanner.l"
+#line 1356 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_COALESCE);
 }
-#line 3528 "Zend/zend_language_scanner.c"
+#line 3561 "Zend/zend_language_scanner.c"
 yy222:
                YYDEBUG(222, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3551,11 +3584,11 @@ yy225:
                }
                YYDEBUG(226, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1250 "Zend/zend_language_scanner.l"
+#line 1260 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_AS);
 }
-#line 3559 "Zend/zend_language_scanner.c"
+#line 3592 "Zend/zend_language_scanner.c"
 yy227:
                YYDEBUG(227, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3641,11 +3674,11 @@ yy234:
                }
                YYDEBUG(235, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1218 "Zend/zend_language_scanner.l"
+#line 1228 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DO);
 }
-#line 3649 "Zend/zend_language_scanner.c"
+#line 3682 "Zend/zend_language_scanner.c"
 yy236:
                YYDEBUG(236, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3730,11 +3763,11 @@ yy247:
                }
                YYDEBUG(248, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1194 "Zend/zend_language_scanner.l"
+#line 1204 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IF);
 }
-#line 3738 "Zend/zend_language_scanner.c"
+#line 3771 "Zend/zend_language_scanner.c"
 yy249:
                YYDEBUG(249, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3795,11 +3828,11 @@ yy255:
                }
                YYDEBUG(256, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1578 "Zend/zend_language_scanner.l"
+#line 1588 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_LOGICAL_OR);
 }
-#line 3803 "Zend/zend_language_scanner.c"
+#line 3836 "Zend/zend_language_scanner.c"
 yy257:
                YYDEBUG(257, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3913,11 +3946,11 @@ yy270:
                ++YYCURSOR;
                YYDEBUG(271, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1566 "Zend/zend_language_scanner.l"
+#line 1576 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_XOR_EQUAL);
 }
-#line 3921 "Zend/zend_language_scanner.c"
+#line 3954 "Zend/zend_language_scanner.c"
 yy272:
                YYDEBUG(272, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3945,31 +3978,31 @@ yy273:
                ++YYCURSOR;
                YYDEBUG(274, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1562 "Zend/zend_language_scanner.l"
+#line 1572 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_OR_EQUAL);
 }
-#line 3953 "Zend/zend_language_scanner.c"
+#line 3986 "Zend/zend_language_scanner.c"
 yy275:
                YYDEBUG(275, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(276, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1570 "Zend/zend_language_scanner.l"
+#line 1580 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_BOOLEAN_OR);
 }
-#line 3963 "Zend/zend_language_scanner.c"
+#line 3996 "Zend/zend_language_scanner.c"
 yy277:
                YYDEBUG(277, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(278, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1494 "Zend/zend_language_scanner.l"
+#line 1504 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IS_NOT_IDENTICAL);
 }
-#line 3973 "Zend/zend_language_scanner.c"
+#line 4006 "Zend/zend_language_scanner.c"
 yy279:
                YYDEBUG(279, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4035,21 +4068,21 @@ yy289:
                ++YYCURSOR;
                YYDEBUG(290, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1534 "Zend/zend_language_scanner.l"
+#line 1544 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_POW_EQUAL);
 }
-#line 4043 "Zend/zend_language_scanner.c"
+#line 4076 "Zend/zend_language_scanner.c"
 yy291:
                YYDEBUG(291, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(292, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1342 "Zend/zend_language_scanner.l"
+#line 1352 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ELLIPSIS);
 }
-#line 4053 "Zend/zend_language_scanner.c"
+#line 4086 "Zend/zend_language_scanner.c"
 yy293:
                YYDEBUG(293, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4073,7 +4106,7 @@ yy294:
                }
                YYDEBUG(296, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1639 "Zend/zend_language_scanner.l"
+#line 1649 "Zend/zend_language_scanner.l"
                {
        char *bin = yytext + 2; /* Skip "0b" */
        int len = yyleng - 2;
@@ -4101,7 +4134,7 @@ yy294:
                RETURN_TOKEN_WITH_VAL(T_DNUMBER);
        }
 }
-#line 4105 "Zend/zend_language_scanner.c"
+#line 4138 "Zend/zend_language_scanner.c"
 yy297:
                YYDEBUG(297, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4127,7 +4160,7 @@ yy300:
                }
                YYDEBUG(302, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1718 "Zend/zend_language_scanner.l"
+#line 1728 "Zend/zend_language_scanner.l"
                {
        char *hex = yytext + 2; /* Skip "0x" */
        int len = yyleng - 2;
@@ -4155,7 +4188,7 @@ yy300:
                RETURN_TOKEN_WITH_VAL(T_DNUMBER);
        }
 }
-#line 4159 "Zend/zend_language_scanner.c"
+#line 4192 "Zend/zend_language_scanner.c"
 yy303:
                YYDEBUG(303, *YYCURSOR);
                ++YYCURSOR;
@@ -4190,41 +4223,41 @@ yy305:
                ++YYCURSOR;
                YYDEBUG(306, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1550 "Zend/zend_language_scanner.l"
+#line 1560 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_SL_EQUAL);
 }
-#line 4198 "Zend/zend_language_scanner.c"
+#line 4231 "Zend/zend_language_scanner.c"
 yy307:
                YYDEBUG(307, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(308, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1506 "Zend/zend_language_scanner.l"
+#line 1516 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_SPACESHIP);
 }
-#line 4208 "Zend/zend_language_scanner.c"
+#line 4241 "Zend/zend_language_scanner.c"
 yy309:
                YYDEBUG(309, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(310, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1490 "Zend/zend_language_scanner.l"
+#line 1500 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IS_IDENTICAL);
 }
-#line 4218 "Zend/zend_language_scanner.c"
+#line 4251 "Zend/zend_language_scanner.c"
 yy311:
                YYDEBUG(311, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(312, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1554 "Zend/zend_language_scanner.l"
+#line 1564 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_SR_EQUAL);
 }
-#line 4228 "Zend/zend_language_scanner.c"
+#line 4261 "Zend/zend_language_scanner.c"
 yy313:
                YYDEBUG(313, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4248,11 +4281,11 @@ yy316:
                }
                YYDEBUG(317, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1582 "Zend/zend_language_scanner.l"
+#line 1592 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_LOGICAL_AND);
 }
-#line 4256 "Zend/zend_language_scanner.c"
+#line 4289 "Zend/zend_language_scanner.c"
 yy318:
                YYDEBUG(318, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4333,11 +4366,11 @@ yy329:
                }
                YYDEBUG(330, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1152 "Zend/zend_language_scanner.l"
+#line 1162 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_EXIT);
 }
-#line 4341 "Zend/zend_language_scanner.c"
+#line 4374 "Zend/zend_language_scanner.c"
 yy331:
                YYDEBUG(331, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4419,11 +4452,11 @@ yy339:
 yy340:
                YYDEBUG(340, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1222 "Zend/zend_language_scanner.l"
+#line 1232 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FOR);
 }
-#line 4427 "Zend/zend_language_scanner.c"
+#line 4460 "Zend/zend_language_scanner.c"
 yy341:
                YYDEBUG(341, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4492,11 +4525,11 @@ yy351:
                }
                YYDEBUG(352, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1350 "Zend/zend_language_scanner.l"
+#line 1360 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_NEW);
 }
-#line 4500 "Zend/zend_language_scanner.c"
+#line 4533 "Zend/zend_language_scanner.c"
 yy353:
                YYDEBUG(353, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4569,11 +4602,11 @@ yy362:
                }
                YYDEBUG(363, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1178 "Zend/zend_language_scanner.l"
+#line 1188 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_TRY);
 }
-#line 4577 "Zend/zend_language_scanner.c"
+#line 4610 "Zend/zend_language_scanner.c"
 yy364:
                YYDEBUG(364, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4588,11 +4621,11 @@ yy365:
                }
                YYDEBUG(366, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1414 "Zend/zend_language_scanner.l"
+#line 1424 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_USE);
 }
-#line 4596 "Zend/zend_language_scanner.c"
+#line 4629 "Zend/zend_language_scanner.c"
 yy367:
                YYDEBUG(367, *YYCURSOR);
                ++YYCURSOR;
@@ -4601,11 +4634,11 @@ yy367:
                }
                YYDEBUG(368, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1358 "Zend/zend_language_scanner.l"
+#line 1368 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_VAR);
 }
-#line 4609 "Zend/zend_language_scanner.c"
+#line 4642 "Zend/zend_language_scanner.c"
 yy369:
                YYDEBUG(369, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4620,11 +4653,11 @@ yy370:
                }
                YYDEBUG(371, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1586 "Zend/zend_language_scanner.l"
+#line 1596 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_LOGICAL_XOR);
 }
-#line 4628 "Zend/zend_language_scanner.c"
+#line 4661 "Zend/zend_language_scanner.c"
 yy372:
                YYDEBUG(372, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4838,11 +4871,11 @@ yy401:
                }
                YYDEBUG(402, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1262 "Zend/zend_language_scanner.l"
+#line 1272 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CASE);
 }
-#line 4846 "Zend/zend_language_scanner.c"
+#line 4879 "Zend/zend_language_scanner.c"
 yy403:
                YYDEBUG(403, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4893,11 +4926,11 @@ yy410:
                }
                YYDEBUG(411, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1282 "Zend/zend_language_scanner.l"
+#line 1292 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ECHO);
 }
-#line 4901 "Zend/zend_language_scanner.c"
+#line 4934 "Zend/zend_language_scanner.c"
 yy412:
                YYDEBUG(412, *YYCURSOR);
                ++YYCURSOR;
@@ -4921,11 +4954,11 @@ yy412:
 yy413:
                YYDEBUG(413, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1206 "Zend/zend_language_scanner.l"
+#line 1216 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ELSE);
 }
-#line 4929 "Zend/zend_language_scanner.c"
+#line 4962 "Zend/zend_language_scanner.c"
 yy414:
                YYDEBUG(414, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4970,11 +5003,11 @@ yy420:
                }
                YYDEBUG(421, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1390 "Zend/zend_language_scanner.l"
+#line 1400 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_EVAL);
 }
-#line 4978 "Zend/zend_language_scanner.c"
+#line 5011 "Zend/zend_language_scanner.c"
 yy422:
                YYDEBUG(422, *YYCURSOR);
                ++YYCURSOR;
@@ -4983,11 +5016,11 @@ yy422:
                }
                YYDEBUG(423, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1148 "Zend/zend_language_scanner.l"
+#line 1158 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_EXIT);
 }
-#line 4991 "Zend/zend_language_scanner.c"
+#line 5024 "Zend/zend_language_scanner.c"
 yy424:
                YYDEBUG(424, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5026,11 +5059,11 @@ yy429:
                }
                YYDEBUG(430, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1278 "Zend/zend_language_scanner.l"
+#line 1288 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_GOTO);
 }
-#line 5034 "Zend/zend_language_scanner.c"
+#line 5067 "Zend/zend_language_scanner.c"
 yy431:
                YYDEBUG(431, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5079,11 +5112,11 @@ yy436:
                }
                YYDEBUG(437, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1470 "Zend/zend_language_scanner.l"
+#line 1480 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_LIST);
 }
-#line 5087 "Zend/zend_language_scanner.c"
+#line 5120 "Zend/zend_language_scanner.c"
 yy438:
                YYDEBUG(438, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5270,11 +5303,11 @@ yy467:
                ++YYCURSOR;
                YYDEBUG(469, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1362 "Zend/zend_language_scanner.l"
+#line 1372 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_INT_CAST);
 }
-#line 5278 "Zend/zend_language_scanner.c"
+#line 5311 "Zend/zend_language_scanner.c"
 yy470:
                YYDEBUG(470, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5371,7 +5404,7 @@ yy480:
 yy481:
                YYDEBUG(481, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2128 "Zend/zend_language_scanner.l"
+#line 2165 "Zend/zend_language_scanner.l"
                {
        char *s;
        int bprefix = (yytext[0] != '<') ? 1 : 0;
@@ -5418,7 +5451,7 @@ yy481:
 
        RETURN_TOKEN(T_START_HEREDOC);
 }
-#line 5422 "Zend/zend_language_scanner.c"
+#line 5455 "Zend/zend_language_scanner.c"
 yy482:
                YYDEBUG(482, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5438,11 +5471,11 @@ yy484:
                }
                YYDEBUG(485, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1474 "Zend/zend_language_scanner.l"
+#line 1484 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ARRAY);
 }
-#line 5446 "Zend/zend_language_scanner.c"
+#line 5479 "Zend/zend_language_scanner.c"
 yy486:
                YYDEBUG(486, *YYCURSOR);
                ++YYCURSOR;
@@ -5451,11 +5484,11 @@ yy486:
                }
                YYDEBUG(487, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1270 "Zend/zend_language_scanner.l"
+#line 1280 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_BREAK);
 }
-#line 5459 "Zend/zend_language_scanner.c"
+#line 5492 "Zend/zend_language_scanner.c"
 yy488:
                YYDEBUG(488, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5470,11 +5503,11 @@ yy489:
                }
                YYDEBUG(490, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1182 "Zend/zend_language_scanner.l"
+#line 1192 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CATCH);
 }
-#line 5478 "Zend/zend_language_scanner.c"
+#line 5511 "Zend/zend_language_scanner.c"
 yy491:
                YYDEBUG(491, *YYCURSOR);
                ++YYCURSOR;
@@ -5483,11 +5516,11 @@ yy491:
                }
                YYDEBUG(492, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1290 "Zend/zend_language_scanner.l"
+#line 1300 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CLASS);
 }
-#line 5491 "Zend/zend_language_scanner.c"
+#line 5524 "Zend/zend_language_scanner.c"
 yy493:
                YYDEBUG(493, *YYCURSOR);
                ++YYCURSOR;
@@ -5496,11 +5529,11 @@ yy493:
                }
                YYDEBUG(494, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1354 "Zend/zend_language_scanner.l"
+#line 1364 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CLONE);
 }
-#line 5504 "Zend/zend_language_scanner.c"
+#line 5537 "Zend/zend_language_scanner.c"
 yy495:
                YYDEBUG(495, *YYCURSOR);
                ++YYCURSOR;
@@ -5509,11 +5542,11 @@ yy495:
                }
                YYDEBUG(496, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1160 "Zend/zend_language_scanner.l"
+#line 1170 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CONST);
 }
-#line 5517 "Zend/zend_language_scanner.c"
+#line 5550 "Zend/zend_language_scanner.c"
 yy497:
                YYDEBUG(497, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5546,11 +5579,11 @@ yy501:
                }
                YYDEBUG(502, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1430 "Zend/zend_language_scanner.l"
+#line 1440 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_EMPTY);
 }
-#line 5554 "Zend/zend_language_scanner.c"
+#line 5587 "Zend/zend_language_scanner.c"
 yy503:
                YYDEBUG(503, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5571,11 +5604,11 @@ yy505:
                }
                YYDEBUG(506, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1202 "Zend/zend_language_scanner.l"
+#line 1212 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ENDIF);
 }
-#line 5579 "Zend/zend_language_scanner.c"
+#line 5612 "Zend/zend_language_scanner.c"
 yy507:
                YYDEBUG(507, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5617,11 +5650,11 @@ yy510:
 yy511:
                YYDEBUG(511, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1446 "Zend/zend_language_scanner.l"
+#line 1456 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FINAL);
 }
-#line 5625 "Zend/zend_language_scanner.c"
+#line 5658 "Zend/zend_language_scanner.c"
 yy512:
                YYDEBUG(512, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5678,11 +5711,11 @@ yy520:
                }
                YYDEBUG(521, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1426 "Zend/zend_language_scanner.l"
+#line 1436 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ISSET);
 }
-#line 5686 "Zend/zend_language_scanner.c"
+#line 5719 "Zend/zend_language_scanner.c"
 yy522:
                YYDEBUG(522, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5697,11 +5730,11 @@ yy523:
                }
                YYDEBUG(524, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1286 "Zend/zend_language_scanner.l"
+#line 1296 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_PRINT);
 }
-#line 5705 "Zend/zend_language_scanner.c"
+#line 5738 "Zend/zend_language_scanner.c"
 yy525:
                YYDEBUG(525, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5752,11 +5785,11 @@ yy532:
                }
                YYDEBUG(533, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1190 "Zend/zend_language_scanner.l"
+#line 1200 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_THROW);
 }
-#line 5760 "Zend/zend_language_scanner.c"
+#line 5793 "Zend/zend_language_scanner.c"
 yy534:
                YYDEBUG(534, *YYCURSOR);
                ++YYCURSOR;
@@ -5765,11 +5798,11 @@ yy534:
                }
                YYDEBUG(535, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1298 "Zend/zend_language_scanner.l"
+#line 1308 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_TRAIT);
 }
-#line 5773 "Zend/zend_language_scanner.c"
+#line 5806 "Zend/zend_language_scanner.c"
 yy536:
                YYDEBUG(536, *YYCURSOR);
                ++YYCURSOR;
@@ -5778,11 +5811,11 @@ yy536:
                }
                YYDEBUG(537, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1462 "Zend/zend_language_scanner.l"
+#line 1472 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_UNSET);
 }
-#line 5786 "Zend/zend_language_scanner.c"
+#line 5819 "Zend/zend_language_scanner.c"
 yy538:
                YYDEBUG(538, *YYCURSOR);
                ++YYCURSOR;
@@ -5791,11 +5824,11 @@ yy538:
                }
                YYDEBUG(539, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1210 "Zend/zend_language_scanner.l"
+#line 1220 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_WHILE);
 }
-#line 5799 "Zend/zend_language_scanner.c"
+#line 5832 "Zend/zend_language_scanner.c"
 yy540:
                YYDEBUG(540, *YYCURSOR);
                yyaccept = 6;
@@ -5813,11 +5846,11 @@ yy540:
 yy541:
                YYDEBUG(541, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1174 "Zend/zend_language_scanner.l"
+#line 1184 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_YIELD);
 }
-#line 5821 "Zend/zend_language_scanner.c"
+#line 5854 "Zend/zend_language_scanner.c"
 yy542:
                YYDEBUG(542, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5909,11 +5942,11 @@ yy555:
                ++YYCURSOR;
                YYDEBUG(557, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1382 "Zend/zend_language_scanner.l"
+#line 1392 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_BOOL_CAST);
 }
-#line 5917 "Zend/zend_language_scanner.c"
+#line 5950 "Zend/zend_language_scanner.c"
 yy558:
                YYDEBUG(558, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5943,11 +5976,11 @@ yy562:
                ++YYCURSOR;
                YYDEBUG(563, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1366 "Zend/zend_language_scanner.l"
+#line 1376 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DOUBLE_CAST);
 }
-#line 5951 "Zend/zend_language_scanner.c"
+#line 5984 "Zend/zend_language_scanner.c"
 yy564:
                YYDEBUG(564, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6012,11 +6045,11 @@ yy573:
                }
                YYDEBUG(574, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1198 "Zend/zend_language_scanner.l"
+#line 1208 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ELSEIF);
 }
-#line 6020 "Zend/zend_language_scanner.c"
+#line 6053 "Zend/zend_language_scanner.c"
 yy575:
                YYDEBUG(575, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6046,11 +6079,11 @@ yy576:
 yy577:
                YYDEBUG(577, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1226 "Zend/zend_language_scanner.l"
+#line 1236 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ENDFOR);
 }
-#line 6054 "Zend/zend_language_scanner.c"
+#line 6087 "Zend/zend_language_scanner.c"
 yy578:
                YYDEBUG(578, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6095,11 +6128,11 @@ yy584:
                }
                YYDEBUG(585, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1422 "Zend/zend_language_scanner.l"
+#line 1432 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_GLOBAL);
 }
-#line 6103 "Zend/zend_language_scanner.c"
+#line 6136 "Zend/zend_language_scanner.c"
 yy586:
                YYDEBUG(586, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6156,11 +6189,11 @@ yy594:
                }
                YYDEBUG(595, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1458 "Zend/zend_language_scanner.l"
+#line 1468 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_PUBLIC);
 }
-#line 6164 "Zend/zend_language_scanner.c"
+#line 6197 "Zend/zend_language_scanner.c"
 yy596:
                YYDEBUG(596, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6175,11 +6208,11 @@ yy597:
                }
                YYDEBUG(598, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1164 "Zend/zend_language_scanner.l"
+#line 1174 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_RETURN);
 }
-#line 6183 "Zend/zend_language_scanner.c"
+#line 6216 "Zend/zend_language_scanner.c"
 yy599:
                YYDEBUG(599, *YYCURSOR);
                ++YYCURSOR;
@@ -6188,11 +6221,11 @@ yy599:
                }
                YYDEBUG(600, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1438 "Zend/zend_language_scanner.l"
+#line 1448 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_STATIC);
 }
-#line 6196 "Zend/zend_language_scanner.c"
+#line 6229 "Zend/zend_language_scanner.c"
 yy601:
                YYDEBUG(601, *YYCURSOR);
                ++YYCURSOR;
@@ -6201,11 +6234,11 @@ yy601:
                }
                YYDEBUG(602, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1254 "Zend/zend_language_scanner.l"
+#line 1264 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_SWITCH);
 }
-#line 6209 "Zend/zend_language_scanner.c"
+#line 6242 "Zend/zend_language_scanner.c"
 yy603:
                YYDEBUG(603, *YYCURSOR);
                ++YYCURSOR;
@@ -6285,11 +6318,11 @@ yy614:
                ++YYCURSOR;
                YYDEBUG(615, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1374 "Zend/zend_language_scanner.l"
+#line 1384 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ARRAY_CAST);
 }
-#line 6293 "Zend/zend_language_scanner.c"
+#line 6326 "Zend/zend_language_scanner.c"
 yy616:
                YYDEBUG(616, *YYCURSOR);
                ++YYCURSOR;
@@ -6335,11 +6368,11 @@ yy622:
                ++YYCURSOR;
                YYDEBUG(623, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1386 "Zend/zend_language_scanner.l"
+#line 1396 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_UNSET_CAST);
 }
-#line 6343 "Zend/zend_language_scanner.c"
+#line 6376 "Zend/zend_language_scanner.c"
 yy624:
                YYDEBUG(624, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6366,11 +6399,11 @@ yy627:
                }
                YYDEBUG(628, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1238 "Zend/zend_language_scanner.l"
+#line 1248 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DECLARE);
 }
-#line 6374 "Zend/zend_language_scanner.c"
+#line 6407 "Zend/zend_language_scanner.c"
 yy629:
                YYDEBUG(629, *YYCURSOR);
                ++YYCURSOR;
@@ -6379,11 +6412,11 @@ yy629:
                }
                YYDEBUG(630, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1266 "Zend/zend_language_scanner.l"
+#line 1276 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DEFAULT);
 }
-#line 6387 "Zend/zend_language_scanner.c"
+#line 6420 "Zend/zend_language_scanner.c"
 yy631:
                YYDEBUG(631, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6416,11 +6449,11 @@ yy635:
                }
                YYDEBUG(636, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1302 "Zend/zend_language_scanner.l"
+#line 1312 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_EXTENDS);
 }
-#line 6424 "Zend/zend_language_scanner.c"
+#line 6457 "Zend/zend_language_scanner.c"
 yy637:
                YYDEBUG(637, *YYCURSOR);
                ++YYCURSOR;
@@ -6429,11 +6462,11 @@ yy637:
                }
                YYDEBUG(638, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1186 "Zend/zend_language_scanner.l"
+#line 1196 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FINALLY);
 }
-#line 6437 "Zend/zend_language_scanner.c"
+#line 6470 "Zend/zend_language_scanner.c"
 yy639:
                YYDEBUG(639, *YYCURSOR);
                ++YYCURSOR;
@@ -6442,11 +6475,11 @@ yy639:
                }
                YYDEBUG(640, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1230 "Zend/zend_language_scanner.l"
+#line 1240 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FOREACH);
 }
-#line 6450 "Zend/zend_language_scanner.c"
+#line 6483 "Zend/zend_language_scanner.c"
 yy641:
                YYDEBUG(641, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6480,11 +6513,11 @@ yy643:
 yy644:
                YYDEBUG(644, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1394 "Zend/zend_language_scanner.l"
+#line 1404 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_INCLUDE);
 }
-#line 6488 "Zend/zend_language_scanner.c"
+#line 6521 "Zend/zend_language_scanner.c"
 yy645:
                YYDEBUG(645, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6517,11 +6550,11 @@ yy649:
                }
                YYDEBUG(650, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1450 "Zend/zend_language_scanner.l"
+#line 1460 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_PRIVATE);
 }
-#line 6525 "Zend/zend_language_scanner.c"
+#line 6558 "Zend/zend_language_scanner.c"
 yy651:
                YYDEBUG(651, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6549,11 +6582,11 @@ yy652:
 yy653:
                YYDEBUG(653, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1402 "Zend/zend_language_scanner.l"
+#line 1412 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_REQUIRE);
 }
-#line 6557 "Zend/zend_language_scanner.c"
+#line 6590 "Zend/zend_language_scanner.c"
 yy654:
                YYDEBUG(654, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6573,11 +6606,11 @@ yy656:
                }
                YYDEBUG(657, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1800 "Zend/zend_language_scanner.l"
+#line 1814 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_DIR);
 }
-#line 6581 "Zend/zend_language_scanner.c"
+#line 6614 "Zend/zend_language_scanner.c"
 yy658:
                YYDEBUG(658, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6622,21 +6655,21 @@ yy665:
                ++YYCURSOR;
                YYDEBUG(666, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1370 "Zend/zend_language_scanner.l"
+#line 1380 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_STRING_CAST);
 }
-#line 6630 "Zend/zend_language_scanner.c"
+#line 6663 "Zend/zend_language_scanner.c"
 yy667:
                YYDEBUG(667, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(668, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1378 "Zend/zend_language_scanner.l"
+#line 1388 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_OBJECT_CAST);
 }
-#line 6640 "Zend/zend_language_scanner.c"
+#line 6673 "Zend/zend_language_scanner.c"
 yy669:
                YYDEBUG(669, *YYCURSOR);
                ++YYCURSOR;
@@ -6645,11 +6678,11 @@ yy669:
                }
                YYDEBUG(670, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1442 "Zend/zend_language_scanner.l"
+#line 1452 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ABSTRACT);
 }
-#line 6653 "Zend/zend_language_scanner.c"
+#line 6686 "Zend/zend_language_scanner.c"
 yy671:
                YYDEBUG(671, *YYCURSOR);
                ++YYCURSOR;
@@ -6658,11 +6691,11 @@ yy671:
                }
                YYDEBUG(672, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1478 "Zend/zend_language_scanner.l"
+#line 1488 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CALLABLE);
 }
-#line 6666 "Zend/zend_language_scanner.c"
+#line 6699 "Zend/zend_language_scanner.c"
 yy673:
                YYDEBUG(673, *YYCURSOR);
                ++YYCURSOR;
@@ -6671,11 +6704,11 @@ yy673:
                }
                YYDEBUG(674, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1274 "Zend/zend_language_scanner.l"
+#line 1284 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CONTINUE);
 }
-#line 6679 "Zend/zend_language_scanner.c"
+#line 6712 "Zend/zend_language_scanner.c"
 yy675:
                YYDEBUG(675, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6702,11 +6735,11 @@ yy678:
                }
                YYDEBUG(679, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1214 "Zend/zend_language_scanner.l"
+#line 1224 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ENDWHILE);
 }
-#line 6710 "Zend/zend_language_scanner.c"
+#line 6743 "Zend/zend_language_scanner.c"
 yy680:
                YYDEBUG(680, *YYCURSOR);
                ++YYCURSOR;
@@ -6715,11 +6748,11 @@ yy680:
                }
                YYDEBUG(681, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1156 "Zend/zend_language_scanner.l"
+#line 1166 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FUNCTION);
 }
-#line 6723 "Zend/zend_language_scanner.c"
+#line 6756 "Zend/zend_language_scanner.c"
 yy682:
                YYDEBUG(682, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6787,11 +6820,11 @@ yy692:
                }
                YYDEBUG(693, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1796 "Zend/zend_language_scanner.l"
+#line 1810 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FILE);
 }
-#line 6795 "Zend/zend_language_scanner.c"
+#line 6828 "Zend/zend_language_scanner.c"
 yy694:
                YYDEBUG(694, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6812,11 +6845,11 @@ yy696:
                }
                YYDEBUG(697, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1792 "Zend/zend_language_scanner.l"
+#line 1806 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_LINE);
 }
-#line 6820 "Zend/zend_language_scanner.c"
+#line 6853 "Zend/zend_language_scanner.c"
 yy698:
                YYDEBUG(698, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6853,11 +6886,11 @@ yy703:
                }
                YYDEBUG(704, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1258 "Zend/zend_language_scanner.l"
+#line 1268 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ENDSWITCH);
 }
-#line 6861 "Zend/zend_language_scanner.c"
+#line 6894 "Zend/zend_language_scanner.c"
 yy705:
                YYDEBUG(705, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6884,11 +6917,11 @@ yy708:
                }
                YYDEBUG(709, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1418 "Zend/zend_language_scanner.l"
+#line 1428 "Zend/zend_language_scanner.l"
                {
     RETURN_TOKEN(T_INSTEADOF);
 }
-#line 6892 "Zend/zend_language_scanner.c"
+#line 6925 "Zend/zend_language_scanner.c"
 yy710:
                YYDEBUG(710, *YYCURSOR);
                ++YYCURSOR;
@@ -6897,11 +6930,11 @@ yy710:
                }
                YYDEBUG(711, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1294 "Zend/zend_language_scanner.l"
+#line 1304 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_INTERFACE);
 }
-#line 6905 "Zend/zend_language_scanner.c"
+#line 6938 "Zend/zend_language_scanner.c"
 yy712:
                YYDEBUG(712, *YYCURSOR);
                ++YYCURSOR;
@@ -6910,11 +6943,11 @@ yy712:
                }
                YYDEBUG(713, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1410 "Zend/zend_language_scanner.l"
+#line 1420 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_NAMESPACE);
 }
-#line 6918 "Zend/zend_language_scanner.c"
+#line 6951 "Zend/zend_language_scanner.c"
 yy714:
                YYDEBUG(714, *YYCURSOR);
                ++YYCURSOR;
@@ -6923,11 +6956,11 @@ yy714:
                }
                YYDEBUG(715, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1454 "Zend/zend_language_scanner.l"
+#line 1464 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_PROTECTED);
 }
-#line 6931 "Zend/zend_language_scanner.c"
+#line 6964 "Zend/zend_language_scanner.c"
 yy716:
                YYDEBUG(716, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6948,11 +6981,11 @@ yy718:
                }
                YYDEBUG(719, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1776 "Zend/zend_language_scanner.l"
+#line 1790 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_CLASS_C);
 }
-#line 6956 "Zend/zend_language_scanner.c"
+#line 6989 "Zend/zend_language_scanner.c"
 yy720:
                YYDEBUG(720, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6984,11 +7017,11 @@ yy724:
                }
                YYDEBUG(725, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1780 "Zend/zend_language_scanner.l"
+#line 1794 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_TRAIT_C);
 }
-#line 6992 "Zend/zend_language_scanner.c"
+#line 7025 "Zend/zend_language_scanner.c"
 yy726:
                YYDEBUG(726, *YYCURSOR);
                ++YYCURSOR;
@@ -6997,11 +7030,11 @@ yy726:
                }
                YYDEBUG(727, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1242 "Zend/zend_language_scanner.l"
+#line 1252 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ENDDECLARE);
 }
-#line 7005 "Zend/zend_language_scanner.c"
+#line 7038 "Zend/zend_language_scanner.c"
 yy728:
                YYDEBUG(728, *YYCURSOR);
                ++YYCURSOR;
@@ -7010,11 +7043,11 @@ yy728:
                }
                YYDEBUG(729, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1234 "Zend/zend_language_scanner.l"
+#line 1244 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_ENDFOREACH);
 }
-#line 7018 "Zend/zend_language_scanner.c"
+#line 7051 "Zend/zend_language_scanner.c"
 yy730:
                YYDEBUG(730, *YYCURSOR);
                ++YYCURSOR;
@@ -7023,11 +7056,11 @@ yy730:
                }
                YYDEBUG(731, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1306 "Zend/zend_language_scanner.l"
+#line 1316 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_IMPLEMENTS);
 }
-#line 7031 "Zend/zend_language_scanner.c"
+#line 7064 "Zend/zend_language_scanner.c"
 yy732:
                YYDEBUG(732, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7042,11 +7075,11 @@ yy733:
                }
                YYDEBUG(734, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1246 "Zend/zend_language_scanner.l"
+#line 1256 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_INSTANCEOF);
 }
-#line 7050 "Zend/zend_language_scanner.c"
+#line 7083 "Zend/zend_language_scanner.c"
 yy735:
                YYDEBUG(735, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7094,11 +7127,11 @@ yy739:
                }
                YYDEBUG(740, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1788 "Zend/zend_language_scanner.l"
+#line 1802 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_METHOD_C);
 }
-#line 7102 "Zend/zend_language_scanner.c"
+#line 7135 "Zend/zend_language_scanner.c"
 yy741:
                YYDEBUG(741, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7122,13 +7155,13 @@ yy744:
                ++YYCURSOR;
                YYDEBUG(745, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1168 "Zend/zend_language_scanner.l"
+#line 1178 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        HANDLE_NEWLINES(yytext, yyleng);
        RETURN_TOKEN(T_YIELD_FROM);
 }
-#line 7132 "Zend/zend_language_scanner.c"
+#line 7165 "Zend/zend_language_scanner.c"
 yy746:
                YYDEBUG(746, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7153,11 +7186,11 @@ yy749:
                }
                YYDEBUG(750, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1398 "Zend/zend_language_scanner.l"
+#line 1408 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_INCLUDE_ONCE);
 }
-#line 7161 "Zend/zend_language_scanner.c"
+#line 7194 "Zend/zend_language_scanner.c"
 yy751:
                YYDEBUG(751, *YYCURSOR);
                ++YYCURSOR;
@@ -7166,11 +7199,11 @@ yy751:
                }
                YYDEBUG(752, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1406 "Zend/zend_language_scanner.l"
+#line 1416 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_REQUIRE_ONCE);
 }
-#line 7174 "Zend/zend_language_scanner.c"
+#line 7207 "Zend/zend_language_scanner.c"
 yy753:
                YYDEBUG(753, *YYCURSOR);
                ++YYCURSOR;
@@ -7179,11 +7212,11 @@ yy753:
                }
                YYDEBUG(754, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1784 "Zend/zend_language_scanner.l"
+#line 1798 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_FUNC_C);
 }
-#line 7187 "Zend/zend_language_scanner.c"
+#line 7220 "Zend/zend_language_scanner.c"
 yy755:
                YYDEBUG(755, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7209,11 +7242,11 @@ yy758:
                }
                YYDEBUG(759, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1804 "Zend/zend_language_scanner.l"
+#line 1818 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_NS_C);
 }
-#line 7217 "Zend/zend_language_scanner.c"
+#line 7250 "Zend/zend_language_scanner.c"
 yy760:
                YYDEBUG(760, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7227,11 +7260,11 @@ yy761:
                }
                YYDEBUG(762, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1434 "Zend/zend_language_scanner.l"
+#line 1444 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_HALT_COMPILER);
 }
-#line 7235 "Zend/zend_language_scanner.c"
+#line 7268 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_PROPERTY:
@@ -7297,13 +7330,13 @@ yy765:
 yy766:
                YYDEBUG(766, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1328 "Zend/zend_language_scanner.l"
+#line 1338 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state();
        goto restart;
 }
-#line 7307 "Zend/zend_language_scanner.c"
+#line 7340 "Zend/zend_language_scanner.c"
 yy767:
                YYDEBUG(767, *YYCURSOR);
                ++YYCURSOR;
@@ -7315,11 +7348,11 @@ yy767:
                }
                YYDEBUG(769, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1315 "Zend/zend_language_scanner.l"
+#line 1325 "Zend/zend_language_scanner.l"
                {
        goto return_whitespace;
 }
-#line 7323 "Zend/zend_language_scanner.c"
+#line 7356 "Zend/zend_language_scanner.c"
 yy770:
                YYDEBUG(770, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7336,22 +7369,22 @@ yy771:
                }
                YYDEBUG(773, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1323 "Zend/zend_language_scanner.l"
+#line 1333 "Zend/zend_language_scanner.l"
                {
        yy_pop_state();
        RETURN_TOKEN_WITH_STR(T_STRING, 0);
 }
-#line 7345 "Zend/zend_language_scanner.c"
+#line 7378 "Zend/zend_language_scanner.c"
 yy774:
                YYDEBUG(774, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(775, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1319 "Zend/zend_language_scanner.l"
+#line 1329 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN(T_OBJECT_OPERATOR);
 }
-#line 7355 "Zend/zend_language_scanner.c"
+#line 7388 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_VARNAME:
@@ -7408,14 +7441,14 @@ yy778:
 yy779:
                YYDEBUG(779, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1632 "Zend/zend_language_scanner.l"
+#line 1642 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state();
        yy_push_state(ST_IN_SCRIPTING);
        goto restart;
 }
-#line 7419 "Zend/zend_language_scanner.c"
+#line 7452 "Zend/zend_language_scanner.c"
 yy780:
                YYDEBUG(780, *YYCURSOR);
                yych = *(YYMARKER = ++YYCURSOR);
@@ -7462,14 +7495,14 @@ yy784:
                ++YYCURSOR;
                YYDEBUG(785, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1624 "Zend/zend_language_scanner.l"
+#line 1634 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_pop_state();
        yy_push_state(ST_IN_SCRIPTING);
        RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0);
 }
-#line 7473 "Zend/zend_language_scanner.c"
+#line 7506 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_NOWDOC:
@@ -7480,7 +7513,7 @@ yyc_ST_NOWDOC:
        ++YYCURSOR;
        YYDEBUG(789, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2392 "Zend/zend_language_scanner.l"
+#line 2429 "Zend/zend_language_scanner.l"
        {
        int newline = 0;
 
@@ -7536,7 +7569,7 @@ nowdoc_scan_done:
        HANDLE_NEWLINES(yytext, yyleng - newline);
        RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
 }
-#line 7540 "Zend/zend_language_scanner.c"
+#line 7573 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_VAR_OFFSET:
        {
@@ -7624,7 +7657,7 @@ yy792:
                ++YYCURSOR;
                YYDEBUG(793, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2449 "Zend/zend_language_scanner.l"
+#line 2486 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                RETURN_TOKEN(END);
@@ -7633,13 +7666,13 @@ yy792:
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 7637 "Zend/zend_language_scanner.c"
+#line 7670 "Zend/zend_language_scanner.c"
 yy794:
                YYDEBUG(794, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(795, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1917 "Zend/zend_language_scanner.l"
+#line 1933 "Zend/zend_language_scanner.l"
                {
        /* Invalid rule to return a more explicit parse error with proper line number */
        yyless(0);
@@ -7647,19 +7680,19 @@ yy794:
        ZVAL_NULL(zendlval);
        RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE);
 }
-#line 7651 "Zend/zend_language_scanner.c"
+#line 7684 "Zend/zend_language_scanner.c"
 yy796:
                YYDEBUG(796, *YYCURSOR);
                ++YYCURSOR;
 yy797:
                YYDEBUG(797, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1912 "Zend/zend_language_scanner.l"
+#line 1928 "Zend/zend_language_scanner.l"
                {
        /* Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error */
        RETURN_TOKEN(yytext[0]);
 }
-#line 7663 "Zend/zend_language_scanner.c"
+#line 7696 "Zend/zend_language_scanner.c"
 yy798:
                YYDEBUG(798, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7694,7 +7727,7 @@ yy799:
 yy800:
                YYDEBUG(800, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1746 "Zend/zend_language_scanner.l"
+#line 1756 "Zend/zend_language_scanner.l"
                { /* Offset could be treated as a long */
        if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) {
                char *end;
@@ -7710,7 +7743,7 @@ string:
        }
        RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
 }
-#line 7714 "Zend/zend_language_scanner.c"
+#line 7747 "Zend/zend_language_scanner.c"
 yy801:
                YYDEBUG(801, *YYCURSOR);
                ++YYCURSOR;
@@ -7732,22 +7765,22 @@ yy803:
                }
                YYDEBUG(805, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1925 "Zend/zend_language_scanner.l"
+#line 1941 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_STRING, 0);
 }
-#line 7740 "Zend/zend_language_scanner.c"
+#line 7773 "Zend/zend_language_scanner.c"
 yy806:
                YYDEBUG(806, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(807, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1907 "Zend/zend_language_scanner.l"
+#line 1923 "Zend/zend_language_scanner.l"
                {
        yy_pop_state();
        RETURN_TOKEN(']');
 }
-#line 7751 "Zend/zend_language_scanner.c"
+#line 7784 "Zend/zend_language_scanner.c"
 yy808:
                YYDEBUG(808, *YYCURSOR);
                ++YYCURSOR;
@@ -7772,11 +7805,11 @@ yy808:
 yy810:
                YYDEBUG(810, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1903 "Zend/zend_language_scanner.l"
+#line 1919 "Zend/zend_language_scanner.l"
                {
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
-#line 7780 "Zend/zend_language_scanner.c"
+#line 7813 "Zend/zend_language_scanner.c"
 yy811:
                YYDEBUG(811, *YYCURSOR);
                ++YYCURSOR;
@@ -7788,12 +7821,16 @@ yy811:
 yy813:
                YYDEBUG(813, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1762 "Zend/zend_language_scanner.l"
+#line 1772 "Zend/zend_language_scanner.l"
                { /* Offset must be treated as a string */
-       ZVAL_STRINGL(zendlval, yytext, yyleng);
+       if (yyleng == 1) {
+               ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext)));
+       } else {
+               ZVAL_STRINGL(zendlval, yytext, yyleng);
+       }
        RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
 }
-#line 7797 "Zend/zend_language_scanner.c"
+#line 7834 "Zend/zend_language_scanner.c"
 yy814:
                YYDEBUG(814, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7833,7 +7870,7 @@ yy819:
                goto yy813;
        }
 }
-#line 2458 "Zend/zend_language_scanner.l"
+#line 2495 "Zend/zend_language_scanner.l"
 
 
 emit_token_with_str:
index e5214e66a86a16d5f757069383245a6ee5cd0236..bb87d818f99f29f109c493fd759ddc6de3be8233 100644 (file)
@@ -874,6 +874,8 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter
                SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); \
                ZVAL_STRINGL(zendlval, s, sz); \
                efree(s); \
+       } else if (yyleng == 1) { \
+               ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext))); \
        } else { \
                ZVAL_STRINGL(zendlval, yytext, yyleng); \
        }
@@ -883,11 +885,38 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
        register char *s, *t;
        char *end;
 
+       if (len <= 1) {
+               if (len < 1) {
+                       ZVAL_EMPTY_STRING(zendlval);
+               } else {
+                       zend_uchar c = (zend_uchar)*str;
+                       if (c == '\n' || c == '\r') {
+                               CG(zend_lineno)++;
+                       }
+                       ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+               }
+               goto skip_escape_conversion;
+       }
+
        ZVAL_STRINGL(zendlval, str, len);
 
        /* convert escape sequences */
-       s = t = Z_STRVAL_P(zendlval);
+       s = Z_STRVAL_P(zendlval);
        end = s+Z_STRLEN_P(zendlval);
+       while (1) {
+               if (UNEXPECTED(*s=='\\')) {
+                       break;
+               }
+               if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+                       CG(zend_lineno)++;
+               }
+               s++;
+               if (s == end) {
+                       goto skip_escape_conversion;
+               }
+       }
+
+       t = s;
        while (s<end) {
                if (*s=='\\') {
                        s++;
@@ -899,23 +928,18 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                        switch(*s) {
                                case 'n':
                                        *t++ = '\n';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'r':
                                        *t++ = '\r';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 't':
                                        *t++ = '\t';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'f':
                                        *t++ = '\f';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'v':
                                        *t++ = '\v';
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'e':
 #ifdef ZEND_WIN32
@@ -923,7 +947,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
 #else
                                        *t++ = '\e';
 #endif
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case '"':
                                case '`':
@@ -935,20 +958,15 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                                case '\\':
                                case '$':
                                        *t++ = *s;
-                                       Z_STRLEN_P(zendlval)--;
                                        break;
                                case 'x':
                                case 'X':
                                        if (ZEND_IS_HEX(*(s+1))) {
                                                char hex_buf[3] = { 0, 0, 0 };
 
-                                               Z_STRLEN_P(zendlval)--; /* for the 'x' */
-
                                                hex_buf[0] = *(++s);
-                                               Z_STRLEN_P(zendlval)--;
                                                if (ZEND_IS_HEX(*(s+1))) {
                                                        hex_buf[1] = *(++s);
-                                                       Z_STRLEN_P(zendlval)--;
                                                }
                                                *t++ = (char) ZEND_STRTOL(hex_buf, NULL, 16);
                                        } else {
@@ -964,7 +982,6 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                                                size_t len = 0;
                                                zend_bool valid = 1;
                                                unsigned long codepoint;
-                                               size_t byte_len = 0;
 
                                                if (*start != '{') {
                                                        /* we silently let this pass to avoid breaking code
@@ -1020,27 +1037,20 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
 
                                                /* based on https://en.wikipedia.org/wiki/UTF-8#Sample_code */
                                                if (codepoint < 0x80) {
-                                                       byte_len = 1;
                                                        *t++ = codepoint;
                                                } else if (codepoint <= 0x7FF) {
-                                                       byte_len = 2;
                                                        *t++ = (codepoint >> 6) + 0xC0;
                                                        *t++ = (codepoint & 0x3F) + 0x80;
                                                } else if (codepoint <= 0xFFFF) {
-                                                       byte_len = 3;
                                                        *t++ = (codepoint >> 12) + 0xE0;
                                                        *t++ = ((codepoint >> 6) & 0x3F) + 0x80;
                                                        *t++ = (codepoint & 0x3F) + 0x80;
                                                } else if (codepoint <= 0x10FFFF) {
-                                                       byte_len = 4;
                                                        *t++ = (codepoint >> 18) + 0xF0;
                                                        *t++ = ((codepoint >> 12) & 0x3F) + 0x80;
                                                        *t++ = ((codepoint >> 6) & 0x3F) + 0x80;
                                                        *t++ = (codepoint & 0x3F) + 0x80;
                                                }
-
-                                               Z_STRLEN_P(zendlval) -= 2; /* \u */
-                                               Z_STRLEN_P(zendlval) -= (len - byte_len);
                                        }
                                        break;
                                default:
@@ -1049,13 +1059,10 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                                                char octal_buf[4] = { 0, 0, 0, 0 };
 
                                                octal_buf[0] = *s;
-                                               Z_STRLEN_P(zendlval)--;
                                                if (ZEND_IS_OCT(*(s+1))) {
                                                        octal_buf[1] = *(++s);
-                                                       Z_STRLEN_P(zendlval)--;
                                                        if (ZEND_IS_OCT(*(s+1))) {
                                                                octal_buf[2] = *(++s);
-                                                               Z_STRLEN_P(zendlval)--;
                                                        }
                                                }
                                                if (octal_buf[2] &&
@@ -1081,6 +1088,9 @@ static int zend_scan_escape_string(zval *zendlval, char *str, int len, char quot
                s++;
        }
        *t = 0;
+       Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
+
+skip_escape_conversion:
        if (SCNG(output_filter)) {
                size_t sz = 0;
                unsigned char *str;
@@ -1760,7 +1770,11 @@ string:
 }
 
 <ST_VAR_OFFSET>{LNUM}|{HNUM}|{BNUM} { /* Offset must be treated as a string */
-       ZVAL_STRINGL(zendlval, yytext, yyleng);
+       if (yyleng == 1) {
+               ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*(yytext)));
+       } else {
+               ZVAL_STRINGL(zendlval, yytext, yyleng);
+       }
        RETURN_TOKEN_WITH_VAL(T_NUM_STRING);
 }
 
@@ -1875,8 +1889,10 @@ inline_char_handler:
                if (readsize < yyleng) {
                        yyless(readsize);
                }
+       } else if (yyleng == 1) {
+               ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext));
        } else {
-         ZVAL_STRINGL(zendlval, yytext, yyleng);
+               ZVAL_STRINGL(zendlval, yytext, yyleng);
        }
        HANDLE_NEWLINES(yytext, yyleng);
        RETURN_TOKEN_WITH_VAL(T_INLINE_HTML);
@@ -2036,37 +2052,58 @@ inline_char_handler:
                }
        }
 
+       if (yyleng-bprefix-2 <= 1) {
+               if (yyleng-bprefix-2 < 1) {
+                       ZVAL_EMPTY_STRING(zendlval);
+               } else {
+                       zend_uchar c = (zend_uchar)*(yytext+bprefix+1);
+                       if (c == '\n' || c == '\r') {
+                               CG(zend_lineno)++;
+                       }
+                       ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c));
+               }
+               goto skip_escape_conversion;
+       }
        ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2);
 
        /* convert escape sequences */
-       s = t = Z_STRVAL_P(zendlval);
+       s = Z_STRVAL_P(zendlval);
        end = s+Z_STRLEN_P(zendlval);
+       while (1) {
+               if (UNEXPECTED(*s=='\\')) {
+                       break;
+               }
+               if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
+                       CG(zend_lineno)++;
+               }
+               s++;
+               if (s == end) {
+                       goto skip_escape_conversion;
+               }
+       }
+
+       t = s;
        while (s<end) {
                if (*s=='\\') {
                        s++;
-
-                       switch(*s) {
-                               case '\\':
-                               case '\'':
-                                       *t++ = *s;
-                                       Z_STRLEN_P(zendlval)--;
-                                       break;
-                               default:
-                                       *t++ = '\\';
-                                       *t++ = *s;
-                                       break;
+                       if (*s == '\\' || *s == '\'') {
+                               *t++ = *s;
+                       } else {
+                               *t++ = '\\';
+                               *t++ = *s;
                        }
                } else {
                        *t++ = *s;
                }
-
                if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) {
                        CG(zend_lineno)++;
                }
                s++;
        }
        *t = 0;
+       Z_STRLEN_P(zendlval) = t - Z_STRVAL_P(zendlval);
 
+skip_escape_conversion:
        if (SCNG(output_filter)) {
                size_t sz = 0;
                char *str = NULL;