TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.3 KiB
79 lines
2.3 KiB
#if PPROF_ON
|
|
#include <gperftools/profiler.h>
|
|
#endif
|
|
|
|
#include <php_aot_helper.h>
|
|
#include "sapi/embed/php_embed.h"
|
|
|
|
extern zend_module_entry *php_embed_get_module();
|
|
|
|
void module_init(zend_module_entry *module) {
|
|
if (zend_register_module_ex(module, MODULE_PERSISTENT) == NULL) {
|
|
zend_error(E_ERROR, "Failed to register module [%s]", module->name);
|
|
exit(255);
|
|
}
|
|
if (zend_startup_module_ex(module) == FAILURE) {
|
|
zend_error(E_ERROR, "Failed to startup module [%s]", module->name);
|
|
exit(255);
|
|
}
|
|
}
|
|
|
|
const char *php_get_called_class(php::Object &this_) {
|
|
auto ce = php_get_called_ce(this_);
|
|
if (ce) {
|
|
return ce->name->val;
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
zend_class_entry *php_get_called_ce(php::Object &this_) {
|
|
if (this_.isObject()) {
|
|
return this_.ce();
|
|
} else {
|
|
return (zend_class_entry *) Z_PTR_P(this_.ptr());
|
|
}
|
|
}
|
|
|
|
void module_shutdown(zend_module_entry *module) {
|
|
/**
|
|
* There is a bug in PHP's handling of internal strings. All interned strings are released in the request shutdown
|
|
* function, but then released again in the php_embed_shutdown function, resulting in a use-after-free issue. These
|
|
* must be manually removed from the module table to prevent double release.
|
|
*/
|
|
auto name_len = strlen(module->name);
|
|
auto lcname = zend_string_alloc(name_len, module->type == MODULE_PERSISTENT);
|
|
zend_str_tolower_copy(ZSTR_VAL(lcname), module->name, name_len);
|
|
zend_hash_del(&module_registry, lcname);
|
|
}
|
|
|
|
int main(int cpp_argc, char **cpp_argv) {
|
|
php_embed_init(cpp_argc, cpp_argv);
|
|
php::throw_impl = [](zend_object *ex) { throw ex; };
|
|
|
|
zend_module_entry *module = php_embed_get_module();
|
|
module_init(module);
|
|
|
|
int rc = 0;
|
|
#if PPROF_ON
|
|
ProfilerStart("profile.out");
|
|
#endif
|
|
try {
|
|
char path_translated[] = "embed";
|
|
SG(request_info).path_translated = path_translated;
|
|
module->request_startup_func(module->type, module->module_number);
|
|
} catch (zend_object *e) {
|
|
rc = EG(exit_status);
|
|
CG(unclean_shutdown) = 1;
|
|
zend_exception_error(e, E_ERROR);
|
|
}
|
|
#if PPROF_ON
|
|
ProfilerStop();
|
|
#endif
|
|
|
|
module->request_shutdown_func(module->type, module->module_number);
|
|
module_shutdown(module);
|
|
php_embed_shutdown();
|
|
|
|
return rc;
|
|
}
|
|
|