@@ -3234,15 +3234,19 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
3234
3234
GC_REFCOUNT (obj )++ ; /* For $this pointer */
3235
3235
}
3236
3236
3237
+ FREE_OP2 ();
3238
+ FREE_OP1 ();
3239
+
3240
+ if ((OP1_TYPE & (IS_VAR |IS_TMP_VAR )) && UNEXPECTED (EG (exception ))) {
3241
+ HANDLE_EXCEPTION ();
3242
+ }
3243
+
3237
3244
call = zend_vm_stack_push_call_frame (call_info ,
3238
3245
fbc , opline -> extended_value , called_scope , obj );
3239
3246
call -> prev_execute_data = EX (call );
3240
3247
EX (call ) = call ;
3241
3248
3242
- FREE_OP2 ();
3243
- FREE_OP1 ();
3244
-
3245
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
3249
+ ZEND_VM_NEXT_OPCODE ();
3246
3250
}
3247
3251
3248
3252
ZEND_VM_HANDLER (113 , ZEND_INIT_STATIC_METHOD_CALL , UNUSED |CLASS_FETCH |CONST |VAR , CONST |TMPVAR |UNUSED |CONSTRUCTOR |CV , NUM )
@@ -3397,7 +3401,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
3397
3401
call -> prev_execute_data = EX (call );
3398
3402
EX (call ) = call ;
3399
3403
3400
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
3404
+ ZEND_VM_NEXT_OPCODE ();
3401
3405
}
3402
3406
3403
3407
ZEND_VM_HANDLER (59 , ZEND_INIT_FCALL_BY_NAME , ANY , CONST , NUM )
@@ -3461,12 +3465,26 @@ ZEND_VM_C_LABEL(try_function_name):
3461
3465
call = NULL ;
3462
3466
}
3463
3467
3464
- FREE_OP2 ();
3465
-
3466
3468
if (UNEXPECTED (!call )) {
3467
3469
HANDLE_EXCEPTION ();
3468
3470
}
3469
3471
3472
+ FREE_OP2 ();
3473
+ if (OP2_TYPE & (IS_VAR |IS_TMP_VAR )) {
3474
+ if (UNEXPECTED (EG (exception ))) {
3475
+ if (call ) {
3476
+ if (call -> func -> common .fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE ) {
3477
+ zend_string_release (call -> func -> common .function_name );
3478
+ zend_free_trampoline (call -> func );
3479
+ }
3480
+ zend_vm_stack_free_call_frame (call );
3481
+ }
3482
+ HANDLE_EXCEPTION ();
3483
+ }
3484
+ } else if (UNEXPECTED (!call )) {
3485
+ HANDLE_EXCEPTION ();
3486
+ }
3487
+
3470
3488
call -> prev_execute_data = EX (call );
3471
3489
EX (call ) = call ;
3472
3490
@@ -3492,6 +3510,17 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
3492
3510
func = fcc .function_handler ;
3493
3511
called_scope = fcc .called_scope ;
3494
3512
object = fcc .object ;
3513
+ if (error ) {
3514
+ efree (error );
3515
+ /* This is the only soft error is_callable() can generate */
3516
+ zend_error (E_DEPRECATED ,
3517
+ "Non-static method %s::%s() should not be called statically" ,
3518
+ ZSTR_VAL (func -> common .scope -> name ), ZSTR_VAL (func -> common .function_name ));
3519
+ if (UNEXPECTED (EG (exception ) != NULL )) {
3520
+ FREE_OP2 ();
3521
+ HANDLE_EXCEPTION ();
3522
+ }
3523
+ }
3495
3524
if (func -> common .fn_flags & ZEND_ACC_CLOSURE ) {
3496
3525
/* Delay closure destruction until its invocation */
3497
3526
ZEND_ASSERT (GC_TYPE ((zend_object * )func -> common .prototype ) == IS_OBJECT );
@@ -3504,22 +3533,28 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
3504
3533
call_info |= ZEND_CALL_RELEASE_THIS ;
3505
3534
GC_REFCOUNT (object )++ ; /* For $this pointer */
3506
3535
}
3507
- if (error ) {
3508
- efree (error );
3509
- /* This is the only soft error is_callable() can generate */
3510
- zend_error (E_DEPRECATED ,
3511
- "Non-static method %s::%s() should not be called statically" ,
3512
- ZSTR_VAL (func -> common .scope -> name ), ZSTR_VAL (func -> common .function_name ));
3513
- if (UNEXPECTED (EG (exception ) != NULL )) {
3514
- HANDLE_EXCEPTION ();
3536
+
3537
+ FREE_OP2 ();
3538
+ if ((OP2_TYPE & (IS_TMP_VAR |IS_VAR )) && UNEXPECTED (EG (exception ))) {
3539
+ if (call_info & ZEND_CALL_CLOSURE ) {
3540
+ zend_object_release ((zend_object * )func -> common .prototype );
3515
3541
}
3542
+ if (call_info & ZEND_CALL_RELEASE_THIS ) {
3543
+ zend_object_release (object );
3544
+ }
3545
+ HANDLE_EXCEPTION ();
3516
3546
}
3547
+
3517
3548
if (EXPECTED (func -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!func -> op_array .run_time_cache )) {
3518
3549
init_func_run_time_cache (& func -> op_array );
3519
3550
}
3520
3551
} else {
3521
3552
zend_internal_type_error (EX_USES_STRICT_TYPES (), "%s() expects parameter 1 to be a valid callback, %s" , Z_STRVAL_P (EX_CONSTANT (opline -> op1 )), error );
3522
3553
efree (error );
3554
+ FREE_OP2 ();
3555
+ if (UNEXPECTED (EG (exception ))) {
3556
+ HANDLE_EXCEPTION ();
3557
+ }
3523
3558
func = (zend_function * )& zend_pass_function ;
3524
3559
called_scope = NULL ;
3525
3560
object = NULL ;
@@ -3530,8 +3565,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
3530
3565
call -> prev_execute_data = EX (call );
3531
3566
EX (call ) = call ;
3532
3567
3533
- FREE_OP2 ();
3534
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
3568
+ ZEND_VM_NEXT_OPCODE ();
3535
3569
}
3536
3570
3537
3571
ZEND_VM_HANDLER (69 , ZEND_INIT_NS_FCALL_BY_NAME , ANY , CONST , NUM )
@@ -4992,7 +5026,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
4992
5026
4993
5027
call -> prev_execute_data = EX (call );
4994
5028
EX (call ) = call ;
4995
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
5029
+ ZEND_VM_NEXT_OPCODE ();
4996
5030
}
4997
5031
4998
5032
ZEND_VM_HANDLER (110 , ZEND_CLONE , CONST |TMPVAR |UNUSED |THIS |CV , ANY )
0 commit comments