Skip to content

Commit f7faa62

Browse files
committed
Reorder conditions to minimize number of checks on fast path
1 parent 6288fc1 commit f7faa62

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

Zend/zend_inheritance.c

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -450,10 +450,12 @@ static inheritance_status zend_do_perform_implementation_check(
450450

451451
local_status = zend_do_perform_arg_type_hint_check(
452452
unresolved_class, fe, fe_arg_info, proto, proto_arg_info);
453-
if (local_status == INHERITANCE_ERROR) {
454-
return INHERITANCE_ERROR;
455-
}
456-
if (local_status == INHERITANCE_UNRESOLVED) {
453+
454+
if (UNEXPECTED(local_status != INHERITANCE_SUCCESS)) {
455+
if (UNEXPECTED(local_status == INHERITANCE_ERROR)) {
456+
return INHERITANCE_ERROR;
457+
}
458+
ZEND_ASSERT(local_status == INHERITANCE_UNRESOLVED);
457459
status = INHERITANCE_UNRESOLVED;
458460
}
459461

@@ -473,10 +475,12 @@ static inheritance_status zend_do_perform_implementation_check(
473475

474476
local_status = zend_perform_covariant_type_check(
475477
unresolved_class, fe, fe->common.arg_info - 1, proto, proto->common.arg_info - 1);
476-
if (local_status == INHERITANCE_ERROR) {
477-
return INHERITANCE_ERROR;
478-
}
479-
if (local_status == INHERITANCE_UNRESOLVED) {
478+
479+
if (UNEXPECTED(local_status != INHERITANCE_SUCCESS)) {
480+
if (UNEXPECTED(local_status == INHERITANCE_ERROR)) {
481+
return INHERITANCE_ERROR;
482+
}
483+
ZEND_ASSERT(local_status == INHERITANCE_UNRESOLVED);
480484
status = INHERITANCE_UNRESOLVED;
481485
}
482486
}
@@ -702,7 +706,8 @@ static void perform_delayable_implementation_check(
702706
if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
703707
if (EXPECTED(status == INHERITANCE_UNRESOLVED)) {
704708
add_compatibility_obligation(ce, fe, proto, always_error);
705-
} else if (status == INHERITANCE_ERROR) {
709+
} else {
710+
ZEND_ASSERT(status == INHERITANCE_ERROR);
706711
if (always_error) {
707712
emit_incompatible_method_error(
708713
E_COMPILE_ERROR, "must", fe, proto, status, unresolved_class);
@@ -2262,10 +2267,12 @@ static int check_variance_obligation(zval *zv) {
22622267
zend_string *unresolved_class;
22632268
inheritance_status status = zend_do_perform_implementation_check(
22642269
&unresolved_class, obligation->child_fn, obligation->parent_fn);
2265-
if (status == INHERITANCE_UNRESOLVED) {
2266-
return ZEND_HASH_APPLY_KEEP;
2267-
}
2268-
if (status == INHERITANCE_ERROR) {
2270+
2271+
if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
2272+
if (EXPECTED(status == INHERITANCE_UNRESOLVED)) {
2273+
return ZEND_HASH_APPLY_KEEP;
2274+
}
2275+
ZEND_ASSERT(status == INHERITANCE_ERROR);
22692276
emit_incompatible_method_error_or_warning(
22702277
obligation->child_fn, obligation->parent_fn, status, unresolved_class,
22712278
obligation->always_error);
@@ -2402,9 +2409,16 @@ zend_bool zend_can_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce)
24022409
}
24032410

24042411
zv = zend_hash_find_ex(&ce->function_table, key, 1);
2405-
if (zv
2406-
&& zend_do_perform_implementation_check(&unresolved_class, Z_FUNC_P(zv), parent_func) == INHERITANCE_UNRESOLVED) {
2407-
return 0;
2412+
if (zv) {
2413+
zend_function *child_func = Z_FUNC_P(zv);
2414+
inheritance_status status;
2415+
2416+
status = zend_do_perform_implementation_check(
2417+
&unresolved_class, child_func, parent_func);
2418+
2419+
if (UNEXPECTED(status == INHERITANCE_UNRESOLVED)) {
2420+
return 0;
2421+
}
24082422
}
24092423
} ZEND_HASH_FOREACH_END();
24102424
return 1;

0 commit comments

Comments
 (0)