#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)
{
n = php_scandir(path, &entries, psi_select_dirent, alphasort);
if (n < 0) {
- C->error(PSI_WARNING, "Failed to scan PSI directory '%s'", path);
+ return;
} else for (i = 0; i < n; ++i) {
char psi[MAXPATHLEN];
PSI_Parser P;
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;
PSI_ParserDtor(&P);
if (PSI_ValidatorValidate(&V)) {
- zend_function_entry *closures = PSI_ContextCompile(C, (PSI_Data *) &V);
+ zend_function_entry *closures;
+ 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);
}
zend_function_entry *PSI_ContextCompile(PSI_Context *C, PSI_Data *D)
{
- size_t count = C->count++;
+ size_t i, count = C->count++;
zend_function_entry *zfe;
+ if (D->consts) {
+ zend_constant zc;
+
+ zc.flags = CONST_PERSISTENT|CONST_CS;
+ zc.module_number = EG(current_module)->module_number;
+
+ for (i = 0; i < D->consts->count; ++i) {
+ constant *c = D->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);
+ }
+ }
+
C->data = realloc(C->data, C->count * sizeof(*C->data));
PSI_DataExchange(&C->data[count], D);
for (i = 0; i < C->count; ++i) {
PSI_DataDtor(&C->data[i]);
+ if (C->closures[i]){
+ free(C->closures[i]);
+ }
}
free(C->data);
+ free(C->closures);
memset(C, 0, sizeof(*C));
}