Skip to content

Commit aed1f78

Browse files
committed
micro-optimization
1 parent 4e6fbb0 commit aed1f78

File tree

2 files changed

+286
-173
lines changed

2 files changed

+286
-173
lines changed

Zend/zend_vm_def.h

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3428,8 +3428,17 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
34283428
do {
34293429
if (OP1_TYPE == IS_CONST || UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
34303430
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;
34323434
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+
}
34333442
break;
34343443
}
34353444
}
@@ -3473,7 +3482,9 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
34733482
zend_undefined_method(obj->ce, Z_STR_P(function_name));
34743483
}
34753484
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+
}
34773488
HANDLE_EXCEPTION();
34783489
}
34793490
if (OP2_TYPE == IS_CONST &&
@@ -3482,8 +3493,10 @@ ZEND_VM_HOT_OBJ_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV,
34823493
CACHE_POLYMORPHIC_PTR(opline->result.num, called_scope, fbc);
34833494
}
34843495
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+
}
34873500
}
34883501
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
34893502
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,
34963509

34973510
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS;
34983511
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+
}
35033517
}
35043518
/* call static method */
35053519
obj = (zend_object*)called_scope;
35063520
call_info = ZEND_CALL_NESTED_FUNCTION;
35073521
} else if (OP1_TYPE & (IS_VAR|IS_TMP_VAR|IS_CV)) {
35083522
if (OP1_TYPE == IS_CV) {
35093523
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-
}
35163524
}
35173525
/* CV may be changed indirectly (e.g. when it's a reference) */
35183526
call_info = ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS;

0 commit comments

Comments
 (0)