@@ -521,16 +521,27 @@ static int zend_jit_trace_record_fake_init_call_ex(zend_execute_data *call, zend
521
521
&& (func -> op_array .fn_flags & (ZEND_ACC_CLOSURE |ZEND_ACC_FAKE_CLOSURE ))) {
522
522
return -1 ;
523
523
}
524
- if (func -> type == ZEND_USER_FUNCTION
525
- && (func -> op_array .fn_flags & ZEND_ACC_CLOSURE )) {
524
+ if (func -> type == ZEND_USER_FUNCTION ) {
526
525
jit_extension =
527
526
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (& func -> op_array );
528
- if (UNEXPECTED (!jit_extension
529
- || !(jit_extension -> func_info .flags & ZEND_FUNC_JIT_ON_HOT_TRACE )
530
- || (func -> op_array .fn_flags & ZEND_ACC_FAKE_CLOSURE ))) {
527
+ if (func -> op_array .fn_flags & ZEND_ACC_CLOSURE ) {
528
+ if (UNEXPECTED (!jit_extension
529
+ || !(jit_extension -> func_info .flags & ZEND_FUNC_JIT_ON_HOT_TRACE )
530
+ || (func -> op_array .fn_flags & ZEND_ACC_FAKE_CLOSURE ))) {
531
+ return -1 ;
532
+ }
533
+ func = (zend_function * )jit_extension -> op_array ;
534
+ }
535
+ // First not-skipped op
536
+ zend_op * opline = func -> op_array .opcodes ;
537
+ if (!(func -> op_array .fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
538
+ while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
539
+ opline ++ ;
540
+ }
541
+ }
542
+ if (jit_extension && ZEND_OP_TRACE_INFO (opline , jit_extension -> offset )-> trace_flags & ZEND_JIT_TRACE_BLACKLISTED ) {
531
543
return -1 ;
532
544
}
533
- func = (zend_function * )jit_extension -> op_array ;
534
545
}
535
546
if (is_megamorphic == ZEND_JIT_EXIT_POLYMORPHISM
536
547
/* TODO: use more accurate check ??? */
@@ -986,6 +997,11 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
986
997
break ;
987
998
}
988
999
1000
+ if (jit_extension && ZEND_OP_TRACE_INFO (opline , offset )-> trace_flags & ZEND_JIT_TRACE_BLACKLISTED ) {
1001
+ stop = ZEND_JIT_TRACE_STOP_BLACK_LIST ;
1002
+ break ;
1003
+ }
1004
+
989
1005
TRACE_RECORD (ZEND_JIT_TRACE_ENTER ,
990
1006
EX (return_value ) != NULL ? ZEND_JIT_TRACE_RETURN_VALUE_USED : 0 ,
991
1007
op_array );
@@ -1100,17 +1116,29 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
1100
1116
stop = ZEND_JIT_TRACE_STOP_BAD_FUNC ;
1101
1117
break ;
1102
1118
}
1103
- if (func -> type == ZEND_USER_FUNCTION
1104
- && (func -> op_array .fn_flags & ZEND_ACC_CLOSURE )) {
1119
+ if (func -> type == ZEND_USER_FUNCTION ) {
1105
1120
jit_extension =
1106
1121
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (& func -> op_array );
1107
- if (UNEXPECTED (!jit_extension )
1108
- || !(jit_extension -> func_info .flags & ZEND_FUNC_JIT_ON_HOT_TRACE )
1109
- || (func -> op_array .fn_flags & ZEND_ACC_FAKE_CLOSURE )) {
1110
- stop = ZEND_JIT_TRACE_STOP_INTERPRETER ;
1122
+ if (func -> op_array .fn_flags & ZEND_ACC_CLOSURE ) {
1123
+ if (UNEXPECTED (!jit_extension
1124
+ || !(jit_extension -> func_info .flags & ZEND_FUNC_JIT_ON_HOT_TRACE )
1125
+ || (func -> op_array .fn_flags & ZEND_ACC_FAKE_CLOSURE ))) {
1126
+ stop = ZEND_JIT_TRACE_STOP_INTERPRETER ;
1127
+ break ;
1128
+ }
1129
+ func = (zend_function * )jit_extension -> op_array ;
1130
+ }
1131
+ // First not-skipped op
1132
+ zend_op * opline = func -> op_array .opcodes ;
1133
+ if (!(func -> op_array .fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
1134
+ while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
1135
+ opline ++ ;
1136
+ }
1137
+ }
1138
+ if (jit_extension && ZEND_OP_TRACE_INFO (opline , jit_extension -> offset )-> trace_flags & ZEND_JIT_TRACE_BLACKLISTED ) {
1139
+ stop = ZEND_JIT_TRACE_STOP_BLACK_LIST ;
1111
1140
break ;
1112
1141
}
1113
- func = (zend_function * )jit_extension -> op_array ;
1114
1142
}
1115
1143
1116
1144
#ifndef HAVE_GCC_GLOBAL_REGS
0 commit comments