X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fmodule.c;h=de8b50ee500b40eca180309bc284e9b7e7fad6f4;hp=338f9451f0104981f6b616898b1d3519cba51cae;hb=077b151b807ea0704eb79761278bb4ca615a5344;hpb=e48a77547645d7985d11880f463d811bbe10da6a diff --git a/src/module.c b/src/module.c index 338f945..de8b50e 100644 --- a/src/module.c +++ b/src/module.c @@ -23,7 +23,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif #include "php.h" #include "php_ini.h" @@ -34,9 +38,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" @@ -119,6 +121,7 @@ PHP_INI_END(); static zend_object_handlers psi_object_handlers; static zend_class_entry *psi_class_entry; +zend_class_entry *psi_object_get_class_entry(); zend_class_entry *psi_object_get_class_entry() { return psi_class_entry; @@ -168,19 +171,18 @@ static PHP_FUNCTION(psi_dump) { php_stream *s; zval *r = NULL; - int fd = STDOUT_FILENO; + struct psi_dump dump = {.fun = (psi_dump_cb) php_stream_printf}; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "|r!", &r)) { return; } if (r) { php_stream_from_zval(s, r); - - if (SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL, (void **)&fd, 1)) { - RETURN_FALSE; - } + dump.ctx.hn = s; + } else { + dump.ctx.hn = php_stream_open_wrapper("php://output", "w", REPORT_ERRORS, NULL); } - psi_context_dump(PSI_G(context), fd); + psi_context_dump(&dump, PSI_G(context)); } ZEND_BEGIN_ARG_INFO_EX(ai_psi_validate, 0, 0, 1) @@ -219,7 +221,7 @@ static PHP_FUNCTION(psi_validate) psi_parser_parse(&P, I); psi_data_ctor(&D, P.error, P.flags); psi_validate_scope_ctor(&S); - S.defs = &P.preproc->defs; + S.cpp = P.preproc; RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P))); @@ -232,7 +234,7 @@ static PHP_FUNCTION(psi_validate) 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) @@ -271,7 +273,7 @@ static PHP_FUNCTION(psi_validate_string) psi_parser_parse(&P, I); psi_data_ctor(&D, P.error, P.flags); psi_validate_scope_ctor(&S); - S.defs = &P.preproc->defs; + S.cpp = P.preproc; RETVAL_BOOL(psi_validate(&S, &D, PSI_DATA(&P))); @@ -284,37 +286,16 @@ static PHP_FUNCTION(psi_validate_string) 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 - - if (!ops) { - php_error(E_WARNING, "No PSI engine found"); - return FAILURE; - } - - PSI_G(ops) = ops; - if (ops->load) { - return ops->load(); - } - return SUCCESS; + psi_parser_input_free(&I); } +PHP_MINIT_FUNCTION(psi_debug); +PHP_MINIT_FUNCTION(psi_cpp); +PHP_MINIT_FUNCTION(psi_builtin); +PHP_MINIT_FUNCTION(psi_context); static PHP_MINIT_FUNCTION(psi) { zend_class_entry ce = {0}; - unsigned flags = 0; REGISTER_INI_ENTRIES(); @@ -330,37 +311,32 @@ 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_debug)(type, module_number)) { return FAILURE; } - - if (psi_check_env("PSI_DEBUG")) { - flags |= PSI_DEBUG; + if (SUCCESS != PHP_MINIT(psi_builtin)(type, module_number)) { + return FAILURE; } - if (psi_check_env("PSI_SILENT")) { - flags |= PSI_SILENT; + if (SUCCESS != PHP_MINIT(psi_cpp)(type, module_number)) { + return FAILURE; + } + 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_builtin); +PHP_MSHUTDOWN_FUNCTION(psi_context); +PHP_MSHUTDOWN_FUNCTION(psi_debug); 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); + PHP_MSHUTDOWN(psi_builtin)(type, module_number); + PHP_MSHUTDOWN(psi_debug)(type, module_number); UNREGISTER_INI_ENTRIES();