X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=7670462cd255e8769f0d01caa7ffa3ae803d8729;hp=2b91f43adfe294c5bb5c7ff82f30b619feef59a1;hb=762750b4a3f4e0471993849c4bd12965f6b62356;hpb=4a49fe2f8eb21cdeabb06acec7a0395b6708d911 diff --git a/src/context.c b/src/context.c index 2b91f43..7670462 100644 --- a/src/context.c +++ b/src/context.c @@ -6,6 +6,8 @@ #include "php.h" #include "php_scandir.h" #include "context.h" +#include "parser.h" +#include "validator.h" PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error) { @@ -38,6 +40,7 @@ void PSI_ContextBuild(PSI_Context *C, const char *path) n = php_scandir(path, &entries, psi_select_dirent, alphasort); if (n < 0) { + return; C->error(PSI_WARNING, "Failed to scan PSI directory '%s'", path); } else for (i = 0; i < n; ++i) { char psi[MAXPATHLEN]; @@ -48,7 +51,7 @@ void PSI_ContextBuild(PSI_Context *C, const char *path) C->error(PSI_WARNING, "Path to PSI file too long: %s/%s", path, entries[i]->d_name); } - if (!PSI_ParserInit(&P, psi, psi_error, 0)) { + if (!PSI_ParserInit(&P, psi, C->error, 0)) { C->error(PSI_WARNING, "Failed to init PSI parser (%s): %s", psi, strerror(errno)); continue; @@ -66,12 +69,39 @@ void PSI_ContextBuild(PSI_Context *C, const char *path) PSI_ParserDtor(&P); if (PSI_ValidatorValidate(&V)) { - zend_function_entry *closures = PSI_ContextCompile(C, (PSI_Data *) &V); + zend_function_entry *closures; + + if (V.consts) { + zend_constant zc; + + zc.flags = CONST_PERSISTENT|CONST_CS; + zc.module_number = EG(current_module)->module_number; + + for (i = 0; i < V.consts->count; ++i) { + constant *c = V.consts->list[i]; + + zc.name = zend_string_init(c->name + (c->name[0] == '\\'), strlen(c->name) - (c->name[0] == '\\'), 1); + ZVAL_NEW_STR(&zc.value, zend_string_init(c->val->text, strlen(c->val->text), 1)); + + switch (c->type->type) { + case PSI_T_BOOL: + convert_to_boolean(&zc.value); + break; + case PSI_T_INT: + convert_to_long(&zc.value); + break; + case PSI_T_FLOAT: + convert_to_double(&zc.value); + break; + } + zend_register_constant(&zc); + } + } + closures = PSI_ContextCompile(C, (PSI_Data *) &V); if (closures && SUCCESS != zend_register_functions(NULL, closures, NULL, MODULE_PERSISTENT)) { C->error(PSI_WARNING, "Failed to register functions!"); } - } PSI_ValidatorDtor(&V); } @@ -108,8 +138,13 @@ void PSI_ContextDtor(PSI_Context *C) for (i = 0; i < C->count; ++i) { PSI_DataDtor(&C->data[i]); + if (C->closures[i]){ + free(C->closures[i]->arg_info); + free(C->closures[i]); + } } free(C->data); + free(C->closures); memset(C, 0, sizeof(*C)); }