}
-void do_fetch_class(znode *result, znode *namespace_name, znode *class_name TSRMLS_DC)
+void zend_do_fetch_class(znode *result, znode *namespace_name, znode *class_name TSRMLS_DC)
{
long fetch_class_op_number;
zend_op *opline;
opline->opcode = ZEND_FETCH_CLASS;
if (namespace_name) {
- zend_str_tolower(namespace_name->u.constant.value.str.val, namespace_name->u.constant.value.str.len);
+ if (namespace_name->op_type == IS_CONST) {
+ zend_str_tolower(namespace_name->u.constant.value.str.val, namespace_name->u.constant.value.str.len);
+ }
opline->op1 = *namespace_name;
} else {
SET_UNUSED(opline->op1);
SET_UNUSED(opline->op2);
opline->extended_value = ZEND_FETCH_CLASS_PARENT;
zval_dtor(&class_name->u.constant);
- } else if ((class_name->u.constant.value.str.len == (sizeof("main") - 1)) &&
- !memcmp(class_name->u.constant.value.str.val, "main", sizeof("main"))) {
- SET_UNUSED(opline->op2);
- opline->extended_value = ZEND_FETCH_CLASS_MAIN;
- zval_dtor(&class_name->u.constant);
} else {
opline->op2 = *class_name;
}
}
-void do_fetch_class_name(znode *result, znode *class_name_entry, znode *class_name, zend_bool case_sensitive TSRMLS_DC)
+void zend_do_fetch_class_name(znode *result, znode *class_name_entry, znode *class_name, zend_bool case_sensitive TSRMLS_DC)
{
zend_uint length;
result->u.constant.value.str.len = length;
}
-void zend_do_begin_class_member_function_call(znode *class_name, znode *function_name TSRMLS_DC)
+void zend_do_begin_class_member_function_call(TSRMLS_D)
{
unsigned char *ptr = NULL;
- zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+ long fetch_const_op_number = get_next_op_number(CG(active_op_array));
+ zend_op *opline = &CG(active_op_array)->opcodes[fetch_const_op_number-1];
+ /* a tmp var is leaked here */
opline->opcode = ZEND_INIT_STATIC_METHOD_CALL;
- opline->op1 = *class_name;
- zend_lowercase_znode_if_const(function_name);
- opline->op2 = *function_name;
+ zend_lowercase_znode_if_const(&opline->op2);
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *));
}
void zend_do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method, int is_dynamic_fcall TSRMLS_DC)
{
zend_op *opline;
-
- if (is_method && function_name && function_name->u.constant.value.lval == ZEND_CLONE) {
- if (argument_list->u.constant.value.lval > 0) {
- zend_error(E_COMPILE_ERROR, "Can't pass arguments to __clone()");
- }
- /* FIXME: throw_list */
- zend_stack_del_top(&CG(function_call_stack));
- *result = CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1].result;
- return;
- }
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
switch (mode) {
case ZEND_CT:
if (constant_container) {
- do_fetch_class_name(NULL, constant_container, constant_name, 1 TSRMLS_CC);
+ zend_do_fetch_class_name(NULL, constant_container, constant_name, 1 TSRMLS_CC);
*result = *constant_container;
} else {
*result = *constant_name;
optional_class_type:
/* empty */ { $$.op_type = IS_UNUSED; }
- | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
- | T_STRING { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
+ | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
+ | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
;
function_call_parameter_list:
T_STRING '(' { $2.u.opline_num = zend_do_begin_function_call(&$1 TSRMLS_CC); }
function_call_parameter_list
')' { zend_do_end_function_call(&$1, &$$, &$4, 0, $2.u.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
- | parse_class_entry static_or_variable_string '(' { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_class_member_function_call(&$1, &$2 TSRMLS_CC); }
+ | class_or_namespace_constant '(' { zend_do_extended_fcall_begin(TSRMLS_C); zend_do_begin_class_member_function_call(TSRMLS_C); }
function_call_parameter_list
- ')' { zend_do_end_function_call(&$2, &$$, &$5, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
+ ')' { zend_do_end_function_call(NULL, &$$, &$4, 1, 1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C);}
| variable_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);}
;
-parse_class_entry:
- T_NAMESPACE_NAME T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM { do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
- | static_or_variable_string T_PAAMAYIM_NEKUDOTAYIM { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
- | T_PAAMAYIM_NEKUDOTAYIM { do_fetch_class(&$$, NULL, NULL TSRMLS_CC); }
-;
-
fully_qualified_class_name:
- namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
- | T_PAAMAYIM_NEKUDOTAYIM T_STRING { do_fetch_class(&$$, NULL, &$2 TSRMLS_CC); }
- | T_STRING { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
+ namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
+ | T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, NULL, &$2 TSRMLS_CC); }
+ | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
;
import_namespace:
- T_NAMESPACE_NAME { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
- | T_STRING { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
+ T_NAMESPACE_NAME { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
+ | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
;
new_class_entry:
- namespace_name T_PAAMAYIM_NEKUDOTAYIM static_or_variable_string { do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
- | static_or_variable_string { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
+ namespace_name T_PAAMAYIM_NEKUDOTAYIM static_or_variable_string { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
+ | static_or_variable_string { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
;
namespace_name:
;
instanceof_expr:
- namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
- | T_STRING { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
+ namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$$, &$1, &$3 TSRMLS_CC); }
+ | T_STRING { zend_do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
;
exit_expr:
| '+' static_scalar { $$ = $2; }
| '-' static_scalar { zval minus_one; minus_one.type = IS_LONG; minus_one.value.lval = -1; mul_function(&$2.u.constant, &$2.u.constant, &minus_one TSRMLS_CC); $$ = $2; }
| T_ARRAY '(' static_array_pair_list ')' { $$ = $3; $$.u.constant.type = IS_CONSTANT_ARRAY; }
- | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_CT TSRMLS_CC); }
+ | class_or_namespace_constant { /* FIXME */ }
;
scalar:
T_STRING { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT TSRMLS_CC); }
| T_STRING_VARNAME { $$ = $1; }
- | parse_class_entry T_STRING { zend_do_fetch_constant(&$$, &$1, &$2, ZEND_RT TSRMLS_CC); }
+ | class_or_namespace_constant { $$ = $1; }
| common_scalar { $$ = $1; }
| '"' encaps_list '"' { $$ = $2; }
| '\'' encaps_list '\'' { $$ = $2; }
;
static_member:
- parse_class_entry variable_without_objects { $$ = $2; zend_do_fetch_static_member(&$1 TSRMLS_CC); }
+ T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $4; zend_do_fetch_class(&$1, NULL, &$2 TSRMLS_CC); zend_do_fetch_static_member(&$1 TSRMLS_CC); }
+ | namespace_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $3; zend_do_fetch_class(&$2, NULL, &$1 TSRMLS_CC); zend_do_fetch_static_member(&$2 TSRMLS_CC); }
+ | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { $$ = $5; zend_do_fetch_class(&$4, &$1, &$3 TSRMLS_CC); zend_do_fetch_static_member(&$4 TSRMLS_CC); }
;
| isset_variables ',' { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } variable { znode tmp; zend_do_isset_or_isempty(ZEND_ISSET, &tmp, &$4 TSRMLS_CC); zend_do_boolean_and_end(&$$, &$1, &tmp, &$2 TSRMLS_CC); }
;
+class_or_namespace_constant:
+ T_PAAMAYIM_NEKUDOTAYIM namespace_name { zend_do_fetch_constant(&$$, NULL, &$2, ZEND_RT TSRMLS_CC); }
+ | T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$1, NULL, &$2 TSRMLS_CC); zend_do_fetch_constant(&$$, &$1, &$4, ZEND_RT TSRMLS_CC); }
+ | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$2, NULL, &$1 TSRMLS_CC); zend_do_fetch_constant(&$$, &$2, &$3, ZEND_RT TSRMLS_CC); }
+ | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_class(&$4, &$1, &$3 TSRMLS_CC); zend_do_fetch_constant(&$$, &$4, &$5, ZEND_RT TSRMLS_CC); }
+;
+
%%
/*