X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=9b5730ed64736fe121866a0f04c2d807f34c233a;hp=be8bae9cbdf7b8385b5ef3abe7f157ea1e4e9089;hb=b52dfcdc26059b167eca9baa1e92b3ba9611c3c7;hpb=a7ac1c0a3c855321f21682c127a4b707de33a303 diff --git a/src/context.c b/src/context.c index be8bae9..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; @@ -235,29 +257,7 @@ zend_function_entry *psi_context_compile(struct psi_context *C) } zc.name = zend_string_copy(c->name); - - switch (c->type ? c->type->type : c->val->type) { - case PSI_T_BOOL: - ZVAL_BOOL(&zc.value, c->val->ival.zend.bval); - break; - case PSI_T_INT: - ZVAL_LONG(&zc.value, c->val->ival.zend.lval); - break; - case PSI_T_FLOAT: - case PSI_T_DOUBLE: - ZVAL_DOUBLE(&zc.value, c->val->ival.dval); - break; - case PSI_T_STRING: - case PSI_T_QUOTED_STRING: - ZVAL_NEW_STR(&zc.value, zend_string_copy(c->val->ival.zend.str)); - if (ZSTR_IS_INTERNED(Z_STR(zc.value))) { - Z_TYPE_FLAGS(zc.value) = 0; - } - break; - default: - assert(0); - break; - } + psi_impl_def_val_get_zval(c->val, c->type ? c->type->type : PSI_T_MIXED, &zc.value); zend_register_constant(&zc); } @@ -274,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); } @@ -380,8 +382,6 @@ void psi_context_free(struct psi_context **C) void psi_context_dump(struct psi_dump *dump, struct psi_context *C) { - size_t i; - PSI_DUMP(dump, "// psi.engine=%s\n// %lu files\n", (char *) C->ops->query(C, PSI_CONTEXT_QUERY_SELF, NULL), C->count); @@ -390,8 +390,10 @@ void psi_context_dump(struct psi_dump *dump, struct psi_context *C) #if 0 if (C->flags & PSI_DEBUG) { + size_t i; + for (i = 0; i < C->count; ++i) { - psi_data_dump(fd, &C->data[i]); + psi_data_dump(dump, &C->data[i]); } } #endif