]> granicus.if.org Git - php/commitdiff
Convert zval_get_string() into "fast path" macro and "slow path" function
authorDmitry Stogov <dmitry@zend.com>
Mon, 21 Apr 2014 18:36:01 +0000 (22:36 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 21 Apr 2014 18:36:01 +0000 (22:36 +0400)
14 files changed:
Zend/zend.c
Zend/zend_closures.c
Zend/zend_operators.c
Zend/zend_operators.h
ext/dom/attr.c
ext/dom/characterdata.c
ext/dom/document.c
ext/dom/node.c
ext/dom/php_dom.c
ext/dom/processinginstruction.c
ext/dom/xpath.c
ext/reflection/php_reflection.c
ext/standard/formatted_print.c
ext/standard/string.c

index 4d14c8a8870c6bc6be9225e0676b5e6c38e1e2ff..a72253128349e674ed2e87de77ad306bb0048e05 100644 (file)
@@ -317,7 +317,7 @@ 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_string *str = zval_get_string(expr TSRMLS_CC);
+       zend_string *str = zval_get_string(expr);
        int len = str->len;
 
        if (len != 0) {
index 9f58ce85414e26d3ede29fb4c3f7e5e90797857d..9d48dab9f26bf936f521d92ea7fa7ba49efe7e8f 100644 (file)
@@ -90,7 +90,7 @@ ZEND_METHOD(Closure, bind)
                } else if (Z_TYPE_P(scope_arg) == IS_NULL) {
                        ce = NULL;
                } else {
-                       zend_string *class_name = zval_get_string(scope_arg TSRMLS_CC);
+                       zend_string *class_name = zval_get_string(scope_arg);
                        if ((class_name->len == sizeof("static") - 1) &&
                                (memcmp("static", class_name->val, sizeof("static") - 1) == 0)) {
                                ce = closure->func.common.scope;
index 3b596bb6c0e51e8b087173ae8233a1c1433460dd..0824d8d98f718d8d6970dacdfe39f5516373e7df 100644 (file)
@@ -893,8 +893,9 @@ ZEND_API double zval_get_double(zval *op TSRMLS_DC) /* {{{ */
 }
 /* }}} */
 
-ZEND_API zend_string *zval_get_string(zval *op TSRMLS_DC) /* {{{ */
+ZEND_API zend_string *_zval_get_string_func(zval *op TSRMLS_DC) /* {{{ */
 {
+try_again:
        switch (Z_TYPE_P(op)) {
                case IS_NULL:
                        return STR_EMPTY_ALLOC();
@@ -907,18 +908,18 @@ ZEND_API zend_string *zval_get_string(zval *op TSRMLS_DC) /* {{{ */
                                return STR_EMPTY_ALLOC();
                        }
                case IS_RESOURCE: {
-                       char *str;
-                       int len = zend_spprintf(&str, 0, "Resource id #%ld", Z_RES_HANDLE_P(op));
-                       zend_string *retval = STR_INIT(str, len, 0);
-                       efree(str);
-                       return retval;
+                       char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
+                       int len;
+
+                       len = snprintf(buf, sizeof(buf), "Resource id #%ld", Z_RES_HANDLE_P(op));
+                       return STR_INIT(buf, len, 0);
                }
                case IS_LONG: {
-                       char *str;
-                       int len = zend_spprintf(&str, 0, "%ld", Z_LVAL_P(op));
-                       zend_string *retval = STR_INIT(str, len, 0);
-                       efree(str);
-                       return retval;
+                       char buf[MAX_LENGTH_OF_LONG + 1];
+                       int len;
+
+                       len = snprintf(buf, sizeof(buf), "%ld", Z_LVAL_P(op));
+                       return STR_INIT(buf, len, 0);
                }
                case IS_DOUBLE: {
                        char *str;
@@ -942,7 +943,7 @@ ZEND_API zend_string *zval_get_string(zval *op TSRMLS_DC) /* {{{ */
                        } else if (Z_OBJ_HT_P(op)->get) {
                                zval *z = Z_OBJ_HT_P(op)->get(op, &tmp TSRMLS_CC);
                                if (Z_TYPE_P(z) != IS_OBJECT) {
-                                       zend_string *str = zval_get_string(z TSRMLS_CC);
+                                       zend_string *str = zval_get_string(z);
                                        zval_ptr_dtor(z);
                                        return str;
                                }
@@ -952,7 +953,8 @@ ZEND_API zend_string *zval_get_string(zval *op TSRMLS_DC) /* {{{ */
                        return STR_EMPTY_ALLOC();
                }
                case IS_REFERENCE:
-                       return zval_get_string(Z_REFVAL_P(op));
+                       op = Z_REFVAL_P(op);
+                       goto try_again;
                default:
                        //??? original code returns bool(0)
                        return STR_EMPTY_ALLOC();
@@ -1557,8 +1559,8 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{
 
 ZEND_API int string_compare_function_ex(zval *result, zval *op1, zval *op2, zend_bool case_insensitive TSRMLS_DC) /* {{{ */
 {
-       zend_string *str1 = zval_get_string(op1 TSRMLS_CC),
-                               *str2 = zval_get_string(op2 TSRMLS_CC);
+       zend_string *str1 = zval_get_string(op1);
+       zend_string *str2 = zval_get_string(op2);
 
        if (case_insensitive) {
                ZVAL_LONG(result, zend_binary_strcasecmp_l(str1->val, str1->len, str2->val, str1->len));
@@ -1587,8 +1589,8 @@ ZEND_API int string_case_compare_function(zval *result, zval *op1, zval *op2 TSR
 #if HAVE_STRCOLL
 ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
 {
-       zend_string *str1 = zval_get_string(op1 TSRMLS_CC),
-                               *str2 = zval_get_string(op2 TSRMLS_CC);
+       zend_string *str1 = zval_get_string(op1);
+       zend_string *str2 = zval_get_string(op2);
 
        ZVAL_LONG(result, strcoll(str1->val, str2->val));
 
index 9df4a68933f36a1b1f917ea81c8d4105515d9dd1..f026ae1dbc965365589ce41e155b6985306c5312 100644 (file)
@@ -339,7 +339,10 @@ ZEND_API void multi_convert_to_string_ex(int argc, ...);
 
 ZEND_API long zval_get_long(zval *op TSRMLS_DC);
 ZEND_API double zval_get_double(zval *op TSRMLS_DC);
-ZEND_API zend_string *zval_get_string(zval *op TSRMLS_DC);
+ZEND_API zend_string *_zval_get_string_func(zval *op TSRMLS_DC);
+
+#define zval_get_string(op) ((Z_TYPE_P(op) == IS_STRING) ? \
+       STR_COPY(Z_STR_P(op)) : _zval_get_string_func((op) TSRMLS_CC))
 
 ZEND_API int add_char_to_string(zval *result, const zval *op1, const zval *op2);
 ZEND_API int add_string_to_string(zval *result, const zval *op1, const zval *op2);
index 63be8762d1fabecf3b910a25e0697de0ab738edf..b0489ef122340a68a8d1a5790d9b85435fb83d32 100644 (file)
@@ -171,7 +171,7 @@ int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC)
                node_list_unlink(attrp->children TSRMLS_CC);
        }
 
-       str = zval_get_string(newval TSRMLS_CC);
+       str = zval_get_string(newval);
 
        xmlNodeSetContentLen((xmlNodePtr) attrp, str->val, str->len + 1);
 
index b1b5d76d26e3377dae72351c3d1af9157f3418fc..2ef6352f205c9db6abfda6192d0411e4896cf109 100644 (file)
@@ -106,7 +106,7 @@ int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC)
                return FAILURE;
        }
 
-       str = zval_get_string(newval TSRMLS_CC);
+       str = zval_get_string(newval);
 
        xmlNodeSetContentLen(nodep, str->val, str->len + 1);
 
index 35d8348a2d6af21cf91bb4ecc843c6cae4b1e74f..b1c1dc2737e60332513174f34abf9614a0ef1efb 100644 (file)
@@ -338,7 +338,7 @@ int dom_document_encoding_write(dom_object *obj, zval *newval TSRMLS_DC)
                return FAILURE;
        }
 
-       str = zval_get_string(newval TSRMLS_CC);
+       str = zval_get_string(newval);
 
        handler = xmlFindCharEncodingHandler(Z_STRVAL_P(newval));
 
@@ -436,7 +436,7 @@ int dom_document_version_write(dom_object *obj, zval *newval TSRMLS_DC)
                xmlFree((xmlChar *) docp->version );
        }
 
-       str = zval_get_string(newval TSRMLS_CC);
+       str = zval_get_string(newval);
 
        docp->version = xmlStrdup((const xmlChar *) str->val);
 
@@ -664,7 +664,7 @@ int dom_document_document_uri_write(dom_object *obj, zval *newval TSRMLS_DC)
                xmlFree((xmlChar *) docp->URL);
        }
 
-       str = zval_get_string(newval TSRMLS_CC);
+       str = zval_get_string(newval);
 
        docp->URL = xmlStrdup((const xmlChar *) str->val);
 
index 57669b506945701e86e2e01789c33decceeb0613..25c8daee6fb6c705feb0b4279b1378d8f4844360 100644 (file)
@@ -343,7 +343,7 @@ int dom_node_node_value_write(dom_object *obj, zval *newval TSRMLS_DC)
                case XML_CDATA_SECTION_NODE:
                case XML_PI_NODE:
                        {
-                               zend_string *str = zval_get_string(newval TSRMLS_CC);
+                               zend_string *str = zval_get_string(newval);
                                xmlNodeSetContentLen(nodep, str->val, str->len + 1);
                                STR_RELEASE(str);
                                break;
@@ -720,7 +720,7 @@ int dom_node_prefix_write(dom_object *obj, zval *newval TSRMLS_DC)
                                        nsnode = xmlDocGetRootElement(nodep->doc);
                                }
                        }
-                       str = zval_get_string(newval TSRMLS_CC);
+                       str = zval_get_string(newval);
                        prefix = str->val;
                        if (nsnode && nodep->ns != NULL && !xmlStrEqual(nodep->ns->prefix, (xmlChar *)prefix)) {
                                strURI = (char *) nodep->ns->href;
index 99d99e236fc4f3bf10bcff1fb6f91a94da292462..9f971ee0ace8441f8b1475c5b1900f9922c44358 100644 (file)
@@ -313,7 +313,7 @@ static void dom_register_prop_handler(HashTable *prop_handler, char *name, dom_r
 static zval *dom_get_property_ptr_ptr(zval *object, zval *member, int type, zend_uint cache_slot TSRMLS_DC) /* {{{ */
 {
        dom_object *obj = Z_DOMOBJ_P(object);
-       zend_string *member_str = zval_get_string(member TSRMLS_CC);
+       zend_string *member_str = zval_get_string(member);
        zval *retval = NULL;
 
        if (!obj->prop_handler || !zend_hash_exists(obj->prop_handler, member_str)) {
@@ -330,7 +330,7 @@ static zval *dom_get_property_ptr_ptr(zval *object, zval *member, int type, zend
 zval *dom_read_property(zval *object, zval *member, int type, zend_uint cache_slot, zval *rv TSRMLS_DC)
 {
        dom_object *obj = Z_DOMOBJ_P(object);
-       zend_string *member_str = zval_get_string(member TSRMLS_CC);
+       zend_string *member_str = zval_get_string(member);
        zval *retval;
        dom_prop_handler *hnd = NULL;
 
@@ -361,7 +361,7 @@ zval *dom_read_property(zval *object, zval *member, int type, zend_uint cache_sl
 void dom_write_property(zval *object, zval *member, zval *value, zend_uint cache_slot TSRMLS_DC)
 {
        dom_object *obj = Z_DOMOBJ_P(object);
-       zend_string *member_str = zval_get_string(member TSRMLS_CC);
+       zend_string *member_str = zval_get_string(member);
        dom_prop_handler *hnd = NULL;
 
        if (obj->prop_handler != NULL) {
@@ -382,7 +382,7 @@ void dom_write_property(zval *object, zval *member, zval *value, zend_uint cache
 static int dom_property_exists(zval *object, zval *member, int check_empty, zend_uint cache_slot TSRMLS_DC)
 {
        dom_object *obj = Z_DOMOBJ_P(object);
-       zend_string *member_str = zval_get_string(member TSRMLS_CC);
+       zend_string *member_str = zval_get_string(member);
        dom_prop_handler *hnd = NULL;
        int retval = 0;
 
index aef9e92b64b857315d2c68996d789c21a5378ff0..36b159cc6ee2aa96385856024df30fb67d4fdeb0 100644 (file)
@@ -145,7 +145,7 @@ int dom_processinginstruction_data_write(dom_object *obj, zval *newval TSRMLS_DC
                return FAILURE;
        }
 
-       str = zval_get_string(newval TSRMLS_CC);
+       str = zval_get_string(newval);
 
        xmlNodeSetContentLen(nodep, str->val, str->len + 1);
 
index 08bb8603a50a02830d62056ff5a16ec0ed4a7815..3290a3a5e7dd0fc5754ce71a976e4e3e0ccd644f 100644 (file)
@@ -522,7 +522,7 @@ PHP_FUNCTION(dom_xpath_register_php_functions)
                intern = Z_XPATHOBJ_P(id);
                zend_hash_internal_pointer_reset(Z_ARRVAL_P(array_value));
                while ((entry = zend_hash_get_current_data(Z_ARRVAL_P(array_value)))) {
-                       zend_string *str = zval_get_string(entry TSRMLS_CC);
+                       zend_string *str = zval_get_string(entry);
                        ZVAL_LONG(&new_string,1);
                        zend_hash_update(intern->registered_phpfunctions, str, &new_string);
                        zend_hash_move_forward(Z_ARRVAL_P(array_value));
index b78311868ae2b64e71cac2216c72ead794769e60..4940457333dd63640f1cc392c58b26c4a83e30f0 100644 (file)
@@ -656,7 +656,7 @@ static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *in
 static void _const_string(string *str, char *name, zval *value, char *indent TSRMLS_DC)
 {
        char *type = zend_zval_type_name(value);
-       zend_string *value_str = zval_get_string(value TSRMLS_CC);
+       zend_string *value_str = zval_get_string(value);
 
        string_printf(str, "%s    Constant [ %s %s ] { %s }\n",
                                        indent, type, name, value_str->val);
index b08b06fac5d41642b9ceee0e9e7d771872c7fd00..2942daaad3ec04eb95c7e08e05435219fe19f619 100644 (file)
@@ -559,7 +559,7 @@ php_formatted_print(int param_count, int use_array, int format_offset TSRMLS_DC)
 
                        switch (format[inpos]) {
                                case 's': {
-                                       zend_string *str = zval_get_string(&tmp TSRMLS_CC);
+                                       zend_string *str = zval_get_string(&tmp);
                                        php_sprintf_appendstring(&result, &outpos,
                                                                                         str->val,
                                                                                         width, precision, padding,
index fe6d30f18a0d6297500beaae3cbaf76f103d9a90..a960cd1a5c81ff4c2be76a0e3c02359ac8e04ad6 100644 (file)
@@ -4956,8 +4956,8 @@ static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case)
 
 PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, zend_bool case_insensitive TSRMLS_DC) /* {{{ */
 {
-       zend_string *str1 = zval_get_string(op1 TSRMLS_CC),
-                               *str2 = zval_get_string(op2 TSRMLS_CC);
+       zend_string *str1 = zval_get_string(op1);
+       zend_string *str2 = zval_get_string(op2);
 
        ZVAL_LONG(result, strnatcmp_ex(str1->val, str1->len, str2->val, str2->len, case_insensitive));