From 9727b47418afe42978df898f8319d6512e473e04 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 6 Mar 2014 13:11:23 +0400 Subject: [PATCH] Fixed ArrayAccess handling --- Zend/zend_execute.c | 14 +++++++------- Zend/zend_vm_def.h | 3 +++ Zend/zend_vm_execute.h | 30 ++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4c17201385..7fcc67fc80 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1262,8 +1262,8 @@ convert_to_array: //??? } overloaded_result = Z_OBJ_HT_P(container)->read_dimension(container, dim, type, result TSRMLS_CC); - if (overloaded_result) { -//??? if (!Z_ISREF_P(overloaded_result)) { + if (overloaded_result && Z_TYPE_P(overloaded_result) != IS_UNDEF) { + if (!Z_ISREF_P(overloaded_result)) { //??? if (Z_REFCOUNT_P(overloaded_result) > 0) { //??? zval *tmp = overloaded_result; //??? @@ -1272,11 +1272,11 @@ convert_to_array: //??? Z_UNSET_ISREF_P(overloaded_result); //??? Z_SET_REFCOUNT_P(overloaded_result, 0); //??? } -//??? if (Z_TYPE_P(overloaded_result) != IS_OBJECT) { -//??? zend_class_entry *ce = Z_OBJCE_P(container); -//??? zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ce->name); -//??? } -//??? } + if (Z_TYPE_P(overloaded_result) != IS_OBJECT) { + zend_class_entry *ce = Z_OBJCE_P(container); + zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ce->name->val); + } + } //??? AI_SET_PTR(result, overloaded_result); //??? PZVAL_LOCK(overloaded_result); //??? ZVAL_COPY(result, overloaded_result); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 30fefcdf97..b67cd89d43 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1661,6 +1661,9 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV) if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zend_free_op free_op2; zval *property_name = GET_OP2_ZVAL_PTR(BP_VAR_R); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 12393aa379..1a6486d2a8 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15002,6 +15002,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zval *property_name = opline->op2.zv; @@ -17301,6 +17304,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zend_free_op free_op2; zval *property_name = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); @@ -19497,6 +19503,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zend_free_op free_op2; zval *property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); @@ -21083,6 +21092,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zval *property_name = NULL; @@ -22881,6 +22893,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zval *property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); @@ -32096,6 +32111,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zval *property_name = opline->op2.zv; @@ -34177,6 +34195,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLE if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zend_free_op free_op2; zval *property_name = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); @@ -36248,6 +36269,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zend_free_op free_op2; zval *property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); @@ -37712,6 +37736,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAN if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zval *property_name = NULL; @@ -39372,6 +39399,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(object_ptr) == IS_STR_OFFSET)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } + if (Z_TYPE_P(object_ptr) == IS_REFERENCE) { + object_ptr = Z_REFVAL_P(object_ptr); + } if (Z_TYPE_P(object_ptr) == IS_OBJECT) { zval *property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); -- 2.40.0