diff options
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index bbfc99390d..c0cd0ff88f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -532,8 +532,7 @@ static void zend_fetch_var_address(zend_op *opline, temp_variable *Ts, int type switch (opline->extended_value) { case ZEND_FETCH_LOCAL: - //target_symbol_table = EG(active_symbol_table); - target_symbol_table = EG(namespace)?&EG(namespace)->static_members:EG(active_symbol_table); + target_symbol_table = EG(active_symbol_table); break; case ZEND_FETCH_GLOBAL: if (opline->op1.op_type == IS_VAR) { @@ -1009,6 +1008,7 @@ typedef struct _zend_execute_data { object_info object; temp_variable *Ts; zend_bool original_in_execution; + zend_class_entry *calling_namespace; } zend_execute_data; #define EX(element) execute_data.element @@ -1552,7 +1552,8 @@ binary_assign_op_addr: { convert_to_string(&tmp); function_name = &tmp; zend_str_tolower(tmp.value.str.val, tmp.value.str.len); - + + EX(calling_namespace) = EG(namespace); if (EX(opline)->op1.op_type != IS_UNUSED) { if (EX(opline)->op1.op_type==IS_CONST) { /* used for class::function() */ zval **object_ptr_ptr; @@ -1565,7 +1566,14 @@ binary_assign_op_addr: { EX(object).ptr = *object_ptr_ptr; EX(object).ptr->refcount++; /* For this pointer */ } - active_function_table = &EX(Ts)[EX(opline)->op1.u.var].EA.class_entry->function_table; + + { + zend_class_entry *ce = EX(Ts)[EX(opline)->op1.u.var].EA.class_entry; + active_function_table = &ce->function_table; + if (ce->is_namespace) { + EX(calling_namespace) = ce; + } + } } else { /* used for member function calls */ EX(object).ptr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); @@ -1637,9 +1645,12 @@ overloaded_function_call_cont: do_fcall_common: { zval **original_return_value; + zend_class_entry *current_namespace; int return_value_used = RETURN_VALUE_USED(EX(opline)); zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) EX(opline)->extended_value, NULL); + current_namespace = EG(namespace); + EG(namespace) = EX(calling_namespace); EX(Ts)[EX(opline)->result.u.var].var.ptr_ptr = &EX(Ts)[EX(opline)->result.u.var].var.ptr; @@ -1723,6 +1734,8 @@ do_fcall_common: EG(function_state_ptr) = &EX(function_state); zend_ptr_stack_clear_multiple(TSRMLS_C); + EG(namespace) = current_namespace; + if (EG(exception)) { if (EX(opline)->op2.u.opline_num == -1) { RETURN_FROM_EXECUTE_LOOP(execute_data); @@ -2034,6 +2047,9 @@ send_by_ref: NEXT_OPCODE(); case ZEND_NEW: { + if (EX(Ts)[EX(opline)->op1.u.var].EA.class_entry->is_namespace) { + zend_error(E_ERROR, "Cannot instantiate a namespace"); + } EX(Ts)[EX(opline)->result.u.var].var.ptr_ptr = &EX(Ts)[EX(opline)->result.u.var].var.ptr; ALLOC_ZVAL(EX(Ts)[EX(opline)->result.u.var].var.ptr); object_init_ex(EX(Ts)[EX(opline)->result.u.var].var.ptr, EX(Ts)[EX(opline)->op1.u.var].EA.class_entry); |