@@ -3428,8 +3428,17 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
3428
3428
do {
3429
3429
if (OP1_TYPE == IS_CONST || UNEXPECTED (Z_TYPE_P (object ) != IS_OBJECT )) {
3430
3430
if ((OP1_TYPE & (IS_VAR |IS_CV )) && EXPECTED (Z_ISREF_P (object ))) {
3431
- object = Z_REFVAL_P (object );
3431
+ zend_reference * ref = Z_REF_P (object );
3432
+
3433
+ object = & ref -> val ;
3432
3434
if (EXPECTED (Z_TYPE_P (object ) == IS_OBJECT )) {
3435
+ if (OP1_TYPE & IS_VAR ) {
3436
+ if (UNEXPECTED (GC_DELREF (ref ) == 0 )) {
3437
+ efree_size (ref , sizeof (zend_reference ));
3438
+ } else {
3439
+ Z_ADDREF_P (object );
3440
+ }
3441
+ }
3433
3442
break ;
3434
3443
}
3435
3444
}
@@ -3473,7 +3482,9 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
3473
3482
zend_undefined_method (obj -> ce , Z_STR_P (function_name ));
3474
3483
}
3475
3484
FREE_OP2 ();
3476
- FREE_OP1 ();
3485
+ if ((OP1_TYPE & (IS_VAR |IS_TMP_VAR )) && GC_DELREF (orig_obj ) == 0 ) {
3486
+ zend_objects_store_del (orig_obj );
3487
+ }
3477
3488
HANDLE_EXCEPTION ();
3478
3489
}
3479
3490
if (OP2_TYPE == IS_CONST &&
@@ -3482,8 +3493,10 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
3482
3493
CACHE_POLYMORPHIC_PTR (opline -> result .num , called_scope , fbc );
3483
3494
}
3484
3495
if ((OP1_TYPE & (IS_VAR |IS_TMP_VAR )) && UNEXPECTED (obj != orig_obj )) {
3485
- /* Reset "object" to trigger reference counting */
3486
- object = NULL ;
3496
+ GC_ADDREF (obj ); /* For $this pointer */
3497
+ if (GC_DELREF (orig_obj ) == 0 ) {
3498
+ zend_objects_store_del (orig_obj );
3499
+ }
3487
3500
}
3488
3501
if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE (& fbc -> op_array ))) {
3489
3502
init_func_run_time_cache (& fbc -> op_array );
@@ -3496,23 +3509,18 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
3496
3509
3497
3510
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS ;
3498
3511
if (UNEXPECTED ((fbc -> common .fn_flags & ZEND_ACC_STATIC ) != 0 )) {
3499
- FREE_OP1 ();
3500
-
3501
- if ((OP1_TYPE & (IS_VAR |IS_TMP_VAR )) && UNEXPECTED (EG (exception ))) {
3502
- HANDLE_EXCEPTION ();
3512
+ if ((OP1_TYPE & (IS_VAR |IS_TMP_VAR )) && GC_DELREF (obj ) == 0 ) {
3513
+ zend_objects_store_del (obj );
3514
+ if (UNEXPECTED (EG (exception ))) {
3515
+ HANDLE_EXCEPTION ();
3516
+ }
3503
3517
}
3504
3518
/* call static method */
3505
3519
obj = (zend_object * )called_scope ;
3506
3520
call_info = ZEND_CALL_NESTED_FUNCTION ;
3507
3521
} else if (OP1_TYPE & (IS_VAR |IS_TMP_VAR |IS_CV )) {
3508
3522
if (OP1_TYPE == IS_CV ) {
3509
3523
GC_ADDREF (obj ); /* For $this pointer */
3510
- } else {
3511
- zval * free_op1 = EX_VAR (opline -> op1 .var );
3512
- if (free_op1 != object ) {
3513
- GC_ADDREF (obj ); /* For $this pointer */
3514
- zval_ptr_dtor_nogc (free_op1 );
3515
- }
3516
3524
}
3517
3525
/* CV may be changed indirectly (e.g. when it's a reference) */
3518
3526
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS ;
0 commit comments