mirror of
https://github.com/php/php-src.git
synced 2025-08-20 09:24:05 +02:00
Optimize fast path
This commit is contained in:
parent
b928ea2de7
commit
db5898c9e5
2 changed files with 36 additions and 16 deletions
|
@ -7628,20 +7628,30 @@ ZEND_VM_C_LABEL(check_indirect):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
zend_reference *ref;
|
zend_reference *ref;
|
||||||
|
|
||||||
if (UNEXPECTED(!Z_ISREF_P(value))) {
|
if (UNEXPECTED(!Z_ISREF_P(value))) {
|
||||||
ZVAL_NEW_REF(value, value);
|
ref = (zend_reference*)emalloc(sizeof(zend_reference));
|
||||||
} else if (UNEXPECTED(variable_ptr == value)) {
|
GC_REFCOUNT(ref) = 2;
|
||||||
break;
|
GC_TYPE_INFO(ref) = IS_REFERENCE;
|
||||||
|
ZVAL_COPY_VALUE(&ref->val, value);
|
||||||
|
Z_REF_P(value) = ref;
|
||||||
|
Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
|
||||||
|
} else {
|
||||||
|
ref = Z_REF_P(value);
|
||||||
|
GC_REFCOUNT(ref)++;
|
||||||
}
|
}
|
||||||
ref = Z_REF_P(value);
|
|
||||||
GC_REFCOUNT(ref)++;
|
variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
|
||||||
|
|
||||||
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
|
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
|
||||||
if (!Z_DELREF_P(variable_ptr)) {
|
uint32_t refcnt = Z_DELREF_P(variable_ptr);
|
||||||
|
|
||||||
|
if (UNEXPECTED(variable_ptr == value)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (refcnt == 0) {
|
||||||
SAVE_OPLINE();
|
SAVE_OPLINE();
|
||||||
zval_dtor_func_for_ptr(Z_COUNTED_P(variable_ptr));
|
zval_dtor_func_for_ptr(Z_COUNTED_P(variable_ptr));
|
||||||
if (UNEXPECTED(EG(exception))) {
|
if (UNEXPECTED(EG(exception))) {
|
||||||
|
|
|
@ -32798,20 +32798,30 @@ check_indirect:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
zend_reference *ref;
|
zend_reference *ref;
|
||||||
|
|
||||||
if (UNEXPECTED(!Z_ISREF_P(value))) {
|
if (UNEXPECTED(!Z_ISREF_P(value))) {
|
||||||
ZVAL_NEW_REF(value, value);
|
ref = (zend_reference*)emalloc(sizeof(zend_reference));
|
||||||
} else if (UNEXPECTED(variable_ptr == value)) {
|
GC_REFCOUNT(ref) = 2;
|
||||||
break;
|
GC_TYPE_INFO(ref) = IS_REFERENCE;
|
||||||
|
ZVAL_COPY_VALUE(&ref->val, value);
|
||||||
|
Z_REF_P(value) = ref;
|
||||||
|
Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
|
||||||
|
} else {
|
||||||
|
ref = Z_REF_P(value);
|
||||||
|
GC_REFCOUNT(ref)++;
|
||||||
}
|
}
|
||||||
ref = Z_REF_P(value);
|
|
||||||
GC_REFCOUNT(ref)++;
|
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
|
||||||
|
|
||||||
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
|
if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
|
||||||
if (!Z_DELREF_P(variable_ptr)) {
|
uint32_t refcnt = Z_DELREF_P(variable_ptr);
|
||||||
|
|
||||||
|
if (UNEXPECTED(variable_ptr == value)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (refcnt == 0) {
|
||||||
SAVE_OPLINE();
|
SAVE_OPLINE();
|
||||||
zval_dtor_func_for_ptr(Z_COUNTED_P(variable_ptr));
|
zval_dtor_func_for_ptr(Z_COUNTED_P(variable_ptr));
|
||||||
if (UNEXPECTED(EG(exception))) {
|
if (UNEXPECTED(EG(exception))) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue