]> granicus.if.org Git - php/commitdiff
Optimize serializing class names
authorTyson Andre <tysonandre775@hotmail.com>
Fri, 26 Feb 2021 14:48:36 +0000 (09:48 -0500)
committerTyson Andre <tysonandre775@hotmail.com>
Mon, 1 Mar 2021 14:41:13 +0000 (09:41 -0500)
Because of the memcpy, compilers can't infer that ZSTR_LEN (i.e. class_name->len)
did not change, so they copy it out of memory into a register for the last two
accesses.
php_var_serialize_string already does something similar.

Closes GH-6734

ext/standard/var.c

index fbd6ff4f20990908a44ebb33297987de2ca0b9be..d4c99495d1acad36780ab52533ed4bc28ea34b3f 100644 (file)
@@ -733,9 +733,10 @@ static inline bool php_var_serialize_class_name(smart_str *buf, zval *struc) /*
        PHP_CLASS_ATTRIBUTES;
 
        PHP_SET_CLASS_ATTRIBUTES(struc);
-       s = zend_print_long_to_buf(b + sizeof(b) - 1, ZSTR_LEN(class_name));
+       size_t class_name_len = ZSTR_LEN(class_name);
+       s = zend_print_long_to_buf(b + sizeof(b) - 1, class_name_len);
        l = b + sizeof(b) - 1 - s;
-       new_len = smart_str_alloc(buf, 2 + l + 2 + ZSTR_LEN(class_name) + 2, 0);
+       new_len = smart_str_alloc(buf, 2 + l + 2 + class_name_len + 2, 0);
        res = ZSTR_VAL(buf->s) + ZSTR_LEN(buf->s);
        ZSTR_LEN(buf->s) = new_len;
        memcpy(res, "O:", 2);
@@ -744,8 +745,8 @@ static inline bool php_var_serialize_class_name(smart_str *buf, zval *struc) /*
        res += l;
        memcpy(res, ":\"", 2);
        res += 2;
-       memcpy(res, ZSTR_VAL(class_name), ZSTR_LEN(class_name));
-       res += ZSTR_LEN(class_name);
+       memcpy(res, ZSTR_VAL(class_name), class_name_len);
+       res += class_name_len;
        memcpy(res, "\":", 2);
        PHP_CLEANUP_CLASS_ATTRIBUTES();
        return incomplete_class;