@@ -333,7 +333,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
333
333
zend_free_op free_op1 , free_op2 , free_op_data1 ;
334
334
zval * object = GET_OP1_OBJ_ZVAL_PTR_PTR (BP_VAR_RW );
335
335
zval * property = GET_OP2_ZVAL_PTR (BP_VAR_R );
336
- zval * value = get_zval_ptr (( opline + 1 ) -> op1_type , & ( opline + 1 ) -> op1 , execute_data , & free_op_data1 , BP_VAR_R ) ;
336
+ zval * value ;
337
337
int have_get_ptr = 0 ;
338
338
339
339
if (OP1_TYPE == IS_VAR && UNEXPECTED (Z_TYPE_P (object ) == IS_STR_OFFSET )) {
@@ -342,6 +342,13 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
342
342
343
343
make_real_object (object TSRMLS_CC );
344
344
345
+ //???: object may become INDIRECT
346
+ if (OP1_TYPE == IS_CV && Z_TYPE_P (object ) == IS_INDIRECT ) {
347
+ object = Z_INDIRECT_P (object );
348
+ }
349
+
350
+ value = get_zval_ptr ((opline + 1 )-> op1_type , & (opline + 1 )-> op1 , execute_data , & free_op_data1 , BP_VAR_R );
351
+
345
352
if (UNEXPECTED (Z_TYPE_P (object ) != IS_OBJECT )) {
346
353
zend_error (E_WARNING , "Attempt to assign property of non-object" );
347
354
FREE_OP2 ();
@@ -1040,7 +1047,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
1040
1047
} else {
1041
1048
target_symbol_table = zend_get_target_symbol_table (opline -> extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC );
1042
1049
//???: STRING may become INDIRECT
1043
- if (Z_TYPE_P (varname ) == IS_INDIRECT ) {
1050
+ if (OP1_TYPE == IS_CV && Z_TYPE_P (varname ) == IS_INDIRECT ) {
1044
1051
varname = Z_INDIRECT_P (varname );
1045
1052
}
1046
1053
/*
@@ -4038,7 +4045,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
4038
4045
} else {
4039
4046
target_symbol_table = zend_get_target_symbol_table (opline -> extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC );
4040
4047
//???: STRING may become INDIRECT
4041
- if (Z_TYPE_P (varname ) == IS_INDIRECT ) {
4048
+ if (OP1_TYPE == IS_CV && Z_TYPE_P (varname ) == IS_INDIRECT ) {
4042
4049
varname = Z_INDIRECT_P (varname );
4043
4050
}
4044
4051
zend_delete_variable (execute_data , target_symbol_table , Z_STR_P (varname ) TSRMLS_CC );
@@ -4556,7 +4563,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
4556
4563
} else {
4557
4564
target_symbol_table = zend_get_target_symbol_table (opline -> extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC );
4558
4565
//???: STRING may become INDIRECT
4559
- if (Z_TYPE_P (varname ) == IS_INDIRECT ) {
4566
+ if (OP1_TYPE == IS_CV && Z_TYPE_P (varname ) == IS_INDIRECT ) {
4560
4567
varname = Z_INDIRECT_P (varname );
4561
4568
}
4562
4569
if ((value = zend_hash_find (target_symbol_table , Z_STR_P (varname ))) == NULL ) {
0 commit comments