administrativa
[m6w6/ext-psi] / src / module.c
index 98b1a8d9d97a720f9ab69fe758e47f0ee8df3350..9de278f96cf8ca66c0d2a3de5f71b53128559770 100644 (file)
@@ -34,9 +34,7 @@
 #include "php_psi.h"
 #include "token.h"
 #include "parser.h"
-
-#define PSI_CPP_SEARCH
-#include "php_psi_cpp.h"
+#include "cpp.h"
 
 #if HAVE_LIBJIT
 # include "libjit.h"
@@ -186,6 +184,7 @@ static PHP_FUNCTION(psi_dump)
 ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate, 0, 0, 1)
        ZEND_ARG_INFO(0, file)
        ZEND_ARG_INFO(0, flags)
+       ZEND_ARG_INFO(1, errcnt)
 ZEND_END_ARG_INFO();
 static PHP_FUNCTION(psi_validate)
 {
@@ -195,6 +194,7 @@ static PHP_FUNCTION(psi_validate)
        struct psi_data D = {0};
        struct psi_validate_scope S = {0};
        zend_long flags = 0;
+       zval *errcnt = NULL;
 
 #if PHP_DEBUG
        if (psi_check_env("PSI_DEBUG")) {
@@ -202,7 +202,7 @@ static PHP_FUNCTION(psi_validate)
        }
 #endif
 
-       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &file, &flags)) {
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "P|lz", &file, &flags, &errcnt)) {
                return;
        }
 
@@ -218,15 +218,25 @@ static PHP_FUNCTION(psi_validate)
        psi_data_ctor(&D, P.error, P.flags);
        psi_validate_scope_ctor(&S);
        S.defs = &P.preproc->defs;
-       RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P)) && !P.errors);
+
+       RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P)));
+
+       if (errcnt) {
+               ZVAL_DEREF(errcnt);
+               convert_to_long(errcnt);
+               ZVAL_LONG(errcnt, P.errors);
+       }
+
        psi_validate_scope_dtor(&S);
        psi_data_dtor(&D);
        psi_parser_dtor(&P);
-       free(I);
+       psi_parser_input_free(&I);
 }
 
 ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate_string, 0, 0, 1)
        ZEND_ARG_INFO(0, string)
+       ZEND_ARG_INFO(0, flags)
+       ZEND_ARG_INFO(1, errcnt)
 ZEND_END_ARG_INFO();
 static PHP_FUNCTION(psi_validate_string)
 {
@@ -236,6 +246,7 @@ static PHP_FUNCTION(psi_validate_string)
        struct psi_data D = {0};
        struct psi_validate_scope S = {0};
        zend_long flags = 0;
+       zval *errcnt = NULL;
 
 #if PHP_DEBUG
        if (psi_check_env("PSI_DEBUG")) {
@@ -243,7 +254,7 @@ static PHP_FUNCTION(psi_validate_string)
        }
 #endif
 
-       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S|l", &string, &flags)) {
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "S|lz", &string, &flags, &errcnt)) {
                return;
        }
 
@@ -259,41 +270,26 @@ static PHP_FUNCTION(psi_validate_string)
        psi_data_ctor(&D, P.error, P.flags);
        psi_validate_scope_ctor(&S);
        S.defs = &P.preproc->defs;
-       RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P)) && !P.errors);
-       psi_validate_scope_dtor(&S);
-       psi_data_dtor(&D);
-       psi_parser_dtor(&P);
-       free(I);
-}
 
-static ZEND_RESULT_CODE psi_ops_load()
-{
-       struct psi_context_ops *ops = NULL;
-#ifdef HAVE_LIBJIT
-       if (!strcasecmp(PSI_G(engine), "jit")) {
-               ops = psi_libjit_ops();
-       } else
-#endif
-#ifdef HAVE_LIBFFI
-               ops = psi_libffi_ops();
-#endif
+       RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P)));
 
-       if (!ops) {
-               php_error(E_WARNING, "No PSI engine found");
-               return FAILURE;
+       if (errcnt) {
+               ZVAL_DEREF(errcnt);
+               convert_to_long(errcnt);
+               ZVAL_LONG(errcnt, P.errors);
        }
 
-       PSI_G(ops) = ops;
-       if (ops->load) {
-               return ops->load();
-       }
-       return SUCCESS;
+       psi_validate_scope_dtor(&S);
+       psi_data_dtor(&D);
+       psi_parser_dtor(&P);
+       psi_parser_input_free(&I);
 }
 
+PHP_MINIT_FUNCTION(psi_cpp);
+PHP_MINIT_FUNCTION(psi_context);
 static PHP_MINIT_FUNCTION(psi)
 {
        zend_class_entry ce = {0};
-       unsigned flags = 0;
 
        REGISTER_INI_ENTRIES();
 
@@ -309,37 +305,22 @@ static PHP_MINIT_FUNCTION(psi)
        psi_object_handlers.free_obj = psi_object_free;
        psi_object_handlers.clone_obj = NULL;
 
-       if (SUCCESS != psi_ops_load()) {
+       if (SUCCESS != PHP_MINIT(psi_cpp)(type, module_number)) {
                return FAILURE;
        }
-
-       if (psi_check_env("PSI_DEBUG")) {
-               flags |= PSI_DEBUG;
-       }
-       if (psi_check_env("PSI_SILENT")) {
-               flags |= PSI_SILENT;
+       if (SUCCESS != PHP_MINIT(psi_context)(type, module_number)) {
+               return FAILURE;
        }
 
-       PSI_G(search_path) = pemalloc(strlen(PSI_G(directory)) + strlen(psi_cpp_search) + 1 + 1, 1);
-       sprintf(PSI_G(search_path), "%s:%s", PSI_G(directory), psi_cpp_search);
-
-       PSI_G(context) = psi_context_init(NULL, PSI_G(ops), psi_error_wrapper, flags);
-       psi_context_build(PSI_G(context), PSI_G(directory));
-
        return SUCCESS;
 }
 
+PHP_MSHUTDOWN_FUNCTION(psi_cpp);
+PHP_MSHUTDOWN_FUNCTION(psi_context);
 static PHP_MSHUTDOWN_FUNCTION(psi)
 {
-       if (psi_check_env("PSI_DUMP")) {
-               psi_context_dump(PSI_G(context), STDOUT_FILENO);
-       }
-
-       psi_context_free(&PSI_G(context));
-
-       if (PSI_G(ops)->free) {
-               PSI_G(ops)->free();
-       }
+       PHP_MSHUTDOWN(psi_context)(type, module_number);
+       PHP_MSHUTDOWN(psi_cpp)(type, module_number);
 
        UNREGISTER_INI_ENTRIES();
 
@@ -457,8 +438,15 @@ static const zend_function_entry psi_functions[] = {
        PHP_FE_END
 };
 
+static const zend_module_dep psi_deps[] = {
+       ZEND_MOD_REQUIRED("standard")
+       {0}
+};
+
 zend_module_entry psi_module_entry = {
-       STANDARD_MODULE_HEADER,
+       STANDARD_MODULE_HEADER_EX,
+       NULL,
+       psi_deps,
        "psi",
        psi_functions,
        PHP_MINIT(psi),