]> granicus.if.org Git - php/commitdiff
- Shift around the variable parsing code to make it simpler.
authorAndi Gutmans <andi@php.net>
Fri, 7 Sep 2001 14:46:12 +0000 (14:46 +0000)
committerAndi Gutmans <andi@php.net>
Fri, 7 Sep 2001 14:46:12 +0000 (14:46 +0000)
Zend/zend_compile.c
Zend/zend_language_parser.y

index 3f3ab2b0c82c32ab44b265cf157baaf9b01b4760..19f5bb37da73fdea0d7b4d45fef998bfd589f9ba 100644 (file)
@@ -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);
index 9a47163c91002a9a7282b30459e17ce1ef2c00de..5eeacb0ae6c6a4377191d89f5ab91956c7a8e384 100644 (file)
@@ -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: