From b52dfcdc26059b167eca9baa1e92b3ba9611c3c7 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 22 Nov 2018 12:25:16 +0100 Subject: [PATCH] set psi as module for register functions --- src/context.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/context.c b/src/context.c index 7b48c92..9b5730e 100644 --- a/src/context.c +++ b/src/context.c @@ -211,13 +211,35 @@ void psi_context_build(struct psi_context *C, const char *paths) } while (sep); - if (psi_context_compile(C) && SUCCESS != zend_register_functions(NULL, C->closures, NULL, MODULE_PERSISTENT)) { - C->error(PSI_DATA(C), NULL, PSI_WARNING, "Failed to register functions!"); + if (psi_context_compile(C)) { + /* zend_register_functions depends on EG(current_module) pointing into module */ + EG(current_module) = zend_hash_str_find_ptr(&module_registry, "psi", sizeof("psi") - 1); + if (SUCCESS != zend_register_functions(NULL, C->closures, NULL, MODULE_PERSISTENT)) { + C->error(PSI_DATA(C), NULL, PSI_WARNING, "Failed to register functions!"); + } + EG(current_module) = NULL; } free(cpy); } +#include +static inline bool prefix_match(zend_string *a, zend_string *b) +{ + size_t i; + + for (i = 0; i < a->len && i < b->len; ++i) { + if (tolower(a->val[i]) != tolower(b->val[i])) { + return false; + } + if (i && a->val[i] == '_') { + break; + } + } + + return true; +} + zend_function_entry *psi_context_compile(struct psi_context *C) { zend_constant zc; @@ -252,9 +274,11 @@ zend_function_entry *psi_context_compile(struct psi_context *C) while (psi_plist_get(e->items, j++, &item)) { zend_string *name; - if (psi_decl_type_is_anon(e->name, "enum")) { + if (psi_decl_type_is_anon(e->name, "enum") + || prefix_match(e->name, item->name)) { name = strpprintf(0, "psi\\%s", item->name->val); } else { + name = strpprintf(0, "psi\\%s\\%s", e->name->val, item->name->val); } -- 2.30.2