From: Andi Gutmans Date: Fri, 7 Sep 2001 14:46:12 +0000 (+0000) Subject: - Shift around the variable parsing code to make it simpler. X-Git-Tag: PRE_SUBST_Z_MACROS~170 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d7536a8a5fff618601a0aefd491d8ef375ac33b3;p=php - Shift around the variable parsing code to make it simpler. --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3f3ab2b0c8..19f5bb37da 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -845,13 +845,19 @@ int zend_do_begin_function_call(znode *function_name TSRMLS_DC) void zend_do_begin_method_call(znode *object, znode *function_name TSRMLS_DC) { - zend_op *opline; + zend_op *last_op; + int last_op_number; unsigned char *ptr = NULL; zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_variable_parse(TSRMLS_C); - opline = get_next_op(CG(active_op_array) TSRMLS_CC); + last_op_number = get_next_op_number(CG(active_op_array))-1; + last_op = &CG(active_op_array)->opcodes[last_op_number]; + last_op->opcode = ZEND_INIT_FCALL_BY_NAME; + last_op->extended_value = ZEND_MEMBER_FUNC_CALL; + + /*opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_INIT_FCALL_BY_NAME; opline->extended_value = ZEND_MEMBER_FUNC_CALL; opline->op1 = *object; @@ -861,6 +867,7 @@ void zend_do_begin_method_call(znode *object, znode *function_name TSRMLS_DC) *function_name = opline->result; +*/ /* if (function_name->op_type == IS_CONST) { zval_copy_ctor(&function_name->u.constant); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 9a47163c91..5eeacb0ae6 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -502,7 +502,6 @@ function_call: | cvar_without_objects '(' { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_begin_dynamic_function_call(&$1 TSRMLS_CC); } function_call_parameter_list ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} - ; @@ -590,10 +589,20 @@ rw_cvar: cvar { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; } ; - cvar: - cvar_without_objects { $$ = $1; } - | cvar_without_objects T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); } ref_list { $$ = $4; } + variable { $$ = $1; } +; + + +variable: + variable_property '(' { zend_do_begin_method_call(NULL, &$1 TSRMLS_CC); } + function_call_parameter_list ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} + | variable_property { $$ = $1; } + | cvar_without_objects { $$ = $1; } +; + +variable_property: + variable T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); } object_property { $$ = $4; } ; @@ -620,19 +629,10 @@ dim_offset: | expr { $$ = $1; } ; -ref_list: - object_property { $$ = $1; } - | ref_list T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); } object_property { $$ = $4; } -; object_property: object_dim_list { $$ = $1; } | cvar_without_objects { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); } { znode tmp_znode; zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_fetch_property(&$$, &tmp_znode, &$1 TSRMLS_CC);} - | cvar_without_objects '(' { znode tmp_znode; zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_begin_method_call(&tmp_znode, &$1 TSRMLS_CC); } - function_call_parameter_list ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} - | variable_name '(' { znode tmp_znode; zend_do_pop_object(&tmp_znode TSRMLS_CC); zend_do_begin_method_call(&tmp_znode, &$1 TSRMLS_CC); } - function_call_parameter_list ')' { zend_do_end_function_call(&$1, &$$, &$4, 0, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);} - ; object_dim_list: