@@ -4237,31 +4237,41 @@ static int ZEND_FASTCALL zend_runtime_jit(void)
4237
4237
zend_op_array * op_array = & EX (func )-> op_array ;
4238
4238
zend_op * opline = op_array -> opcodes ;
4239
4239
zend_jit_op_array_extension * jit_extension ;
4240
+ bool do_bailout = 0 ;
4240
4241
4241
4242
zend_shared_alloc_lock ();
4242
4243
4243
4244
if (ZEND_FUNC_INFO (op_array )) {
4245
+
4244
4246
SHM_UNPROTECT ();
4245
4247
zend_jit_unprotect ();
4246
4248
4247
- /* restore original opcode handlers */
4248
- if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
4249
- while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
4250
- opline ++ ;
4249
+ zend_try {
4250
+ /* restore original opcode handlers */
4251
+ if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
4252
+ while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
4253
+ opline ++ ;
4254
+ }
4251
4255
}
4252
- }
4253
- jit_extension = (zend_jit_op_array_extension * )ZEND_FUNC_INFO (op_array );
4254
- opline -> handler = jit_extension -> orig_handler ;
4256
+ jit_extension = (zend_jit_op_array_extension * )ZEND_FUNC_INFO (op_array );
4257
+ opline -> handler = jit_extension -> orig_handler ;
4255
4258
4256
- /* perform real JIT for this function */
4257
- zend_real_jit_func (op_array , NULL , NULL );
4259
+ /* perform real JIT for this function */
4260
+ zend_real_jit_func (op_array , NULL , NULL );
4261
+ } zend_catch {
4262
+ do_bailout = 0 ;
4263
+ } zend_end_try ();
4258
4264
4259
4265
zend_jit_protect ();
4260
4266
SHM_PROTECT ();
4261
4267
}
4262
4268
4263
4269
zend_shared_alloc_unlock ();
4264
4270
4271
+ if (do_bailout ) {
4272
+ zend_bailout ();
4273
+ }
4274
+
4265
4275
/* JIT-ed code is going to be called by VM */
4266
4276
return 0 ;
4267
4277
}
@@ -4304,6 +4314,7 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
4304
4314
zend_op_array * op_array = & EX (func )-> op_array ;
4305
4315
zend_jit_op_array_hot_extension * jit_extension ;
4306
4316
uint32_t i ;
4317
+ bool do_bailout = 0 ;
4307
4318
4308
4319
zend_shared_alloc_lock ();
4309
4320
jit_extension = (zend_jit_op_array_hot_extension * )ZEND_FUNC_INFO (op_array );
@@ -4312,19 +4323,26 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
4312
4323
SHM_UNPROTECT ();
4313
4324
zend_jit_unprotect ();
4314
4325
4315
- for (i = 0 ; i < op_array -> last ; i ++ ) {
4316
- op_array -> opcodes [i ].handler = jit_extension -> orig_handlers [i ];
4317
- }
4326
+ zend_try {
4327
+ for (i = 0 ; i < op_array -> last ; i ++ ) {
4328
+ op_array -> opcodes [i ].handler = jit_extension -> orig_handlers [i ];
4329
+ }
4318
4330
4319
- /* perform real JIT for this function */
4320
- zend_real_jit_func (op_array , NULL , opline );
4331
+ /* perform real JIT for this function */
4332
+ zend_real_jit_func (op_array , NULL , opline );
4333
+ } zend_catch {
4334
+ do_bailout = 1 ;
4335
+ } zend_end_try ();
4321
4336
4322
4337
zend_jit_protect ();
4323
4338
SHM_PROTECT ();
4324
4339
}
4325
4340
4326
4341
zend_shared_alloc_unlock ();
4327
4342
4343
+ if (do_bailout ) {
4344
+ zend_bailout ();
4345
+ }
4328
4346
/* JIT-ed code is going to be called by VM */
4329
4347
}
4330
4348
0 commit comments