summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2001-09-07 14:46:12 +0000
committerAndi Gutmans <andi@php.net>2001-09-07 14:46:12 +0000
commitd7536a8a5fff618601a0aefd491d8ef375ac33b3 (patch)
tree16efc9f0321605b6c229dcafae9426b7f547c97c /Zend
parent2da75a405fb00d86f64fc663fb14d808d8ba7784 (diff)
downloadphp-git-d7536a8a5fff618601a0aefd491d8ef375ac33b3.tar.gz
- Shift around the variable parsing code to make it simpler.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_compile.c11
-rw-r--r--Zend/zend_language_parser.y26
2 files changed, 22 insertions, 15 deletions
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: