flush
[m6w6/ext-psi] / src / context.c
index 2b91f43adfe294c5bb5c7ff82f30b619feef59a1..7670462cd255e8769f0d01caa7ffa3ae803d8729 100644 (file)
@@ -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));
 }