From: Dmitry Stogov Date: Wed, 22 Sep 2004 08:45:21 +0000 (+0000) Subject: Specializer was updated with executor's fixes. X-Git-Tag: PRE_NEW_VM_GEN_PATCH~260 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=480f4e35656f5265488a032977f309b568b3ee38;p=php Specializer was updated with executor's fixes. --- diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 8172da5a54..5ce2b3a43a 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1217,6 +1217,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, int type) } } switch (opline->op2.u.EA.type) { + case ZEND_FETCH_GLOBAL: case ZEND_FETCH_LOCAL: FREE_OP1(); break; @@ -2614,8 +2615,14 @@ ZEND_VM_HANDLER(ZEND_RECV) if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) { char *space; char *class_name = get_active_class_name(&space TSRMLS_CC); + zend_execute_data *ptr = EX(prev_execute_data); + zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, NULL TSRMLS_CC); - zend_error(E_WARNING, "Missing argument %ld for %s%s%s()", opline->op1.u.constant.value.lval, class_name, space, get_active_function_name(TSRMLS_C)); + if(ptr && ptr->op_array) { + zend_error(E_WARNING, "Missing argument %ld for %s%s%s(), called in %s on line %d and defined", opline->op1.u.constant.value.lval, class_name, space, get_active_function_name(TSRMLS_C), ptr->op_array->filename, ptr->opline->lineno); + } else { + zend_error(E_WARNING, "Missing argument %ld for %s%s%s()", opline->op1.u.constant.value.lval, class_name, space, get_active_function_name(TSRMLS_C)); + } if (opline->result.op_type == IS_VAR) { PZVAL_UNLOCK_FREE(*EX_T(opline->result.u.var).var.ptr_ptr); } @@ -3287,7 +3294,7 @@ ZEND_VM_HANDLER(ZEND_FE_RESET) if (opline->extended_value) { array_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R); if (array_ptr_ptr == NULL) { - MAKE_STD_ZVAL(array_ptr); + ALLOC_INIT_ZVAL(array_ptr); } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { ce = Z_OBJCE_PP(array_ptr_ptr); if (!ce || ce->get_iterator == NULL) { diff --git a/Zend/zend_vm_spec.h b/Zend/zend_vm_spec.h index 0bc71f6bdb..7e807c5403 100644 --- a/Zend/zend_vm_spec.h +++ b/Zend/zend_vm_spec.h @@ -117,19 +117,19 @@ #define SPEC_IS_OP1_TMP_FREE_ANY() IS_TMP_FREE(free_op1) #define SPEC_IS_OP1_TMP_FREE_CONST() 0 #define SPEC_IS_OP1_TMP_FREE_TMP() 1 -#define SPEC_IS_OP1_TMP_FREE_VAR() IS_TMP_FREE(free_op1) +#define SPEC_IS_OP1_TMP_FREE_VAR() 0 #define SPEC_IS_OP1_TMP_FREE_UNUSED() 0 #define SPEC_FREE_OP1_ANY() FREE_OP(free_op1); #define SPEC_FREE_OP1_CONST() #define SPEC_FREE_OP1_TMP() zval_dtor(free_op1.var) -#define SPEC_FREE_OP1_VAR() FREE_OP(free_op1); +#define SPEC_FREE_OP1_VAR() FREE_OP_VAR_PTR(free_op1); #define SPEC_FREE_OP1_UNUSED() #define SPEC_FREE_OP1_IF_VAR_ANY() FREE_OP_IF_VAR(free_op1); #define SPEC_FREE_OP1_IF_VAR_CONST() #define SPEC_FREE_OP1_IF_VAR_TMP() -#define SPEC_FREE_OP1_IF_VAR_VAR() FREE_OP_IF_VAR(free_op1); +#define SPEC_FREE_OP1_IF_VAR_VAR() FREE_OP_VAR_PTR(free_op1); #define SPEC_FREE_OP1_IF_VAR_UNUSED() #define SPEC_FREE_OP1_VAR_PTR_ANY() FREE_OP_VAR_PTR(free_op1); @@ -171,19 +171,19 @@ #define SPEC_IS_OP2_TMP_FREE_ANY() IS_TMP_FREE(free_op2) #define SPEC_IS_OP2_TMP_FREE_CONST() 0 #define SPEC_IS_OP2_TMP_FREE_TMP() 1 -#define SPEC_IS_OP2_TMP_FREE_VAR() IS_TMP_FREE(free_op2) +#define SPEC_IS_OP2_TMP_FREE_VAR() 0 #define SPEC_IS_OP2_TMP_FREE_UNUSED() 0 #define SPEC_FREE_OP2_ANY() FREE_OP(free_op2); #define SPEC_FREE_OP2_CONST() #define SPEC_FREE_OP2_TMP() zval_dtor(free_op2.var) -#define SPEC_FREE_OP2_VAR() FREE_OP(free_op2); +#define SPEC_FREE_OP2_VAR() FREE_OP_VAR_PTR(free_op2); #define SPEC_FREE_OP2_UNUSED() #define SPEC_FREE_OP2_IF_VAR_ANY() FREE_OP_IF_VAR(free_op2); #define SPEC_FREE_OP2_IF_VAR_CONST() #define SPEC_FREE_OP2_IF_VAR_TMP() -#define SPEC_FREE_OP2_IF_VAR_VAR() FREE_OP_IF_VAR(free_op2); +#define SPEC_FREE_OP2_IF_VAR_VAR() FREE_OP_VAR_PTR(free_op2); #define SPEC_FREE_OP2_IF_VAR_UNUSED() #define SPEC_FREE_OP2_VAR_PTR_ANY() FREE_OP_VAR_PTR(free_op2);