From 9344fe466a49f593b923585f07df868c0a188ee7 Mon Sep 17 00:00:00 2001 From: PurHur Date: Thu, 16 Jul 2026 04:20:55 +0000 Subject: [PATCH] php-in-php: move StringVarExportUserScriptLlvm to JitVarExportKernel (#19430) User-script / deferred AOT still needs the thin VmActiveContext + VarExportJitHelper bridge (#16075/#17316); house it in ext/standard so lib/JIT/Builtin shrinks (same kernel-quarantine pattern as #19389/#19399). Embed path unchanged. Co-authored-by: Cursor --- docs/bootstrap-inventory.md | 12 ++++++------ .../standard/JitVarExportKernel.php | 11 +++++++---- lib/JIT/Builtin/StringVarExport.php | 6 ++++-- test/selfhost/compiler_lib_spine_smoke/main.php | 2 +- test/unit/VarExportRuntimeShrinkTest.php | 9 ++++++++- 5 files changed, 26 insertions(+), 14 deletions(-) rename lib/JIT/Builtin/StringVarExportUserScriptLlvm.php => ext/standard/JitVarExportKernel.php (88%) diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md index a17744e8b29..e54441de7d5 100644 --- a/docs/bootstrap-inventory.md +++ b/docs/bootstrap-inventory.md @@ -1716,6 +1716,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `ext/standard/JitUtf8Latin1.php` | 0 | 1 | | `ext/standard/JitVarDump.php` | 0 | 1 | | `ext/standard/JitVarExport.php` | 0 | 1 | +| `ext/standard/JitVarExportKernel.php` | 0 | 1 | | `ext/standard/JitVfprintf.php` | 0 | 5 | | `ext/standard/JitVfscanf.php` | 0 | 2 | | `ext/standard/JitVsprintf.php` | 0 | 2 | @@ -4012,7 +4013,6 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/Builtin/StringUtf8Runtime.php` | 0 | 3 | | `lib/JIT/Builtin/StringVarDump.php` | 0 | 3 | | `lib/JIT/Builtin/StringVarExport.php` | 0 | 1 | -| `lib/JIT/Builtin/StringVarExportUserScriptLlvm.php` | 0 | 1 | | `lib/JIT/Builtin/StringVersionCompare.php` | 0 | 2 | | `lib/JIT/Builtin/StringVersionCompareJit.php` | 0 | 1 | | `lib/JIT/Builtin/StringVfscanf.php` | 0 | 3 | @@ -16054,6 +16054,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 3 class method(s) +### `ext/standard/JitVarExportKernel.php` + +**Warnings** (review for bootstrap subset): +- 1 class method(s) + ### `ext/standard/JitVfprintf.php` **Warnings** (review for bootstrap subset): @@ -31514,11 +31519,6 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 7 class method(s) -### `lib/JIT/Builtin/StringVarExportUserScriptLlvm.php` - -**Warnings** (review for bootstrap subset): -- 1 class method(s) - ### `lib/JIT/Builtin/StringVersionCompare.php` **Warnings** (review for bootstrap subset): diff --git a/lib/JIT/Builtin/StringVarExportUserScriptLlvm.php b/ext/standard/JitVarExportKernel.php similarity index 88% rename from lib/JIT/Builtin/StringVarExportUserScriptLlvm.php rename to ext/standard/JitVarExportKernel.php index 7f9403cbb5b..96896ae05de 100644 --- a/lib/JIT/Builtin/StringVarExportUserScriptLlvm.php +++ b/ext/standard/JitVarExportKernel.php @@ -2,8 +2,9 @@ declare(strict_types=1); -namespace PHPCompiler\JIT\Builtin; +namespace PHPCompiler\ext\standard; +use PHPCompiler\JIT\Builtin\DomInstanceMethodRuntime; use PHPCompiler\JIT\Context; use PHPCompiler\JIT\JitNestedHelperCoerce; use PHPCompiler\JIT\JitVmHelperLink; @@ -12,12 +13,14 @@ use PHPCompiler\JIT\VmActiveContextLlvm; /** - * User-script standalone AOT bridge for __compiler_var_export (#17316, #5965). + * User-script standalone AOT bridge for __compiler_var_export (#19430, #17316, #16075). * * Nested VarExportJitHelper from user-main emit segfaults; link bridge during lowering - * after VmActiveContextInit publishes sg_vm_context (#17391). + * after VmActiveContextInit publishes sg_vm_context (#17391). Housed in ext/standard + * (not lib/JIT/Builtin) — same kernel-move pattern as #19389 / #19399. + * php-src: ext/standard/var.c — php_var_export_ex */ -final class StringVarExportUserScriptLlvm +final class JitVarExportKernel { private const HELPER_PATH = '/ext/standard/VarExportJitHelper.php'; diff --git a/lib/JIT/Builtin/StringVarExport.php b/lib/JIT/Builtin/StringVarExport.php index 16b3fb060a2..9d301a7702d 100644 --- a/lib/JIT/Builtin/StringVarExport.php +++ b/lib/JIT/Builtin/StringVarExport.php @@ -11,12 +11,14 @@ use PHPCompiler\JIT\UserScriptAotDeferNestedJit; use PHPCompiler\JIT\VmActiveContextInitLlvm; use PHPCompiler\JIT\VmActiveContextLlvm; +use PHPCompiler\ext\standard\JitVarExportKernel; use PHPLLVM\Value\Function_ as LlvmFunction; /** - * JIT/AOT link for __compiler_var_export via VarExportJitHelper PHP (#9189, #13349). + * JIT/AOT link for __compiler_var_export via VarExportJitHelper PHP (#9189, #13349, #19430). * * Embed and standalone AOT compile {@see VarExportJitHelper}; thin LLVM bridges forward the ABI. + * User-script defer: {@see JitVarExportKernel} (ext/standard) — same kernel-move as #19389/#19399. * php-src: ext/standard/var.c — php_var_export_ex */ final class StringVarExport @@ -48,7 +50,7 @@ public static function ensureStandaloneBodies(Context $context): void public static function implement(Context $context): void { if (UserScriptAotDeferNestedJit::shouldDefer($context)) { - StringVarExportUserScriptLlvm::implement($context); + JitVarExportKernel::implement($context); return; } diff --git a/test/selfhost/compiler_lib_spine_smoke/main.php b/test/selfhost/compiler_lib_spine_smoke/main.php index 25c20c16c3d..81e31e2385e 100644 --- a/test/selfhost/compiler_lib_spine_smoke/main.php +++ b/test/selfhost/compiler_lib_spine_smoke/main.php @@ -1774,6 +1774,7 @@ require_once __DIR__.'/../../../ext/standard/JitUtf8Latin1.php'; require_once __DIR__.'/../../../ext/standard/JitVarDump.php'; require_once __DIR__.'/../../../ext/standard/JitVarExport.php'; +require_once __DIR__.'/../../../ext/standard/JitVarExportKernel.php'; require_once __DIR__.'/../../../ext/standard/JitVfprintf.php'; require_once __DIR__.'/../../../ext/standard/JitVfscanf.php'; require_once __DIR__.'/../../../ext/standard/JitVsprintf.php'; @@ -4093,7 +4094,6 @@ require_once __DIR__.'/../../../lib/JIT/Builtin/StringUtf8Runtime.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/StringVarDump.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/StringVarExport.php'; -require_once __DIR__.'/../../../lib/JIT/Builtin/StringVarExportUserScriptLlvm.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/StringVersionCompare.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/StringVersionCompareJit.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/StringVfscanf.php'; diff --git a/test/unit/VarExportRuntimeShrinkTest.php b/test/unit/VarExportRuntimeShrinkTest.php index cd5871212d7..e6996d50bdb 100644 --- a/test/unit/VarExportRuntimeShrinkTest.php +++ b/test/unit/VarExportRuntimeShrinkTest.php @@ -6,15 +6,20 @@ use PHPUnit\Framework\TestCase; -/** StringVarExport JIT/AOT path uses VarExportJitHelper PHP, not StringVarExportJit monolith (#9189, #13349). */ +/** StringVarExport JIT/AOT path uses VarExportJitHelper PHP + ext kernel for user-script (#9189, #13349, #19430). */ final class VarExportRuntimeShrinkTest extends TestCase { public function testStringVarExportUsesVarExportJitHelperForJitPath(): void { $source = (string) file_get_contents(__DIR__.'/../../lib/JIT/Builtin/StringVarExport.php'); $this->assertStringContainsString('VarExportJitHelper', $source); + $this->assertStringContainsString('JitVarExportKernel', $source); + $this->assertStringContainsString('UserScriptAotDeferNestedJit::shouldDefer', $source); $this->assertStringNotContainsString('StringVarExportJit', $source); + $this->assertStringNotContainsString('StringVarExportUserScriptLlvm', $source); $this->assertLessThan(160, \substr_count($source, "\n"), 'StringVarExport must be a thin bridge (#9189)'); + $this->assertFileDoesNotExist(__DIR__.'/../../lib/JIT/Builtin/StringVarExportUserScriptLlvm.php'); + $this->assertFileExists(__DIR__.'/../../ext/standard/JitVarExportKernel.php'); } public function testVarExportJitHelperDelegatesToVmVarExport(): void @@ -36,8 +41,10 @@ public function testSpineBundleIncludesVarExportPhpJitPath(): void $spine = (string) file_get_contents(__DIR__.'/../../test/selfhost/compiler_lib_spine_smoke/main.php'); $this->assertStringContainsString('VarExportJitHelper.php', $spine); $this->assertStringContainsString('StringVarExport.php', $spine); + $this->assertStringContainsString('JitVarExportKernel.php', $spine); $this->assertStringContainsString('VmVarExport.php', $spine); $this->assertStringNotContainsString('StringVarExportJit.php', $spine); + $this->assertStringNotContainsString('StringVarExportUserScriptLlvm.php', $spine); $this->assertFileDoesNotExist(__DIR__.'/../../lib/JIT/Builtin/StringVarExportJit.php'); } }