Skip to content

Commit abc1910

Browse files
committed
ext/standard/array.c: refactor php_valid_var_name()
1 parent 15ca366 commit abc1910

File tree

1 file changed

+32
-53
lines changed

1 file changed

+32
-53
lines changed

ext/standard/array.c

Lines changed: 32 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,9 +1675,8 @@ PHP_FUNCTION(array_search)
16751675
}
16761676
/* }}} */
16771677

1678-
static zend_always_inline int php_valid_var_name(const char *var_name, size_t var_name_len) /* {{{ */
1678+
static zend_always_inline bool php_valid_var_name(const zend_string *var_name) /* {{{ */
16791679
{
1680-
#if 1
16811680
/* first 256 bits for first character, and second 256 bits for the next */
16821681
static const uint32_t charset[8] = {
16831682
/* 31 0 63 32 95 64 127 96 */
@@ -1687,48 +1686,28 @@ static zend_always_inline int php_valid_var_name(const char *var_name, size_t va
16871686
/* 31 0 63 32 95 64 127 96 */
16881687
0x00000000, 0x03ff0000, 0x87fffffe, 0x07fffffe,
16891688
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff};
1690-
#endif
1691-
size_t i;
1692-
uint32_t ch;
16931689

1694-
if (UNEXPECTED(!var_name_len)) {
1695-
return 0;
1690+
if (UNEXPECTED(!ZSTR_LEN(var_name))) {
1691+
return false;
16961692
}
16971693

16981694
/* These are allowed as first char: [a-zA-Z_\x7f-\xff] */
1699-
ch = (uint32_t)((unsigned char *)var_name)[0];
1700-
#if 1
1695+
uint32_t ch = (uint32_t)((unsigned char *)ZSTR_VAL(var_name))[0];
17011696
if (UNEXPECTED(!ZEND_BIT_TEST(charset, ch))) {
1702-
#else
1703-
if (var_name[0] != '_' &&
1704-
(ch < 65 /* A */ || /* Z */ ch > 90) &&
1705-
(ch < 97 /* a */ || /* z */ ch > 122) &&
1706-
(ch < 127 /* 0x7f */ || /* 0xff */ ch > 255)
1707-
) {
1708-
#endif
1709-
return 0;
1697+
return false;
17101698
}
17111699

17121700
/* And these as the rest: [a-zA-Z0-9_\x7f-\xff] */
1713-
if (var_name_len > 1) {
1714-
i = 1;
1701+
if (ZSTR_LEN(var_name) > 1) {
1702+
size_t i = 1;
17151703
do {
1716-
ch = (uint32_t)((unsigned char *)var_name)[i];
1717-
#if 1
1704+
ch = (uint32_t)((unsigned char *)ZSTR_VAL(var_name))[i];
17181705
if (UNEXPECTED(!ZEND_BIT_TEST(charset2, ch))) {
1719-
#else
1720-
if (var_name[i] != '_' &&
1721-
(ch < 48 /* 0 */ || /* 9 */ ch > 57) &&
1722-
(ch < 65 /* A */ || /* Z */ ch > 90) &&
1723-
(ch < 97 /* a */ || /* z */ ch > 122) &&
1724-
(ch < 127 /* 0x7f */ || /* 0xff */ ch > 255)
1725-
) {
1726-
#endif
1727-
return 0;
1706+
return false;
17281707
}
1729-
} while (++i < var_name_len);
1708+
} while (++i < ZSTR_LEN(var_name));
17301709
}
1731-
return 1;
1710+
return true;
17321711
}
17331712
/* }}} */
17341713

@@ -1768,7 +1747,7 @@ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_t
17681747
continue;
17691748
}
17701749
}
1771-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
1750+
if (!php_valid_var_name(var_name)) {
17721751
continue;
17731752
}
17741753
if (zend_string_equals_literal(var_name, "GLOBALS")) {
@@ -1814,7 +1793,7 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table
18141793
continue;
18151794
}
18161795
}
1817-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
1796+
if (!php_valid_var_name(var_name)) {
18181797
continue;
18191798
}
18201799
if (zend_string_equals_literal(var_name, "GLOBALS")) {
@@ -1850,7 +1829,7 @@ static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_t
18501829
if (!var_name) {
18511830
continue;
18521831
}
1853-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
1832+
if (!php_valid_var_name(var_name)) {
18541833
continue;
18551834
}
18561835
if (zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
@@ -1902,7 +1881,7 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table
19021881
if (!var_name) {
19031882
continue;
19041883
}
1905-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
1884+
if (!php_valid_var_name(var_name)) {
19061885
continue;
19071886
}
19081887
if (zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
@@ -1963,7 +1942,7 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s
19631942
}
19641943
}
19651944
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
1966-
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
1945+
if (php_valid_var_name(Z_STR(final_name))) {
19671946
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
19681947
zend_throw_error(NULL, "Cannot re-assign $this");
19691948
return -1;
@@ -2017,7 +1996,7 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo
20171996
}
20181997
}
20191998
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
2020-
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
1999+
if (php_valid_var_name(Z_STR(final_name))) {
20212000
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
20222001
zend_throw_error(NULL, "Cannot re-assign $this");
20232002
return -1;
@@ -2080,7 +2059,7 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
20802059
}
20812060
prefix:
20822061
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
2083-
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2062+
if (php_valid_var_name(Z_STR(final_name))) {
20842063
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
20852064
zend_throw_error(NULL, "Cannot re-assign $this");
20862065
return -1;
@@ -2104,7 +2083,7 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
21042083
}
21052084
zval_ptr_dtor_str(&final_name);
21062085
} else {
2107-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
2086+
if (!php_valid_var_name(var_name)) {
21082087
continue;
21092088
}
21102089
if (zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
@@ -2152,7 +2131,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
21522131
}
21532132
prefix:
21542133
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
2155-
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2134+
if (php_valid_var_name(Z_STR(final_name))) {
21562135
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
21572136
zend_throw_error(NULL, "Cannot re-assign $this");
21582137
return -1;
@@ -2176,7 +2155,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
21762155
}
21772156
zval_ptr_dtor_str(&final_name);
21782157
} else {
2179-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
2158+
if (!php_valid_var_name(var_name)) {
21802159
continue;
21812160
}
21822161
if (zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
@@ -2211,7 +2190,7 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_
22112190
php_prefix_varname(&final_name, prefix, ZSTR_VAL(str), ZSTR_LEN(str), true);
22122191
zend_string_release_ex(str, 0);
22132192
}
2214-
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2193+
if (php_valid_var_name(Z_STR(final_name))) {
22152194
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
22162195
zend_throw_error(NULL, "Cannot re-assign $this");
22172196
return -1;
@@ -2258,7 +2237,7 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl
22582237
php_prefix_varname(&final_name, prefix, ZSTR_VAL(str), ZSTR_LEN(str), true);
22592238
zend_string_release_ex(str, 0);
22602239
}
2261-
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2240+
if (php_valid_var_name(Z_STR(final_name))) {
22622241
if (zend_string_equals(Z_STR(final_name), ZSTR_KNOWN(ZEND_STR_THIS))) {
22632242
zend_throw_error(NULL, "Cannot re-assign $this");
22642243
return -1;
@@ -2296,10 +2275,10 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
22962275

22972276
ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
22982277
if (var_name) {
2299-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
2278+
if (!php_valid_var_name(var_name)
23002279
|| zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
23012280
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
2302-
if (!php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2281+
if (!php_valid_var_name(Z_STR(final_name))) {
23032282
zval_ptr_dtor_str(&final_name);
23042283
continue;
23052284
}
@@ -2310,7 +2289,7 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
23102289
zend_string *str = zend_long_to_str(num_key);
23112290
php_prefix_varname(&final_name, prefix, ZSTR_VAL(str), ZSTR_LEN(str), true);
23122291
zend_string_release_ex(str, 0);
2313-
if (!php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2292+
if (!php_valid_var_name(Z_STR(final_name))) {
23142293
zval_ptr_dtor_str(&final_name);
23152294
continue;
23162295
}
@@ -2351,10 +2330,10 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
23512330

23522331
ZEND_HASH_FOREACH_KEY_VAL(arr, num_key, var_name, entry) {
23532332
if (var_name) {
2354-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
2333+
if (!php_valid_var_name(var_name)
23552334
|| zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
23562335
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), true);
2357-
if (!php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2336+
if (!php_valid_var_name(Z_STR(final_name))) {
23582337
zval_ptr_dtor_str(&final_name);
23592338
continue;
23602339
}
@@ -2365,7 +2344,7 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
23652344
zend_string *str = zend_long_to_str(num_key);
23662345
php_prefix_varname(&final_name, prefix, ZSTR_VAL(str), ZSTR_LEN(str), true);
23672346
zend_string_release_ex(str, 0);
2368-
if (!php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
2347+
if (!php_valid_var_name(Z_STR(final_name))) {
23692348
zval_ptr_dtor_str(&final_name);
23702349
continue;
23712350
}
@@ -2410,7 +2389,7 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table)
24102389
if (!var_name) {
24112390
continue;
24122391
}
2413-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
2392+
if (!php_valid_var_name(var_name)) {
24142393
continue;
24152394
}
24162395
if (zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
@@ -2458,7 +2437,7 @@ static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /*
24582437
if (!var_name) {
24592438
continue;
24602439
}
2461-
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
2440+
if (!php_valid_var_name(var_name)) {
24622441
continue;
24632442
}
24642443
if (zend_string_equals(var_name, ZSTR_KNOWN(ZEND_STR_THIS))) {
@@ -2519,7 +2498,7 @@ PHP_FUNCTION(extract)
25192498
}
25202499

25212500
if (prefix) {
2522-
if (ZSTR_LEN(prefix) && !php_valid_var_name(ZSTR_VAL(prefix), ZSTR_LEN(prefix))) {
2501+
if (ZSTR_LEN(prefix) && !php_valid_var_name(prefix)) {
25232502
zend_argument_value_error(3, "must be a valid identifier");
25242503
RETURN_THROWS();
25252504
}

0 commit comments

Comments
 (0)