libffi
[m6w6/ext-psi] / src / module.c
index dba74c595852c7260d9e1b91a76f7b630a812022..166596434ae8a4447bcebcf362c8e5d5b85751e8 100644 (file)
 #include "parser.h"
 
 #include "libjit.h"
+#include "libffi.h"
 
 ZEND_DECLARE_MODULE_GLOBALS(psi);
 
 PHP_INI_BEGIN()
-       STD_PHP_INI_ENTRY("psi.directory", "psis", PHP_INI_ALL, OnUpdateString, directory, zend_psi_globals, psi_globals)
+       STD_PHP_INI_ENTRY("psi.engine", "ffi", PHP_INI_SYSTEM, OnUpdateString, engine, zend_psi_globals, psi_globals)
+       STD_PHP_INI_ENTRY("psi.directory", "psis", PHP_INI_SYSTEM, OnUpdateString, directory, zend_psi_globals, psi_globals)
 PHP_INI_END();
 
 void psi_error(int type, const char *msg, ...)
@@ -289,6 +291,18 @@ void psi_do_clean(impl *impl)
 {
        size_t i;
 
+       for (i = 0; i < impl->func->args->count; ++i ) {
+               impl_arg *iarg = impl->func->args->args[i];
+
+               switch (iarg->type->type) {
+               case PSI_T_STRING:
+                       if (iarg->val.str) {
+                               zend_string_release(iarg->val.str);
+                       }
+                       break;
+               }
+       }
+
        for (i = 0; i < impl->decl->args->count; ++i) {
                decl_arg *darg = impl->decl->args->args[i];
 
@@ -301,9 +315,17 @@ void psi_do_clean(impl *impl)
 
 PHP_MINIT_FUNCTION(psi)
 {
+       PSI_ContextOps *ops;
+
        REGISTER_INI_ENTRIES();
 
-       PSI_ContextInit(&PSI_G(context), PSI_Libjit(), psi_error);
+       if (!strcasecmp(PSI_G(engine), "jit")) {
+               ops = PSI_Libjit();
+       } else {
+               ops = PSI_Libffi();
+       }
+
+       PSI_ContextInit(&PSI_G(context), ops, psi_error);
        PSI_ContextBuild(&PSI_G(context), PSI_G(directory));
 
        return SUCCESS;