8 #include "ext/standard/info.h"
9 #include "zend_constants.h"
10 #include "zend_operators.h"
17 # define PSI_ENGINE "jit"
22 # define PSI_ENGINE "ffi"
25 ZEND_DECLARE_MODULE_GLOBALS(psi
);
28 STD_PHP_INI_ENTRY("psi.engine", PSI_ENGINE
, PHP_INI_SYSTEM
, OnUpdateString
, engine
, zend_psi_globals
, psi_globals
)
29 STD_PHP_INI_ENTRY("psi.directory", "psi.d", PHP_INI_SYSTEM
, OnUpdateString
, directory
, zend_psi_globals
, psi_globals
)
32 static zend_object_handlers psi_object_handlers
;
33 static zend_class_entry
*psi_class_entry
;
35 zend_class_entry
*psi_object_get_class_entry()
37 return psi_class_entry
;
40 void psi_error_wrapper(PSI_Token
*t
, int type
, const char *msg
, ...)
45 psi_verror(type
, t
?t
->file
:"Unknown", t
?t
->line
:0, msg
, argv
);
48 void psi_error(int type
, const char *fn
, unsigned ln
, const char *msg
, ...)
53 psi_verror(type
, fn
, ln
, msg
, argv
);
56 void psi_verror(int type
, const char *fn
, unsigned ln
, const char *msg
, va_list argv
)
58 zend_error_cb(type
, fn
, ln
, msg
, argv
);
61 static void psi_object_free(zend_object
*o
)
63 psi_object
*obj
= PSI_OBJ(NULL
, o
);
66 /* FIXME: how about registering a destructor?
67 // free(obj->data); */
70 zend_object_std_dtor(o
);
73 static zend_object
*psi_object_init(zend_class_entry
*ce
)
75 psi_object
*o
= ecalloc(1, sizeof(*o
) + zend_object_properties_size(ce
));
77 zend_object_std_init(&o
->std
, ce
);
78 object_properties_init(&o
->std
, ce
);
79 o
->std
.handlers
= &psi_object_handlers
;
83 PHP_MINIT_FUNCTION(psi
)
85 PSI_ContextOps
*ops
= NULL
;
86 zend_class_entry ce
= {0};
88 REGISTER_INI_ENTRIES();
90 INIT_NS_CLASS_ENTRY(ce
, "psi", "object", NULL
);
91 psi_class_entry
= zend_register_internal_class_ex(&ce
, NULL
);
92 psi_class_entry
->create_object
= psi_object_init
;
94 memcpy(&psi_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
95 psi_object_handlers
.offset
= XtOffsetOf(psi_object
, std
);
96 psi_object_handlers
.free_obj
= psi_object_free
;
97 psi_object_handlers
.clone_obj
= NULL
;
100 if (!strcasecmp(PSI_G(engine
), "jit")) {
109 php_error(E_WARNING
, "No PSI engine found");
113 PSI_ContextInit(&PSI_G(context
), ops
, psi_error_wrapper
);
114 PSI_ContextBuild(&PSI_G(context
), PSI_G(directory
));
116 if (psi_check_env("PSI_DUMP")) {
117 PSI_ContextDump(&PSI_G(context
), STDOUT_FILENO
);
123 PHP_MSHUTDOWN_FUNCTION(psi
)
125 PSI_ContextDtor(&PSI_G(context
));
127 UNREGISTER_INI_ENTRIES();
132 #if defined(COMPILE_DL_PSI) && defined(ZTS)
133 PHP_RINIT_FUNCTION(psi
)
135 ZEND_TSRMLS_CACHE_UPDATE();
140 PHP_MINFO_FUNCTION(psi
)
142 php_info_print_table_start();
143 php_info_print_table_header(2, "psi support", "enabled");
144 php_info_print_table_end();
146 DISPLAY_INI_ENTRIES();
148 const zend_function_entry psi_functions
[] = {
152 zend_module_entry psi_module_entry
= {
153 STANDARD_MODULE_HEADER
,
158 #if defined(COMPILE_DL_PSI) && defined(ZTS)
159 PHP_RINIT(psi
), /* Replace with NULL if there's nothing to do at request start */
166 STANDARD_MODULE_PROPERTIES
169 #ifdef COMPILE_DL_PSI
171 ZEND_TSRMLS_CACHE_DEFINE();
181 * vim600: noet sw=4 ts=4 fdm=marker
182 * vim<600: noet sw=4 ts=4