]> granicus.if.org Git - php/commitdiff
implemented again zend-multibyte for PHP 5.3
authorRui Hirokawa <hirokawa@php.net>
Sun, 29 Jun 2008 08:21:35 +0000 (08:21 +0000)
committerRui Hirokawa <hirokawa@php.net>
Sun, 29 Jun 2008 08:21:35 +0000 (08:21 +0000)
Zend/Zend.m4
Zend/zend.c
Zend/zend_compile.c
Zend/zend_globals.h
Zend/zend_highlight.c
Zend/zend_language_scanner.c
Zend/zend_language_scanner.h
Zend/zend_language_scanner.l
Zend/zend_language_scanner_defs.h
Zend/zend_multibyte.h
win32/build/config.w32

index bbb3411a4a8cda14e2ee764598bb045084ffba18..6de6b0cf13a28d0b099567f71abd3646a41ce800 100644 (file)
@@ -154,6 +154,13 @@ AC_ARG_ENABLE(inline-optimization,
   ZEND_INLINE_OPTIMIZATION=yes
 ])
 
+AC_ARG_ENABLE(zend-multibyte,
+[  --enable-zend-multibyte Compile with zend multibyte support], [
+  ZEND_MULTIBYTE=$enableval
+],[
+  ZEND_MULTIBYTE=no
+])
+
 AC_MSG_CHECKING([virtual machine dispatch method])
 AC_MSG_RESULT($PHP_ZEND_VM)
 
@@ -166,6 +173,9 @@ AC_MSG_RESULT($ZEND_INLINE_OPTIMIZATION)
 AC_MSG_CHECKING(whether to enable Zend debugging)
 AC_MSG_RESULT($ZEND_DEBUG)
 
+AC_MSG_CHECKING(whether to enable Zend multibyte)
+AC_MSG_RESULT($ZEND_MULTIBYTE)
+
 case $PHP_ZEND_VM in
   SWITCH)
     AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_SWITCH,[virtual machine dispatch method])
@@ -200,6 +210,10 @@ if test "$ZEND_MAINTAINER_ZTS" = "yes"; then
   LIBZEND_CPLUSPLUS_CHECKS
 fi  
 
+if test "$ZEND_MULTIBYTE" = "yes"; then
+  AC_DEFINE(ZEND_MULTIBYTE, 1, [ ])
+fi
+
 changequote({,})
 if test -n "$GCC" && test "$ZEND_INLINE_OPTIMIZATION" != "yes"; then
   INLINE_CFLAGS=`echo $ac_n "$CFLAGS $ac_c" | sed s/-O[0-9s]*//`
index 1e622e25cbb9788f2b4d7d83a581543d1dde78f9..42e8efd9b17fdb85f2bc8d79a94ee4670608ddd3 100644 (file)
@@ -91,6 +91,9 @@ static ZEND_INI_MH(OnUpdateGCEnabled) /* {{{ */
 ZEND_INI_BEGIN()
        ZEND_INI_ENTRY("error_reporting",                               NULL,           ZEND_INI_ALL,           OnUpdateErrorReporting)
        STD_ZEND_INI_BOOLEAN("zend.enable_gc",                          "1",    ZEND_INI_ALL,           OnUpdateGCEnabled,      gc_enabled,     zend_gc_globals,        gc_globals)
+#ifdef ZEND_MULTIBYTE
+       STD_ZEND_INI_BOOLEAN("detect_unicode", "1", ZEND_INI_ALL, OnUpdateBool, detect_unicode, zend_compiler_globals, compiler_globals)
+#endif
 ZEND_INI_END()
 
 
index 00f8c11d7c873266125f4af61a85807519b17bda..723191cf56b87e3b59856d906dd4f78ca5d65d47 100644 (file)
 #include "zend_exceptions.h"
 #include "tsrm_virtual_cwd.h"
 
+#ifdef ZEND_MULTIBYTE
+#include "zend_multibyte.h"
+#endif /* ZEND_MULTIBYTE */
+
 ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);
 ZEND_API zend_op_array *(*zend_compile_string)(zval *source_string, char *filename TSRMLS_DC);
 
@@ -80,7 +84,14 @@ static void build_runtime_defined_function_key(zval *result, char *name, int nam
 
        /* NULL, name length, filename length, last accepting char position length */
        result->value.str.len = 1+name_length+strlen(filename)+char_pos_len;
+#ifdef ZEND_MULTIBYTE
+       /* must be binary safe */
+       result->value.str.val = (char *) safe_emalloc(result->value.str.len, 1, 1);
+       result->value.str.val[0] = '\0';
+       sprintf(result->value.str.val+1, "%s%s%s", name, filename, char_pos_buf);
+#else
        zend_spprintf(&result->value.str.val, 0, "%c%s%s%s", '\0', name, filename, char_pos_buf);
+#endif /* ZEND_MULTIBYTE */
        result->type = IS_STRING;
        Z_SET_REFCOUNT_P(result, 1);
 }
@@ -132,6 +143,15 @@ void zend_init_compiler_data_structures(TSRMLS_D)
        zend_hash_apply(CG(auto_globals), (apply_func_t) zend_auto_global_arm TSRMLS_CC);
        zend_stack_init(&CG(labels_stack));
        CG(labels) = NULL;
+
+#ifdef ZEND_MULTIBYTE
+       CG(script_encoding_list) = NULL;
+       CG(script_encoding_list_size) = 0;
+       CG(internal_encoding) = NULL;
+       CG(encoding_detector) = NULL;
+       CG(encoding_converter) = NULL;
+       CG(encoding_oddlen) = NULL;
+#endif /* ZEND_MULTIBYTE */
 }
 
 
@@ -166,6 +186,12 @@ void shutdown_compiler(TSRMLS_D)
        zend_hash_destroy(&CG(filenames_table));
        zend_llist_destroy(&CG(open_files));
        zend_stack_destroy(&CG(labels_stack));
+
+#ifdef ZEND_MULTIBYTE
+       if (CG(script_encoding_list)) {
+               efree(CG(script_encoding_list));
+       }
+#endif /* ZEND_MULTIBYTE */
 }
 
 
@@ -4512,9 +4538,55 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC)
        if (!zend_binary_strcasecmp(var->u.constant.value.str.val, var->u.constant.value.str.len, "ticks", sizeof("ticks")-1)) {
                convert_to_long(&val->u.constant);
                CG(declarables).ticks = val->u.constant;
+#ifdef ZEND_MULTIBYTE
+       } else if (!zend_binary_strcasecmp(var->u.constant.value.str.val, var->u.constant.value.str.len, "encoding", sizeof("encoding")-1)) {
+               zend_encoding *new_encoding, *old_encoding;
+               zend_encoding_filter old_input_filter;
+
+               if (Z_TYPE(val->u.constant) == IS_CONSTANT) {
+                       zend_error(E_COMPILE_ERROR, "Cannot use constants as encoding");
+               }
+
+               /*
+                * Check that the pragma comes before any opcodes. If the compilation
+                * got as far as this, the previous portion of the script must have been
+                * parseable according to the .ini script_encoding setting. We still
+                * want to tell them to put declare() at the top.
+                */
+               if (CG(active_op_array)->last > 0) {
+                       /* ignore ZEND_EXT_STMT and ZEND_TICKS */
+                       int num = CG(active_op_array)->last;
+                       while (num > 0 &&
+                              (CG(active_op_array)->opcodes[num-1].opcode == ZEND_EXT_STMT ||
+                               CG(active_op_array)->opcodes[num-1].opcode == ZEND_TICKS)) {
+                               --num;
+                       }
+                       if (num > 0) {
+                               zend_error(E_COMPILE_ERROR, "Encoding declaration pragma has to be the very first statement in the script");
+                       }
+               }               
+
+               convert_to_string(&val->u.constant);
+               new_encoding = zend_multibyte_fetch_encoding(val->u.constant.value.str.val);
+               if (!new_encoding) {
+                       zend_error(E_COMPILE_WARNING, "Unsupported encoding [%s]", val->u.constant.value.str.val);
+               } else {
+                       old_input_filter = LANG_SCNG(input_filter);
+                       old_encoding = LANG_SCNG(script_encoding);
+                       zend_multibyte_set_filter(new_encoding TSRMLS_CC);
+
+                       /* need to re-scan if input filter changed */
+                       if (old_input_filter != LANG_SCNG(input_filter) ||
+                               ((old_input_filter == zend_multibyte_script_encoding_filter) &&
+                                (new_encoding != old_encoding))) {
+                               zend_multibyte_yyinput_again(old_input_filter, old_encoding TSRMLS_CC);
+                       }
+               }
+#else  /* !ZEND_MULTIBYTE */
        } else if (!zend_binary_strcasecmp(var->u.constant.value.str.val, var->u.constant.value.str.len, "encoding", sizeof("encoding")-1)) {
                /* Do not generate any kind of warning for encoding declares */
                /* zend_error(E_COMPILE_WARNING, "Declare encoding [%s] not supported", val->u.constant.value.str.val); */
+#endif /* ZEND_MULTIBYTE */
                efree(val->u.constant.value.str.val);
        } else {
                zend_error(E_COMPILE_WARNING, "Unsupported declare '%s'", var->u.constant.value.str.val);
index 6578a7e821753ce80ad4ac85bfa4922043934a39..67684a4b9618b276f011c85ad088ab8bb5e7f240 100644 (file)
 #include "zend_objects_API.h"
 #include "zend_modules.h"
 
+#ifdef ZEND_MULTIBYTE
+#include "zend_multibyte.h"
+#endif /* ZEND_MULTIBYTE */
+
 /* Define ZTS if you want a thread-safe Zend */
 /*#undef ZTS*/
 
@@ -134,6 +138,19 @@ struct _zend_compiler_globals {
        HashTable *labels;
        zend_stack labels_stack;
 
+#ifdef ZEND_MULTIBYTE
+       zend_encoding **script_encoding_list;
+       int script_encoding_list_size;
+       zend_bool detect_unicode;
+
+       zend_encoding *internal_encoding;
+
+       /* multibyte utility functions */
+       zend_encoding_detector encoding_detector;
+       zend_encoding_converter encoding_converter;
+       zend_encoding_oddlen encoding_oddlen;
+#endif /* ZEND_MULTIBYTE */
+
 #ifdef ZTS
        HashTable **static_members;
        int last_static_member;
@@ -271,6 +288,22 @@ struct _zend_php_scanner_globals {
        zend_stack state_stack;
        
        zend_llist used_state_stacks;
+
+#ifdef ZEND_MULTIBYTE
+       /* original (unfiltered) script */
+       char *script_org;
+       int script_org_size;
+
+       /* filtered script */
+       char *script_filtered;
+       int script_filtered_size;
+
+       /* input/ouput filters */
+       zend_encoding_filter input_filter;
+       zend_encoding_filter output_filter;
+       zend_encoding *script_encoding;
+       zend_encoding *internal_encoding;
+#endif /* ZEND_MULTIBYTE */
 };
 
 #endif /* ZEND_GLOBALS_H */
index ff3f8fe0b912c1c55131348531284e68d5ae2d0b..a6bc552eab6709c5989c10a5919e4a66c7808fc7 100644 (file)
@@ -58,6 +58,17 @@ ZEND_API void zend_html_puts(const char *s, uint len TSRMLS_DC)
 {
        const char *ptr=s, *end=s+len;
 
+#ifdef ZEND_MULTIBYTE
+       char *filtered;
+       int filtered_len;
+
+       if (LANG_SCNG(output_filter)) {
+               LANG_SCNG(output_filter)(&filtered, &filtered_len, s, len TSRMLS_CC);
+               ptr = filtered;
+               end = filtered + filtered_len;
+       }
+#endif /* ZEND_MULTIBYTE */
+
        while (ptr<end) {
                if (*ptr==' ') {
                        do {
@@ -67,6 +78,12 @@ ZEND_API void zend_html_puts(const char *s, uint len TSRMLS_DC)
                        zend_html_putc(*ptr++);
                }
        }
+
+#ifdef ZEND_MULTIBYTE
+       if (LANG_SCNG(output_filter)) {
+               efree(filtered);
+       }
+#endif /* ZEND_MULTIBYTE */
 }
 
 
index 63c2bed56571393333f5b00826c6664e0413c9d6..cf8d39c4aa46f70fd322363be6e14277c59388d0 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.4 on Sat May 10 03:48:00 2008 */
+/* Generated by re2c 0.13.5 on Sun Jun 29 17:06:51 2008 */
 #line 1 "Zend/zend_language_scanner.l"
 /*
    +----------------------------------------------------------------------+
@@ -182,6 +182,17 @@ ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
        lex_state->yy_state = YYSTATE;
        lex_state->filename = zend_get_compiled_filename(TSRMLS_C);
        lex_state->lineno = CG(zend_lineno);
+
+#ifdef ZEND_MULTIBYTE
+       lex_state->script_org = SCNG(script_org);
+       lex_state->script_org_size = SCNG(script_org_size);
+       lex_state->script_filtered = SCNG(script_filtered);
+       lex_state->script_filtered_size = SCNG(script_filtered_size);
+       lex_state->input_filter = SCNG(input_filter);
+       lex_state->output_filter = SCNG(output_filter);
+       lex_state->script_encoding = SCNG(script_encoding);
+       lex_state->internal_encoding = SCNG(internal_encoding);
+#endif /* ZEND_MULTIBYTE */
 }
 
 ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
@@ -200,6 +211,24 @@ ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
        YYSETCONDITION(lex_state->yy_state);
        CG(zend_lineno) = lex_state->lineno;
        zend_restore_compiled_filename(lex_state->filename TSRMLS_CC);
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+               SCNG(script_org) = NULL;
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+               SCNG(script_filtered) = NULL;
+       }
+       SCNG(script_org) = lex_state->script_org;
+       SCNG(script_org_size) = lex_state->script_org_size;
+       SCNG(script_filtered) = lex_state->script_filtered;
+       SCNG(script_filtered_size) = lex_state->script_filtered_size;
+       SCNG(input_filter) = lex_state->input_filter;
+       SCNG(output_filter) = lex_state->output_filter;
+       SCNG(script_encoding) = lex_state->script_encoding;
+       SCNG(internal_encoding) = lex_state->internal_encoding;
+#endif /* ZEND_MULTIBYTE */
 }
 
 ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC)
