mirror of
https://github.com/php/php-src.git
synced 2026-04-17 21:11:02 +02:00
Better hot/cold code splitting
This commit is contained in:
@@ -262,7 +262,7 @@ static zend_never_inline ZEND_COLD void zval_undefined_cv(uint32_t var EXECUTE_D
|
||||
}
|
||||
}
|
||||
|
||||
static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, uint32_t var, int type EXECUTE_DATA_DC)
|
||||
static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup(zval *ptr, uint32_t var, int type EXECUTE_DATA_DC)
|
||||
{
|
||||
switch (type) {
|
||||
case BP_VAR_R:
|
||||
@@ -282,52 +282,50 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, uint32_t var, int
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
zval_undefined_cv(var EXECUTE_DATA_CC);
|
||||
return &EG(uninitialized_zval);
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
zval_undefined_cv(var EXECUTE_DATA_CC);
|
||||
return &EG(uninitialized_zval);
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
static zend_never_inline ZEND_COLD zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
ZVAL_NULL(ptr);
|
||||
zval_undefined_cv(var EXECUTE_DATA_CC);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_cv_lookup_BP_VAR_W(zval *ptr, uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
ZVAL_NULL(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv(uint32_t var, int type EXECUTE_DATA_DC)
|
||||
{
|
||||
zval *ret = EX_VAR(var);
|
||||
|
||||
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
|
||||
return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
|
||||
if (type == BP_VAR_W) {
|
||||
ZVAL_NULL(ret);
|
||||
} else {
|
||||
return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv_undef(uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
return EX_VAR(var);
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv_deref(uint32_t var, int type EXECUTE_DATA_DC)
|
||||
{
|
||||
zval *ret = EX_VAR(var);
|
||||
|
||||
if (UNEXPECTED(Z_TYPE_P(ret) == IS_UNDEF)) {
|
||||
return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
|
||||
if (type == BP_VAR_W) {
|
||||
ZVAL_NULL(ret);
|
||||
return ret;
|
||||
} else {
|
||||
return _get_zval_cv_lookup(ret, var, type EXECUTE_DATA_CC);
|
||||
}
|
||||
}
|
||||
ZVAL_DEREF(ret);
|
||||
return ret;
|
||||
@@ -416,32 +414,18 @@ static zend_always_inline zval *_get_zval_ptr_cv_BP_VAR_W(uint32_t var EXECUTE_D
|
||||
zval *ret = EX_VAR(var);
|
||||
|
||||
if (Z_TYPE_P(ret) == IS_UNDEF) {
|
||||
return _get_zval_cv_lookup_BP_VAR_W(ret, var EXECUTE_DATA_CC);
|
||||
ZVAL_NULL(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv_undef_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
return EX_VAR(var);
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv_undef_BP_VAR_RW(uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
return EX_VAR(var);
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv_undef_BP_VAR_UNSET(uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
return EX_VAR(var);
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_zval_ptr_cv_deref_BP_VAR_W(uint32_t var EXECUTE_DATA_DC)
|
||||
{
|
||||
zval *ret = EX_VAR(var);
|
||||
|
||||
if (Z_TYPE_P(ret) == IS_UNDEF) {
|
||||
return _get_zval_cv_lookup_BP_VAR_W(ret, var EXECUTE_DATA_CC);
|
||||
ZVAL_NULL(ret);
|
||||
return ret;
|
||||
}
|
||||
ZVAL_DEREF(ret);
|
||||
return ret;
|
||||
@@ -545,7 +529,7 @@ static zend_always_inline zval *_get_zval_ptr_undef(int op_type, znode_op node,
|
||||
if (op_type == IS_CONST) {
|
||||
return RT_CONSTANT(opline, node);
|
||||
} else if (op_type == IS_CV) {
|
||||
return _get_zval_ptr_cv_undef(node.var EXECUTE_DATA_CC);
|
||||
return EX_VAR(node.var);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
@@ -576,11 +560,6 @@ static inline zval *_get_zval_ptr_ptr(int op_type, znode_op node, zend_free_op *
|
||||
}
|
||||
}
|
||||
|
||||
static zend_always_inline zval *_get_obj_zval_ptr_unused(EXECUTE_DATA_D)
|
||||
{
|
||||
return &EX(This);
|
||||
}
|
||||
|
||||
static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_free_op *should_free, int type EXECUTE_DATA_DC OPLINE_DC)
|
||||
{
|
||||
if (op_type == IS_UNUSED) {
|
||||
|
||||
@@ -4700,7 +4700,7 @@ ZEND_VM_HOT_HANDLER(63, ZEND_RECV, NUM, UNUSED|CACHE_SLOT)
|
||||
zend_missing_arg_error(execute_data);
|
||||
HANDLE_EXCEPTION();
|
||||
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
|
||||
zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
|
||||
zval *param = EX_VAR(opline->result.var);
|
||||
|
||||
SAVE_OPLINE();
|
||||
if (UNEXPECTED(!zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num)) || EG(exception))) {
|
||||
@@ -4720,7 +4720,7 @@ ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST, CACHE_SLOT)
|
||||
ZEND_VM_REPEATABLE_OPCODE
|
||||
|
||||
arg_num = opline->op1.num;
|
||||
param = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
|
||||
param = EX_VAR(opline->result.var);
|
||||
if (arg_num > EX_NUM_ARGS()) {
|
||||
zval *default_value = RT_CONSTANT(opline, opline->op2);
|
||||
|
||||
@@ -4769,7 +4769,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED|CACHE_SLOT)
|
||||
|
||||
SAVE_OPLINE();
|
||||
|
||||
params = _get_zval_ptr_cv_undef_BP_VAR_W(opline->result.var EXECUTE_DATA_CC);
|
||||
params = EX_VAR(opline->result.var);
|
||||
|
||||
if (arg_num <= arg_count) {
|
||||
zval *param;
|
||||
@@ -5931,7 +5931,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
|
||||
}
|
||||
|
||||
if (EXPECTED(OP2_TYPE == IS_CV)) {
|
||||
zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
|
||||
zval *variable_ptr = EX_VAR(opline->op2.var);
|
||||
zend_assign_to_variable(variable_ptr, value, IS_CV);
|
||||
} else {
|
||||
zval *res = EX_VAR(opline->op2.var);
|
||||
@@ -6097,7 +6097,7 @@ ZEND_VM_C_LABEL(fe_fetch_w_exit):
|
||||
ZVAL_COPY_VALUE_EX(ref, value, gc, value_type);
|
||||
}
|
||||
if (EXPECTED(OP2_TYPE == IS_CV)) {
|
||||
zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
|
||||
zval *variable_ptr = EX_VAR(opline->op2.var);
|
||||
if (EXPECTED(variable_ptr != value)) {
|
||||
zend_reference *ref;
|
||||
|
||||
@@ -8780,7 +8780,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf
|
||||
}
|
||||
}
|
||||
|
||||
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
|
||||
variable_ptr = EX_VAR(opline->op2.var);
|
||||
zend_assign_to_variable(variable_ptr, value, IS_CV);
|
||||
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -299,7 +299,7 @@ $op1_get_zval_ptr_undef = array(
|
||||
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op1)",
|
||||
"UNUSED" => "NULL",
|
||||
"CV" => "_get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"CV" => "EX_VAR(opline->op1.var)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"TMPVARCV" => "EX_VAR(opline->op1.var)",
|
||||
);
|
||||
@@ -310,7 +310,7 @@ $op2_get_zval_ptr_undef = array(
|
||||
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op2)",
|
||||
"UNUSED" => "NULL",
|
||||
"CV" => "_get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"CV" => "EX_VAR(opline->op2.var)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"TMPVARCV" => "EX_VAR(opline->op2.var)",
|
||||
);
|
||||
@@ -321,7 +321,7 @@ $op1_get_zval_ptr_ptr_undef = array(
|
||||
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "NULL",
|
||||
"UNUSED" => "NULL",
|
||||
"CV" => "_get_zval_ptr_cv_undef_\\1(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"CV" => "EX_VAR(opline->op1.var)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "EX_VAR(opline->op1.var)",
|
||||
);
|
||||
@@ -332,7 +332,7 @@ $op2_get_zval_ptr_ptr_undef = array(
|
||||
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "NULL",
|
||||
"UNUSED" => "NULL",
|
||||
"CV" => "_get_zval_ptr_cv_undef_\\1(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"CV" => "EX_VAR(opline->op2.var)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "EX_VAR(opline->op2.var)",
|
||||
);
|
||||
@@ -342,7 +342,7 @@ $op1_get_obj_zval_ptr = array(
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op1)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"TMPVARCV" => "???",
|
||||
@@ -353,7 +353,7 @@ $op2_get_obj_zval_ptr = array(
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op2)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"TMPVARCV" => "???",
|
||||
@@ -364,8 +364,8 @@ $op1_get_obj_zval_ptr_undef = array(
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"VAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op1)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"CV" => "_get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "EX_VAR(opline->op1.var)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"TMPVARCV" => "EX_VAR(opline->op1.var)",
|
||||
);
|
||||
@@ -375,8 +375,8 @@ $op2_get_obj_zval_ptr_undef = array(
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"VAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op2)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"CV" => "_get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "EX_VAR(opline->op2.var)",
|
||||
"TMPVAR" => "_get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"TMPVARCV" => "EX_VAR(opline->op2.var)",
|
||||
);
|
||||
@@ -386,7 +386,7 @@ $op1_get_obj_zval_ptr_deref = array(
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"VAR" => "_get_zval_ptr_var_deref(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op1)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "_get_zval_ptr_cv_deref_\\1(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "???",
|
||||
@@ -397,7 +397,7 @@ $op2_get_obj_zval_ptr_deref = array(
|
||||
"TMP" => "_get_zval_ptr_tmp(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"VAR" => "_get_zval_ptr_var_deref(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "RT_CONSTANT(opline, opline->op2)",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "_get_zval_ptr_cv_deref_\\1(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "???",
|
||||
@@ -408,7 +408,7 @@ $op1_get_obj_zval_ptr_ptr = array(
|
||||
"TMP" => "NULL",
|
||||
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "NULL",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "_get_zval_ptr_cv_\\1(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "???",
|
||||
@@ -419,7 +419,7 @@ $op2_get_obj_zval_ptr_ptr = array(
|
||||
"TMP" => "NULL",
|
||||
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "NULL",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "_get_zval_ptr_cv_\\1(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "???",
|
||||
@@ -430,8 +430,8 @@ $op1_get_obj_zval_ptr_ptr_undef = array(
|
||||
"TMP" => "NULL",
|
||||
"VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC)",
|
||||
"CONST" => "NULL",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"CV" => "_get_zval_ptr_cv_undef_\\1(opline->op1.var EXECUTE_DATA_CC)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "EX_VAR(opline->op1.var)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "EX_VAR(opline->op1.var)",
|
||||
);
|
||||
@@ -441,8 +441,8 @@ $op2_get_obj_zval_ptr_ptr_undef = array(
|
||||
"TMP" => "NULL",
|
||||
"VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC)",
|
||||
"CONST" => "NULL",
|
||||
"UNUSED" => "_get_obj_zval_ptr_unused(EXECUTE_DATA_C)",
|
||||
"CV" => "_get_zval_ptr_cv_undef_\\1(opline->op2.var EXECUTE_DATA_CC)",
|
||||
"UNUSED" => "&EX(This)",
|
||||
"CV" => "EX_VAR(opline->op2.var)",
|
||||
"TMPVAR" => "???",
|
||||
"TMPVARCV" => "EX_VAR(opline->op2.var)",
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user