From d409c5e3470c553c4f6eeadaf08ae30eaca54c55 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 30 Nov 2005 10:10:32 +0000 Subject: [PATCH] Fixed bug #35470 (Assigning global using variable name from array doesn't function) --- Zend/tests/bug35470.phpt | 11 +++++++++++ Zend/zend_vm_def.h | 5 +++++ Zend/zend_vm_execute.h | 24 ++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100755 Zend/tests/bug35470.phpt diff --git a/Zend/tests/bug35470.phpt b/Zend/tests/bug35470.phpt new file mode 100755 index 0000000000..5a854552bb --- /dev/null +++ b/Zend/tests/bug35470.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #35470 (Assigning global using variable name from array doesn't function) +--FILE-- + +--EXPECT-- +Test: 55 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 30aad58515..4fd3ae1230 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -983,6 +983,11 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, ANY, int type case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); break; + case ZEND_FETCH_GLOBAL_LOCK: + if (OP1_TYPE == IS_VAR && !free_op1.var) { + PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr); + } + break; } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 55a0f4afed..7a6dc541d9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1308,7 +1308,7 @@ static int ZEND_PRINT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) static int zend_fetch_var_address_helper_SPEC_CONST(int type, ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - + zend_free_op free_op1; zval *varname = &opline->op1.u.constant; zval **retval; zval tmp_varname; @@ -1364,6 +1364,11 @@ static int zend_fetch_var_address_helper_SPEC_CONST(int type, ZEND_OPCODE_HANDLE case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); break; + case ZEND_FETCH_GLOBAL_LOCK: + if (IS_CONST == IS_VAR && !free_op1.var) { + PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr); + } + break; } } @@ -3864,6 +3869,11 @@ static int zend_fetch_var_address_helper_SPEC_TMP(int type, ZEND_OPCODE_HANDLER_ case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); break; + case ZEND_FETCH_GLOBAL_LOCK: + if (IS_TMP_VAR == IS_VAR && !free_op1.var) { + PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr); + } + break; } } @@ -6871,6 +6881,11 @@ static int zend_fetch_var_address_helper_SPEC_VAR(int type, ZEND_OPCODE_HANDLER_ case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); break; + case ZEND_FETCH_GLOBAL_LOCK: + if (IS_VAR == IS_VAR && !free_op1.var) { + PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr); + } + break; } } @@ -19513,7 +19528,7 @@ static int ZEND_PRINT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) static int zend_fetch_var_address_helper_SPEC_CV(int type, ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - + zend_free_op free_op1; zval *varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); zval **retval; zval tmp_varname; @@ -19569,6 +19584,11 @@ static int zend_fetch_var_address_helper_SPEC_CV(int type, ZEND_OPCODE_HANDLER_A case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); break; + case ZEND_FETCH_GLOBAL_LOCK: + if (IS_CV == IS_VAR && !free_op1.var) { + PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr); + } + break; } } -- 2.50.1