Skip to content

Commit 37070ed

Browse files
committed
Avoid exception check unless zval_undefined_cv is called
These functions are inlined anyway, so we're only sacrificing readability.
1 parent 07c9d50 commit 37070ed

File tree

2 files changed

+703
-105
lines changed

2 files changed

+703
-105
lines changed

Zend/zend_vm_def.h

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9562,11 +9562,24 @@ ZEND_VM_HANDLER(205, ZEND_FRAMELESS_ICALL_1, CONST|TMP|VAR|CV, UNUSED)
95629562
USE_OPLINE
95639563
SAVE_OPLINE();
95649564
zend_frameless_function_1 function = (zend_frameless_function_1)zend_flf_handlers[opline->extended_value];
9565-
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9566-
if (OP1_TYPE == IS_CV && EG(exception)) {
9567-
ZVAL_NULL(EX_VAR(opline->result.var));
9568-
HANDLE_EXCEPTION();
9565+
9566+
zval *arg1;
9567+
if (OP1_TYPE == IS_CV) {
9568+
/* Inlined GET_OPx_ZVAL_PTR_DEREF to nest the EG(exception) check. */
9569+
arg1 = EX_VAR(opline->op1.var);
9570+
if (UNEXPECTED(Z_TYPE_P(arg1) == IS_UNDEF)) {
9571+
arg1 = zval_undefined_cv(opline->op1.var EXECUTE_DATA_CC);
9572+
if (EG(exception)) {
9573+
ZVAL_NULL(EX_VAR(opline->result.var));
9574+
FREE_OP1();
9575+
HANDLE_EXCEPTION();
9576+
}
9577+
}
9578+
ZVAL_DEREF(arg1);
9579+
} else {
9580+
arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
95699581
}
9582+
95709583
function(EX_VAR(opline->result.var), arg1);
95719584
FREE_OP1();
95729585
if (EG(exception)) {
@@ -9581,12 +9594,43 @@ ZEND_VM_HANDLER(206, ZEND_FRAMELESS_ICALL_2, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
95819594
USE_OPLINE
95829595
SAVE_OPLINE();
95839596
zend_frameless_function_2 function = (zend_frameless_function_2)zend_flf_handlers[opline->extended_value];
9584-
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9585-
zval *arg2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
9586-
if ((OP1_TYPE == IS_CV || OP2_TYPE == IS_CV) && EG(exception)) {
9587-
ZVAL_NULL(EX_VAR(opline->result.var));
9588-
HANDLE_EXCEPTION();
9597+
9598+
zval *arg1;
9599+
if (OP1_TYPE == IS_CV) {
9600+
/* Inlined GET_OPx_ZVAL_PTR_DEREF to nest the EG(exception) check. */
9601+
arg1 = EX_VAR(opline->op1.var);
9602+
if (UNEXPECTED(Z_TYPE_P(arg1) == IS_UNDEF)) {
9603+
arg1 = zval_undefined_cv(opline->op1.var EXECUTE_DATA_CC);
9604+
if (EG(exception)) {
9605+
ZVAL_NULL(EX_VAR(opline->result.var));
9606+
FREE_OP1();
9607+
FREE_OP2();
9608+
HANDLE_EXCEPTION();
9609+
}
9610+
}
9611+
ZVAL_DEREF(arg1);
9612+
} else {
9613+
arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
95899614
}
9615+
9616+
zval *arg2;
9617+
if (OP2_TYPE == IS_CV) {
9618+
/* Inlined GET_OPx_ZVAL_PTR_DEREF to nest the EG(exception) check. */
9619+
arg2 = EX_VAR(opline->op2.var);
9620+
if (UNEXPECTED(Z_TYPE_P(arg2) == IS_UNDEF)) {
9621+
arg2 = zval_undefined_cv(opline->op2.var EXECUTE_DATA_CC);
9622+
if (EG(exception)) {
9623+
ZVAL_NULL(EX_VAR(opline->result.var));
9624+
FREE_OP1();
9625+
FREE_OP2();
9626+
HANDLE_EXCEPTION();
9627+
}
9628+
}
9629+
ZVAL_DEREF(arg2);
9630+
} else {
9631+
arg2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
9632+
}
9633+
95909634
function(EX_VAR(opline->result.var), arg1, arg2);
95919635
FREE_OP1();
95929636
FREE_OP2();
@@ -9607,6 +9651,9 @@ ZEND_VM_HANDLER(207, ZEND_FRAMELESS_ICALL_3, ANY, ANY)
96079651
zval *arg3 = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
96089652
if (EG(exception)) {
96099653
ZVAL_NULL(EX_VAR(opline->result.var));
9654+
FREE_OP1();
9655+
FREE_OP2();
9656+
FREE_OP_DATA();
96109657
HANDLE_EXCEPTION();
96119658
}
96129659
function(EX_VAR(opline->result.var), arg1, arg2, arg3);

0 commit comments

Comments
 (0)