summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-07-04 12:05:51 +0300
committerDmitry Stogov <dmitry@zend.com>2018-07-04 12:05:51 +0300
commit5f19816f533500a7a262b4ccaa9d5a59d25a932b (patch)
tree39d829f819c1af9c2b93bd6bce427795cf48e7b5
parentd84ef967424343abcc48b8f945d5e7807f1c1e09 (diff)
downloadphp-git-5f19816f533500a7a262b4ccaa9d5a59d25a932b.tar.gz
concat_function() micro optimization
-rw-r--r--Zend/zend_operators.c64
-rw-r--r--Zend/zend_variables.h10
2 files changed, 36 insertions, 38 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index cd0e7047d0..e10a75679d 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1744,7 +1744,9 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
{
zval *orig_op1 = op1;
zval op1_copy, op2_copy;
- int use_copy1 = 0, use_copy2 = 0;
+
+ ZVAL_UNDEF(&op1_copy);
+ ZVAL_UNDEF(&op2_copy);
do {
if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING)) {
@@ -1753,22 +1755,20 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (Z_TYPE_P(op1) == IS_STRING) break;
}
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
- use_copy1 = zend_make_printable_zval(op1, &op1_copy);
- if (use_copy1) {
- if (UNEXPECTED(EG(exception))) {
- zval_dtor(&op1_copy);
- if (orig_op1 != result) {
- ZVAL_UNDEF(result);
- }
- return FAILURE;
+ ZVAL_STR(&op1_copy, zval_get_string_func(op1));
+ if (UNEXPECTED(EG(exception))) {
+ zval_ptr_dtor_str(&op1_copy);
+ if (orig_op1 != result) {
+ ZVAL_UNDEF(result);
}
- if (result == op1) {
- if (UNEXPECTED(op1 == op2)) {
- op2 = &op1_copy;
- }
+ return FAILURE;
+ }
+ if (result == op1) {
+ if (UNEXPECTED(op1 == op2)) {
+ op2 = &op1_copy;
}
- op1 = &op1_copy;
}
+ op1 = &op1_copy;
}
} while (0);
do {
@@ -1778,20 +1778,16 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (Z_TYPE_P(op2) == IS_STRING) break;
}
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_CONCAT);
- use_copy2 = zend_make_printable_zval(op2, &op2_copy);
- if (use_copy2) {
- if (UNEXPECTED(EG(exception))) {
- if (UNEXPECTED(use_copy1)) {
- zval_dtor(op1);
- }
- zval_dtor(&op2_copy);
- if (orig_op1 != result) {
- ZVAL_UNDEF(result);
- }
- return FAILURE;
+ ZVAL_STR(&op2_copy, zval_get_string_func(op2));
+ if (UNEXPECTED(EG(exception))) {
+ zval_ptr_dtor_str(&op1_copy);
+ zval_ptr_dtor_str(&op2_copy);
+ if (orig_op1 != result) {
+ ZVAL_UNDEF(result);
}
- op2 = &op2_copy;
+ return FAILURE;
}
+ op2 = &op2_copy;
}
} while (0);
@@ -1814,12 +1810,8 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
if (UNEXPECTED(op1_len > SIZE_MAX - op2_len)) {
zend_throw_error(NULL, "String size overflow");
- if (UNEXPECTED(use_copy1)) {
- zval_dtor(op1);
- }
- if (UNEXPECTED(use_copy2)) {
- zval_dtor(op2);
- }
+ zval_ptr_dtor_str(&op1_copy);
+ zval_ptr_dtor_str(&op2_copy);
if (orig_op1 != result) {
ZVAL_UNDEF(result);
}
@@ -1846,12 +1838,8 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
ZSTR_VAL(result_str)[result_len] = '\0';
}
- if (UNEXPECTED(use_copy1)) {
- zval_dtor(op1);
- }
- if (UNEXPECTED(use_copy2)) {
- zval_dtor(op2);
- }
+ zval_ptr_dtor_str(&op1_copy);
+ zval_ptr_dtor_str(&op2_copy);
return SUCCESS;
}
/* }}} */
diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h
index 154378d71f..ebc6c5b40c 100644
--- a/Zend/zend_variables.h
+++ b/Zend/zend_variables.h
@@ -71,6 +71,16 @@ static zend_always_inline void _zval_opt_copy_ctor(zval *zvalue ZEND_FILE_LINE_D
}
}
+static zend_always_inline void zval_ptr_dtor_str(zval *zval_ptr)
+{
+ if (Z_REFCOUNTED_P(zval_ptr) && !Z_DELREF_P(zval_ptr)) {
+ ZEND_ASSERT(Z_TYPE_P(zval_ptr) == IS_STRING);
+ ZEND_ASSERT(!ZSTR_IS_INTERNED(Z_STR_P(zval_ptr)));
+ ZEND_ASSERT(!(GC_FLAGS(Z_STR_P(zval_ptr)) & IS_STR_PERSISTENT));
+ efree(Z_STR_P(zval_ptr));
+ }
+}
+
ZEND_API void _zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC);
ZEND_API void _zval_internal_ptr_dtor(zval *zvalue ZEND_FILE_LINE_DC);
#define zval_copy_ctor(zvalue) _zval_copy_ctor((zvalue) ZEND_FILE_LINE_CC)