@@ -1425,7 +1425,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
1425
1425
uint32_t target_label , target_label2 ;
1426
1426
uint32_t op1_info , op1_def_info , op2_info , res_info , res_use_info , op1_mem_info ;
1427
1427
zend_jit_addr op1_addr , op1_def_addr , op2_addr , op2_def_addr , res_addr ;
1428
- zend_class_entry * ce ;
1428
+ zend_class_entry * ce = NULL ;
1429
1429
bool ce_is_instanceof ;
1430
1430
bool on_this ;
1431
1431
@@ -2444,11 +2444,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2444
2444
case ZEND_FETCH_OBJ_R :
2445
2445
case ZEND_FETCH_OBJ_IS :
2446
2446
case ZEND_FETCH_OBJ_W :
2447
- if (opline -> op2_type != IS_CONST
2448
- || Z_TYPE_P (RT_CONSTANT (opline , opline -> op2 )) != IS_STRING
2449
- || Z_STRVAL_P (RT_CONSTANT (opline , opline -> op2 ))[0 ] == '\0' ) {
2450
- break ;
2451
- }
2452
2447
ce = NULL ;
2453
2448
ce_is_instanceof = 0 ;
2454
2449
on_this = 0 ;
@@ -2478,6 +2473,11 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2478
2473
}
2479
2474
}
2480
2475
}
2476
+ if (opline -> op2_type != IS_CONST
2477
+ || Z_TYPE_P (RT_CONSTANT (opline , opline -> op2 )) != IS_STRING
2478
+ || Z_STRVAL_P (RT_CONSTANT (opline , opline -> op2 ))[0 ] == '\0' ) {
2479
+ break ;
2480
+ }
2481
2481
if (!zend_jit_fetch_obj (& ctx , opline , op_array , ssa , ssa_op ,
2482
2482
op1_info , op1_addr , 0 , ce , ce_is_instanceof , on_this , 0 , 0 , NULL ,
2483
2483
RES_REG_ADDR (), IS_UNKNOWN ,
@@ -2847,6 +2847,36 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2847
2847
/* We skip over the DO_FCALL, so decrement call_level ourselves. */
2848
2848
call_level -- ;
2849
2849
}
2850
+ break ;
2851
+ case ZEND_FETCH_OBJ_R :
2852
+ if (!zend_jit_handler (& ctx , opline ,
2853
+ zend_may_throw (opline , ssa_op , op_array , ssa ))) {
2854
+ goto jit_failure ;
2855
+ }
2856
+
2857
+ /* Cache slot is only used for IS_CONST op2, so only that can result in hook fast path. */
2858
+ if (opline -> op2_type == IS_CONST ) {
2859
+ if (JIT_G (opt_level ) < ZEND_JIT_LEVEL_INLINE ) {
2860
+ if (opline -> op1_type == IS_UNUSED ) {
2861
+ ce = op_array -> scope ;
2862
+ } else {
2863
+ ce = NULL ;
2864
+ }
2865
+ }
2866
+
2867
+ if (!ce || !(ce -> ce_flags & ZEND_ACC_FINAL ) || ce -> num_hooked_props > 0 ) {
2868
+ /* If a simple hook is called, exit to the VM. */
2869
+ ir_ref if_hook_enter = ir_IF (jit_CMP_IP (jit , IR_EQ , opline + 1 ));
2870
+ ir_IF_FALSE (if_hook_enter );
2871
+ if (GCC_GLOBAL_REGS ) {
2872
+ ir_TAILCALL (IR_VOID , ir_LOAD_A (jit_IP (jit )));
2873
+ } else {
2874
+ ir_RETURN (ir_CONST_I32 (1 )); /* ZEND_VM_ENTER */
2875
+ }
2876
+ ir_IF_TRUE (if_hook_enter );
2877
+ }
2878
+ }
2879
+
2850
2880
break ;
2851
2881
default :
2852
2882
if (!zend_jit_handler (& ctx , opline ,
0 commit comments