From 44899e18d4917bc36ab294158d1c969f67c86c92 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Tue, 21 Jul 2026 17:37:32 +0800 Subject: [PATCH] feat(compiler): add constant declarations to global variable header - Add assertion to verify _const_var_ is not in main header - Generate extern declarations for constants in global variable header - Include exported ABI constants in global header generation - Move constant extern declarations from extension file to global header - Add test cases for exported ABI integer, string, and array constants --- phpunit/code/compiler_api/default_argument_abi.php | 4 ++++ phpunit/src/CompilerBaseApiTest.php | 10 ++++++++++ src/Translator.php | 8 ++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/phpunit/code/compiler_api/default_argument_abi.php b/phpunit/code/compiler_api/default_argument_abi.php index ac0c44bd..842382bb 100644 --- a/phpunit/code/compiler_api/default_argument_abi.php +++ b/phpunit/code/compiler_api/default_argument_abi.php @@ -1,5 +1,9 @@ 'fast']; + function exported_defaults( string $text = 'hello', array $options = ['mode' => 'fast'], diff --git a/phpunit/src/CompilerBaseApiTest.php b/phpunit/src/CompilerBaseApiTest.php index e7126409..a9f20a03 100644 --- a/phpunit/src/CompilerBaseApiTest.php +++ b/phpunit/src/CompilerBaseApiTest.php @@ -863,9 +863,19 @@ YAML); $header ); $this->assertStringNotContainsString('_literal_strings', $header); + $this->assertStringNotContainsString('_const_var_', $header); $this->assertStringNotContainsString('php_func_map', $header); $this->assertStringNotContainsString('php_class_map', $header); + $globalHeaderFile = $this->testDir . '/php_abi_defaults_global_var_decl.h'; + $this->compiler->genExternGlobalVars($globalHeaderFile); + $globalHeader = file_get_contents($globalHeaderFile); + $this->assertStringContainsString('extern php::Var _const_var_EXPORTED_ABI_INT;', $globalHeader); + $this->assertStringContainsString('extern php::Var _const_var_EXPORTED_ABI_STRING;', $globalHeader); + $this->assertStringContainsString('extern php::Var _const_var_EXPORTED_ABI_ARRAY;', $globalHeader); + $this->assertStringContainsString('extern php::Str _literal_strings[', $globalHeader); + $this->assertStringContainsString('extern THREAD_LOCAL zend_function *php_func_map[', $globalHeader); + $extensionFile = $this->compiler->genExtension(); $extension = file_get_contents($extensionFile); $this->assertStringContainsString('php::Str php_exported_defaults_arg_0_default_value() {', $extension); diff --git a/src/Translator.php b/src/Translator.php index 1ceb1b26..e727c991 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -669,6 +669,10 @@ class Translator extends Preprocessor $lines[] = 'extern ' . Type::STR . ' ' . self::LITERAL_STRINGS . '[' . $literalStringsCount . '];' . PHP_EOL; } + foreach ($this->constants as $name => $constant) { + $lines[] = 'extern ' . $constant->type . ' ' . $name . ';'; + } + // 确保数组大小至少为 1,避免 C/C++ 编译错误 $classCount = max(1, count($this->classMap)); $lines[] = 'extern THREAD_LOCAL zend_class_entry *' . self::PREFIX . self::CLASS_MAP . '[' . $classCount . '];' . PHP_EOL; @@ -1590,10 +1594,6 @@ CODE; } } - $code .= PHP_EOL; - foreach ($this->constants as $name => $constant) { - $code .= 'extern ' . $constant->type . ' ' . $name . ';' . PHP_EOL; - } $this->writeFile($file, $code); }