@@ -4265,31 +4265,41 @@ static int ZEND_FASTCALL zend_runtime_jit(void)
4265
4265
zend_op_array * op_array = & EX (func )-> op_array ;
4266
4266
zend_op * opline = op_array -> opcodes ;
4267
4267
zend_jit_op_array_extension * jit_extension ;
4268
+ bool do_bailout = 0 ;
4268
4269
4269
4270
zend_shared_alloc_lock ();
4270
4271
4271
4272
if (ZEND_FUNC_INFO (op_array )) {
4273
+
4272
4274
SHM_UNPROTECT ();
4273
4275
zend_jit_unprotect ();
4274
4276
4275
- /* restore original opcode handlers */
4276
- if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
4277
- while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
4278
- opline ++ ;
4277
+ zend_try {
4278
+ /* restore original opcode handlers */
4279
+ if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
4280
+ while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
4281
+ opline ++ ;
4282
+ }
4279
4283
}
4280
- }
4281
- jit_extension = (zend_jit_op_array_extension * )ZEND_FUNC_INFO (op_array );
4282
- opline -> handler = jit_extension -> orig_handler ;
4284
+ jit_extension = (zend_jit_op_array_extension * )ZEND_FUNC_INFO (op_array );
4285
+ opline -> handler = jit_extension -> orig_handler ;
4283
4286
4284
- /* perform real JIT for this function */
4285
- zend_real_jit_func (op_array , NULL , NULL );
4287
+ /* perform real JIT for this function */
4288
+ zend_real_jit_func (op_array , NULL , NULL );
4289
+ } zend_catch {
4290
+ do_bailout = 0 ;
4291
+ } zend_end_try ();
4286
4292
4287
4293
zend_jit_protect ();
4288
4294
SHM_PROTECT ();
4289
4295
}
4290
4296
4291
4297
zend_shared_alloc_unlock ();
4292
4298
4299
+ if (do_bailout ) {
4300
+ zend_bailout ();
4301
+ }
4302
+
4293
4303
/* JIT-ed code is going to be called by VM */
4294
4304
return 0 ;
4295
4305
}
@@ -4332,6 +4342,7 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
4332
4342
zend_op_array * op_array = & EX (func )-> op_array ;
4333
4343
zend_jit_op_array_hot_extension * jit_extension ;
4334
4344
uint32_t i ;
4345
+ bool do_bailout = 0 ;
4335
4346
4336
4347
zend_shared_alloc_lock ();
4337
4348
jit_extension = (zend_jit_op_array_hot_extension * )ZEND_FUNC_INFO (op_array );
@@ -4340,19 +4351,26 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
4340
4351
SHM_UNPROTECT ();
4341
4352
zend_jit_unprotect ();
4342
4353
4343
- for (i = 0 ; i < op_array -> last ; i ++ ) {
4344
- op_array -> opcodes [i ].handler = jit_extension -> orig_handlers [i ];
4345
- }
4354
+ zend_try {
4355
+ for (i = 0 ; i < op_array -> last ; i ++ ) {
4356
+ op_array -> opcodes [i ].handler = jit_extension -> orig_handlers [i ];
4357
+ }
4346
4358
4347
- /* perform real JIT for this function */
4348
- zend_real_jit_func (op_array , NULL , opline );
4359
+ /* perform real JIT for this function */
4360
+ zend_real_jit_func (op_array , NULL , opline );
4361
+ } zend_catch {
4362
+ do_bailout = 1 ;
4363
+ } zend_end_try ();
4349
4364
4350
4365
zend_jit_protect ();
4351
4366
SHM_PROTECT ();
4352
4367
}
4353
4368
4354
4369
zend_shared_alloc_unlock ();
4355
4370
4371
+ if (do_bailout ) {
4372
+ zend_bailout ();
4373
+ }
4356
4374
/* JIT-ed code is going to be called by VM */
4357
4375
}
4358
4376
0 commit comments