]> granicus.if.org Git - php/commitdiff
Fixed bug #35470 (Assigning global using variable name from array doesn't function)
authorDmitry Stogov <dmitry@php.net>
Wed, 30 Nov 2005 10:10:32 +0000 (10:10 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 30 Nov 2005 10:10:32 +0000 (10:10 +0000)
Zend/tests/bug35470.phpt [new file with mode: 0755]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug35470.phpt b/Zend/tests/bug35470.phpt
new file mode 100755 (executable)
index 0000000..5a85455
--- /dev/null
@@ -0,0 +1,11 @@
+--TEST--
+Bug #35470 (Assigning global using variable name from array doesn't function)
+--FILE--
+<?php
+$x = array("test", "55");
+global ${$x[0]};
+${$x[0]} = $x[1];
+echo "Test: $test\n";;
+?>
+--EXPECT--
+Test: 55
index 30aad585154400327dc96bf90d8f9de9eeab9687..4fd3ae1230d641d076ab6229510fca0aa6588e43 100644 (file)
@@ -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;
                }
        }
 
index 55a0f4afed2c31d9dec8326f773e51d696e34e16..7a6dc541d92d2f84dc6181eb4975d2727642db45 100644 (file)
@@ -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;
                }
        }