@@ -2401,7 +2401,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
2401
2401
if (UNEXPECTED (call_info & ZEND_CALL_CLOSURE )) {
2402
2402
OBJ_RELEASE ((zend_object * )old_execute_data -> func -> op_array .prototype );
2403
2403
}
2404
- if (call_info & ZEND_CALL_RELEASE_THIS ) {
2404
+ if (UNEXPECTED ( call_info & ZEND_CALL_RELEASE_THIS ) ) {
2405
2405
object = Z_OBJ (old_execute_data -> This );
2406
2406
#if 0
2407
2407
if (UNEXPECTED (EG (exception ) != NULL ) && (EX (opline )-> op1 .num & ZEND_CALL_CTOR )) {
@@ -2921,16 +2921,23 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
2921
2921
}
2922
2922
2923
2923
if (OP1_TYPE != IS_UNUSED ) {
2924
- ZVAL_DEREF (object );
2925
- if (UNEXPECTED (Z_TYPE_P (object ) != IS_OBJECT )) {
2926
- if (UNEXPECTED (EG (exception ) != NULL )) {
2924
+ do {
2925
+ if (UNEXPECTED (Z_TYPE_P (object ) != IS_OBJECT )) {
2926
+ if ((OP1_TYPE & (IS_VAR |IS_CV )) && EXPECTED (Z_ISREF_P (object ))) {
2927
+ object = Z_REFVAL_P (object );
2928
+ if (EXPECTED (Z_TYPE_P (object ) == IS_OBJECT )) {
2929
+ break ;
2930
+ }
2931
+ }
2932
+ if (UNEXPECTED (EG (exception ) != NULL )) {
2933
+ HANDLE_EXCEPTION ();
2934
+ }
2935
+ zend_error (E_EXCEPTION | E_ERROR , "Call to a member function %s() on %s" , Z_STRVAL_P (function_name ), zend_get_type_by_const (Z_TYPE_P (object )));
2936
+ FREE_OP2 ();
2937
+ FREE_OP1 ();
2927
2938
HANDLE_EXCEPTION ();
2928
2939
}
2929
- zend_error (E_EXCEPTION | E_ERROR , "Call to a member function %s() on %s" , Z_STRVAL_P (function_name ), zend_get_type_by_const (Z_TYPE_P (object )));
2930
- FREE_OP2 ();
2931
- FREE_OP1 ();
2932
- HANDLE_EXCEPTION ();
2933
- }
2940
+ } while (0 );
2934
2941
}
2935
2942
2936
2943
obj = Z_OBJ_P (object );
@@ -3760,7 +3767,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
3760
3767
}
3761
3768
3762
3769
ZEND_VM_C_LABEL (fcall_end_change_scope ):
3763
- if (ZEND_CALL_INFO (call ) & ZEND_CALL_RELEASE_THIS ) {
3770
+ if (UNEXPECTED ( ZEND_CALL_INFO (call ) & ZEND_CALL_RELEASE_THIS ) ) {
3764
3771
object = Z_OBJ (call -> This );
3765
3772
#if 0
3766
3773
if (UNEXPECTED (EG (exception ) != NULL ) && (opline -> op1 .num & ZEND_CALL_CTOR )) {
@@ -8004,7 +8011,7 @@ ZEND_VM_C_LABEL(call_trampoline_end):
8004
8011
8005
8012
opline = EX (opline );
8006
8013
8007
- if (call_info & ZEND_CALL_RELEASE_THIS ) {
8014
+ if (UNEXPECTED ( call_info & ZEND_CALL_RELEASE_THIS ) ) {
8008
8015
object = Z_OBJ (call -> This );
8009
8016
OBJ_RELEASE (object );
8010
8017
}
0 commit comments