diff options
-rw-r--r-- | Zend/zend_compile.h | 7 | ||||
-rw-r--r-- | Zend/zend_language_scanner.h | 2 | ||||
-rw-r--r-- | Zend/zend_language_scanner.l | 20 |
3 files changed, 14 insertions, 15 deletions
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 13d7883edb..abd7c6449d 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -117,17 +117,12 @@ typedef struct _zend_file_context { HashTable seen_symbols; } zend_file_context; -typedef struct { - uint32_t offset; - uint32_t len; -} zend_lexer_ident_ref; - typedef union _zend_parser_stack_elem { zend_ast *ast; zend_string *str; zend_ulong num; unsigned char *ptr; - zend_lexer_ident_ref ident; + unsigned char *ident; } zend_parser_stack_elem; void zend_compile_top_stmt(zend_ast *ast); diff --git a/Zend/zend_language_scanner.h b/Zend/zend_language_scanner.h index c6ac8eb387..ca32329a55 100644 --- a/Zend/zend_language_scanner.h +++ b/Zend/zend_language_scanner.h @@ -78,7 +78,7 @@ ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state); ZEND_API void zend_prepare_string_for_scanning(zval *str, zend_string *filename); ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, const zend_encoding *old_encoding); ZEND_API zend_result zend_multibyte_set_filter(const zend_encoding *onetime_encoding); -ZEND_API zend_result zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref); +ZEND_API zend_result zend_lex_tstring(zval *zv, unsigned char *ident); END_EXTERN_C() diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 4452d7d000..6f2889aac8 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -307,20 +307,25 @@ ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle) } } -ZEND_API zend_result zend_lex_tstring(zval *zv, zend_lexer_ident_ref ident_ref) +ZEND_API zend_result zend_lex_tstring(zval *zv, unsigned char *ident) { - char *ident = (char *) SCNG(yy_start) + ident_ref.offset; - size_t length = ident_ref.len; - if (length == sizeof("<?=")-1 && memcmp(ident, "<?=", sizeof("<?=")-1) == 0) { + unsigned char *end = ident; + while ((*end >= 'a' && *end <= 'z') || (*end >= 'A' && *end <= 'Z') || *end == '_') { + end++; + } + + size_t length = end - ident; + if (length == 0) { + ZEND_ASSERT(ident[0] == '<' && ident[1] == '?' && ident[2] == '='); zend_throw_exception(zend_ce_parse_error, "Cannot use \"<?=\" as an identifier", 0); return FAILURE; } if (SCNG(on_event)) { - SCNG(on_event)(ON_FEEDBACK, T_STRING, 0, ident, length, SCNG(on_event_context)); + SCNG(on_event)(ON_FEEDBACK, T_STRING, 0, (char *) ident, length, SCNG(on_event_context)); } - ZVAL_STRINGL(zv, ident, length); + ZVAL_STRINGL(zv, (char *) ident, length); return SUCCESS; } @@ -3096,8 +3101,7 @@ emit_token: emit_token_with_ident: if (PARSER_MODE()) { - elem->ident.offset = SCNG(yy_text) - SCNG(yy_start); - elem->ident.len = SCNG(yy_leng); + elem->ident = SCNG(yy_text); } if (SCNG(on_event)) { SCNG(on_event)(ON_TOKEN, token, start_line, yytext, yyleng, SCNG(on_event_context)); |