Commit:    16d59aa1718324ff0d4bea62fa9dfc3d4c8b16ce
Author:    Dmitry Stogov <dmi...@zend.com>         Wed, 27 Nov 2013 14:26:34 
+0400
Parents:   63f3ff7b5f89f50eb9df76c3d0860c04cc6e0f66
Branches:  PHP-5.4 PHP-5.5 PHP-5.6 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=16d59aa1718324ff0d4bea62fa9dfc3d4c8b16ce

Log:
Fixed bug #65969 (Chain assignment with T_LIST failure)

Bugs:
https://bugs.php.net/65969

Changed paths:
  M  NEWS
  A  Zend/tests/bug65969.phpt
  M  Zend/zend_execute.c
  M  Zend/zend_vm_def.h
  M  Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index 2514027..ac57315 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP                                                             
           NEWS
 - Core:
   . Fixed bug #66094 (unregister_tick_function tries to cast a Closure to a 
     string). (Laruence)
+  . Fixed bug #65969 (Chain assignment with T_LIST failure). (Dmitry)
   . Fixed bug #65947 (basename is no more working after fgetcsv in certain 
     situation). (Laruence)
 
diff --git a/Zend/tests/bug65969.phpt b/Zend/tests/bug65969.phpt
new file mode 100644
index 0000000..d512832
--- /dev/null
+++ b/Zend/tests/bug65969.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Bug #65969 (Chain assignment with T_LIST failure)
+--FILE--
+<?php
+$obj = new stdClass;
+list($a,$b) = $obj->prop = [1,2];
+var_dump($a,$b);
+--EXPECT--
+int(1)
+int(2)
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index ff9c2d0..0b6aff2 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1248,9 +1248,8 @@ convert_to_array:
        }
 }
 
-static void zend_fetch_dimension_address_read(temp_variable *result, zval 
**container_ptr, zval *dim, int dim_type, int type TSRMLS_DC)
+static void zend_fetch_dimension_address_read(temp_variable *result, zval 
*container, zval *dim, int dim_type, int type TSRMLS_DC)
 {
-       zval *container = *container_ptr;
        zval **retval;
 
        switch (Z_TYPE_P(container)) {
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index f6c6e6a..b28cd51 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -1166,19 +1166,17 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, VAR|CV, 
CONST|TMP|VAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           OP1_TYPE != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (OP1_TYPE == IS_VAR && (opline->extended_value & 
ZEND_FETCH_ADD_LOCK)) {
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+       container = GET_OP1_ZVAL_PTR(BP_VAR_R);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
        FREE_OP2();
-       FREE_OP1_VAR_PTR();
+       FREE_OP1();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -1243,13 +1241,13 @@ ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, VAR|CV, 
CONST|TMP|VAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_IS);
+       container = GET_OP1_ZVAL_PTR(BP_VAR_IS);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_IS TSRMLS_CC);
        FREE_OP2();
-       FREE_OP1_VAR_PTR();
+       FREE_OP1();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -1258,12 +1256,12 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, VAR|CV, 
CONST|TMP|VAR|UNUSED|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
+               zval **container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
+
                if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -1271,15 +1269,19 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, VAR|CV, 
CONST|TMP|VAR|UNUSED|CV)
                if (OP1_TYPE == IS_VAR && OP1_FREE && 
READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               FREE_OP2();
+               FREE_OP1_VAR_PTR();
        } else {
+               zval *container;
+
                if (OP2_TYPE == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+               container = GET_OP1_ZVAL_PTR(BP_VAR_R);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
+               FREE_OP2();
+               FREE_OP1();
        }
-       FREE_OP2();
-       FREE_OP1_VAR_PTR();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 64d4320..c606b88 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -12874,16 +12874,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) 
{
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -12951,10 +12949,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
 
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -12966,12 +12964,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_var(opline->op1.var, 
EX_Ts(), &free_op1 TSRMLS_CC);
+
                if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -12979,15 +12977,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && 
READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
+               zval *container;
+
                if (IS_CONST == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
-       }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -15048,16 +15050,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) 
{
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, 
BP_VAR_R TSRMLS_CC);
        zval_dtor(free_op2.var);
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -15125,10 +15125,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, 
BP_VAR_IS TSRMLS_CC);
        zval_dtor(free_op2.var);
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -15140,12 +15140,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_var(opline->op1.var, 
EX_Ts(), &free_op1 TSRMLS_CC);
+
                if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -15153,15 +15153,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && 
READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               zval_dtor(free_op2.var);
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
+               zval *container;
+
                if (IS_TMP_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), 
IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
+               zval_dtor(free_op2.var);
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
-       zval_dtor(free_op2.var);
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -17132,16 +17136,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) 
{
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, 
BP_VAR_R TSRMLS_CC);
        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -17209,10 +17211,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, 
BP_VAR_IS TSRMLS_CC);
        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -17224,12 +17226,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_var(opline->op1.var, 
EX_Ts(), &free_op1 TSRMLS_CC);
+
                if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -17237,15 +17239,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && 
READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
+               zval *container;
+
                if (IS_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), 
IS_VAR, BP_VAR_R TSRMLS_CC);
+               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -19007,12 +19013,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_var(opline->op1.var, 
EX_Ts(), &free_op1 TSRMLS_CC);
+
                if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -19020,15 +19026,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && 
READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
+               zval *container;
+
                if (IS_UNUSED == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
-       }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -20257,16 +20267,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_VAR != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) 
{
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R 
TSRMLS_CC);
 
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -20334,10 +20342,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
+       container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, 
BP_VAR_IS TSRMLS_CC);
 
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -20349,12 +20357,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_var(opline->op1.var, 
EX_Ts(), &free_op1 TSRMLS_CC);
+
                if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -20362,15 +20370,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD
                if (IS_VAR == IS_VAR && (free_op1.var != NULL) && 
READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
        } else {
+               zval *container;
+
                if (IS_CV == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
+               container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), 
&free_op1 TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), 
IS_CV, BP_VAR_R TSRMLS_CC);
-       }
 
-       if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+               if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -28692,16 +28704,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
 {
        USE_OPLINE
 
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 
 
@@ -28768,10 +28778,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HA
 {
        USE_OPLINE
 
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
 
 
@@ -28783,12 +28793,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPC
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+
                if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -28796,15 +28806,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPC
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+
        } else {
+               zval *container;
+
                if (IS_CONST == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
-       }
 
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -30641,16 +30655,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, 
BP_VAR_R TSRMLS_CC);
        zval_dtor(free_op2.var);
 
@@ -30717,10 +30729,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HAND
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, 
BP_VAR_IS TSRMLS_CC);
        zval_dtor(free_op2.var);
 
@@ -30732,12 +30744,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCOD
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+
                if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -30745,15 +30757,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCOD
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               zval_dtor(free_op2.var);
+
        } else {
+               zval *container;
+
                if (IS_TMP_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), 
IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
-       }
-       zval_dtor(free_op2.var);
+               zval_dtor(free_op2.var);
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -32594,16 +32610,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, 
BP_VAR_R TSRMLS_CC);
        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
@@ -32670,10 +32684,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, 
BP_VAR_IS TSRMLS_CC);
        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
@@ -32685,12 +32699,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+
                if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -32698,15 +32712,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+
        } else {
+               zval *container;
+
                if (IS_VAR == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), 
IS_VAR, BP_VAR_R TSRMLS_CC);
-       }
-       if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+               if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -34336,12 +34354,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OP
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+
                if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -34349,15 +34367,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OP
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+
        } else {
+               zval *container;
+
                if (IS_UNUSED == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
-       }
 
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -35446,16 +35468,14 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
 {
        USE_OPLINE
 
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
 
-       if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
-           IS_CV != IS_CV &&
-           EX_T(opline->op1.var).var.ptr_ptr) {
-               PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
+       if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+               PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
        }
-       container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R 
TSRMLS_CC);
 
 
@@ -35522,10 +35542,10 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDL
 {
        USE_OPLINE
 
-       zval **container;
+       zval *container;
 
        SAVE_OPLINE();
-       container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
+       container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var 
TSRMLS_CC);
        zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, 
_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, 
BP_VAR_IS TSRMLS_CC);
 
 
@@ -35537,12 +35557,12 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval **container;
 
        SAVE_OPLINE();
 
        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
-               container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+
                if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
                        zend_error_noreturn(E_ERROR, "Cannot use string offset 
as an array");
                }
@@ -35550,15 +35570,19 @@ static int ZEND_FASTCALL  
ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE
                if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
                        EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
                }
+
+
        } else {
+               zval *container;
+
                if (IS_CV == IS_UNUSED) {
                        zend_error_noreturn(E_ERROR, "Cannot use [] for 
reading");
                }
-               container = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), 
opline->op1.var TSRMLS_CC);
+               container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var 
TSRMLS_CC);
                zend_fetch_dimension_address_read(&EX_T(opline->result.var), 
container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), 
IS_CV, BP_VAR_R TSRMLS_CC);
-       }
 
 
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to