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
pull/34/head
韩天峰 1 month ago
parent bb113b2186
commit 44899e18d4
  1. 4
      phpunit/code/compiler_api/default_argument_abi.php
  2. 10
      phpunit/src/CompilerBaseApiTest.php
  3. 8
      src/Translator.php

@ -1,5 +1,9 @@
<?php
const EXPORTED_ABI_INT = 42;
const EXPORTED_ABI_STRING = 'internal';
const EXPORTED_ABI_ARRAY = ['mode' => 'fast'];
function exported_defaults(
string $text = 'hello',
array $options = ['mode' => 'fast'],

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

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

Loading…
Cancel
Save