From ba4ec73fd987186ec1f8a083d357f7a220449c95 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Sat, 22 Feb 2025 16:09:57 +0100 Subject: [PATCH] Avoid unnecessary string refcounting in ext/dom --- ext/dom/document.c | 11 ++++------- ext/dom/node.c | 5 ++--- ext/dom/xpath_callbacks.c | 10 ++++++---- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/ext/dom/document.c b/ext/dom/document.c index 60687136927b9..853275e3e232d 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -194,13 +194,12 @@ zend_result dom_document_version_write(dom_object *obj, zval *newval) { DOM_PROP_NODE(xmlDocPtr, docp, obj); - /* Cannot fail because the type is either null or a string. */ - zend_string *str = zval_get_string(newval); + /* Type is ?string */ + zend_string *str = Z_TYPE_P(newval) == IS_NULL ? ZSTR_EMPTY_ALLOC() : Z_STR_P(newval); if (php_dom_follow_spec_intern(obj)) { if (!zend_string_equals_literal(str, "1.0") && !zend_string_equals_literal(str, "1.1")) { zend_value_error("Invalid XML version"); - zend_string_release_ex(str, 0); return FAILURE; } } @@ -211,7 +210,6 @@ zend_result dom_document_version_write(dom_object *obj, zval *newval) docp->version = xmlStrdup((const xmlChar *) ZSTR_VAL(str)); - zend_string_release_ex(str, 0); return SUCCESS; } @@ -394,8 +392,8 @@ zend_result dom_document_document_uri_write(dom_object *obj, zval *newval) { DOM_PROP_NODE(xmlDocPtr, docp, obj); - /* Cannot fail because the type is either null or a string. */ - zend_string *str = zval_get_string(newval); + /* Type is ?string */ + zend_string *str = Z_TYPE_P(newval) == IS_NULL ? ZSTR_EMPTY_ALLOC() : Z_STR_P(newval); if (docp->URL != NULL) { xmlFree(BAD_CAST docp->URL); @@ -403,7 +401,6 @@ zend_result dom_document_document_uri_write(dom_object *obj, zval *newval) docp->URL = xmlStrdup((const xmlChar *) ZSTR_VAL(str)); - zend_string_release_ex(str, 0); return SUCCESS; } diff --git a/ext/dom/node.c b/ext/dom/node.c index 9ff6c4a489616..c9bf45e887db8 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -185,8 +185,8 @@ zend_result dom_node_node_value_write(dom_object *obj, zval *newval) { DOM_PROP_NODE(xmlNodePtr, nodep, obj); - /* Cannot fail because the type is either null or a string. */ - zend_string *str = zval_get_string(newval); + /* Type is ?string */ + zend_string *str = Z_TYPE_P(newval) == IS_NULL ? ZSTR_EMPTY_ALLOC() : Z_STR_P(newval); /* Access to Element node is implemented as a convenience method */ switch (nodep->type) { @@ -213,7 +213,6 @@ zend_result dom_node_node_value_write(dom_object *obj, zval *newval) php_libxml_invalidate_node_list_cache(obj->document); - zend_string_release_ex(str, 0); return SUCCESS; } diff --git a/ext/dom/xpath_callbacks.c b/ext/dom/xpath_callbacks.c index 3155b0d626af6..c4715fa67e80a 100644 --- a/ext/dom/xpath_callbacks.c +++ b/ext/dom/xpath_callbacks.c @@ -206,13 +206,14 @@ static zend_result php_dom_xpath_callback_ns_update_method_handler( ZVAL_PTR(®istered_value, fcc); if (!key) { - zend_string *str = zval_try_get_string(entry); + zend_string *tmp_str; + zend_string *str = zval_try_get_tmp_string(entry, &tmp_str); if (str && php_dom_xpath_is_callback_name_valid_and_throw(str, name_validation, true)) { zend_hash_update(&ns->functions, str, ®istered_value); if (register_func) { register_func(ctxt, namespace, str); } - zend_string_release_ex(str, false); + zend_tmp_string_release(tmp_str); } else { zend_fcc_dtor(fcc); efree(fcc); @@ -445,9 +446,10 @@ static zend_result php_dom_xpath_callback_dispatch(php_dom_xpath_callbacks *xpat zval_ptr_dtor(&callback_retval); return FAILURE; } else { - zend_string *str = zval_get_string(&callback_retval); + zend_string *tmp_str; + zend_string *str = zval_get_tmp_string(&callback_retval, &tmp_str); valuePush(ctxt, xmlXPathNewString(BAD_CAST ZSTR_VAL(str))); - zend_string_release_ex(str, 0); + zend_tmp_string_release(tmp_str); } zval_ptr_dtor(&callback_retval); }