}
/* }}} */
-static void *zend_hash_find_ptr_lc(HashTable *ht, const char *str, size_t len) {
- void *result;
- zend_string *lcname;
- ALLOCA_FLAG(use_heap);
-
- ZSTR_ALLOCA_ALLOC(lcname, len, use_heap);
- zend_str_tolower_copy(ZSTR_VAL(lcname), str, len);
- result = zend_hash_find_ptr(ht, lcname);
- ZSTR_ALLOCA_FREE(lcname, use_heap);
-
- return result;
-}
-
static zend_bool zend_is_not_imported(zend_string *name) {
/* Assuming "name" is unqualified here. */
- return !FC(imports)
- || zend_hash_find_ptr_lc(FC(imports), ZSTR_VAL(name), ZSTR_LEN(name)) == NULL;
+ return !FC(imports) || zend_hash_find_ptr_lc(FC(imports), name) == NULL;
}
void zend_oparray_context_begin(zend_oparray_context *prev_context) /* {{{ */
if (case_sensitive) {
import_name = zend_hash_find_ptr(current_import_sub, name);
} else {
- import_name = zend_hash_find_ptr_lc(current_import_sub, ZSTR_VAL(name), ZSTR_LEN(name));
+ import_name = zend_hash_find_ptr_lc(current_import_sub, name);
}
if (import_name) {
if (compound && FC(imports)) {
/* If the first part of a qualified name is an alias, substitute it. */
size_t len = compound - ZSTR_VAL(name);
- zend_string *import_name = zend_hash_find_ptr_lc(FC(imports), ZSTR_VAL(name), len);
+ zend_string *import_name = zend_hash_str_find_ptr_lc(FC(imports), ZSTR_VAL(name), len);
if (import_name) {
return zend_concat_names(
/* If the first part of a qualified name is an alias, substitute it. */
size_t len = compound - ZSTR_VAL(name);
zend_string *import_name =
- zend_hash_find_ptr_lc(FC(imports), ZSTR_VAL(name), len);
+ zend_hash_str_find_ptr_lc(FC(imports), ZSTR_VAL(name), len);
if (import_name) {
return zend_concat_names(
} else {
/* If an unqualified name is an alias, replace it. */
zend_string *import_name
- = zend_hash_find_ptr_lc(FC(imports), ZSTR_VAL(name), ZSTR_LEN(name));
+ = zend_hash_find_ptr_lc(FC(imports), name);
if (import_name) {
return zend_string_copy(import_name);
if (ce->ce_flags & ZEND_ACC_RESOLVED_PARENT) {
ce = ce->parent;
} else {
- ce = zend_hash_find_ptr_lc(CG(class_table), ZSTR_VAL(ce->parent_name), ZSTR_LEN(ce->parent_name));
+ ce = zend_hash_find_ptr_lc(CG(class_table), ce->parent_name);
if (!ce) {
break;
}
if (class_name_refers_to_active_ce(class_name, fetch_type)) {
cc = zend_hash_find_ptr(&CG(active_class_entry)->constants_table, name);
} else if (fetch_type == ZEND_FETCH_CLASS_DEFAULT && !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION)) {
- zend_class_entry *ce = zend_hash_find_ptr_lc(CG(class_table), ZSTR_VAL(class_name), ZSTR_LEN(class_name));
+ zend_class_entry *ce = zend_hash_find_ptr_lc(CG(class_table), class_name);
if (ce) {
cc = zend_hash_find_ptr(&ce->constants_table, name);
} else {
lcname = zend_string_tolower(name);
if (FC(imports_function)) {
- zend_string *import_name = zend_hash_find_ptr_lc(
- FC(imports_function), ZSTR_VAL(unqualified_name), ZSTR_LEN(unqualified_name));
+ zend_string *import_name =
+ zend_hash_find_ptr_lc(FC(imports_function), unqualified_name);
if (import_name && !zend_string_equals_ci(lcname, import_name)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare function %s "
"because the name is already in use", ZSTR_VAL(name));
lcname = zend_string_tolower(name);
if (FC(imports)) {
- zend_string *import_name = zend_hash_find_ptr_lc(
- FC(imports), ZSTR_VAL(unqualified_name), ZSTR_LEN(unqualified_name));
+ zend_string *import_name =
+ zend_hash_find_ptr_lc(FC(imports), unqualified_name);
if (import_name && !zend_string_equals_ci(lcname, import_name)) {
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare class %s "
"because the name is already in use", ZSTR_VAL(name));
zend_hash_do_resize(ht); \
}
+ZEND_API void *zend_hash_str_find_ptr_lc(const HashTable *ht, const char *str, size_t len) {
+ void *result;
+ char *lc_str;
+
+ /* Stack allocate small strings to improve performance */
+ ALLOCA_FLAG(use_heap)
+
+ lc_str = zend_str_tolower_copy(do_alloca(len + 1, use_heap), str, len);
+ result = zend_hash_str_find_ptr(ht, lc_str, len);
+ free_alloca(lc_str, use_heap);
+
+ return result;
+}
+
+ZEND_API void *zend_hash_find_ptr_lc(const HashTable *ht, zend_string *key) {
+ void *result;
+ zend_string *lc_key = zend_string_tolower(key);
+ result = zend_hash_find_ptr(ht, lc_key);
+ zend_string_release(lc_key);
+ return result;
+}
+
static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht);
static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)