@@ -1989,7 +1989,13 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
1989
1989
if (EXPECTED (IS_VALID_PROPERTY_OFFSET (prop_offset ))) {
1990
1990
retval = OBJ_PROP (zobj , prop_offset );
1991
1991
if (EXPECTED (Z_TYPE_INFO_P (retval ) != IS_UNDEF )) {
1992
- ZEND_VM_C_GOTO (fetch_obj_r_copy );
1992
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR |IS_VAR ))) {
1993
+ ZEND_VM_C_GOTO (fetch_obj_r_copy );
1994
+ } else {
1995
+ ZEND_VM_C_LABEL (fetch_obj_r_fast_copy ):
1996
+ ZVAL_COPY_DEREF (EX_VAR (opline -> result .var ), retval );
1997
+ ZEND_VM_NEXT_OPCODE ();
1998
+ }
1993
1999
}
1994
2000
} else if (EXPECTED (zobj -> properties != NULL )) {
1995
2001
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET (prop_offset )) {
@@ -2004,7 +2010,11 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
2004
2010
EXPECTED (p -> key != NULL ) &&
2005
2011
EXPECTED (zend_string_equal_content (p -> key , Z_STR_P (offset )))))) {
2006
2012
retval = & p -> val ;
2007
- ZEND_VM_C_GOTO (fetch_obj_r_copy );
2013
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR |IS_VAR ))) {
2014
+ ZEND_VM_C_GOTO (fetch_obj_r_copy );
2015
+ } else {
2016
+ ZEND_VM_C_GOTO (fetch_obj_r_fast_copy );
2017
+ }
2008
2018
}
2009
2019
}
2010
2020
CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_DYNAMIC_PROPERTY_OFFSET );
@@ -2013,7 +2023,11 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST
2013
2023
if (EXPECTED (retval )) {
2014
2024
uintptr_t idx = (char * )retval - (char * )zobj -> properties -> arData ;
2015
2025
CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_ENCODE_DYN_PROP_OFFSET (idx ));
2016
- ZEND_VM_C_GOTO (fetch_obj_r_copy );
2026
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR |IS_VAR ))) {
2027
+ ZEND_VM_C_GOTO (fetch_obj_r_copy );
2028
+ } else {
2029
+ ZEND_VM_C_GOTO (fetch_obj_r_fast_copy );
2030
+ }
2017
2031
}
2018
2032
}
2019
2033
}
@@ -2131,7 +2145,13 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
2131
2145
if (EXPECTED (IS_VALID_PROPERTY_OFFSET (prop_offset ))) {
2132
2146
retval = OBJ_PROP (zobj , prop_offset );
2133
2147
if (EXPECTED (Z_TYPE_P (retval ) != IS_UNDEF )) {
2134
- ZEND_VM_C_GOTO (fetch_obj_is_copy );
2148
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR |IS_VAR ))) {
2149
+ ZEND_VM_C_GOTO (fetch_obj_is_copy );
2150
+ } else {
2151
+ ZEND_VM_C_LABEL (fetch_obj_is_fast_copy ):
2152
+ ZVAL_COPY (EX_VAR (opline -> result .var ), retval );
2153
+ ZEND_VM_NEXT_OPCODE ();
2154
+ }
2135
2155
}
2136
2156
} else if (EXPECTED (zobj -> properties != NULL )) {
2137
2157
if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET (prop_offset )) {
@@ -2146,7 +2166,11 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
2146
2166
EXPECTED (p -> key != NULL ) &&
2147
2167
EXPECTED (zend_string_equal_content (p -> key , Z_STR_P (offset )))))) {
2148
2168
retval = & p -> val ;
2149
- ZEND_VM_C_GOTO (fetch_obj_is_copy );
2169
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR |IS_VAR ))) {
2170
+ ZEND_VM_C_GOTO (fetch_obj_is_copy );
2171
+ } else {
2172
+ ZEND_VM_C_GOTO (fetch_obj_is_fast_copy );
2173
+ }
2150
2174
}
2151
2175
}
2152
2176
CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_DYNAMIC_PROPERTY_OFFSET );
@@ -2155,7 +2179,11 @@ ZEND_VM_COLD_CONST_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, C
2155
2179
if (EXPECTED (retval )) {
2156
2180
uintptr_t idx = (char * )retval - (char * )zobj -> properties -> arData ;
2157
2181
CACHE_PTR_EX (cache_slot + 1 , (void * )ZEND_ENCODE_DYN_PROP_OFFSET (idx ));
2158
- ZEND_VM_C_GOTO (fetch_obj_is_copy );
2182
+ if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR |IS_VAR ))) {
2183
+ ZEND_VM_C_GOTO (fetch_obj_is_copy );
2184
+ } else {
2185
+ ZEND_VM_C_GOTO (fetch_obj_is_fast_copy );
2186
+ }
2159
2187
}
2160
2188
}
2161
2189
}
0 commit comments