Micro-optimizations to str_increment() and str_decrement() (#18193)

Since it's a new string we're returning we can use RETURN_NEW_STR() and
we can also use zend_string_efree() for the strings that we replace
because they have RC1.
This commit is contained in:
Niels Dossche 2025-03-30 18:09:21 +02:00 committed by GitHub
parent ce5d2f6d01
commit 24fbe2d61e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1273,10 +1273,10 @@ PHP_FUNCTION(str_increment)
ZSTR_VAL(tmp)[0] = ZSTR_VAL(incremented)[0]; ZSTR_VAL(tmp)[0] = ZSTR_VAL(incremented)[0];
break; break;
} }
zend_string_release_ex(incremented, /* persistent */ false); zend_string_efree(incremented);
RETURN_STR(tmp); RETURN_NEW_STR(tmp);
} }
RETURN_STR(incremented); RETURN_NEW_STR(incremented);
} }
@ -1323,17 +1323,17 @@ PHP_FUNCTION(str_decrement)
if (UNEXPECTED(carry || (ZSTR_VAL(decremented)[0] == '0' && ZSTR_LEN(decremented) > 1))) { if (UNEXPECTED(carry || (ZSTR_VAL(decremented)[0] == '0' && ZSTR_LEN(decremented) > 1))) {
if (ZSTR_LEN(decremented) == 1) { if (ZSTR_LEN(decremented) == 1) {
zend_string_release_ex(decremented, /* persistent */ false); zend_string_efree(decremented);
zend_argument_value_error(1, "\"%s\" is out of decrement range", ZSTR_VAL(str)); zend_argument_value_error(1, "\"%s\" is out of decrement range", ZSTR_VAL(str));
RETURN_THROWS(); RETURN_THROWS();
} }
zend_string *tmp = zend_string_alloc(ZSTR_LEN(decremented) - 1, 0); zend_string *tmp = zend_string_alloc(ZSTR_LEN(decremented) - 1, 0);
memcpy(ZSTR_VAL(tmp), ZSTR_VAL(decremented) + 1, ZSTR_LEN(decremented) - 1); memcpy(ZSTR_VAL(tmp), ZSTR_VAL(decremented) + 1, ZSTR_LEN(decremented) - 1);
ZSTR_VAL(tmp)[ZSTR_LEN(decremented) - 1] = '\0'; ZSTR_VAL(tmp)[ZSTR_LEN(decremented) - 1] = '\0';
zend_string_release_ex(decremented, /* persistent */ false); zend_string_efree(decremented);
RETURN_STR(tmp); RETURN_NEW_STR(tmp);
} }
RETURN_STR(decremented); RETURN_NEW_STR(decremented);
} }
#if defined(PHP_WIN32) #if defined(PHP_WIN32)