mirror of
https://github.com/php/php-src.git
synced 2026-04-19 22:11:12 +02:00
Optimization
This commit is contained in:
@@ -819,7 +819,6 @@ static inline int zend_assign_to_string_offset(const temp_variable *T, const zva
|
||||
static inline zval* zend_assign_tmp_to_variable(zval **variable_ptr_ptr, zval *value TSRMLS_DC)
|
||||
{
|
||||
zval *variable_ptr = *variable_ptr_ptr;
|
||||
zval garbage;
|
||||
|
||||
if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
|
||||
UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
|
||||
@@ -828,12 +827,12 @@ static inline zval* zend_assign_tmp_to_variable(zval **variable_ptr_ptr, zval *v
|
||||
}
|
||||
|
||||
if (EXPECTED(!PZVAL_IS_REF(variable_ptr))) {
|
||||
if (Z_DELREF_P(variable_ptr)==0) {
|
||||
ZVAL_COPY_VALUE(&garbage, variable_ptr);
|
||||
INIT_PZVAL_COPY(variable_ptr, value);
|
||||
zendi_zval_dtor(garbage);
|
||||
if (Z_REFCOUNT_P(variable_ptr)==1) {
|
||||
zendi_zval_dtor(*variable_ptr);
|
||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
||||
return variable_ptr;
|
||||
} else { /* we need to split */
|
||||
Z_DELREF_P(variable_ptr);
|
||||
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
|
||||
ALLOC_ZVAL(variable_ptr);
|
||||
INIT_PZVAL_COPY(variable_ptr, value);
|
||||
@@ -841,11 +840,8 @@ static inline zval* zend_assign_tmp_to_variable(zval **variable_ptr_ptr, zval *v
|
||||
return variable_ptr;
|
||||
}
|
||||
} else {
|
||||
if (EXPECTED(variable_ptr != value)) {
|
||||
ZVAL_COPY_VALUE(&garbage, variable_ptr);
|
||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
||||
zendi_zval_dtor(garbage);
|
||||
}
|
||||
zendi_zval_dtor(*variable_ptr);
|
||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
||||
return variable_ptr;
|
||||
}
|
||||
}
|
||||
@@ -863,17 +859,17 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
|
||||
}
|
||||
|
||||
if (EXPECTED(!PZVAL_IS_REF(variable_ptr))) {
|
||||
if (Z_DELREF_P(variable_ptr)==0) {
|
||||
if (Z_REFCOUNT_P(variable_ptr)==1) {
|
||||
if (variable_ptr==value) {
|
||||
Z_ADDREF_P(variable_ptr);
|
||||
return variable_ptr;
|
||||
} else if (PZVAL_IS_REF(value)) {
|
||||
ZVAL_COPY_VALUE(&garbage, variable_ptr);
|
||||
INIT_PZVAL_COPY(variable_ptr, value);
|
||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
||||
zval_copy_ctor(variable_ptr);
|
||||
zendi_zval_dtor(garbage);
|
||||
return variable_ptr;
|
||||
} else {
|
||||
Z_DELREF_P(variable_ptr);
|
||||
Z_ADDREF_P(value);
|
||||
*variable_ptr_ptr = value;
|
||||
if (variable_ptr != &EG(uninitialized_zval)) {
|
||||
@@ -884,6 +880,7 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
|
||||
return value;
|
||||
}
|
||||
} else { /* we need to split */
|
||||
Z_DELREF_P(variable_ptr);
|
||||
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
|
||||
if (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0) {
|
||||
ALLOC_ZVAL(variable_ptr);
|
||||
|
||||
Reference in New Issue
Block a user