@@ -234,8 +263,27 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle TSRMLS_DC)
        SCNG(yy_in) = file_handle;
 
        if (size != -1) {
-               /* TODO: For MULTIBYTE we need to do some clever re-encoding */
+#ifdef ZEND_MULTIBYTE
+               if (zend_multibyte_read_script(buf, size TSRMLS_CC) != 0) {
+                       return FAILURE;
+               }
+
+               SCNG(yy_in) = NULL;
+
+               zend_multibyte_set_filter(NULL TSRMLS_CC);
+
+               if (!SCNG(input_filter)) {
+                       SCNG(script_filtered) = (char*)emalloc(SCNG(script_org_size)+1);
+                       memcpy(SCNG(script_filtered), SCNG(script_org), SCNG(script_org_size)+1);
+                       SCNG(script_filtered_size) = SCNG(script_org_size);
+               } else {
+                       SCNG(input_filter)(&SCNG(script_filtered), &SCNG(script_filtered_size), SCNG(script_org), SCNG(script_org_size) TSRMLS_CC);
+               }
+
+               yy_scan_buffer(SCNG(script_filtered), SCNG(script_filtered_size) TSRMLS_CC);
+#else /* !ZEND_MULTIBYTE */
                yy_scan_buffer(buf, size TSRMLS_CC);
+#endif /* ZEND_MULTIBYTE */
        } else {
                zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed");
        }
@@ -372,8 +420,24 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_D
 
        SCNG(yy_in)=NULL;
 
-       /* TODO: For MULTIBYTE we need to do some clever re-encoding */
+#ifdef ZEND_MULTIBYTE
+       SCNG(script_org) = estrdup(str->value.str.val);
+       SCNG(script_org_size) = str->value.str.len;
+
+       zend_multibyte_set_filter(CG(internal_encoding) TSRMLS_CC);
+
+       if (!SCNG(input_filter)) {
+               SCNG(script_filtered) = (char*)emalloc(SCNG(script_org_size)+1);
+               memcpy(SCNG(script_filtered), SCNG(script_org), SCNG(script_org_size)+1);
+               SCNG(script_filtered_size) = SCNG(script_org_size);
+       } else {
+               SCNG(input_filter)(&SCNG(script_filtered), &SCNG(script_filtered_size), SCNG(script_org), SCNG(script_org_size) TSRMLS_CC);
+       }
+
+       yy_scan_buffer(SCNG(script_filtered), SCNG(script_filtered_size) TSRMLS_CC);    
+#else /* !ZEND_MULTIBYTE */
        yy_scan_buffer(str->value.str.val, str->value.str.len TSRMLS_CC);
+#endif /* ZEND_MULTIBYTE */
 
        zend_set_compiled_filename(filename TSRMLS_CC);
        CG(zend_lineno) = 1;
@@ -424,6 +488,17 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)
                BEGIN(ST_IN_SCRIPTING);
                compiler_result = zendparse(TSRMLS_C);
 
+#ifdef ZEND_MULTIBYTE
+               if (SCNG(script_org)) {
+                       efree(SCNG(script_org));
+                       SCNG(script_org) = NULL;
+               }
+               if (SCNG(script_filtered)) {
+                       efree(SCNG(script_filtered));
+                       SCNG(script_filtered) = NULL;
+               }
+#endif /* ZEND_MULTIBYTE */
+
                if (compiler_result==1) {
                        CG(active_op_array) = original_active_op_array;
                        CG(unclean_shutdown)=1;
@@ -459,6 +534,16 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
                return FAILURE;
        }
        zend_highlight(syntax_highlighter_ini TSRMLS_CC);
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+               SCNG(script_org) = NULL;
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+               SCNG(script_filtered) = NULL;
+       }
+#endif /* ZEND_MULTIBYTE */
        zend_destroy_file_handle(&file_handle TSRMLS_CC);
        zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
        return SUCCESS;
@@ -477,15 +562,147 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
        }
        BEGIN(INITIAL);
        zend_highlight(syntax_highlighter_ini TSRMLS_CC);
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+               SCNG(script_org) = NULL;
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+               SCNG(script_filtered) = NULL;
+       }
+#endif /* ZEND_MULTIBYTE */
        zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
        zval_dtor(str);
        return SUCCESS;
 }
 END_EXTERN_C()
 
+#ifdef ZEND_MULTIBYTE
+BEGIN_EXTERN_C()
+ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, zend_encoding *old_encoding TSRMLS_DC)
+{
+  int offset, original_offset, length, free_flag, new_len;
+       char *p;
+       zend_encoding *new_encoding;
+       unsigned char *yy_c_buf_p;
+
+       /* calculate current position */
+       offset = original_offset = YYCURSOR - SCNG(yy_start);
+       if (old_input_filter && original_offset > 0) {
+               new_encoding = SCNG(script_encoding);
+               SCNG(script_encoding) = old_encoding;
+               do {
+                       (old_input_filter)(&p, &length, SCNG(script_org), offset TSRMLS_CC);
+                       if (!p) {
+                               SCNG(script_encoding) = new_encoding;
+                               return;
+                       }
+                       efree(p);
+                       if (length > original_offset) {
+                               offset--;
+                       } else if (length < original_offset) {
+                               offset++;
+                       }
+               } while (original_offset != length);
+               SCNG(script_encoding) = new_encoding;
+       }
+
+       /* convert and set */
+       if (!SCNG(input_filter)) {
+               length = SCNG(script_org_size)-offset-1;
+               p = SCNG(script_org)+offset+1;
+               free_flag = 0;
+       } else {
+               SCNG(input_filter)(&p, &length, SCNG(script_org)+offset+1, SCNG(script_org_size)-offset-1 TSRMLS_CC);
+               free_flag = 1;
+       }
+
+       new_len = original_offset+length+1;
+
+       if (new_len > YYLIMIT-SCNG(yy_start)) {
+               YYLIMIT = SCNG(yy_start) + new_len;
+               SCNG(yy_start) =  erealloc(SCNG(yy_start), new_len);
+               SCNG(script_filtered) = SCNG(yy_start);
+               SCNG(script_filtered_size) = new_len;
+       }
+
+       yy_c_buf_p = SCNG(yy_start) + original_offset;
+       strncpy(yy_c_buf_p+1, p, length);
+
+       if (free_flag) {
+               efree(p);
+       }
+}
+
+
+ZEND_API int zend_multibyte_yyinput(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC)
+{
+       int c = '*', n;
+
+       if (CG(interactive) == 0) {
+               if (zend_stream_fixup(file_handle, &buf, &len TSRMLS_CC) == FAILURE) {
+                       return FAILURE;
+               }
+               n = len;
+               return n;
+       }
+
+       /* interactive */
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+       }
+       SCNG(script_org) = NULL;
+       SCNG(script_org_size) = 0;
+
+       /* TODO: support widechars */
+       if (zend_stream_fixup(file_handle, &buf, &len TSRMLS_CC) == FAILURE) {
+               return FAILURE;
+       }
+       n = len;
+
+       SCNG(script_org_size) = n;
+       SCNG(script_org) = (char*)emalloc(SCNG(script_org_size) + 1);
+       memcpy(SCNG(script_org), buf, n);
+
+       return n;
+}
+
+
+ZEND_API int zend_multibyte_read_script(char *buf, int n TSRMLS_DC)
+{
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+       }
+       if (n<0) {
+               return -1;
+       }
+       SCNG(script_org_size) = n;
+       SCNG(script_org) = (char*)erealloc(SCNG(script_org), SCNG(script_org_size));
+       memcpy(SCNG(script_org) + SCNG(script_org_size) - n, buf, n);
+       
+       SCNG(script_org) = (char*)erealloc(SCNG(script_org), SCNG(script_org_size) + 1);
+       *(SCNG(script_org)+SCNG(script_org_size)) = '\0';
+
+       return 0;
+}
+
+
+# define zend_copy_value(zendlval, yytext, yyleng) \
+       if (SCNG(output_filter)) { \
+               SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), yytext, yyleng TSRMLS_CC); \
+       } else { \
+               zendlval->value.str.val = (char *) estrndup(yytext, yyleng); \
+               zendlval->value.str.len = yyleng; \
+       }
+#else /* ZEND_MULTIBYTE */
 # define zend_copy_value(zendlval, yytext, yyleng) \
        zendlval->value.str.val = (char *)estrndup(yytext, yyleng); \
        zendlval->value.str.len = yyleng;
+#endif /* ZEND_MULTIBYTE */
 
 static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC)
 {
@@ -589,6 +806,13 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo
                s++;
        }
        *t = 0;
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(output_filter)) {
+               s = zendlval->value.str.val;
+               SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), s, zendlval->value.str.len TSRMLS_CC);
+               efree(s);
+       }
+#endif /* ZEND_MULTIBYTE */
 }
 
 
@@ -610,7 +834,7 @@ yymore_restart:
        }
 
 
-#line 614 "Zend/zend_language_scanner.c"
+#line 838 "Zend/zend_language_scanner.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -734,7 +958,7 @@ yyc_INITIAL:
 yy3:
                YYDEBUG(3, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1402 "Zend/zend_language_scanner.l"
+#line 1626 "Zend/zend_language_scanner.l"
                {
 
        while (1) {
@@ -759,13 +983,26 @@ yy3:
 
 inline_char_handler:
 
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(output_filter)) {
+               int readsize;
+               readsize = SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), yytext, yyleng TSRMLS_CC);
+               if (readsize < yyleng) {
+                       yyless(readsize);
+               }
+       } else {
+         zendlval->value.str.val = (char *) estrndup(yytext, yyleng);
+         zendlval->value.str.len = yyleng;
+       }
+#else /* !ZEND_MULTIBYTE */
        zendlval->value.str.val = (char *) estrndup(yytext, yyleng);
-       zendlval->value.str.len = yyleng;
+       zendlval->value.str.len = yyleng;
+#endif
        zendlval->type = IS_STRING;
        HANDLE_NEWLINES(yytext, yyleng);
        return T_INLINE_HTML;
 }
-#line 769 "Zend/zend_language_scanner.c"
+#line 1006 "Zend/zend_language_scanner.c"
 yy4:
                YYDEBUG(4, *YYCURSOR);
                yyaccept = 0;
@@ -792,7 +1029,7 @@ yy8:
 yy9:
                YYDEBUG(9, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1393 "Zend/zend_language_scanner.l"
+#line 1617 "Zend/zend_language_scanner.l"
                {
        if ((YYCTYPE*)yytext == SCNG(yy_start)) {
                /* ignore first line when it's started with a # */
@@ -801,7 +1038,7 @@ yy9:
                goto inline_char_handler;
        }
 }
-#line 805 "Zend/zend_language_scanner.c"
+#line 1042 "Zend/zend_language_scanner.c"
 yy10:
                YYDEBUG(10, *YYCURSOR);
                yyaccept = 1;
@@ -827,7 +1064,7 @@ yy12:
 yy13:
                YYDEBUG(13, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1377 "Zend/zend_language_scanner.l"
+#line 1601 "Zend/zend_language_scanner.l"
                {
        HANDLE_NEWLINES(yytext, yyleng);
        if (CG(short_tags)) {
@@ -843,14 +1080,14 @@ yy13:
                return T_INLINE_HTML;
        }
 }
-#line 847 "Zend/zend_language_scanner.c"
+#line 1084 "Zend/zend_language_scanner.c"
 yy14:
                YYDEBUG(14, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy50;
                YYDEBUG(15, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1351 "Zend/zend_language_scanner.l"
+#line 1575 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -865,7 +1102,7 @@ yy14:
                return T_INLINE_HTML;
        }
 }
-#line 869 "Zend/zend_language_scanner.c"
+#line 1106 "Zend/zend_language_scanner.c"
 yy16:
                YYDEBUG(16, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1055,7 +1292,7 @@ yy42:
                ++YYCURSOR;
                YYDEBUG(45, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1309 "Zend/zend_language_scanner.l"
+#line 1533 "Zend/zend_language_scanner.l"
                {
        HANDLE_NEWLINES(yytext, yyleng);
        zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1064,7 +1301,7 @@ yy42:
        BEGIN(ST_IN_SCRIPTING);
        return T_OPEN_TAG;
 }
-#line 1068 "Zend/zend_language_scanner.c"
+#line 1305 "Zend/zend_language_scanner.c"
 yy46:
                YYDEBUG(46, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1091,7 +1328,7 @@ yy50:
                ++YYCURSOR;
                YYDEBUG(51, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1319 "Zend/zend_language_scanner.l"
+#line 1543 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1106,13 +1343,13 @@ yy50:
                return T_INLINE_HTML;
        }
 }
-#line 1110 "Zend/zend_language_scanner.c"
+#line 1347 "Zend/zend_language_scanner.c"
 yy52:
                YYDEBUG(52, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(53, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1335 "Zend/zend_language_scanner.l"
+#line 1559 "Zend/zend_language_scanner.l"
                {
        if (CG(short_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1127,7 +1364,7 @@ yy52:
                return T_INLINE_HTML;
        }
 }
-#line 1131 "Zend/zend_language_scanner.c"
+#line 1368 "Zend/zend_language_scanner.c"
 yy54:
                YYDEBUG(54, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1154,7 +1391,7 @@ yy57:
 yy58:
                YYDEBUG(58, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1367 "Zend/zend_language_scanner.l"
+#line 1591 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -1163,7 +1400,7 @@ yy58:
        BEGIN(ST_IN_SCRIPTING);
        return T_OPEN_TAG;
 }
-#line 1167 "Zend/zend_language_scanner.c"
+#line 1404 "Zend/zend_language_scanner.c"
 yy59:
                YYDEBUG(59, *YYCURSOR);
                ++YYCURSOR;
@@ -1254,13 +1491,13 @@ yy63:
 yy64:
                YYDEBUG(64, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1763 "Zend/zend_language_scanner.l"
+#line 2007 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_CURLY_OPEN;
 }
-#line 1264 "Zend/zend_language_scanner.c"
+#line 1501 "Zend/zend_language_scanner.c"
 yy65:
                YYDEBUG(65, *YYCURSOR);
                yyaccept = 1;
@@ -1278,12 +1515,12 @@ yy66:
 yy67:
                YYDEBUG(67, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1788 "Zend/zend_language_scanner.l"
+#line 2032 "Zend/zend_language_scanner.l"
                {
        zend_scan_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 1287 "Zend/zend_language_scanner.c"
+#line 1524 "Zend/zend_language_scanner.c"
 yy68:
                YYDEBUG(68, *YYCURSOR);
                ++YYCURSOR;
@@ -1295,12 +1532,12 @@ yy69:
                ++YYCURSOR;
                YYDEBUG(70, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1924 "Zend/zend_language_scanner.l"
+#line 2168 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '`';
 }
-#line 1304 "Zend/zend_language_scanner.c"
+#line 1541 "Zend/zend_language_scanner.c"
 yy71:
                YYDEBUG(71, *YYCURSOR);
                ++YYCURSOR;
@@ -1388,13 +1625,13 @@ yy75:
 yy77:
                YYDEBUG(77, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1793 "Zend/zend_language_scanner.l"
+#line 2037 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        zend_scan_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 1398 "Zend/zend_language_scanner.c"
+#line 1635 "Zend/zend_language_scanner.c"
 yy78:
                YYDEBUG(78, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1428,24 +1665,24 @@ yy81:
 yy83:
                YYDEBUG(83, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1455 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1438 "Zend/zend_language_scanner.c"
+#line 1675 "Zend/zend_language_scanner.c"
 yy84:
                YYDEBUG(84, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(85, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1102 "Zend/zend_language_scanner.l"
+#line 1326 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
 }
-#line 1449 "Zend/zend_language_scanner.c"
+#line 1686 "Zend/zend_language_scanner.c"
 yy86:
                YYDEBUG(86, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1456,7 +1693,7 @@ yy87:
                ++YYCURSOR;
                YYDEBUG(88, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1447 "Zend/zend_language_scanner.l"
+#line 1684 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1464,7 +1701,7 @@ yy87:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1468 "Zend/zend_language_scanner.c"
+#line 1705 "Zend/zend_language_scanner.c"
 yy89:
                YYDEBUG(89, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1482,7 +1719,7 @@ yy90:
                ++YYCURSOR;
                YYDEBUG(91, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1674 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1490,7 +1727,7 @@ yy90:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1494 "Zend/zend_language_scanner.c"
+#line 1731 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_COMMENT:
@@ -1547,34 +1784,34 @@ yy94:
                }
                YYDEBUG(96, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1547 "Zend/zend_language_scanner.l"
+#line 1784 "Zend/zend_language_scanner.l"
                {
        yymore();
 }
-#line 1555 "Zend/zend_language_scanner.c"
+#line 1792 "Zend/zend_language_scanner.c"
 yy97:
                YYDEBUG(97, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '/') goto yy99;
                YYDEBUG(98, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1565 "Zend/zend_language_scanner.l"
+#line 1802 "Zend/zend_language_scanner.l"
                {
        yymore();
 }
-#line 1566 "Zend/zend_language_scanner.c"
+#line 1803 "Zend/zend_language_scanner.c"
 yy99:
                YYDEBUG(99, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(100, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1559 "Zend/zend_language_scanner.l"
+#line 1796 "Zend/zend_language_scanner.l"
                {
        HANDLE_NEWLINES(yytext, yyleng);
        BEGIN(ST_IN_SCRIPTING);
        return T_COMMENT;
 }
-#line 1578 "Zend/zend_language_scanner.c"
+#line 1815 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_DOC_COMMENT:
@@ -1631,28 +1868,28 @@ yy103:
                }
                YYDEBUG(105, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1547 "Zend/zend_language_scanner.l"
+#line 1784 "Zend/zend_language_scanner.l"
                {
        yymore();
 }
-#line 1639 "Zend/zend_language_scanner.c"
+#line 1876 "Zend/zend_language_scanner.c"
 yy106:
                YYDEBUG(106, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '/') goto yy108;
                YYDEBUG(107, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1565 "Zend/zend_language_scanner.l"
+#line 1802 "Zend/zend_language_scanner.l"
                {
        yymore();
 }
-#line 1650 "Zend/zend_language_scanner.c"
+#line 1887 "Zend/zend_language_scanner.c"
 yy108:
                YYDEBUG(108, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(109, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1551 "Zend/zend_language_scanner.l"
+#line 1788 "Zend/zend_language_scanner.l"
                {
        CG(doc_comment) = estrndup(yytext, yyleng);
        CG(doc_comment_len) = yyleng;
@@ -1660,7 +1897,7 @@ yy108:
        BEGIN(ST_IN_SCRIPTING);
        return T_DOC_COMMENT;
 }
-#line 1664 "Zend/zend_language_scanner.c"
+#line 1901 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_DOUBLE_QUOTES:
@@ -1747,13 +1984,13 @@ yy113:
 yy114:
                YYDEBUG(114, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1763 "Zend/zend_language_scanner.l"
+#line 2007 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_CURLY_OPEN;
 }
-#line 1757 "Zend/zend_language_scanner.c"
+#line 1994 "Zend/zend_language_scanner.c"
 yy115:
                YYDEBUG(115, *YYCURSOR);
                yyaccept = 1;
@@ -1772,12 +2009,12 @@ yy116:
 yy117:
                YYDEBUG(117, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1770 "Zend/zend_language_scanner.l"
+#line 2014 "Zend/zend_language_scanner.l"
                {
        zend_scan_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 1781 "Zend/zend_language_scanner.c"
+#line 2018 "Zend/zend_language_scanner.c"
 yy118:
                YYDEBUG(118, *YYCURSOR);
                ++YYCURSOR;
@@ -1789,12 +2026,12 @@ yy119:
                ++YYCURSOR;
                YYDEBUG(120, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1918 "Zend/zend_language_scanner.l"
+#line 2162 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '"';
 }
-#line 1798 "Zend/zend_language_scanner.c"
+#line 2035 "Zend/zend_language_scanner.c"
 yy121:
                YYDEBUG(121, *YYCURSOR);
                ++YYCURSOR;
@@ -1885,13 +2122,13 @@ yy125:
 yy127:
                YYDEBUG(127, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1781 "Zend/zend_language_scanner.l"
+#line 2025 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        zend_scan_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 1895 "Zend/zend_language_scanner.c"
+#line 2132 "Zend/zend_language_scanner.c"
 yy128:
                YYDEBUG(128, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1925,24 +2162,24 @@ yy131:
 yy133:
                YYDEBUG(133, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1455 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1935 "Zend/zend_language_scanner.c"
+#line 2172 "Zend/zend_language_scanner.c"
 yy134:
                YYDEBUG(134, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(135, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1102 "Zend/zend_language_scanner.l"
+#line 1326 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
 }
-#line 1946 "Zend/zend_language_scanner.c"
+#line 2183 "Zend/zend_language_scanner.c"
 yy136:
                YYDEBUG(136, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1953,7 +2190,7 @@ yy137:
                ++YYCURSOR;
                YYDEBUG(138, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1447 "Zend/zend_language_scanner.l"
+#line 1684 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1961,7 +2198,7 @@ yy137:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1965 "Zend/zend_language_scanner.c"
+#line 2202 "Zend/zend_language_scanner.c"
 yy139:
                YYDEBUG(139, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -1979,7 +2216,7 @@ yy140:
                ++YYCURSOR;
                YYDEBUG(141, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1674 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1987,7 +2224,7 @@ yy140:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 1991 "Zend/zend_language_scanner.c"
+#line 2228 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_END_HEREDOC:
@@ -1998,7 +2235,7 @@ yyc_ST_END_HEREDOC:
        ++YYCURSOR;
        YYDEBUG(145, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 1752 "Zend/zend_language_scanner.l"
+#line 1996 "Zend/zend_language_scanner.l"
        {
        SCNG(yy_text) = Z_STRVAL_P(zendlval) = CG(heredoc);
        SCNG(yy_leng) = Z_STRLEN_P(zendlval) = CG(heredoc_len);
@@ -2007,7 +2244,7 @@ yyc_ST_END_HEREDOC:
        BEGIN(ST_IN_SCRIPTING);
        return T_END_HEREDOC;
 }
-#line 2011 "Zend/zend_language_scanner.c"
+#line 2248 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_END_NOWDOC:
        YYDEBUG(146, *YYCURSOR);
@@ -2017,7 +2254,7 @@ yyc_ST_END_NOWDOC:
        ++YYCURSOR;
        YYDEBUG(149, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 1907 "Zend/zend_language_scanner.l"
+#line 2151 "Zend/zend_language_scanner.l"
        {
        SCNG(yy_text) = Z_STRVAL_P(zendlval) = CG(heredoc);
        SCNG(yy_leng) = Z_STRLEN_P(zendlval) = CG(heredoc_len);
@@ -2026,7 +2263,7 @@ yyc_ST_END_NOWDOC:
        BEGIN(ST_IN_SCRIPTING);
        return T_END_NOWDOC;
 }
-#line 2030 "Zend/zend_language_scanner.c"
+#line 2267 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_HEREDOC:
        {
@@ -2083,12 +2320,12 @@ yyc_ST_HEREDOC:
 yy152:
                YYDEBUG(152, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1807 "Zend/zend_language_scanner.l"
+#line 2051 "Zend/zend_language_scanner.l"
                {
        zend_scan_escape_string(zendlval, yytext, yyleng, 0 TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 2092 "Zend/zend_language_scanner.c"
+#line 2329 "Zend/zend_language_scanner.c"
 yy153:
                YYDEBUG(153, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2134,13 +2371,13 @@ yy154:
 yy155:
                YYDEBUG(155, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1763 "Zend/zend_language_scanner.l"
+#line 2007 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_CURLY_OPEN;
 }
-#line 2144 "Zend/zend_language_scanner.c"
+#line 2381 "Zend/zend_language_scanner.c"
 yy156:
                YYDEBUG(156, *YYCURSOR);
                yyaccept = 0;
@@ -2391,13 +2628,13 @@ yy172:
 yy174:
                YYDEBUG(174, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1812 "Zend/zend_language_scanner.l"
+#line 2056 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        zend_scan_escape_string(zendlval, yytext, yyleng, 0 TSRMLS_CC);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 2401 "Zend/zend_language_scanner.c"
+#line 2638 "Zend/zend_language_scanner.c"
 yy175:
                YYDEBUG(175, *YYCURSOR);
                yyaccept = 2;
@@ -2496,7 +2733,7 @@ yy181:
                ++YYCURSOR;
                YYDEBUG(182, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1712 "Zend/zend_language_scanner.l"
+#line 1956 "Zend/zend_language_scanner.l"
                {
        char *end = yytext + yyleng - 1;
 
@@ -2536,7 +2773,7 @@ yy181:
                yymore();
        }
 }
-#line 2540 "Zend/zend_language_scanner.c"
+#line 2777 "Zend/zend_language_scanner.c"
 yy183:
                YYDEBUG(183, *YYCURSOR);
                yyaccept = 2;
@@ -2796,24 +3033,24 @@ yy202:
 yy204:
                YYDEBUG(204, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1455 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 2806 "Zend/zend_language_scanner.c"
+#line 3043 "Zend/zend_language_scanner.c"
 yy205:
                YYDEBUG(205, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(206, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1102 "Zend/zend_language_scanner.l"
+#line 1326 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
 }
-#line 2817 "Zend/zend_language_scanner.c"
+#line 3054 "Zend/zend_language_scanner.c"
 yy207:
                YYDEBUG(207, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2824,7 +3061,7 @@ yy208:
                ++YYCURSOR;
                YYDEBUG(209, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1447 "Zend/zend_language_scanner.l"
+#line 1684 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -2832,7 +3069,7 @@ yy208:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 2836 "Zend/zend_language_scanner.c"
+#line 3073 "Zend/zend_language_scanner.c"
 yy210:
                YYDEBUG(210, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -2850,7 +3087,7 @@ yy211:
                ++YYCURSOR;
                YYDEBUG(212, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1674 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -2858,7 +3095,7 @@ yy211:
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 2862 "Zend/zend_language_scanner.c"
+#line 3099 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_IN_SCRIPTING:
@@ -3073,13 +3310,13 @@ yy215:
 yy216:
                YYDEBUG(216, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1479 "Zend/zend_language_scanner.l"
+#line 1716 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 3083 "Zend/zend_language_scanner.c"
+#line 3320 "Zend/zend_language_scanner.c"
 yy217:
                YYDEBUG(217, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3326,11 +3563,11 @@ yy229:
 yy230:
                YYDEBUG(230, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1091 "Zend/zend_language_scanner.l"
+#line 1315 "Zend/zend_language_scanner.l"
                {
        return yytext[0];
 }
-#line 3334 "Zend/zend_language_scanner.c"
+#line 3571 "Zend/zend_language_scanner.c"
 yy231:
                YYDEBUG(231, *YYCURSOR);
                ++YYCURSOR;
@@ -3339,7 +3576,7 @@ yy231:
 yy232:
                YYDEBUG(232, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 830 "Zend/zend_language_scanner.l"
+#line 1054 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -3347,7 +3584,7 @@ yy232:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_WHITESPACE;
 }
-#line 3351 "Zend/zend_language_scanner.c"
+#line 3588 "Zend/zend_language_scanner.c"
 yy233:
                YYDEBUG(233, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3580,18 +3817,18 @@ yy257:
                ++YYCURSOR;
                YYDEBUG(258, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1096 "Zend/zend_language_scanner.l"
+#line 1320 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return '{';
 }
-#line 3589 "Zend/zend_language_scanner.c"
+#line 3826 "Zend/zend_language_scanner.c"
 yy259:
                YYDEBUG(259, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(260, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1108 "Zend/zend_language_scanner.l"
+#line 1332 "Zend/zend_language_scanner.l"
                {
        RESET_DOC_COMMENT();
        if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -3599,7 +3836,7 @@ yy259:
        }
        return '}';
 }
-#line 3603 "Zend/zend_language_scanner.c"
+#line 3840 "Zend/zend_language_scanner.c"
 yy261:
                YYDEBUG(261, *YYCURSOR);
                yyaccept = 2;
@@ -3622,7 +3859,7 @@ yy261:
 yy262:
                YYDEBUG(262, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1134 "Zend/zend_language_scanner.l"
+#line 1358 "Zend/zend_language_scanner.l"
                {
        if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
                zendlval->value.lval = strtol(yytext, NULL, 0);
@@ -3643,7 +3880,7 @@ yy262:
        zendlval->type = IS_LONG;
        return T_LNUMBER;
 }
-#line 3647 "Zend/zend_language_scanner.c"
+#line 3884 "Zend/zend_language_scanner.c"
 yy263:
                YYDEBUG(263, *YYCURSOR);
                yyaccept = 2;
@@ -3671,12 +3908,12 @@ yy265:
 yy266:
                YYDEBUG(266, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1486 "Zend/zend_language_scanner.l"
+#line 1723 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_ONE_LINE_COMMENT);
        yymore();
 }
-#line 3680 "Zend/zend_language_scanner.c"
+#line 3917 "Zend/zend_language_scanner.c"
 yy267:
                YYDEBUG(267, *YYCURSOR);
                yyaccept = 3;
@@ -3685,12 +3922,12 @@ yy267:
 yy268:
                YYDEBUG(268, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1644 "Zend/zend_language_scanner.l"
+#line 1888 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_DOUBLE_QUOTES);
        return '"';
 }
-#line 3694 "Zend/zend_language_scanner.c"
+#line 3931 "Zend/zend_language_scanner.c"
 yy269:
                YYDEBUG(269, *YYCURSOR);
                yyaccept = 4;
@@ -3699,23 +3936,23 @@ yy269:
 yy270:
                YYDEBUG(270, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1930 "Zend/zend_language_scanner.l"
+#line 2174 "Zend/zend_language_scanner.l"
                {
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 3708 "Zend/zend_language_scanner.c"
+#line 3945 "Zend/zend_language_scanner.c"
 yy271:
                YYDEBUG(271, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(272, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1672 "Zend/zend_language_scanner.l"
+#line 1916 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_BACKQUOTE);
        return '`';
 }
-#line 3719 "Zend/zend_language_scanner.c"
+#line 3956 "Zend/zend_language_scanner.c"
 yy273:
                YYDEBUG(273, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -3741,7 +3978,7 @@ yy277:
                ++YYCURSOR;
                YYDEBUG(278, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1602 "Zend/zend_language_scanner.l"
+#line 1839 "Zend/zend_language_scanner.l"
                {
        register char *s, *t;
        char *end;
@@ -3780,9 +4017,16 @@ yy277:
        }
        *t = 0;
 
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(output_filter)) {
+               s = zendlval->value.str.val;
+               SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), s, zendlval->value.str.len TSRMLS_CC);
+               efree(s);
+       }
+#endif /* ZEND_MULTIBYTE */
        return T_CONSTANT_ENCAPSED_STRING;
 }
-#line 3786 "Zend/zend_language_scanner.c"
+#line 4030 "Zend/zend_language_scanner.c"
 yy279:
                YYDEBUG(279, *YYCURSOR);
                ++YYCURSOR;
@@ -3879,14 +4123,14 @@ yy287:
                ++YYCURSOR;
                YYDEBUG(288, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1594 "Zend/zend_language_scanner.l"
+#line 1831 "Zend/zend_language_scanner.l"
                {
        int bprefix = (yytext[0] != '"') ? 1 : 0;
 
        zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"' TSRMLS_CC);
        return T_CONSTANT_ENCAPSED_STRING;
 }
-#line 3890 "Zend/zend_language_scanner.c"
+#line 4134 "Zend/zend_language_scanner.c"
 yy289:
                YYDEBUG(289, *YYCURSOR);
                ++YYCURSOR;
@@ -3919,13 +4163,13 @@ yy292:
 yy294:
                YYDEBUG(294, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1195 "Zend/zend_language_scanner.l"
+#line 1419 "Zend/zend_language_scanner.l"
                {
        zendlval->value.dval = zend_strtod(yytext, NULL);
        zendlval->type = IS_DOUBLE;
        return T_DNUMBER;
 }
-#line 3929 "Zend/zend_language_scanner.c"
+#line 4173 "Zend/zend_language_scanner.c"
 yy295:
                YYDEBUG(295, *YYCURSOR);
                yyaccept = 2;
@@ -3987,7 +4231,7 @@ yy302:
                }
                YYDEBUG(304, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1155 "Zend/zend_language_scanner.l"
+#line 1379 "Zend/zend_language_scanner.l"
                {
        char *hex = yytext + 2; /* Skip "0x" */
        int len = yyleng - 2;
@@ -4008,7 +4252,7 @@ yy302:
                return T_DNUMBER;
        }
 }
-#line 4012 "Zend/zend_language_scanner.c"
+#line 4256 "Zend/zend_language_scanner.c"
 yy305:
                YYDEBUG(305, *YYCURSOR);
                ++YYCURSOR;
@@ -4017,7 +4261,7 @@ yy305:
 yy306:
                YYDEBUG(306, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1569 "Zend/zend_language_scanner.l"
+#line 1806 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -4025,7 +4269,7 @@ yy306:
        BEGIN(INITIAL);
        return T_CLOSE_TAG;  /* implicit ';' at php-end tag */
 }
-#line 4029 "Zend/zend_language_scanner.c"
+#line 4273 "Zend/zend_language_scanner.c"
 yy307:
                YYDEBUG(307, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4059,13 +4303,13 @@ yy309:
 yy311:
                YYDEBUG(311, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1455 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 4069 "Zend/zend_language_scanner.c"
+#line 4313 "Zend/zend_language_scanner.c"
 yy312:
                YYDEBUG(312, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4079,11 +4323,11 @@ yy313:
                }
                YYDEBUG(314, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1079 "Zend/zend_language_scanner.l"
+#line 1303 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_XOR;
 }
-#line 4087 "Zend/zend_language_scanner.c"
+#line 4331 "Zend/zend_language_scanner.c"
 yy315:
                YYDEBUG(315, *YYCURSOR);
                ++YYCURSOR;
@@ -4092,61 +4336,61 @@ yy315:
                }
                YYDEBUG(316, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1071 "Zend/zend_language_scanner.l"
+#line 1295 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_OR;
 }
-#line 4100 "Zend/zend_language_scanner.c"
+#line 4344 "Zend/zend_language_scanner.c"
 yy317:
                YYDEBUG(317, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(318, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1059 "Zend/zend_language_scanner.l"
+#line 1283 "Zend/zend_language_scanner.l"
                {
        return T_XOR_EQUAL;
 }
-#line 4110 "Zend/zend_language_scanner.c"
+#line 4354 "Zend/zend_language_scanner.c"
 yy319:
                YYDEBUG(319, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(320, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1063 "Zend/zend_language_scanner.l"
+#line 1287 "Zend/zend_language_scanner.l"
                {
        return T_BOOLEAN_OR;
 }
-#line 4120 "Zend/zend_language_scanner.c"
+#line 4364 "Zend/zend_language_scanner.c"
 yy321:
                YYDEBUG(321, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(322, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1055 "Zend/zend_language_scanner.l"
+#line 1279 "Zend/zend_language_scanner.l"
                {
        return T_OR_EQUAL;
 }
-#line 4130 "Zend/zend_language_scanner.c"
+#line 4374 "Zend/zend_language_scanner.c"
 yy323:
                YYDEBUG(323, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(324, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1067 "Zend/zend_language_scanner.l"
+#line 1291 "Zend/zend_language_scanner.l"
                {
        return T_BOOLEAN_AND;
 }
-#line 4140 "Zend/zend_language_scanner.c"
+#line 4384 "Zend/zend_language_scanner.c"
 yy325:
                YYDEBUG(325, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(326, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1051 "Zend/zend_language_scanner.l"
+#line 1275 "Zend/zend_language_scanner.l"
                {
        return T_AND_EQUAL;
 }
-#line 4150 "Zend/zend_language_scanner.c"
+#line 4394 "Zend/zend_language_scanner.c"
 yy327:
                YYDEBUG(327, *YYCURSOR);
                ++YYCURSOR;
@@ -4155,7 +4399,7 @@ yy327:
 yy328:
                YYDEBUG(328, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1578 "Zend/zend_language_scanner.l"
+#line 1815 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                BEGIN(INITIAL);
@@ -4168,17 +4412,17 @@ yy328:
                return yytext[0];
        }
 }
-#line 4172 "Zend/zend_language_scanner.c"
+#line 4416 "Zend/zend_language_scanner.c"
 yy329:
                YYDEBUG(329, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(330, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1039 "Zend/zend_language_scanner.l"
+#line 1263 "Zend/zend_language_scanner.l"
                {
        return T_MOD_EQUAL;
 }
-#line 4182 "Zend/zend_language_scanner.c"
+#line 4426 "Zend/zend_language_scanner.c"
 yy331:
                YYDEBUG(331, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4209,11 +4453,11 @@ yy335:
                ++YYCURSOR;
                YYDEBUG(336, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1035 "Zend/zend_language_scanner.l"
+#line 1259 "Zend/zend_language_scanner.l"
                {
        return T_CONCAT_EQUAL;
 }
-#line 4217 "Zend/zend_language_scanner.c"
+#line 4461 "Zend/zend_language_scanner.c"
 yy337:
                YYDEBUG(337, *YYCURSOR);
                yyaccept = 6;
@@ -4222,12 +4466,12 @@ yy337:
 yy338:
                YYDEBUG(338, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1541 "Zend/zend_language_scanner.l"
+#line 1778 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_COMMENT);
        yymore();
 }
-#line 4231 "Zend/zend_language_scanner.c"
+#line 4475 "Zend/zend_language_scanner.c"
 yy339:
                YYDEBUG(339, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4237,11 +4481,11 @@ yy340:
                ++YYCURSOR;
                YYDEBUG(341, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1031 "Zend/zend_language_scanner.l"
+#line 1255 "Zend/zend_language_scanner.l"
                {
        return T_DIV_EQUAL;
 }
-#line 4245 "Zend/zend_language_scanner.c"
+#line 4489 "Zend/zend_language_scanner.c"
 yy342:
                YYDEBUG(342, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4260,54 +4504,54 @@ yy343:
                }
                YYDEBUG(345, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1535 "Zend/zend_language_scanner.l"
+#line 1772 "Zend/zend_language_scanner.l"
                {
        RESET_DOC_COMMENT();
        BEGIN(ST_DOC_COMMENT);
        yymore();
 }
-#line 4270 "Zend/zend_language_scanner.c"
+#line 4514 "Zend/zend_language_scanner.c"
 yy346:
                YYDEBUG(346, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(347, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1027 "Zend/zend_language_scanner.l"
+#line 1251 "Zend/zend_language_scanner.l"
                {
        return T_MUL_EQUAL;
 }
-#line 4280 "Zend/zend_language_scanner.c"
+#line 4524 "Zend/zend_language_scanner.c"
 yy348:
                YYDEBUG(348, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy352;
                YYDEBUG(349, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1087 "Zend/zend_language_scanner.l"
+#line 1311 "Zend/zend_language_scanner.l"
                {
        return T_SR;
 }
-#line 4291 "Zend/zend_language_scanner.c"
+#line 4535 "Zend/zend_language_scanner.c"
 yy350:
                YYDEBUG(350, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(351, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1015 "Zend/zend_language_scanner.l"
+#line 1239 "Zend/zend_language_scanner.l"
                {
        return T_IS_GREATER_OR_EQUAL;
 }
-#line 4301 "Zend/zend_language_scanner.c"
+#line 4545 "Zend/zend_language_scanner.c"
 yy352:
                YYDEBUG(352, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(353, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1047 "Zend/zend_language_scanner.l"
+#line 1271 "Zend/zend_language_scanner.l"
                {
        return T_SR_EQUAL;
 }
-#line 4311 "Zend/zend_language_scanner.c"
+#line 4555 "Zend/zend_language_scanner.c"
 yy354:
                YYDEBUG(354, *YYCURSOR);
                yyaccept = 7;
@@ -4318,11 +4562,11 @@ yy354:
 yy355:
                YYDEBUG(355, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1083 "Zend/zend_language_scanner.l"
+#line 1307 "Zend/zend_language_scanner.l"
                {
        return T_SL;
 }
-#line 4326 "Zend/zend_language_scanner.c"
+#line 4570 "Zend/zend_language_scanner.c"
 yy356:
                YYDEBUG(356, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4334,22 +4578,22 @@ yy357:
                ++YYCURSOR;
                YYDEBUG(358, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1011 "Zend/zend_language_scanner.l"
+#line 1235 "Zend/zend_language_scanner.l"
                {
        return T_IS_SMALLER_OR_EQUAL;
 }
-#line 4342 "Zend/zend_language_scanner.c"
+#line 4586 "Zend/zend_language_scanner.c"
 yy359:
                YYDEBUG(359, *YYCURSOR);
                ++YYCURSOR;
 yy360:
                YYDEBUG(360, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1007 "Zend/zend_language_scanner.l"
+#line 1231 "Zend/zend_language_scanner.l"
                {
        return T_IS_NOT_EQUAL;
 }
-#line 4353 "Zend/zend_language_scanner.c"
+#line 4597 "Zend/zend_language_scanner.c"
 yy361:
                YYDEBUG(361, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4400,11 +4644,11 @@ yy368:
                ++YYCURSOR;
                YYDEBUG(369, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1043 "Zend/zend_language_scanner.l"
+#line 1267 "Zend/zend_language_scanner.l"
                {
        return T_SL_EQUAL;
 }
-#line 4408 "Zend/zend_language_scanner.c"
+#line 4652 "Zend/zend_language_scanner.c"
 yy370:
                YYDEBUG(370, *YYCURSOR);
                ++YYCURSOR;
@@ -4511,7 +4755,7 @@ yy379:
 yy380:
                YYDEBUG(380, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1650 "Zend/zend_language_scanner.l"
+#line 1894 "Zend/zend_language_scanner.l"
                {
        char *s;
        int bprefix = (yytext[0] != '<') ? 1 : 0;
@@ -4532,7 +4776,7 @@ yy380:
        BEGIN(ST_START_HEREDOC);
        return T_START_HEREDOC;
 }
-#line 4536 "Zend/zend_language_scanner.c"
+#line 4780 "Zend/zend_language_scanner.c"
 yy381:
                YYDEBUG(381, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4574,7 +4818,7 @@ yy385:
 yy386:
                YYDEBUG(386, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1821 "Zend/zend_language_scanner.l"
+#line 2065 "Zend/zend_language_scanner.l"
                {
        int bprefix = (yytext[0] != '<') ? 1 : 0;
        char *s;
@@ -4591,7 +4835,7 @@ yy386:
        BEGIN(ST_START_NOWDOC);
        return T_START_NOWDOC;
 }
-#line 4595 "Zend/zend_language_scanner.c"
+#line 4839 "Zend/zend_language_scanner.c"
 yy387:
                YYDEBUG(387, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4605,31 +4849,31 @@ yy388:
                ++YYCURSOR;
                YYDEBUG(390, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 999 "Zend/zend_language_scanner.l"
+#line 1223 "Zend/zend_language_scanner.l"
                {
        return T_IS_NOT_IDENTICAL;
 }
-#line 4613 "Zend/zend_language_scanner.c"
+#line 4857 "Zend/zend_language_scanner.c"
 yy391:
                YYDEBUG(391, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(392, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1019 "Zend/zend_language_scanner.l"
+#line 1243 "Zend/zend_language_scanner.l"
                {
        return T_PLUS_EQUAL;
 }
-#line 4623 "Zend/zend_language_scanner.c"
+#line 4867 "Zend/zend_language_scanner.c"
 yy393:
                YYDEBUG(393, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(394, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 987 "Zend/zend_language_scanner.l"
+#line 1211 "Zend/zend_language_scanner.l"
                {
        return T_INC;
 }
-#line 4633 "Zend/zend_language_scanner.c"
+#line 4877 "Zend/zend_language_scanner.c"
 yy395:
                YYDEBUG(395, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4648,42 +4892,42 @@ yy397:
                }
                YYDEBUG(398, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 979 "Zend/zend_language_scanner.l"
+#line 1203 "Zend/zend_language_scanner.l"
                {
        return T_LIST;
 }
-#line 4656 "Zend/zend_language_scanner.c"
+#line 4900 "Zend/zend_language_scanner.c"
 yy399:
                YYDEBUG(399, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) == '=') goto yy403;
                YYDEBUG(400, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1003 "Zend/zend_language_scanner.l"
+#line 1227 "Zend/zend_language_scanner.l"
                {
        return T_IS_EQUAL;
 }
-#line 4667 "Zend/zend_language_scanner.c"
+#line 4911 "Zend/zend_language_scanner.c"
 yy401:
                YYDEBUG(401, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(402, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 975 "Zend/zend_language_scanner.l"
+#line 1199 "Zend/zend_language_scanner.l"
                {
        return T_DOUBLE_ARROW;
 }
-#line 4677 "Zend/zend_language_scanner.c"
+#line 4921 "Zend/zend_language_scanner.c"
 yy403:
                YYDEBUG(403, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(404, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 995 "Zend/zend_language_scanner.l"
+#line 1219 "Zend/zend_language_scanner.l"
                {
        return T_IS_IDENTICAL;
 }
-#line 4687 "Zend/zend_language_scanner.c"
+#line 4931 "Zend/zend_language_scanner.c"
 yy405:
                YYDEBUG(405, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4775,7 +5019,7 @@ yy412:
                }
                YYDEBUG(423, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1299 "Zend/zend_language_scanner.l"
+#line 1523 "Zend/zend_language_scanner.l"
                {
        if (CG(current_namespace)) {
                *zendlval = *CG(current_namespace);
@@ -4785,7 +5029,7 @@ yy412:
        }
        return T_NS_C;
 }
-#line 4789 "Zend/zend_language_scanner.c"
+#line 5033 "Zend/zend_language_scanner.c"
 yy424:
                YYDEBUG(424, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4803,7 +5047,7 @@ yy424:
                }
                YYDEBUG(428, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1272 "Zend/zend_language_scanner.l"
+#line 1496 "Zend/zend_language_scanner.l"
                {
        char *filename = zend_get_compiled_filename(TSRMLS_C);
        const size_t filename_len = strlen(filename);
@@ -4830,7 +5074,7 @@ yy424:
        zendlval->type = IS_STRING;
        return T_DIR;
 }
-#line 4834 "Zend/zend_language_scanner.c"
+#line 5078 "Zend/zend_language_scanner.c"
 yy429:
                YYDEBUG(429, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4851,13 +5095,13 @@ yy429:
                }
                YYDEBUG(434, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1254 "Zend/zend_language_scanner.l"
+#line 1478 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = CG(zend_lineno);
        zendlval->type = IS_LONG;
        return T_LINE;
 }
-#line 4861 "Zend/zend_language_scanner.c"
+#line 5105 "Zend/zend_language_scanner.c"
 yy435:
                YYDEBUG(435, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4884,7 +5128,7 @@ yy435:
                }
                YYDEBUG(442, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1233 "Zend/zend_language_scanner.l"
+#line 1457 "Zend/zend_language_scanner.l"
                {
        char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL;
        char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL;
@@ -4905,7 +5149,7 @@ yy435:
        zendlval->type = IS_STRING;
        return T_METHOD_C;
 }
-#line 4909 "Zend/zend_language_scanner.c"
+#line 5153 "Zend/zend_language_scanner.c"
 yy443:
                YYDEBUG(443, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4943,7 +5187,7 @@ yy444:
                }
                YYDEBUG(453, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1217 "Zend/zend_language_scanner.l"
+#line 1441 "Zend/zend_language_scanner.l"
                {
        char *func_name = NULL;
 
@@ -4959,7 +5203,7 @@ yy444:
        zendlval->type = IS_STRING;
        return T_FUNC_C;
 }
-#line 4963 "Zend/zend_language_scanner.c"
+#line 5207 "Zend/zend_language_scanner.c"
 yy454:
                YYDEBUG(454, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -4977,7 +5221,7 @@ yy454:
                }
                YYDEBUG(458, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1260 "Zend/zend_language_scanner.l"
+#line 1484 "Zend/zend_language_scanner.l"
                {
        char *filename = zend_get_compiled_filename(TSRMLS_C);
 
@@ -4989,7 +5233,7 @@ yy454:
        zendlval->type = IS_STRING;
        return T_FILE;
 }
-#line 4993 "Zend/zend_language_scanner.c"
+#line 5237 "Zend/zend_language_scanner.c"
 yy459:
                YYDEBUG(459, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5013,7 +5257,7 @@ yy459:
                }
                YYDEBUG(465, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1201 "Zend/zend_language_scanner.l"
+#line 1425 "Zend/zend_language_scanner.l"
                {
        char *class_name = NULL;
 
@@ -5029,7 +5273,7 @@ yy459:
        zendlval->type = IS_STRING;
        return T_CLASS_C;
 }
-#line 5033 "Zend/zend_language_scanner.c"
+#line 5277 "Zend/zend_language_scanner.c"
 yy466:
                YYDEBUG(466, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5091,11 +5335,11 @@ yy477:
                }
                YYDEBUG(478, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 943 "Zend/zend_language_scanner.l"
+#line 1167 "Zend/zend_language_scanner.l"
                {
        return T_HALT_COMPILER;
 }
-#line 5099 "Zend/zend_language_scanner.c"
+#line 5343 "Zend/zend_language_scanner.c"
 yy479:
                YYDEBUG(479, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5115,11 +5359,11 @@ yy481:
                }
                YYDEBUG(482, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 927 "Zend/zend_language_scanner.l"
+#line 1151 "Zend/zend_language_scanner.l"
                {
        return T_USE;
 }
-#line 5123 "Zend/zend_language_scanner.c"
+#line 5367 "Zend/zend_language_scanner.c"
 yy483:
                YYDEBUG(483, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5138,11 +5382,11 @@ yy485:
                }
                YYDEBUG(486, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 971 "Zend/zend_language_scanner.l"
+#line 1195 "Zend/zend_language_scanner.l"
                {
        return T_UNSET;
 }
-#line 5146 "Zend/zend_language_scanner.c"
+#line 5390 "Zend/zend_language_scanner.c"
 yy487:
                YYDEBUG(487, *YYCURSOR);
                ++YYCURSOR;
@@ -5314,11 +5558,11 @@ yy502:
                ++YYCURSOR;
                YYDEBUG(504, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 871 "Zend/zend_language_scanner.l"
+#line 1095 "Zend/zend_language_scanner.l"
                {
        return T_INT_CAST;
 }
-#line 5322 "Zend/zend_language_scanner.c"
+#line 5566 "Zend/zend_language_scanner.c"
 yy505:
                YYDEBUG(505, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5362,11 +5606,11 @@ yy510:
                ++YYCURSOR;
                YYDEBUG(513, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 875 "Zend/zend_language_scanner.l"
+#line 1099 "Zend/zend_language_scanner.l"
                {
        return T_DOUBLE_CAST;
 }
-#line 5370 "Zend/zend_language_scanner.c"
+#line 5614 "Zend/zend_language_scanner.c"
 yy514:
                YYDEBUG(514, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5436,11 +5680,11 @@ yy524:
                ++YYCURSOR;
                YYDEBUG(527, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 879 "Zend/zend_language_scanner.l"
+#line 1103 "Zend/zend_language_scanner.l"
                {
        return T_STRING_CAST;
 }
-#line 5444 "Zend/zend_language_scanner.c"
+#line 5688 "Zend/zend_language_scanner.c"
 yy528:
                YYDEBUG(528, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5473,11 +5717,11 @@ yy531:
                ++YYCURSOR;
                YYDEBUG(534, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 887 "Zend/zend_language_scanner.l"
+#line 1111 "Zend/zend_language_scanner.l"
                {
        return T_ARRAY_CAST;
 }
-#line 5481 "Zend/zend_language_scanner.c"
+#line 5725 "Zend/zend_language_scanner.c"
 yy535:
                YYDEBUG(535, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5515,11 +5759,11 @@ yy539:
                ++YYCURSOR;
                YYDEBUG(542, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 891 "Zend/zend_language_scanner.l"
+#line 1115 "Zend/zend_language_scanner.l"
                {
        return T_OBJECT_CAST;
 }
-#line 5523 "Zend/zend_language_scanner.c"
+#line 5767 "Zend/zend_language_scanner.c"
 yy543:
                YYDEBUG(543, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5560,11 +5804,11 @@ yy548:
                ++YYCURSOR;
                YYDEBUG(550, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 895 "Zend/zend_language_scanner.l"
+#line 1119 "Zend/zend_language_scanner.l"
                {
        return T_BOOL_CAST;
 }
-#line 5568 "Zend/zend_language_scanner.c"
+#line 5812 "Zend/zend_language_scanner.c"
 yy551:
                YYDEBUG(551, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5608,11 +5852,11 @@ yy556:
                ++YYCURSOR;
                YYDEBUG(559, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 883 "Zend/zend_language_scanner.l"
+#line 1107 "Zend/zend_language_scanner.l"
                {
        return T_STRING_CAST;
 }
-#line 5616 "Zend/zend_language_scanner.c"
+#line 5860 "Zend/zend_language_scanner.c"
 yy560:
                YYDEBUG(560, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5645,11 +5889,11 @@ yy563:
                ++YYCURSOR;
                YYDEBUG(566, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 899 "Zend/zend_language_scanner.l"
+#line 1123 "Zend/zend_language_scanner.l"
                {
        return T_UNSET_CAST;
 }
-#line 5653 "Zend/zend_language_scanner.c"
+#line 5897 "Zend/zend_language_scanner.c"
 yy567:
                YYDEBUG(567, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5663,11 +5907,11 @@ yy568:
                }
                YYDEBUG(569, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 867 "Zend/zend_language_scanner.l"
+#line 1091 "Zend/zend_language_scanner.l"
                {
        return T_VAR;
 }
-#line 5671 "Zend/zend_language_scanner.c"
+#line 5915 "Zend/zend_language_scanner.c"
 yy570:
                YYDEBUG(570, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5687,11 +5931,11 @@ yy572:
                }
                YYDEBUG(573, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 859 "Zend/zend_language_scanner.l"
+#line 1083 "Zend/zend_language_scanner.l"
                {
        return T_NEW;
 }
-#line 5695 "Zend/zend_language_scanner.c"
+#line 5939 "Zend/zend_language_scanner.c"
 yy574:
                YYDEBUG(574, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5730,21 +5974,21 @@ yy580:
                }
                YYDEBUG(581, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 923 "Zend/zend_language_scanner.l"
+#line 1147 "Zend/zend_language_scanner.l"
                {
        return T_NAMESPACE;
 }
-#line 5738 "Zend/zend_language_scanner.c"
+#line 5982 "Zend/zend_language_scanner.c"
 yy582:
                YYDEBUG(582, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(583, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 855 "Zend/zend_language_scanner.l"
+#line 1079 "Zend/zend_language_scanner.l"
                {
        return T_PAAMAYIM_NEKUDOTAYIM;
 }
-#line 5748 "Zend/zend_language_scanner.c"
+#line 5992 "Zend/zend_language_scanner.c"
 yy584:
                YYDEBUG(584, *YYCURSOR);
                ++YYCURSOR;
@@ -5766,32 +6010,32 @@ yy586:
                ++YYCURSOR;
                YYDEBUG(587, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1023 "Zend/zend_language_scanner.l"
+#line 1247 "Zend/zend_language_scanner.l"
                {
        return T_MINUS_EQUAL;
 }
-#line 5774 "Zend/zend_language_scanner.c"
+#line 6018 "Zend/zend_language_scanner.c"
 yy588:
                YYDEBUG(588, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(589, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 991 "Zend/zend_language_scanner.l"
+#line 1215 "Zend/zend_language_scanner.l"
                {
        return T_DEC;
 }
-#line 5784 "Zend/zend_language_scanner.c"
+#line 6028 "Zend/zend_language_scanner.c"
 yy590:
                YYDEBUG(590, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(591, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 825 "Zend/zend_language_scanner.l"
+#line 1049 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
        return T_OBJECT_OPERATOR;
 }
-#line 5795 "Zend/zend_language_scanner.c"
+#line 6039 "Zend/zend_language_scanner.c"
 yy592:
                YYDEBUG(592, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5836,11 +6080,11 @@ yy597:
                }
                YYDEBUG(598, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 967 "Zend/zend_language_scanner.l"
+#line 1191 "Zend/zend_language_scanner.l"
                {
        return T_PUBLIC;
 }
-#line 5844 "Zend/zend_language_scanner.c"
+#line 6088 "Zend/zend_language_scanner.c"
 yy599:
                YYDEBUG(599, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5895,11 +6139,11 @@ yy606:
                }
                YYDEBUG(607, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 963 "Zend/zend_language_scanner.l"
+#line 1187 "Zend/zend_language_scanner.l"
                {
        return T_PROTECTED;
 }
-#line 5903 "Zend/zend_language_scanner.c"
+#line 6147 "Zend/zend_language_scanner.c"
 yy608:
                YYDEBUG(608, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5929,11 +6173,11 @@ yy612:
                }
                YYDEBUG(613, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 959 "Zend/zend_language_scanner.l"
+#line 1183 "Zend/zend_language_scanner.l"
                {
        return T_PRIVATE;
 }
-#line 5937 "Zend/zend_language_scanner.c"
+#line 6181 "Zend/zend_language_scanner.c"
 yy614:
                YYDEBUG(614, *YYCURSOR);
                ++YYCURSOR;
@@ -5942,11 +6186,11 @@ yy614:
                }
                YYDEBUG(615, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 805 "Zend/zend_language_scanner.l"
+#line 1029 "Zend/zend_language_scanner.l"
                {
        return T_PRINT;
 }
-#line 5950 "Zend/zend_language_scanner.c"
+#line 6194 "Zend/zend_language_scanner.c"
 yy616:
                YYDEBUG(616, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5971,11 +6215,11 @@ yy619:
                }
                YYDEBUG(620, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 797 "Zend/zend_language_scanner.l"
+#line 1021 "Zend/zend_language_scanner.l"
                {
        return T_GOTO;
 }
-#line 5979 "Zend/zend_language_scanner.c"
+#line 6223 "Zend/zend_language_scanner.c"
 yy621:
                YYDEBUG(621, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -5999,11 +6243,11 @@ yy624:
                }
                YYDEBUG(625, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 931 "Zend/zend_language_scanner.l"
+#line 1155 "Zend/zend_language_scanner.l"
                {
        return T_GLOBAL;
 }
-#line 6007 "Zend/zend_language_scanner.c"
+#line 6251 "Zend/zend_language_scanner.c"
 yy626:
                YYDEBUG(626, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6037,11 +6281,11 @@ yy631:
                }
                YYDEBUG(632, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 789 "Zend/zend_language_scanner.l"
+#line 1013 "Zend/zend_language_scanner.l"
                {
        return T_BREAK;
 }
-#line 6045 "Zend/zend_language_scanner.c"
+#line 6289 "Zend/zend_language_scanner.c"
 yy633:
                YYDEBUG(633, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6081,11 +6325,11 @@ yy639:
                }
                YYDEBUG(640, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 773 "Zend/zend_language_scanner.l"
+#line 997 "Zend/zend_language_scanner.l"
                {
        return T_SWITCH;
 }
-#line 6089 "Zend/zend_language_scanner.c"
+#line 6333 "Zend/zend_language_scanner.c"
 yy641:
                YYDEBUG(641, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6109,11 +6353,11 @@ yy644:
                }
                YYDEBUG(645, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 947 "Zend/zend_language_scanner.l"
+#line 1171 "Zend/zend_language_scanner.l"
                {
        return T_STATIC;
 }
-#line 6117 "Zend/zend_language_scanner.c"
+#line 6361 "Zend/zend_language_scanner.c"
 yy646:
                YYDEBUG(646, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6140,11 +6384,11 @@ yy649:
                }
                YYDEBUG(650, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 769 "Zend/zend_language_scanner.l"
+#line 993 "Zend/zend_language_scanner.l"
                {
        return T_AS;
 }
-#line 6148 "Zend/zend_language_scanner.c"
+#line 6392 "Zend/zend_language_scanner.c"
 yy651:
                YYDEBUG(651, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6163,11 +6407,11 @@ yy653:
                }
                YYDEBUG(654, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 983 "Zend/zend_language_scanner.l"
+#line 1207 "Zend/zend_language_scanner.l"
                {
        return T_ARRAY;
 }
-#line 6171 "Zend/zend_language_scanner.c"
+#line 6415 "Zend/zend_language_scanner.c"
 yy655:
                YYDEBUG(655, *YYCURSOR);
                ++YYCURSOR;
@@ -6176,11 +6420,11 @@ yy655:
                }
                YYDEBUG(656, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1075 "Zend/zend_language_scanner.l"
+#line 1299 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_AND;
 }
-#line 6184 "Zend/zend_language_scanner.c"
+#line 6428 "Zend/zend_language_scanner.c"
 yy657:
                YYDEBUG(657, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6214,11 +6458,11 @@ yy662:
                }
                YYDEBUG(663, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 951 "Zend/zend_language_scanner.l"
+#line 1175 "Zend/zend_language_scanner.l"
                {
        return T_ABSTRACT;
 }
-#line 6222 "Zend/zend_language_scanner.c"
+#line 6466 "Zend/zend_language_scanner.c"
 yy664:
                YYDEBUG(664, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6242,11 +6486,11 @@ yy667:
                }
                YYDEBUG(668, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 729 "Zend/zend_language_scanner.l"
+#line 953 "Zend/zend_language_scanner.l"
                {
        return T_WHILE;
 }
-#line 6250 "Zend/zend_language_scanner.c"
+#line 6494 "Zend/zend_language_scanner.c"
 yy669:
                YYDEBUG(669, *YYCURSOR);
                ++YYCURSOR;
@@ -6255,11 +6499,11 @@ yy669:
                }
                YYDEBUG(670, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 713 "Zend/zend_language_scanner.l"
+#line 937 "Zend/zend_language_scanner.l"
                {
        return T_IF;
 }
-#line 6263 "Zend/zend_language_scanner.c"
+#line 6507 "Zend/zend_language_scanner.c"
 yy671:
                YYDEBUG(671, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6311,11 +6555,11 @@ yy676:
                }
                YYDEBUG(677, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 935 "Zend/zend_language_scanner.l"
+#line 1159 "Zend/zend_language_scanner.l"
                {
        return T_ISSET;
 }
-#line 6319 "Zend/zend_language_scanner.c"
+#line 6563 "Zend/zend_language_scanner.c"
 yy678:
                YYDEBUG(678, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6369,11 +6613,11 @@ yy684:
 yy685:
                YYDEBUG(685, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 907 "Zend/zend_language_scanner.l"
+#line 1131 "Zend/zend_language_scanner.l"
                {
        return T_INCLUDE;
 }
-#line 6377 "Zend/zend_language_scanner.c"
+#line 6621 "Zend/zend_language_scanner.c"
 yy686:
                YYDEBUG(686, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6402,11 +6646,11 @@ yy690:
                }
                YYDEBUG(691, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 911 "Zend/zend_language_scanner.l"
+#line 1135 "Zend/zend_language_scanner.l"
                {
        return T_INCLUDE_ONCE;
 }
-#line 6410 "Zend/zend_language_scanner.c"
+#line 6654 "Zend/zend_language_scanner.c"
 yy692:
                YYDEBUG(692, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6440,11 +6684,11 @@ yy697:
                }
                YYDEBUG(698, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 813 "Zend/zend_language_scanner.l"
+#line 1037 "Zend/zend_language_scanner.l"
                {
        return T_INTERFACE;
 }
-#line 6448 "Zend/zend_language_scanner.c"
+#line 6692 "Zend/zend_language_scanner.c"
 yy699:
                YYDEBUG(699, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6483,11 +6727,11 @@ yy705:
                }
                YYDEBUG(706, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 765 "Zend/zend_language_scanner.l"
+#line 989 "Zend/zend_language_scanner.l"
                {
        return T_INSTANCEOF;
 }
-#line 6491 "Zend/zend_language_scanner.c"
+#line 6735 "Zend/zend_language_scanner.c"
 yy707:
                YYDEBUG(707, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6531,11 +6775,11 @@ yy714:
                }
                YYDEBUG(715, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 821 "Zend/zend_language_scanner.l"
+#line 1045 "Zend/zend_language_scanner.l"
                {
        return T_IMPLEMENTS;
 }
-#line 6539 "Zend/zend_language_scanner.c"
+#line 6783 "Zend/zend_language_scanner.c"
 yy716:
                YYDEBUG(716, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6555,11 +6799,11 @@ yy718:
                }
                YYDEBUG(719, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 701 "Zend/zend_language_scanner.l"
+#line 925 "Zend/zend_language_scanner.l"
                {
        return T_TRY;
 }
-#line 6563 "Zend/zend_language_scanner.c"
+#line 6807 "Zend/zend_language_scanner.c"
 yy720:
                YYDEBUG(720, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6578,11 +6822,11 @@ yy722:
                }
                YYDEBUG(723, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 709 "Zend/zend_language_scanner.l"
+#line 933 "Zend/zend_language_scanner.l"
                {
        return T_THROW;
 }
-#line 6586 "Zend/zend_language_scanner.c"
+#line 6830 "Zend/zend_language_scanner.c"
 yy724:
                YYDEBUG(724, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6643,11 +6887,11 @@ yy730:
 yy731:
                YYDEBUG(731, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 915 "Zend/zend_language_scanner.l"
+#line 1139 "Zend/zend_language_scanner.l"
                {
        return T_REQUIRE;
 }
-#line 6651 "Zend/zend_language_scanner.c"
+#line 6895 "Zend/zend_language_scanner.c"
 yy732:
                YYDEBUG(732, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6676,11 +6920,11 @@ yy736:
                }
                YYDEBUG(737, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 919 "Zend/zend_language_scanner.l"
+#line 1143 "Zend/zend_language_scanner.l"
                {
        return T_REQUIRE_ONCE;
 }
-#line 6684 "Zend/zend_language_scanner.c"
+#line 6928 "Zend/zend_language_scanner.c"
 yy738:
                YYDEBUG(738, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6699,11 +6943,11 @@ yy740:
                }
                YYDEBUG(741, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 697 "Zend/zend_language_scanner.l"
+#line 921 "Zend/zend_language_scanner.l"
                {
        return T_RETURN;
 }
-#line 6707 "Zend/zend_language_scanner.c"
+#line 6951 "Zend/zend_language_scanner.c"
 yy742:
                YYDEBUG(742, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6784,11 +7028,11 @@ yy751:
                }
                YYDEBUG(752, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 793 "Zend/zend_language_scanner.l"
+#line 1017 "Zend/zend_language_scanner.l"
                {
        return T_CONTINUE;
 }
-#line 6792 "Zend/zend_language_scanner.c"
+#line 7036 "Zend/zend_language_scanner.c"
 yy753:
                YYDEBUG(753, *YYCURSOR);
                ++YYCURSOR;
@@ -6797,11 +7041,11 @@ yy753:
                }
                YYDEBUG(754, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 693 "Zend/zend_language_scanner.l"
+#line 917 "Zend/zend_language_scanner.l"
                {
        return T_CONST;
 }
-#line 6805 "Zend/zend_language_scanner.c"
+#line 7049 "Zend/zend_language_scanner.c"
 yy755:
                YYDEBUG(755, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6826,11 +7070,11 @@ yy758:
                }
                YYDEBUG(759, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 863 "Zend/zend_language_scanner.l"
+#line 1087 "Zend/zend_language_scanner.l"
                {
        return T_CLONE;
 }
-#line 6834 "Zend/zend_language_scanner.c"
+#line 7078 "Zend/zend_language_scanner.c"
 yy760:
                YYDEBUG(760, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6844,11 +7088,11 @@ yy761:
                }
                YYDEBUG(762, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 809 "Zend/zend_language_scanner.l"
+#line 1033 "Zend/zend_language_scanner.l"
                {
        return T_CLASS;
 }
-#line 6852 "Zend/zend_language_scanner.c"
+#line 7096 "Zend/zend_language_scanner.c"
 yy763:
                YYDEBUG(763, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6868,11 +7112,11 @@ yy765:
                }
                YYDEBUG(766, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 781 "Zend/zend_language_scanner.l"
+#line 1005 "Zend/zend_language_scanner.l"
                {
        return T_CASE;
 }
-#line 6876 "Zend/zend_language_scanner.c"
+#line 7120 "Zend/zend_language_scanner.c"
 yy767:
                YYDEBUG(767, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6886,11 +7130,11 @@ yy768:
                }
                YYDEBUG(769, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 705 "Zend/zend_language_scanner.l"
+#line 929 "Zend/zend_language_scanner.l"
                {
        return T_CATCH;
 }
-#line 6894 "Zend/zend_language_scanner.c"
+#line 7138 "Zend/zend_language_scanner.c"
 yy770:
                YYDEBUG(770, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6941,11 +7185,11 @@ yy778:
                }
                YYDEBUG(779, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 689 "Zend/zend_language_scanner.l"
+#line 913 "Zend/zend_language_scanner.l"
                {
        return T_FUNCTION;
 }
-#line 6949 "Zend/zend_language_scanner.c"
+#line 7193 "Zend/zend_language_scanner.c"
 yy780:
                YYDEBUG(780, *YYCURSOR);
                ++YYCURSOR;
@@ -6969,11 +7213,11 @@ yy780:
 yy781:
                YYDEBUG(781, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 741 "Zend/zend_language_scanner.l"
+#line 965 "Zend/zend_language_scanner.l"
                {
        return T_FOR;
 }
-#line 6977 "Zend/zend_language_scanner.c"
+#line 7221 "Zend/zend_language_scanner.c"
 yy782:
                YYDEBUG(782, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6997,11 +7241,11 @@ yy785:
                }
                YYDEBUG(786, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 749 "Zend/zend_language_scanner.l"
+#line 973 "Zend/zend_language_scanner.l"
                {
        return T_FOREACH;
 }
-#line 7005 "Zend/zend_language_scanner.c"
+#line 7249 "Zend/zend_language_scanner.c"
 yy787:
                YYDEBUG(787, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7020,11 +7264,11 @@ yy789:
                }
                YYDEBUG(790, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 955 "Zend/zend_language_scanner.l"
+#line 1179 "Zend/zend_language_scanner.l"
                {
        return T_FINAL;
 }
-#line 7028 "Zend/zend_language_scanner.c"
+#line 7272 "Zend/zend_language_scanner.c"
 yy791:
                YYDEBUG(791, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7055,11 +7299,11 @@ yy793:
                }
                YYDEBUG(794, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 737 "Zend/zend_language_scanner.l"
+#line 961 "Zend/zend_language_scanner.l"
                {
        return T_DO;
 }
-#line 7063 "Zend/zend_language_scanner.c"
+#line 7307 "Zend/zend_language_scanner.c"
 yy795:
                YYDEBUG(795, *YYCURSOR);
                ++YYCURSOR;
@@ -7068,11 +7312,11 @@ yy795:
                }
                YYDEBUG(796, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 685 "Zend/zend_language_scanner.l"
+#line 909 "Zend/zend_language_scanner.l"
                {
        return T_EXIT;
 }
-#line 7076 "Zend/zend_language_scanner.c"
+#line 7320 "Zend/zend_language_scanner.c"
 yy797:
                YYDEBUG(797, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7107,11 +7351,11 @@ yy802:
                }
                YYDEBUG(803, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 785 "Zend/zend_language_scanner.l"
+#line 1009 "Zend/zend_language_scanner.l"
                {
        return T_DEFAULT;
 }
-#line 7115 "Zend/zend_language_scanner.c"
+#line 7359 "Zend/zend_language_scanner.c"
 yy804:
                YYDEBUG(804, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7135,11 +7379,11 @@ yy807:
                }
                YYDEBUG(808, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 757 "Zend/zend_language_scanner.l"
+#line 981 "Zend/zend_language_scanner.l"
                {
        return T_DECLARE;
 }
-#line 7143 "Zend/zend_language_scanner.c"
+#line 7387 "Zend/zend_language_scanner.c"
 yy809:
                YYDEBUG(809, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7219,11 +7463,11 @@ yy820:
                }
                YYDEBUG(821, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 817 "Zend/zend_language_scanner.l"
+#line 1041 "Zend/zend_language_scanner.l"
                {
        return T_EXTENDS;
 }
-#line 7227 "Zend/zend_language_scanner.c"
+#line 7471 "Zend/zend_language_scanner.c"
 yy822:
                YYDEBUG(822, *YYCURSOR);
                ++YYCURSOR;
@@ -7232,11 +7476,11 @@ yy822:
                }
                YYDEBUG(823, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 681 "Zend/zend_language_scanner.l"
+#line 905 "Zend/zend_language_scanner.l"
                {
        return T_EXIT;
 }
-#line 7240 "Zend/zend_language_scanner.c"
+#line 7484 "Zend/zend_language_scanner.c"
 yy824:
                YYDEBUG(824, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7250,11 +7494,11 @@ yy825:
                }
                YYDEBUG(826, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 903 "Zend/zend_language_scanner.l"
+#line 1127 "Zend/zend_language_scanner.l"
                {
        return T_EVAL;
 }
-#line 7258 "Zend/zend_language_scanner.c"
+#line 7502 "Zend/zend_language_scanner.c"
 yy827:
                YYDEBUG(827, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7324,11 +7568,11 @@ yy836:
                }
                YYDEBUG(837, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 733 "Zend/zend_language_scanner.l"
+#line 957 "Zend/zend_language_scanner.l"
                {
        return T_ENDWHILE;
 }
-#line 7332 "Zend/zend_language_scanner.c"
+#line 7576 "Zend/zend_language_scanner.c"
 yy838:
                YYDEBUG(838, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7357,11 +7601,11 @@ yy842:
                }
                YYDEBUG(843, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 777 "Zend/zend_language_scanner.l"
+#line 1001 "Zend/zend_language_scanner.l"
                {
        return T_ENDSWITCH;
 }
-#line 7365 "Zend/zend_language_scanner.c"
+#line 7609 "Zend/zend_language_scanner.c"
 yy844:
                YYDEBUG(844, *YYCURSOR);
                ++YYCURSOR;
@@ -7370,11 +7614,11 @@ yy844:
                }
                YYDEBUG(845, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 721 "Zend/zend_language_scanner.l"
+#line 945 "Zend/zend_language_scanner.l"
                {
        return T_ENDIF;
 }
-#line 7378 "Zend/zend_language_scanner.c"
+#line 7622 "Zend/zend_language_scanner.c"
 yy846:
                YYDEBUG(846, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7403,11 +7647,11 @@ yy847:
 yy848:
                YYDEBUG(848, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 745 "Zend/zend_language_scanner.l"
+#line 969 "Zend/zend_language_scanner.l"
                {
        return T_ENDFOR;
 }
-#line 7411 "Zend/zend_language_scanner.c"
+#line 7655 "Zend/zend_language_scanner.c"
 yy849:
                YYDEBUG(849, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7431,11 +7675,11 @@ yy852:
                }
                YYDEBUG(853, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 753 "Zend/zend_language_scanner.l"
+#line 977 "Zend/zend_language_scanner.l"
                {
        return T_ENDFOREACH;
 }
-#line 7439 "Zend/zend_language_scanner.c"
+#line 7683 "Zend/zend_language_scanner.c"
 yy854:
                YYDEBUG(854, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7469,11 +7713,11 @@ yy859:
                }
                YYDEBUG(860, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 761 "Zend/zend_language_scanner.l"
+#line 985 "Zend/zend_language_scanner.l"
                {
        return T_ENDDECLARE;
 }
-#line 7477 "Zend/zend_language_scanner.c"
+#line 7721 "Zend/zend_language_scanner.c"
 yy861:
                YYDEBUG(861, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7492,11 +7736,11 @@ yy863:
                }
                YYDEBUG(864, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 939 "Zend/zend_language_scanner.l"
+#line 1163 "Zend/zend_language_scanner.l"
                {
        return T_EMPTY;
 }
-#line 7500 "Zend/zend_language_scanner.c"
+#line 7744 "Zend/zend_language_scanner.c"
 yy865:
                YYDEBUG(865, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7525,11 +7769,11 @@ yy866:
 yy867:
                YYDEBUG(867, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 725 "Zend/zend_language_scanner.l"
+#line 949 "Zend/zend_language_scanner.l"
                {
        return T_ELSE;
 }
-#line 7533 "Zend/zend_language_scanner.c"
+#line 7777 "Zend/zend_language_scanner.c"
 yy868:
                YYDEBUG(868, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7543,11 +7787,11 @@ yy869:
                }
                YYDEBUG(870, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 717 "Zend/zend_language_scanner.l"
+#line 941 "Zend/zend_language_scanner.l"
                {
        return T_ELSEIF;
 }
-#line 7551 "Zend/zend_language_scanner.c"
+#line 7795 "Zend/zend_language_scanner.c"
 yy871:
                YYDEBUG(871, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7561,11 +7805,11 @@ yy872:
                }
                YYDEBUG(873, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 801 "Zend/zend_language_scanner.l"
+#line 1025 "Zend/zend_language_scanner.l"
                {
        return T_ECHO;
 }
-#line 7569 "Zend/zend_language_scanner.c"
+#line 7813 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_PROPERTY:
@@ -7638,7 +7882,7 @@ yy876:
 yy877:
                YYDEBUG(877, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 830 "Zend/zend_language_scanner.l"
+#line 1054 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -7646,7 +7890,7 @@ yy877:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_WHITESPACE;
 }
-#line 7650 "Zend/zend_language_scanner.c"
+#line 7894 "Zend/zend_language_scanner.c"
 yy878:
                YYDEBUG(878, *YYCURSOR);
                ++YYCURSOR;
@@ -7654,13 +7898,13 @@ yy878:
 yy879:
                YYDEBUG(879, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 849 "Zend/zend_language_scanner.l"
+#line 1073 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state(TSRMLS_C);
        goto restart;
 }
-#line 7664 "Zend/zend_language_scanner.c"
+#line 7908 "Zend/zend_language_scanner.c"
 yy880:
                YYDEBUG(880, *YYCURSOR);
                ++YYCURSOR;
@@ -7669,14 +7913,14 @@ yy880:
 yy881:
                YYDEBUG(881, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 842 "Zend/zend_language_scanner.l"
+#line 1066 "Zend/zend_language_scanner.l"
                {
        yy_pop_state(TSRMLS_C);
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 7680 "Zend/zend_language_scanner.c"
+#line 7924 "Zend/zend_language_scanner.c"
 yy882:
                YYDEBUG(882, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -7697,11 +7941,11 @@ yy885:
                ++YYCURSOR;
                YYDEBUG(886, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 838 "Zend/zend_language_scanner.l"
+#line 1062 "Zend/zend_language_scanner.l"
                {
        return T_OBJECT_OPERATOR;
 }
-#line 7705 "Zend/zend_language_scanner.c"
+#line 7949 "Zend/zend_language_scanner.c"
 yy887:
                YYDEBUG(887, *YYCURSOR);
                ++YYCURSOR;
@@ -7771,7 +8015,7 @@ yy891:
 yy892:
                YYDEBUG(892, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1117 "Zend/zend_language_scanner.l"
+#line 1341 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
@@ -7779,20 +8023,20 @@ yy892:
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_STRING_VARNAME;
 }
-#line 7783 "Zend/zend_language_scanner.c"
+#line 8027 "Zend/zend_language_scanner.c"
 yy893:
                YYDEBUG(893, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(894, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1126 "Zend/zend_language_scanner.l"
+#line 1350 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state(TSRMLS_C);
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        goto restart;
 }
-#line 7796 "Zend/zend_language_scanner.c"
+#line 8040 "Zend/zend_language_scanner.c"
 yy895:
                YYDEBUG(895, *YYCURSOR);
                ++YYCURSOR;
@@ -8254,7 +8498,7 @@ yy932:
                ++YYCURSOR;
                YYDEBUG(933, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1864 "Zend/zend_language_scanner.l"
+#line 2108 "Zend/zend_language_scanner.l"
                {
        char *end = yytext + yyleng - 1;
 
@@ -8297,7 +8541,7 @@ yy932:
                yymore();
        }
 }
-#line 8301 "Zend/zend_language_scanner.c"
+#line 8545 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_ONE_LINE_COMMENT:
@@ -8354,11 +8598,11 @@ yy936:
 yy937:
                YYDEBUG(937, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1491 "Zend/zend_language_scanner.l"
+#line 1728 "Zend/zend_language_scanner.l"
                {
        yymore();
 }
-#line 8362 "Zend/zend_language_scanner.c"
+#line 8606 "Zend/zend_language_scanner.c"
 yy938:
                YYDEBUG(938, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8381,7 +8625,7 @@ yy940:
 yy942:
                YYDEBUG(942, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1495 "Zend/zend_language_scanner.l"
+#line 1732 "Zend/zend_language_scanner.l"
                {
        switch (yytext[yyleng-1]) {
                case '?': case '%': case '>':
@@ -8399,7 +8643,7 @@ yy942:
                        return T_COMMENT;
        }
 }
-#line 8403 "Zend/zend_language_scanner.c"
+#line 8647 "Zend/zend_language_scanner.c"
 yy943:
                YYDEBUG(943, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8412,7 +8656,7 @@ yy944:
                ++YYCURSOR;
                YYDEBUG(946, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1513 "Zend/zend_language_scanner.l"
+#line 1750 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -8421,7 +8665,7 @@ yy944:
        CG(zend_lineno)++;
        return T_COMMENT;
 }
-#line 8425 "Zend/zend_language_scanner.c"
+#line 8669 "Zend/zend_language_scanner.c"
 yy947:
                YYDEBUG(947, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8431,7 +8675,7 @@ yy948:
                ++YYCURSOR;
                YYDEBUG(949, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1522 "Zend/zend_language_scanner.l"
+#line 1759 "Zend/zend_language_scanner.l"
                {
     if (CG(asp_tags) || yytext[yyleng-2] != '%') { /* asp comment? */
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -8444,7 +8688,7 @@ yy948:
                yymore();
        }
 }
-#line 8448 "Zend/zend_language_scanner.c"
+#line 8692 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_START_HEREDOC:
@@ -8501,13 +8745,13 @@ yy952:
 yy953:
                YYDEBUG(953, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1678 "Zend/zend_language_scanner.l"
+#line 1922 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        BEGIN(ST_HEREDOC);
        goto restart;
 }
-#line 8511 "Zend/zend_language_scanner.c"
+#line 8755 "Zend/zend_language_scanner.c"
 yy954:
                YYDEBUG(954, *YYCURSOR);
                yyaccept = 0;
@@ -8552,7 +8796,7 @@ yy959:
                ++YYCURSOR;
                YYDEBUG(960, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1684 "Zend/zend_language_scanner.l"
+#line 1928 "Zend/zend_language_scanner.l"
                {
        int label_len = yyleng - 1;
 
@@ -8574,7 +8818,7 @@ yy959:
                yymore();
        }
 }
-#line 8578 "Zend/zend_language_scanner.c"
+#line 8822 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_START_NOWDOC:
@@ -8631,13 +8875,13 @@ yy963:
 yy964:
                YYDEBUG(964, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1838 "Zend/zend_language_scanner.l"
+#line 2082 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        BEGIN(ST_NOWDOC);
        goto restart;
 }
-#line 8641 "Zend/zend_language_scanner.c"
+#line 8885 "Zend/zend_language_scanner.c"
 yy965:
                YYDEBUG(965, *YYCURSOR);
                yyaccept = 0;
@@ -8682,7 +8926,7 @@ yy970:
                ++YYCURSOR;
                YYDEBUG(971, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1844 "Zend/zend_language_scanner.l"
+#line 2088 "Zend/zend_language_scanner.l"
                {
        int label_len = yyleng - 1;
 
@@ -8702,7 +8946,7 @@ yy970:
                yymore();
        }
 }
-#line 8706 "Zend/zend_language_scanner.c"
+#line 8950 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_VAR_OFFSET:
@@ -8803,7 +9047,7 @@ yy974:
 yy975:
                YYDEBUG(975, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1176 "Zend/zend_language_scanner.l"
+#line 1400 "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)) {
                zendlval->value.lval = strtol(yytext, NULL, 10);
@@ -8815,7 +9059,7 @@ yy975:
        }
        return T_NUM_STRING;
 }
-#line 8819 "Zend/zend_language_scanner.c"
+#line 9063 "Zend/zend_language_scanner.c"
 yy976:
                YYDEBUG(976, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8835,23 +9079,23 @@ yy977:
 yy978:
                YYDEBUG(978, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1466 "Zend/zend_language_scanner.l"
+#line 1703 "Zend/zend_language_scanner.l"
                {
        /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */
        return yytext[0];
 }
-#line 8844 "Zend/zend_language_scanner.c"
+#line 9088 "Zend/zend_language_scanner.c"
 yy979:
                YYDEBUG(979, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(980, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1461 "Zend/zend_language_scanner.l"
+#line 1698 "Zend/zend_language_scanner.l"
                {
        yy_pop_state(TSRMLS_C);
        return ']';
 }
-#line 8855 "Zend/zend_language_scanner.c"
+#line 9099 "Zend/zend_language_scanner.c"
 yy981:
                YYDEBUG(981, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -8861,7 +9105,7 @@ yy982:
                ++YYCURSOR;
                YYDEBUG(983, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1471 "Zend/zend_language_scanner.l"
+#line 1708 "Zend/zend_language_scanner.l"
                {
        /* Invalid rule to return a more explicit parse error with proper line number */
        yyless(0);
@@ -8869,7 +9113,7 @@ yy982:
        ZVAL_EMPTY_STRING(zendlval); /* Empty since it won't be used */
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 8873 "Zend/zend_language_scanner.c"
+#line 9117 "Zend/zend_language_scanner.c"
 yy984:
                YYDEBUG(984, *YYCURSOR);
                ++YYCURSOR;
@@ -8878,24 +9122,24 @@ yy984:
 yy985:
                YYDEBUG(985, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1479 "Zend/zend_language_scanner.l"
+#line 1716 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 8888 "Zend/zend_language_scanner.c"
+#line 9132 "Zend/zend_language_scanner.c"
 yy986:
                YYDEBUG(986, *YYCURSOR);
                ++YYCURSOR;
                YYDEBUG(987, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1930 "Zend/zend_language_scanner.l"
+#line 2174 "Zend/zend_language_scanner.l"
                {
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 8899 "Zend/zend_language_scanner.c"
+#line 9143 "Zend/zend_language_scanner.c"
 yy988:
                YYDEBUG(988, *YYCURSOR);
                ++YYCURSOR;
@@ -8931,13 +9175,13 @@ yy990:
 yy992:
                YYDEBUG(992, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1455 "Zend/zend_language_scanner.l"
+#line 1692 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 8941 "Zend/zend_language_scanner.c"
+#line 9185 "Zend/zend_language_scanner.c"
 yy993:
                YYDEBUG(993, *YYCURSOR);
                ++YYCURSOR;
@@ -8969,14 +9213,14 @@ yy997:
 yy999:
                YYDEBUG(999, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1188 "Zend/zend_language_scanner.l"
+#line 1412 "Zend/zend_language_scanner.l"
                { /* Offset must be treated as a string */
        zendlval->value.str.val = (char *)estrndup(yytext, yyleng);
        zendlval->value.str.len = yyleng;
        zendlval->type = IS_STRING;
        return T_NUM_STRING;
 }
-#line 8980 "Zend/zend_language_scanner.c"
+#line 9224 "Zend/zend_language_scanner.c"
 yy1000:
                YYDEBUG(1000, *YYCURSOR);
                ++YYCURSOR;
@@ -8989,6 +9233,6 @@ yy1000:
                goto yy999;
        }
 }
-#line 1935 "Zend/zend_language_scanner.l"
+#line 2179 "Zend/zend_language_scanner.l"
 
 }
index 3ebe5bb62c51425c848c501bd7f98d688f6db4b0..273f00d1ff5717744cd90aad395fe007065d9be2 100644 (file)
@@ -35,6 +35,22 @@ typedef struct _zend_lex_state {
        zend_file_handle *in;
        uint lineno;
        char *filename;
+
+#ifdef ZEND_MULTIBYTE
+       /* original (unfiltered) script */
+       char *script_org;
+       int script_org_size;
+
+       /* filtered script */
+       char *script_filtered;
+       int script_filtered_size;
+
+       /* input/ouput filters */
+       zend_encoding_filter input_filter;
+       zend_encoding_filter output_filter;
+       zend_encoding *script_encoding;
+       zend_encoding *internal_encoding;
+#endif /* ZEND_MULTIBYTE */
 } zend_lex_state;
 
 
index b55cb854af31cb4e89aa386d78d860e6484bcf2b..3975e5e9932a85dd8d4af46916f7bfd69008987d 100644 (file)
@@ -180,6 +180,17 @@ ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
        lex_state->yy_state = YYSTATE;
        lex_state->filename = zend_get_compiled_filename(TSRMLS_C);
        lex_state->lineno = CG(zend_lineno);
+
+#ifdef ZEND_MULTIBYTE
+       lex_state->script_org = SCNG(script_org);
+       lex_state->script_org_size = SCNG(script_org_size);
+       lex_state->script_filtered = SCNG(script_filtered);
+       lex_state->script_filtered_size = SCNG(script_filtered_size);
+       lex_state->input_filter = SCNG(input_filter);
+       lex_state->output_filter = SCNG(output_filter);
+       lex_state->script_encoding = SCNG(script_encoding);
+       lex_state->internal_encoding = SCNG(internal_encoding);
+#endif /* ZEND_MULTIBYTE */
 }
 
 ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
@@ -198,6 +209,24 @@ ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
        YYSETCONDITION(lex_state->yy_state);
        CG(zend_lineno) = lex_state->lineno;
        zend_restore_compiled_filename(lex_state->filename TSRMLS_CC);
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+               SCNG(script_org) = NULL;
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+               SCNG(script_filtered) = NULL;
+       }
+       SCNG(script_org) = lex_state->script_org;
+       SCNG(script_org_size) = lex_state->script_org_size;
+       SCNG(script_filtered) = lex_state->script_filtered;
+       SCNG(script_filtered_size) = lex_state->script_filtered_size;
+       SCNG(input_filter) = lex_state->input_filter;
+       SCNG(output_filter) = lex_state->output_filter;
+       SCNG(script_encoding) = lex_state->script_encoding;
+       SCNG(internal_encoding) = lex_state->internal_encoding;
+#endif /* ZEND_MULTIBYTE */
 }
 
 ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC)
@@ -232,8 +261,27 @@ ZEND_API int open_file_for_scanning(zend_file_handle *file_handle TSRMLS_DC)
        SCNG(yy_in) = file_handle;
 
        if (size != -1) {
-               /* TODO: For MULTIBYTE we need to do some clever re-encoding */
+#ifdef ZEND_MULTIBYTE
+               if (zend_multibyte_read_script(buf, size TSRMLS_CC) != 0) {
+                       return FAILURE;
+               }
+
+               SCNG(yy_in) = NULL;
+
+               zend_multibyte_set_filter(NULL TSRMLS_CC);
+
+               if (!SCNG(input_filter)) {
+                       SCNG(script_filtered) = (char*)emalloc(SCNG(script_org_size)+1);
+                       memcpy(SCNG(script_filtered), SCNG(script_org), SCNG(script_org_size)+1);
+                       SCNG(script_filtered_size) = SCNG(script_org_size);
+               } else {
+                       SCNG(input_filter)(&SCNG(script_filtered), &SCNG(script_filtered_size), SCNG(script_org), SCNG(script_org_size) TSRMLS_CC);
+               }
+
+               yy_scan_buffer(SCNG(script_filtered), SCNG(script_filtered_size) TSRMLS_CC);
+#else /* !ZEND_MULTIBYTE */
                yy_scan_buffer(buf, size TSRMLS_CC);
+#endif /* ZEND_MULTIBYTE */
        } else {
                zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed");
        }
@@ -370,8 +418,24 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_D
 
        SCNG(yy_in)=NULL;
 
-       /* TODO: For MULTIBYTE we need to do some clever re-encoding */
+#ifdef ZEND_MULTIBYTE
+       SCNG(script_org) = estrdup(str->value.str.val);
+       SCNG(script_org_size) = str->value.str.len;
+
+       zend_multibyte_set_filter(CG(internal_encoding) TSRMLS_CC);
+
+       if (!SCNG(input_filter)) {
+               SCNG(script_filtered) = (char*)emalloc(SCNG(script_org_size)+1);
+               memcpy(SCNG(script_filtered), SCNG(script_org), SCNG(script_org_size)+1);
+               SCNG(script_filtered_size) = SCNG(script_org_size);
+       } else {
+               SCNG(input_filter)(&SCNG(script_filtered), &SCNG(script_filtered_size), SCNG(script_org), SCNG(script_org_size) TSRMLS_CC);
+       }
+
+       yy_scan_buffer(SCNG(script_filtered), SCNG(script_filtered_size) TSRMLS_CC);    
+#else /* !ZEND_MULTIBYTE */
        yy_scan_buffer(str->value.str.val, str->value.str.len TSRMLS_CC);
+#endif /* ZEND_MULTIBYTE */
 
        zend_set_compiled_filename(filename TSRMLS_CC);
        CG(zend_lineno) = 1;
@@ -422,6 +486,17 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)
                BEGIN(ST_IN_SCRIPTING);
                compiler_result = zendparse(TSRMLS_C);
 
+#ifdef ZEND_MULTIBYTE
+               if (SCNG(script_org)) {
+                       efree(SCNG(script_org));
+                       SCNG(script_org) = NULL;
+               }
+               if (SCNG(script_filtered)) {
+                       efree(SCNG(script_filtered));
+                       SCNG(script_filtered) = NULL;
+               }
+#endif /* ZEND_MULTIBYTE */
+
                if (compiler_result==1) {
                        CG(active_op_array) = original_active_op_array;
                        CG(unclean_shutdown)=1;
@@ -457,6 +532,16 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
                return FAILURE;
        }
        zend_highlight(syntax_highlighter_ini TSRMLS_CC);
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+               SCNG(script_org) = NULL;
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+               SCNG(script_filtered) = NULL;
+       }
+#endif /* ZEND_MULTIBYTE */
        zend_destroy_file_handle(&file_handle TSRMLS_CC);
        zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
        return SUCCESS;
@@ -475,15 +560,147 @@ int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_
        }
        BEGIN(INITIAL);
        zend_highlight(syntax_highlighter_ini TSRMLS_CC);
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+               SCNG(script_org) = NULL;
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+               SCNG(script_filtered) = NULL;
+       }
+#endif /* ZEND_MULTIBYTE */
        zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
        zval_dtor(str);
        return SUCCESS;
 }
 END_EXTERN_C()
 
+#ifdef ZEND_MULTIBYTE
+BEGIN_EXTERN_C()
+ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, zend_encoding *old_encoding TSRMLS_DC)
+{
+  int offset, original_offset, length, free_flag, new_len;
+       char *p;
+       zend_encoding *new_encoding;
+       unsigned char *yy_c_buf_p;
+
+       /* calculate current position */
+       offset = original_offset = YYCURSOR - SCNG(yy_start);
+       if (old_input_filter && original_offset > 0) {
+               new_encoding = SCNG(script_encoding);
+               SCNG(script_encoding) = old_encoding;
+               do {
+                       (old_input_filter)(&p, &length, SCNG(script_org), offset TSRMLS_CC);
+                       if (!p) {
+                               SCNG(script_encoding) = new_encoding;
+                               return;
+                       }
+                       efree(p);
+                       if (length > original_offset) {
+                               offset--;
+                       } else if (length < original_offset) {
+                               offset++;
+                       }
+               } while (original_offset != length);
+               SCNG(script_encoding) = new_encoding;
+       }
+
+       /* convert and set */
+       if (!SCNG(input_filter)) {
+               length = SCNG(script_org_size)-offset-1;
+               p = SCNG(script_org)+offset+1;
+               free_flag = 0;
+       } else {
+               SCNG(input_filter)(&p, &length, SCNG(script_org)+offset+1, SCNG(script_org_size)-offset-1 TSRMLS_CC);
+               free_flag = 1;
+       }
+
+       new_len = original_offset+length+1;
+
+       if (new_len > YYLIMIT-SCNG(yy_start)) {
+               YYLIMIT = SCNG(yy_start) + new_len;
+               SCNG(yy_start) =  erealloc(SCNG(yy_start), new_len);
+               SCNG(script_filtered) = SCNG(yy_start);
+               SCNG(script_filtered_size) = new_len;
+       }
+
+       yy_c_buf_p = SCNG(yy_start) + original_offset;
+       strncpy(yy_c_buf_p+1, p, length);
+
+       if (free_flag) {
+               efree(p);
+       }
+}
+
+
+ZEND_API int zend_multibyte_yyinput(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC)
+{
+       int c = '*', n;
+
+       if (CG(interactive) == 0) {
+               if (zend_stream_fixup(file_handle, &buf, &len TSRMLS_CC) == FAILURE) {
+                       return FAILURE;
+               }
+               n = len;
+               return n;
+       }
+
+       /* interactive */
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+       }
+       if (SCNG(script_filtered)) {
+               efree(SCNG(script_filtered));
+       }
+       SCNG(script_org) = NULL;
+       SCNG(script_org_size) = 0;
+
+       /* TODO: support widechars */
+       if (zend_stream_fixup(file_handle, &buf, &len TSRMLS_CC) == FAILURE) {
+               return FAILURE;
+       }
+       n = len;
+
+       SCNG(script_org_size) = n;
+       SCNG(script_org) = (char*)emalloc(SCNG(script_org_size) + 1);
+       memcpy(SCNG(script_org), buf, n);
+
+       return n;
+}
+
+
+ZEND_API int zend_multibyte_read_script(char *buf, int n TSRMLS_DC)
+{
+       if (SCNG(script_org)) {
+               efree(SCNG(script_org));
+       }
+       if (n<0) {
+               return -1;
+       }
+       SCNG(script_org_size) = n;
+       SCNG(script_org) = (char*)erealloc(SCNG(script_org), SCNG(script_org_size));
+       memcpy(SCNG(script_org) + SCNG(script_org_size) - n, buf, n);
+       
+       SCNG(script_org) = (char*)erealloc(SCNG(script_org), SCNG(script_org_size) + 1);
+       *(SCNG(script_org)+SCNG(script_org_size)) = '\0';
+
+       return 0;
+}
+
+
+# define zend_copy_value(zendlval, yytext, yyleng) \
+       if (SCNG(output_filter)) { \
+               SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), yytext, yyleng TSRMLS_CC); \
+       } else { \
+               zendlval->value.str.val = (char *) estrndup(yytext, yyleng); \
+               zendlval->value.str.len = yyleng; \
+       }
+#else /* ZEND_MULTIBYTE */
 # define zend_copy_value(zendlval, yytext, yyleng) \
        zendlval->value.str.val = (char *)estrndup(yytext, yyleng); \
        zendlval->value.str.len = yyleng;
+#endif /* ZEND_MULTIBYTE */
 
 static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC)
 {
@@ -587,6 +804,13 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo
                s++;
        }
        *t = 0;
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(output_filter)) {
+               s = zendlval->value.str.val;
+               SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), s, zendlval->value.str.len TSRMLS_CC);
+               efree(s);
+       }
+#endif /* ZEND_MULTIBYTE */
 }
 
 
@@ -1423,8 +1647,21 @@ NOWDOC_CHARS             ({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_
 
 inline_char_handler:
 
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(output_filter)) {
+               int readsize;
+               readsize = SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), yytext, yyleng TSRMLS_CC);
+               if (readsize < yyleng) {
+                       yyless(readsize);
+               }
+       } else {
+         zendlval->value.str.val = (char *) estrndup(yytext, yyleng);
+         zendlval->value.str.len = yyleng;
+       }
+#else /* !ZEND_MULTIBYTE */
        zendlval->value.str.val = (char *) estrndup(yytext, yyleng);
-       zendlval->value.str.len = yyleng;
+       zendlval->value.str.len = yyleng;
+#endif
        zendlval->type = IS_STRING;
        HANDLE_NEWLINES(yytext, yyleng);
        return T_INLINE_HTML;
@@ -1637,6 +1874,13 @@ inline_char_handler:
        }
        *t = 0;
 
+#ifdef ZEND_MULTIBYTE
+       if (SCNG(output_filter)) {
+               s = zendlval->value.str.val;
+               SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), s, zendlval->value.str.len TSRMLS_CC);
+               efree(s);
+       }
+#endif /* ZEND_MULTIBYTE */
        return T_CONSTANT_ENCAPSED_STRING;
 }
 
index 146a2c6cf6976115d7f4657accfccdade36897b4..e9bb74e5a482d4d3a99ecdc9c2ac8ed3e6fe6896 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5.dev on Thu Apr 10 20:01:41 2008 */
+/* Generated by re2c 0.13.5 on Sun Jun 29 17:06:51 2008 */
 #line 3 "Zend/zend_language_scanner_defs.h"
 
 enum YYCONDTYPE {
index df10965d97ed7343253437a2e9689bb3693770c9..874cbe6f06ecb92541374c5bcedae989d8cc948f 100644 (file)
@@ -62,7 +62,7 @@ ZEND_API int zend_multibyte_internal_encoding_filter(char **to, int *to_length,
 /* in zend_language_scanner.l */
 ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, zend_encoding *old_encoding TSRMLS_DC);
 ZEND_API int zend_multibyte_yyinput(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC);
-ZEND_API int zend_multibyte_read_script(TSRMLS_D);
+ZEND_API int zend_multibyte_read_script(char *buf, int n TSRMLS_DC);
 END_EXTERN_C()
 
 #endif /* ZEND_MULTIBYTE */
index ca4598a24f605a4377492c28cdf6779b90b942cc..ff2453d360f82bc682450260031625392ae19a80 100644 (file)
@@ -351,6 +351,12 @@ AC_DEFINE('HAVE_IPV6', main_network_has_ipv6);
 ARG_ENABLE('fd-setsize', "Set maximum number of sockets for select(2)", "256");
 ADD_FLAG("CFLAGS", "/D FD_SETSIZE=" + parseInt(PHP_FD_SETSIZE));
 
+ARG_ENABLE("zend-multibyte", "Enable Zend multibyte encoding support", "no");
+if (PHP_ZEND_MULTIBYTE == "yes") {
+   STDOUT.WriteLine("Enabling Zend multibyte encoding support");
+   AC_DEFINE('ZEND_MULTIBYTE', 1);
+}
 AC_DEFINE('HAVE_USLEEP', 1);
 AC_DEFINE('HAVE_STRCOLL', 1);