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); }