Skip to content

Commit a989c0a

Browse files
committed
Improved fast path locality
1 parent bdbe121 commit a989c0a

File tree

3 files changed

+204
-113
lines changed

3 files changed

+204
-113
lines changed

Zend/zend_execute.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, ze
180180
{
181181
uint32_t used_stack = ZEND_CALL_FRAME_SLOT + num_args;
182182

183-
if (ZEND_USER_CODE(func->type)) {
183+
if (EXPECTED(ZEND_USER_CODE(func->type))) {
184184
used_stack += func->op_array.last_var + func->op_array.T - MIN(func->op_array.num_args, num_args);
185185
}
186186
return used_stack * sizeof(zval);
@@ -304,7 +304,7 @@ void zend_free_compiled_variables(zend_execute_data *execute_data);
304304
} while (0)
305305

306306
#define CACHED_POLYMORPHIC_PTR(num, ce) \
307-
((((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[0] == (void*)(ce)) ? \
307+
(EXPECTED(((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[0] == (void*)(ce)) ? \
308308
((void**)((char*)EX_RUN_TIME_CACHE() + (num)))[1] : \
309309
NULL)
310310

@@ -322,7 +322,7 @@ void zend_free_compiled_variables(zend_execute_data *execute_data);
322322
} while (0)
323323

324324
#define CACHED_POLYMORPHIC_PTR_EX(slot, ce) \
325-
(((slot)[0] == (ce)) ? (slot)[1] : NULL)
325+
(EXPECTED((slot)[0] == (ce)) ? (slot)[1] : NULL)
326326

327327
#define CACHE_POLYMORPHIC_PTR_EX(slot, ce, ptr) do { \
328328
(slot)[0] = (ce); \

Zend/zend_vm_def.h

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,7 +2401,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
24012401
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
24022402
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
24032403
}
2404-
if (call_info & ZEND_CALL_RELEASE_THIS) {
2404+
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
24052405
object = Z_OBJ(old_execute_data->This);
24062406
#if 0
24072407
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
29212921
}
29222922

29232923
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();
29272938
HANDLE_EXCEPTION();
29282939
}
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);
29342941
}
29352942

29362943
obj = Z_OBJ_P(object);
@@ -3760,7 +3767,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
37603767
}
37613768

37623769
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)) {
37643771
object = Z_OBJ(call->This);
37653772
#if 0
37663773
if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) {
@@ -8004,7 +8011,7 @@ ZEND_VM_C_LABEL(call_trampoline_end):
80048011

80058012
opline = EX(opline);
80068013

8007-
if (call_info & ZEND_CALL_RELEASE_THIS) {
8014+
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
80088015
object = Z_OBJ(call->This);
80098016
OBJ_RELEASE(object);
80108017
}

0 commit comments

Comments
 (0)