]> granicus.if.org Git - php/commitdiff
Changed zend_make_printable_zval() to return "use_copy" instead of additional referen...
authorDmitry Stogov <dmitry@zend.com>
Wed, 9 Jul 2014 12:05:55 +0000 (16:05 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 9 Jul 2014 12:05:55 +0000 (16:05 +0400)
Improved branch prediction.

13 files changed:
Zend/zend.c
Zend/zend.h
Zend/zend_API.c
Zend/zend_operators.c
Zend/zend_string.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/intl/collator/collator_convert.c
ext/opcache/Optimizer/compact_literals.c
ext/spl/spl_iterators.c
ext/sybase_ct/php_sybase_ct.c
main/snprintf.c
main/spprintf.c

index 52d574e047f32335508f4b01983bd0d25f3a2981..effc376f1971aafc200c894d21c7314eaaf94463 100644 (file)
@@ -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;
 }
 /* }}} */
 
index 3827f15b540b125ea5f5a0c7f32d230347fd1688..6f5eee1138cb1e169e0c3c21fae140709b84f3d5 100644 (file)
@@ -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);
index be0e052028be10afbb63a26ae09ba628bef85094..0edff3e1a797ae5dc4efb710c4b6fdbdf6f51cb2 100644 (file)
@@ -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);
index b40d3b14d69cdbb4c92f1fa8f0f4e9ecbd6a356f..4e7b479bda8db987342425d7b25e34fc6426543e 100644 (file)
@@ -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;
index 6a24c5d5e90a9b6cfa417baefdd3f6383e58837b..5a9b0e7fdda129601465ded6eb654d1083252f32 100644 (file)
@@ -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);
index 1ac9f63570bb6a3b9bdff751959c4644777ed5ff..58dc224f8bb198682d7d563d9317918b24e1dd4b 100644 (file)
@@ -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;
index 9e06d76d47a31b76069266a39311999252422fb5..aab96a180808428df9402925d1d9564701a021bf 100644 (file)
@@ -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;
index 5827e4ee538e0c471874e1c62620bd41a1d16324..3f5dd3ae66b35a9c887211799c3f2dc4fe9917fc 100644 (file)
@@ -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 )
                {
index 480e4f92fe4f3147d718c06d21320e7b1dd57a60..61a50a9bc53848de01d98dafd6b46f994f27c458 100644 (file)
@@ -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);
index 80f2a623b2e66d58ac854614e833b2443163802a..ac9b9bef83135bf14cbd055b25aa658856fb8f95 100644 (file)
@@ -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);
index d1c72674546b4e14662d11eaa487abee1c31d8d0..aaa0c79faeed893428451dc69fd7a0c0ce864178 100644 (file)
@@ -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);
        }
index 1c73dcdcb736206769faa696f907ff2b30709095..f26206d851daedfb45bccd71e4c3bfca50946b5e 100644 (file)
@@ -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;
                                        }
index 158d9ddda3f506a8834aef7fc989fef13e03e413..12027f756e01ae12b3effcedfc8f4ee46a014044 100644 (file)
@@ -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;
                                        }