From: Nikita Popov Date: Fri, 30 May 2014 20:03:24 +0000 (+0200) Subject: Use recursion for property fetches X-Git-Tag: POST_AST_MERGE^2~233 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8b3b355be4ac5c537dd5fc60c929f9f15c5c636;p=php Use recursion for property fetches --- diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 1fd580ef58..08c3ffe7eb 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -1082,18 +1082,15 @@ rw_variable: ; variable: - base_variable T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); } - object_property { zend_do_push_object(&$4 TSRMLS_CC); } method_or_not variable_properties - { zend_do_pop_object(&$$ TSRMLS_CC); $$.EA = $1.EA | ($7.EA ? $7.EA : $6.EA); } - | base_variable { $$ = $1; } -; - -variable_properties: - variable_properties variable_property { $$.EA = $2.EA; } - | /* empty */ { $$.EA = 0; } + variable T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); } + object_property { zend_do_push_object(&$4 TSRMLS_CC); } method_or_not + { zend_do_pop_object(&$$ TSRMLS_CC); $$.EA = $6.EA; } + | reference_variable { $$ = $1; $$.EA = ZEND_PARSED_VARIABLE; } + | static_member { $$ = $1; $$.EA = ZEND_PARSED_STATIC_MEMBER; } + | array_function_dereference { $$ = $1; } + | function_call { zend_do_begin_variable_parse(TSRMLS_C); $$ = $1; $$.EA = ZEND_PARSED_FUNCTION_CALL; } ; - variable_property: T_OBJECT_OPERATOR object_property { zend_do_push_object(&$2 TSRMLS_CC); } method_or_not { $$.EA = $4.EA; } ; @@ -1134,13 +1131,6 @@ array_function_dereference: '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$4 TSRMLS_CC); } ; -base_variable: - reference_variable { $$ = $1; $$.EA = ZEND_PARSED_VARIABLE; } - | static_member { $$ = $1; $$.EA = ZEND_PARSED_STATIC_MEMBER; } - | array_function_dereference { $$ = $1; } - | function_call { zend_do_begin_variable_parse(TSRMLS_C); $$ = $1; $$.EA = ZEND_PARSED_FUNCTION_CALL; } -; - reference_variable: reference_variable '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); } | reference_variable '{' expr '}' { fetch_string_offset(&$$, &$1, &$3 TSRMLS_CC); }