Skip to content

Commit 7db3a51

Browse files
committed
Only fetch to_encoding once in mb_convert_encoding()
Instead of doing it on every conversion. This is both more efficient and avoids generating multiple warnings.
1 parent b0d7b12 commit 7db3a51

File tree

2 files changed

+17
-22
lines changed

2 files changed

+17
-22
lines changed

ext/mbstring/mbstring.c

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2691,26 +2691,16 @@ MBSTRING_API char *php_mb_convert_encoding_ex(const char *input, size_t length,
26912691
/* }}} */
26922692

26932693
/* {{{ MBSTRING_API char *php_mb_convert_encoding() */
2694-
MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, const char *_to_encoding, const char *_from_encodings, size_t *output_len)
2694+
MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, const mbfl_encoding *to_encoding, const char *_from_encodings, size_t *output_len)
26952695
{
2696-
const mbfl_encoding *from_encoding, *to_encoding;
2696+
const mbfl_encoding *from_encoding;
26972697

26982698
if (output_len) {
26992699
*output_len = 0;
27002700
}
27012701
if (!input) {
27022702
return NULL;
27032703
}
2704-
/* new encoding */
2705-
if (_to_encoding && strlen(_to_encoding)) {
2706-
to_encoding = mbfl_name2encoding(_to_encoding);
2707-
if (!to_encoding) {
2708-
php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", _to_encoding);
2709-
return NULL;
2710-
}
2711-
} else {
2712-
to_encoding = MBSTRG(current_internal_encoding);
2713-
}
27142704

27152705
/* pre-conversion encoding */
27162706
from_encoding = MBSTRG(current_internal_encoding);
@@ -2743,7 +2733,7 @@ MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, con
27432733
}
27442734
/* }}} */
27452735

2746-
MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, const char *_to_encoding, const char *_from_encodings)
2736+
MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, const mbfl_encoding *to_encoding, const char *_from_encodings)
27472737
{
27482738
HashTable *output, *chash;
27492739
zend_long idx;
@@ -2766,15 +2756,15 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
27662756
ZEND_HASH_FOREACH_KEY_VAL(input, idx, key, entry) {
27672757
/* convert key */
27682758
if (key) {
2769-
ckey = php_mb_convert_encoding(ZSTR_VAL(key), ZSTR_LEN(key), _to_encoding, _from_encodings, &ckey_len);
2759+
ckey = php_mb_convert_encoding(ZSTR_VAL(key), ZSTR_LEN(key), to_encoding, _from_encodings, &ckey_len);
27702760
key = zend_string_init(ckey, ckey_len, 0);
27712761
efree(ckey);
27722762
}
27732763
/* convert value */
27742764
ZEND_ASSERT(entry);
27752765
switch(Z_TYPE_P(entry)) {
27762766
case IS_STRING:
2777-
cval = php_mb_convert_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), _to_encoding, _from_encodings, &cval_len);
2767+
cval = php_mb_convert_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), to_encoding, _from_encodings, &cval_len);
27782768
ZVAL_STRINGL(&entry_tmp, cval, cval_len);
27792769
efree(cval);
27802770
break;
@@ -2786,7 +2776,7 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
27862776
ZVAL_COPY(&entry_tmp, entry);
27872777
break;
27882778
case IS_ARRAY:
2789-
chash = php_mb_convert_encoding_recursive(Z_ARRVAL_P(entry), _to_encoding, _from_encodings);
2779+
chash = php_mb_convert_encoding_recursive(Z_ARRVAL_P(entry), to_encoding, _from_encodings);
27902780
if (chash) {
27912781
ZVAL_ARR(&entry_tmp, chash);
27922782
} else {
@@ -2820,19 +2810,24 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
28202810
PHP_FUNCTION(mb_convert_encoding)
28212811
{
28222812
zval *input;
2823-
char *arg_new;
2824-
size_t new_len;
28252813
zval *arg_old = NULL;
28262814
size_t size, l, n;
28272815
char *_from_encodings = NULL, *ret, *s_free = NULL;
2816+
zend_string *to_encoding_name;
2817+
const mbfl_encoding *to_encoding;
28282818

28292819
zval *hash_entry;
28302820
HashTable *target_hash;
28312821

2832-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z", &input, &arg_new, &new_len, &arg_old) == FAILURE) {
2822+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zS|z", &input, &to_encoding_name, &arg_old) == FAILURE) {
28332823
RETURN_THROWS();
28342824
}
28352825

2826+
to_encoding = php_mb_get_encoding(to_encoding_name);
2827+
if (!to_encoding) {
2828+
RETURN_FALSE;
2829+
}
2830+
28362831
if (Z_TYPE_P(input) != IS_STRING && Z_TYPE_P(input) != IS_ARRAY) {
28372832
if (!try_convert_to_string(input)) {
28382833
RETURN_THROWS();
@@ -2884,7 +2879,7 @@ PHP_FUNCTION(mb_convert_encoding)
28842879

28852880
if (Z_TYPE_P(input) == IS_STRING) {
28862881
/* new encoding */
2887-
ret = php_mb_convert_encoding(Z_STRVAL_P(input), Z_STRLEN_P(input), arg_new, _from_encodings, &size);
2882+
ret = php_mb_convert_encoding(Z_STRVAL_P(input), Z_STRLEN_P(input), to_encoding, _from_encodings, &size);
28882883
if (ret != NULL) {
28892884
// TODO: avoid reallocation ???
28902885
RETVAL_STRINGL(ret, size); /* the string is already strdup()'ed */
@@ -2897,7 +2892,7 @@ PHP_FUNCTION(mb_convert_encoding)
28972892
}
28982893
} else {
28992894
HashTable *tmp;
2900-
tmp = php_mb_convert_encoding_recursive(Z_ARRVAL_P(input), arg_new, _from_encodings);
2895+
tmp = php_mb_convert_encoding_recursive(Z_ARRVAL_P(input), to_encoding, _from_encodings);
29012896
RETURN_ARR(tmp);
29022897
}
29032898

ext/mbstring/mbstring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ MBSTRING_API char *php_mb_convert_encoding_ex(
118118
const char *input, size_t length,
119119
const mbfl_encoding *to_encoding, const mbfl_encoding *from_encoding, size_t *output_len);
120120
MBSTRING_API char * php_mb_convert_encoding(const char *input, size_t length,
121-
const char *_to_encoding,
121+
const mbfl_encoding *to_encoding,
122122
const char *_from_encodings,
123123
size_t *output_len);
124124

0 commit comments

Comments
 (0)