@@ -1174,7 +1174,7 @@ ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
1174
1174
ZEND_VM_DISPATCH_TO_HELPER_EX (zend_fetch_var_address_helper , type , BP_VAR_IS );
1175
1175
}
1176
1176
1177
- ZEND_VM_HANDLER (81 , ZEND_FETCH_DIM_R , VAR |CV , CONST |TMP |VAR |CV )
1177
+ ZEND_VM_HANDLER (81 , ZEND_FETCH_DIM_R , CONST | TMP | VAR |CV , CONST |TMP |VAR |CV )
1178
1178
{
1179
1179
USE_OPLINE
1180
1180
zend_free_op free_op1 , free_op2 ;
@@ -1187,10 +1187,19 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, VAR|CV, CONST|TMP|VAR|CV)
1187
1187
EX_T (opline -> op1 .var ).var .ptr_ptr ) {
1188
1188
PZVAL_LOCK (* EX_T (opline -> op1 .var ).var .ptr_ptr );
1189
1189
}
1190
- container = GET_OP1_ZVAL_PTR_PTR (BP_VAR_R );
1191
- 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 );
1192
- FREE_OP2 ();
1193
- FREE_OP1_VAR_PTR ();
1190
+
1191
+ if (OP1_TYPE == IS_TMP_VAR || OP1_TYPE == IS_CONST ) {
1192
+ zval * container = GET_OP1_ZVAL_PTR (BP_VAR_R );
1193
+ 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 );
1194
+ FREE_OP2 ();
1195
+ FREE_OP1 ();
1196
+ } else {
1197
+ container = GET_OP1_ZVAL_PTR_PTR (BP_VAR_R );
1198
+ 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 );
1199
+ FREE_OP2 ();
1200
+ FREE_OP1_VAR_PTR ();
1201
+ }
1202
+
1194
1203
CHECK_EXCEPTION ();
1195
1204
ZEND_VM_NEXT_OPCODE ();
1196
1205
}
0 commit comments