- 将 extension.cc.php 模板文件删除,改为在 PHP 代码中直接生成 C++ 代码 - 修改 equalsApartFromNameAndRefcount 方法可见性为 public - 在函数查找逻辑中添加 TODO 注释说明必须为 public 方法的原因 - 添加 scope.php 示例文件用于测试作用域相关功能 - 删除 simple.php 中的冗余注释代码 - 移除模板渲染方法 render 的实现pull/1/head
parent
2e0cb9db4c
commit
d8a828558d
5 changed files with 242 additions and 246 deletions
@ -0,0 +1,16 @@ |
||||
<?php |
||||
class Foo { |
||||
private function bar() { |
||||
return true; |
||||
} |
||||
|
||||
public function foo(array $list) { |
||||
foreach ($list as $o) { |
||||
if ($o->bar()) { |
||||
return $this; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
@ -1,235 +0,0 @@ |
||||
<?php |
||||
/** |
||||
* @var $this Translator |
||||
*/ |
||||
use PhpAot\Php\Translator; |
||||
echo $this->genIncludeHeaderFiles(); |
||||
?> |
||||
|
||||
#include "ps_title.h" |
||||
#include "php_cli_process_title.h" |
||||
#include "php_cli_process_title_arginfo.h" |
||||
|
||||
// global vars |
||||
<?php |
||||
// 全局变量只能是 var 类型 |
||||
foreach ($this->globalVars as $name => $type): |
||||
?> |
||||
<?= Translator::TYPE_VAR ?> <?= $this->escapeGlobalVar($name) ?>;
|
||||
<?php endforeach; ?> |
||||
|
||||
// class register functions |
||||
<?php |
||||
foreach ($this->classCeList as $ce): |
||||
?> |
||||
zend_class_entry * <?= $ce ?>;
|
||||
<?php endforeach; ?> |
||||
|
||||
// class entry |
||||
zend_class_entry *<?= Translator::PREFIX . Translator::CLASS_MAP . '[' . count($this->classMap) . ']' ?>;
|
||||
|
||||
// func |
||||
zend_function *<?= Translator::PREFIX . Translator::FUNC_MAP . '[' . count($this->funcMap) . ']' ?>;
|
||||
|
||||
// property |
||||
uint32_t <?= Translator::PREFIX . Translator::PROP_MAP . '[' . count($this->propMap) . ']' ?>;
|
||||
|
||||
zend_class_entry *php_get_class(int class_id, const php::String &class_name) { |
||||
if (UNEXPECTED(<?= Translator::PREFIX . Translator::CLASS_MAP ?>[class_id] == nullptr)) {
|
||||
<?= Translator::PREFIX . Translator::CLASS_MAP ?>[class_id] = php::getClassEntrySafe(class_name);
|
||||
} |
||||
return <?= Translator::PREFIX . Translator::CLASS_MAP ?>[class_id];
|
||||
} |
||||
|
||||
zend_function *php_get_func(int func_id, const php::String &func_name) { |
||||
if (UNEXPECTED(<?= Translator::PREFIX . Translator::FUNC_MAP ?>[func_id] == nullptr)) {
|
||||
<?= Translator::PREFIX . Translator::FUNC_MAP ?>[func_id] = php::getFunction(func_name);
|
||||
} |
||||
return <?= Translator::PREFIX . Translator::FUNC_MAP ?>[func_id];
|
||||
} |
||||
|
||||
zend_function *php_get_method(int func_id, const php::Str &method_name, int class_id, const php::Str &class_name) { |
||||
if (UNEXPECTED(<?= Translator::PREFIX . Translator::FUNC_MAP ?>[func_id] == nullptr)) {
|
||||
auto ce = php_get_class(class_id, class_name); |
||||
<?= Translator::PREFIX . Translator::FUNC_MAP ?>[func_id] = php::getMethod(ce, method_name);
|
||||
} |
||||
return <?= Translator::PREFIX . Translator::FUNC_MAP ?>[func_id];
|
||||
} |
||||
|
||||
uint32_t php_get_prop(int prop_id, const php::Str &prop_name, int class_id, const php::Str &class_name) { |
||||
if (UNEXPECTED(<?= Translator::PREFIX . Translator::PROP_MAP ?>[prop_id] == 0)) {
|
||||
<?= Translator::PREFIX . Translator::PROP_MAP ?>[prop_id] = php::getPropertyOffset(class_name, prop_name) + 1024;
|
||||
} |
||||
return <?= Translator::PREFIX . Translator::PROP_MAP ?>[prop_id] - 1024;
|
||||
} |
||||
|
||||
// literal strings |
||||
php::Str <?=Translator::LITERAL_STRINGS?>[] = {
|
||||
<?php |
||||
foreach ($this->literalStrings as $str => $index): |
||||
?> |
||||
php::String{ZEND_STRL("<?=$this->escapeString($str)?>"), true}, // [<?=$index?>]
|
||||
<?php endforeach; ?> |
||||
}; |
||||
|
||||
// constants |
||||
<?php |
||||
foreach ($this->constants as $name => $const): |
||||
?> |
||||
<?=$const->type?> <?=$name?>;
|
||||
<?php endforeach; ?> |
||||
|
||||
// class |
||||
<?php |
||||
foreach ($this->classes as $classDef) : |
||||
if ($classDef->requireCtor) { |
||||
echo "static zend_object* (*create_object_" . $classDef->getNamespacedName() . ")(zend_class_entry *class_type);"; |
||||
} |
||||
foreach ($classDef->constants as $constant) : |
||||
if ($constant->type === Translator::TYPE_ARRAY) : |
||||
$constName = Translator::PREFIX . $this->getNativeName($constant->name, $classDef->namespace, $classDef->name); |
||||
echo Translator::TYPE_VAR . " " . $constName . ";\n"; |
||||
endif; |
||||
endforeach; |
||||
endforeach; |
||||
?> |
||||
|
||||
// clang-format off |
||||
static const zend_function_entry ext_functions[] = { |
||||
PHP_FE(cli_set_process_title, arginfo_cli_set_process_title) |
||||
PHP_FE(cli_get_process_title, arginfo_cli_get_process_title) |
||||
<?php |
||||
foreach ($this->functions as $functionDef): |
||||
if ($this->buildMode === 'ext' and $functionDef->name === 'main') { |
||||
continue; |
||||
} |
||||
if ($functionDef->method) { |
||||
continue; |
||||
} |
||||
$zif_name = $this->escapeZendFnName($functionDef->getNamespacedName()); |
||||
?> |
||||
<?php if ($functionDef->namespace): ?> |
||||
ZEND_NAMED_FE("<?=$this->escapeString($functionDef->getNamespacedName())?>", ZEND_FN(<?= $zif_name ?>), arginfo_<?=$zif_name?>)
|
||||
<?php else: ?> |
||||
ZEND_FE(<?=$zif_name?>, arginfo_<?=$zif_name?>)
|
||||
<?php endif; ?> |
||||
<?php endforeach;?> |
||||
ZEND_FE_END |
||||
}; |
||||
// clang-format on |
||||
|
||||
PHP_MINIT_FUNCTION(<?=$this->getModuleName()?>) {
|
||||
zend_try { |
||||
// class/interface class entries |
||||
<?=$this->genClassPropertyInit()?> |
||||
|
||||
// register symbols |
||||
<?php |
||||
foreach ($this->registerSymbols as $registerSymbolFn): |
||||
?> |
||||
<?= $registerSymbolFn ?>(module_number);
|
||||
<?php endforeach; ?> |
||||
} zend_end_try(); |
||||
|
||||
return SUCCESS; |
||||
} |
||||
|
||||
void php_app_init() { |
||||
// register constants |
||||
<?php |
||||
foreach ($this->constants as $name => $const): |
||||
?> |
||||
<?=$name?> = <?= $const->value ?>;
|
||||
php::define("<?=$this->escapeString($const->name)?>", <?= $name ?>);
|
||||
<?php endforeach; ?> |
||||
|
||||
// global vars |
||||
<?php |
||||
foreach ($this->globalVars as $name => $type): |
||||
?> |
||||
php::initGlobal("<?=$name?>", <?= $this->escapeGlobalVar($name) ?>);
|
||||
<?php endforeach; ?> |
||||
|
||||
// static property |
||||
<?php |
||||
foreach ($this->defaultStaticPropertyList as $prop): |
||||
?> |
||||
php::setStaticProperty(<?=$this->genCharPtr($prop->class, true)?>, <?=$this->genCharPtr($prop->name)?>, <?=$prop->default?>);
|
||||
<?php |
||||
endforeach; |
||||
?> |
||||
|
||||
// class array constants |
||||
<?=$this->genClassArrayConstants();?> |
||||
} |
||||
|
||||
void php_app_clean() { |
||||
<?php |
||||
foreach ($this->globalVars as $name => $type) : |
||||
?> |
||||
<?= $this->escapeGlobalVar($name) ?>.unset();
|
||||
php::unsetGlobal("<?=$name?>");
|
||||
<?php endforeach; ?> |
||||
<?php |
||||
foreach ($this->constants as $name => $const): |
||||
if ($const->type !== Translator::TYPE_VAR) { |
||||
continue; |
||||
} |
||||
?> |
||||
<?= $name ?>.unset();
|
||||
<?php endforeach; ?> |
||||
|
||||
// class array constants |
||||
<?php |
||||
foreach ($this->classes as $classDef) : |
||||
foreach ($classDef->constants as $constant) : |
||||
if ($constant->type === Translator::TYPE_ARRAY) : |
||||
$constName = Translator::PREFIX . $this->getNativeName($constant->name, $classDef->namespace, $classDef->name); |
||||
echo $constName . ".unset();\n"; |
||||
endif; |
||||
endforeach; |
||||
endforeach; |
||||
?> |
||||
} |
||||
|
||||
PHP_RINIT_FUNCTION(<?=$this->getModuleName()?>) {
|
||||
php::request_init(); |
||||
php_app_init(); |
||||
|
||||
<?php if ($this->buildMode === 'bin'): ?> |
||||
<?php if (count($this->functions['main']->argInfoList) == 2): ?> |
||||
php::eval("global $argc, $argv; main($argc, $argv);"); |
||||
<?php else:?> |
||||
php::eval("main();"); |
||||
<?php endif; ?> |
||||
<?php endif; ?> |
||||
|
||||
return SUCCESS; |
||||
} |
||||
|
||||
PHP_RSHUTDOWN_FUNCTION(<?=$this->getModuleName()?>) {
|
||||
php_app_clean(); |
||||
php::request_shutdown(); |
||||
return SUCCESS; |
||||
} |
||||
|
||||
zend_module_entry <?=$this->getModuleName()?>_module_entry = {
|
||||
STANDARD_MODULE_HEADER, |
||||
"<?=$this->getModuleName()?>",
|
||||
ext_functions, |
||||
PHP_MINIT(<?=$this->getModuleName()?>),
|
||||
nullptr, |
||||
PHP_RINIT(<?=$this->getModuleName()?>),
|
||||
PHP_RSHUTDOWN(<?=$this->getModuleName()?>),
|
||||
nullptr, |
||||
nullptr, |
||||
STANDARD_MODULE_PROPERTIES, |
||||
}; |
||||
|
||||
<?php if ($this->buildMode === 'ext'): ?> |
||||
ZEND_GET_MODULE(<?=$this->getModuleName()?>);
|
||||
<?php else: ?> |
||||
zend_module_entry *<?= Translator::PREFIX . 'embed_' ?>get_module() {
|
||||
return &<?= $this->getModuleName() ?>_module_entry;
|
||||
} |
||||
<?php endif; ?> |
||||
Loading…
Reference in new issue