Browse Source

- Shift around the variable parsing code to make it simpler.

experimental/namespaces
Andi Gutmans 25 years ago
parent
commit
d7536a8a5f
  1. 11
      Zend/zend_compile.c
  2. 26
      Zend/zend_language_parser.y

11
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);

26
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:

Loading…
Cancel
Save