diff options
| author | Nikita Popov <nikic@php.net> | 2012-03-30 20:41:44 +0200 |
|---|---|---|
| committer | Nikita Popov <nikic@php.net> | 2012-03-31 21:53:30 +0200 |
| commit | 4cf90e06c9834a52195384da760503ea055c726d (patch) | |
| tree | 87a30ce3bf8e76ea04e43cd4d1b871c96214cd6e /Zend/zend_compile.c | |
| parent | 15a98ece9fc43578fe1825d3c5ccafa665f63b48 (diff) | |
| download | php-git-4cf90e06c9834a52195384da760503ea055c726d.tar.gz | |
Fix lexing of nested heredoc strings in token_get_all()
This fixes bug #60097.
Before two global variables CG(heredoc) and CG(heredoc_len) were used to
track the current heredoc label. In order to support nested heredoc
strings the *previous* heredoc label was assigned as the token value of
T_START_HEREDOC and the language_parser.y assigned that to CG(heredoc).
This created a dependency of the lexer on the parser. Thus the
token_get_all() function, which accesses the lexer directly without
also running the parser, was not able to tokenize nested heredoc strings
(and leaked memory). Same applies for the source-code highlighting
functions.
The new approach is to maintain a heredoc_label_stack in the lexer, which
contains all active heredoc labels.
As it is no longer required, T_START_HEREDOC and T_END_HEREDOC now don't
carry a token value anymore.
In order to make the work with zend_ptr_stack in this context more
convenient I added a new function zend_ptr_stack_top(), which retrieves the
top element of the stack (similar to zend_stack_top()).
Diffstat (limited to 'Zend/zend_compile.c')
| -rw-r--r-- | Zend/zend_compile.c | 3 |
1 files changed, 0 insertions, 3 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c3c35eb5fc..0533bf8c18 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6708,9 +6708,6 @@ again: case T_OPEN_TAG_WITH_ECHO: retval = T_ECHO; break; - case T_END_HEREDOC: - efree(Z_STRVAL(zendlval->u.constant)); - break; } INIT_PZVAL(&zendlval->u.constant); |
