Skip to content

Commit 6546c51

Browse files
committed
Optimized ucfirst(Avoid duping string if possible)
1 parent fea7957 commit 6546c51

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

ext/standard/string.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2789,11 +2789,16 @@ PHP_FUNCTION(chr)
27892789

27902790
/* {{{ php_ucfirst
27912791
Uppercase the first character of the word in a native string */
2792-
static void php_ucfirst(char *str)
2792+
static zend_string* php_ucfirst(zend_string *str)
27932793
{
2794-
register char *r;
2795-
r = str;
2796-
*r = toupper((unsigned char) *r);
2794+
unsigned char r = toupper(ZSTR_VAL(str)[0]);
2795+
if (r == ZSTR_VAL(str)[0]) {
2796+
return zend_string_copy(str);
2797+
} else {
2798+
zend_string *s = zend_string_init(ZSTR_VAL(str), ZSTR_LEN(str), 0);
2799+
ZSTR_VAL(s)[0] = r;
2800+
return s;
2801+
}
27972802
}
27982803
/* }}} */
27992804

@@ -2811,18 +2816,22 @@ PHP_FUNCTION(ucfirst)
28112816
RETURN_EMPTY_STRING();
28122817
}
28132818

2814-
ZVAL_STRINGL(return_value, ZSTR_VAL(str), ZSTR_LEN(str));
2815-
php_ucfirst(Z_STRVAL_P(return_value));
2819+
RETURN_STR(php_ucfirst(str));
28162820
}
28172821
/* }}} */
28182822

28192823
/* {{{
28202824
Lowercase the first character of the word in a native string */
2821-
static void php_lcfirst(char *str)
2825+
static zend_string* php_lcfirst(zend_string *str)
28222826
{
2823-
register char *r;
2824-
r = str;
2825-
*r = tolower((unsigned char) *r);
2827+
unsigned char r = tolower(ZSTR_VAL(str)[0]);
2828+
if (r == ZSTR_VAL(str)[0]) {
2829+
return zend_string_copy(str);
2830+
} else {
2831+
zend_string *s = zend_string_init(ZSTR_VAL(str), ZSTR_LEN(str), 0);
2832+
ZSTR_VAL(s)[0] = r;
2833+
return s;
2834+
}
28262835
}
28272836
/* }}} */
28282837

@@ -2840,8 +2849,7 @@ PHP_FUNCTION(lcfirst)
28402849
RETURN_EMPTY_STRING();
28412850
}
28422851

2843-
ZVAL_STRINGL(return_value, ZSTR_VAL(str), ZSTR_LEN(str));
2844-
php_lcfirst(Z_STRVAL_P(return_value));
2852+
RETURN_STR(php_lcfirst(str));
28452853
}
28462854
/* }}} */
28472855

0 commit comments

Comments
 (0)