diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-07-09 16:05:55 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-07-09 16:05:55 +0400 |
commit | 9d6e45a0ee84030f125ec6d49da07796977a2a29 (patch) | |
tree | ea6193c52c6544f90991fc5f87f2a83507c4a5ce | |
parent | d085f79aea4ff900592c0eada5d44bf97744efe4 (diff) | |
download | php-git-9d6e45a0ee84030f125ec6d49da07796977a2a29.tar.gz |
Changed zend_make_printable_zval() to return "use_copy" instead of additional reference argument.
Improved branch prediction.
-rw-r--r-- | Zend/zend.c | 16 | ||||
-rw-r--r-- | Zend/zend.h | 2 | ||||
-rw-r--r-- | Zend/zend_API.c | 8 | ||||
-rw-r--r-- | Zend/zend_operators.c | 12 | ||||
-rw-r--r-- | Zend/zend_string.h | 2 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 2 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 12 | ||||
-rw-r--r-- | ext/intl/collator/collator_convert.c | 2 | ||||
-rw-r--r-- | ext/opcache/Optimizer/compact_literals.c | 4 | ||||
-rw-r--r-- | ext/spl/spl_iterators.c | 8 | ||||
-rw-r--r-- | ext/sybase_ct/php_sybase_ct.c | 2 | ||||
-rw-r--r-- | main/snprintf.c | 2 | ||||
-rw-r--r-- | main/spprintf.c | 2 |
13 files changed, 33 insertions, 41 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index 52d574e047..effc376f19 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -212,11 +212,10 @@ static void print_flat_hash(HashTable *ht TSRMLS_DC) /* {{{ */ } /* }}} */ -ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy) /* {{{ */ +ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy) /* {{{ */ { if (Z_TYPE_P(expr) == IS_STRING) { - *use_copy = 0; - return; + return 0; } again: @@ -262,14 +261,12 @@ again: Z_ADDREF_P(z); if (Z_TYPE_P(z) != IS_OBJECT) { - zend_make_printable_zval(z, expr_copy, use_copy); - if (*use_copy) { + if (zend_make_printable_zval(z, expr_copy)) { zval_ptr_dtor(z); } else { ZVAL_ZVAL(expr_copy, z, 0, 1); - *use_copy = 1; } - return; + return 1; } zval_ptr_dtor(z); } @@ -285,8 +282,7 @@ again: expr = Z_REFVAL_P(expr); if (Z_TYPE_P(expr) == IS_STRING) { ZVAL_STR(expr_copy, STR_COPY(Z_STR_P(expr))); - *use_copy = 1; - return; + return 1; } goto again; break; @@ -295,7 +291,7 @@ again: convert_to_string(expr_copy); break; } - *use_copy = 1; + return 1; } /* }}} */ diff --git a/Zend/zend.h b/Zend/zend.h index 3827f15b54..6f5eee1138 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -601,7 +601,7 @@ END_EXTERN_C() BEGIN_EXTERN_C() ZEND_API char *get_zend_version(void); -ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy); +ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy); ZEND_API int zend_print_zval(zval *expr, int indent TSRMLS_DC); ZEND_API int zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int indent TSRMLS_DC); ZEND_API void zend_print_zval_r(zval *expr, int indent TSRMLS_DC); diff --git a/Zend/zend_API.c b/Zend/zend_API.c index be0e052028..0edff3e1a7 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -243,15 +243,13 @@ static int parse_arg_object_to_string(zval *arg, char **p, int *pl, int type TSR } } if (!Z_OBJ_HANDLER_P(arg, cast_object) && Z_OBJ_HANDLER_P(arg, get)) { - int use_copy; zval rv; zval *z = Z_OBJ_HANDLER_P(arg, get)(arg, &rv TSRMLS_CC); Z_ADDREF_P(z); if(Z_TYPE_P(z) != IS_OBJECT) { zval_dtor(arg); ZVAL_NULL(arg); - zend_make_printable_zval(z, arg, &use_copy); - if (!use_copy) { + if (!zend_make_printable_zval(z, arg)) { ZVAL_ZVAL(arg, z, 1, 1); } *pl = Z_STRLEN_P(arg); @@ -284,15 +282,13 @@ static int parse_arg_object_to_str(zval *arg, zend_string **str, int type TSRMLS } } if (!Z_OBJ_HANDLER_P(arg, cast_object) && Z_OBJ_HANDLER_P(arg, get)) { - int use_copy; zval rv; zval *z = Z_OBJ_HANDLER_P(arg, get)(arg, &rv TSRMLS_CC); Z_ADDREF_P(z); if(Z_TYPE_P(z) != IS_OBJECT) { zval_dtor(arg); ZVAL_NULL(arg); - zend_make_printable_zval(z, arg, &use_copy); - if (!use_copy) { + if (!zend_make_printable_zval(z, arg)) { ZVAL_ZVAL(arg, z, 1, 1); } *str = Z_STR_P(arg); diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index b40d3b14d6..4e7b479bda 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1546,14 +1546,15 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{ zval op1_copy, op2_copy; int use_copy1 = 0, use_copy2 = 0; - if (Z_TYPE_P(op1) != IS_STRING || Z_TYPE_P(op2) != IS_STRING) { + if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING) || + UNEXPECTED(Z_TYPE_P(op2) != IS_STRING)) { ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT); if (Z_TYPE_P(op1) != IS_STRING) { - zend_make_printable_zval(op1, &op1_copy, &use_copy1); + use_copy1 = zend_make_printable_zval(op1, &op1_copy); } if (Z_TYPE_P(op2) != IS_STRING) { - zend_make_printable_zval(op2, &op2_copy, &use_copy2); + use_copy2 = zend_make_printable_zval(op2, &op2_copy); } } @@ -1569,6 +1570,7 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{ if (use_copy2) { op2 = &op2_copy; } + if (result==op1 && !IS_INTERNED(Z_STR_P(op1))) { /* special case, perform operations on result */ uint op1_len = Z_STRLEN_P(op1); uint op2_len = Z_STRLEN_P(op2); @@ -1592,10 +1594,10 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{ buf->val[length] = 0; ZVAL_NEW_STR(result, buf); } - if (use_copy1) { + if (UNEXPECTED(use_copy1)) { zval_dtor(op1); } - if (use_copy2) { + if (UNEXPECTED(use_copy2)) { zval_dtor(op2); } return SUCCESS; diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 6a24c5d5e9..5a9b0e7fdd 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -176,7 +176,7 @@ static zend_always_inline zend_string *zend_str_realloc(zend_string *s, int len, if (IS_INTERNED(s)) { ret = STR_ALLOC(len, persistent); memcpy(ret->val, s->val, (len > s->len ? s->len : len) + 1); - } else if (STR_REFCOUNT(s) == 1) { + } else if (EXPECTED(STR_REFCOUNT(s) == 1)) { ret = (zend_string *)perealloc(s, _STR_HEADER_SIZE + len + 1, persistent); ret->len = len; STR_FORGET_HASH_VAL(ret); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1ac9f63570..58dc224f8b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2120,7 +2120,7 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV) if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9e06d76d47..aab96a1808 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -9832,7 +9832,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; @@ -10669,7 +10669,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; @@ -12057,7 +12057,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; @@ -26018,7 +26018,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDL if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; @@ -27296,7 +27296,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; @@ -29085,7 +29085,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLE if (Z_TYPE_P(var) != IS_STRING) { ZVAL_DEREF(var); if (Z_TYPE_P(var) != IS_STRING) { - zend_make_printable_zval(var, &var_copy, &use_copy); + use_copy = zend_make_printable_zval(var, &var_copy); if (use_copy) { var = &var_copy; diff --git a/ext/intl/collator/collator_convert.c b/ext/intl/collator/collator_convert.c index 5827e4ee53..3f5dd3ae66 100644 --- a/ext/intl/collator/collator_convert.c +++ b/ext/intl/collator/collator_convert.c @@ -398,7 +398,7 @@ zval* collator_make_printable_zval( zval* arg, zval *rv ) if( Z_TYPE_P(arg) != IS_STRING ) { - zend_make_printable_zval(arg, &arg_copy, &use_copy); + use_copy = zend_make_printable_zval(arg, &arg_copy); if( use_copy ) { diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 480e4f92fe..61a50a9bc5 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -270,7 +270,7 @@ static void optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_c for (i = 0; i < op_array->last_literal; i++) { zval zv = op_array->literals[i].constant; - zend_make_printable_zval(&op_array->literals[i].constant, &zv, &use_copy); + use_copy = zend_make_printable_zval(&op_array->literals[i].constant, &zv); fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv)); if (use_copy) { zval_dtor(&zv); @@ -451,7 +451,7 @@ static void optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_c for (i = 0; i < op_array->last_literal; i++) { zval zv = op_array->literals[i].constant; - zend_make_printable_zval(&op_array->literals[i].constant, &zv, &use_copy); + use_copy = zend_make_printable_zval(&op_array->literals[i].constant, &zv); fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv)); if (use_copy) { zval_dtor(&zv); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 80f2a623b2..ac9b9bef83 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1196,9 +1196,7 @@ SPL_METHOD(RecursiveTreeIterator, key) } if (Z_TYPE(key) != IS_STRING) { - int use_copy; - zend_make_printable_zval(&key, &key_copy, &use_copy); - if (use_copy) { + if (zend_make_printable_zval(&key, &key_copy)) { key = key_copy; } } @@ -1974,7 +1972,7 @@ SPL_METHOD(RegexIterator, accept) } ZVAL_UNDEF(&subject_copy); - zend_make_printable_zval(subject_ptr, &subject_copy, &use_copy); + use_copy = zend_make_printable_zval(subject_ptr, &subject_copy); if (use_copy) { subject = Z_STRVAL(subject_copy); subject_len = Z_STRLEN(subject_copy); @@ -2611,7 +2609,7 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern TSRMLS_DC) } else { ZVAL_COPY_VALUE(&intern->u.caching.zstr, &intern->current.data); } - zend_make_printable_zval(&intern->u.caching.zstr, &expr_copy, &use_copy); + use_copy = zend_make_printable_zval(&intern->u.caching.zstr, &expr_copy); if (use_copy) { ZVAL_COPY(&intern->u.caching.zstr, &expr_copy); //??? INIT_PZVAL(intern->u.caching.zstr); diff --git a/ext/sybase_ct/php_sybase_ct.c b/ext/sybase_ct/php_sybase_ct.c index d1c7267454..aaa0c79fae 100644 --- a/ext/sybase_ct/php_sybase_ct.c +++ b/ext/sybase_ct/php_sybase_ct.c @@ -442,7 +442,7 @@ static int _call_message_handler(zval *callback_name, CS_SERVERMSG *srvmsg TSRML zval expr_copy; int use_copy; - zend_make_printable_zval(callback_name, &expr_copy, &use_copy); + use_copy = zend_make_printable_zval(callback_name, &expr_copy); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Sybase: Cannot call the messagehandler %s", Z_STRVAL(expr_copy)); zval_dtor(&expr_copy); } diff --git a/main/snprintf.c b/main/snprintf.c index 1c73dcdcb7..f26206d851 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -783,7 +783,7 @@ static int format_converter(register buffy * odp, const char *fmt, va_list ap) / switch (*fmt) { case 'Z': zvp = (zval*) va_arg(ap, zval*); - zend_make_printable_zval(zvp, &zcopy, &free_zcopy); + free_zcopy = zend_make_printable_zval(zvp, &zcopy); if (free_zcopy) { zvp = &zcopy; } diff --git a/main/spprintf.c b/main/spprintf.c index 158d9ddda3..12027f756e 100644 --- a/main/spprintf.c +++ b/main/spprintf.c @@ -391,7 +391,7 @@ static void xbuf_format_converter(void *xbuf, zend_bool is_char, const char *fmt switch (*fmt) { case 'Z': zvp = (zval*) va_arg(ap, zval*); - zend_make_printable_zval(zvp, &zcopy, &free_zcopy); + free_zcopy = zend_make_printable_zval(zvp, &zcopy); if (free_zcopy) { zvp = &zcopy; } |