From f555fee7c6e19ffc002ef6062a4656598470c845 Mon Sep 17 00:00:00 2001 From: PurHur Date: Sat, 23 May 2026 20:53:47 +0200 Subject: [PATCH] Keep filter_var/filter_input at real JIT under self-host AOT (#1122). Register filter builtins in SelfHostBuiltinPolicy so PHP_COMPILER_SELFHOST_AOT=1 no longer external-stubs them; hash/preg were already required (#1119, #1121). Update stdlib JIT audit to recognize JitFilter lowering. Co-authored-by: Cursor --- docs/bootstrap-selfhost.md | 1 + docs/stdlib-jit-audit.md | 9 ++++++--- lib/JIT/SelfHostBuiltinPolicy.php | 4 ++++ script/audit-stdlib-jit.php | 2 +- test/unit/SelfHostBuiltinPolicyTest.php | 5 +++++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/bootstrap-selfhost.md b/docs/bootstrap-selfhost.md index ec2f4502..b5e403c8 100644 --- a/docs/bootstrap-selfhost.md +++ b/docs/bootstrap-selfhost.md @@ -61,6 +61,7 @@ Native self-host bundles include `lib/JIT/Result.php` for type closure only. Whe | string | `strtolower`, `strtoupper`, `strcmp`, `strncmp`, `strcasecmp`, `strncasecmp`, `strlen`, `count`/`sizeof` | required | | hash | `hash`, `hash_hmac` | required | | preg | `preg_match`, `preg_quote` | required | +| filter | `filter_var`, `filter_input` | required | | json | `json_encode` (minimal) | required | | echo/print | opcode lowering in `lib/JIT.php` | n/a | | other stdlib | — | `ExternalMethod` stub when not required | diff --git a/docs/stdlib-jit-audit.md b/docs/stdlib-jit-audit.md index facde016..c4c1ecc3 100644 --- a/docs/stdlib-jit-audit.md +++ b/docs/stdlib-jit-audit.md @@ -4,11 +4,11 @@ Auto-generated by `script/audit-stdlib-jit.php`. Regenerate: `php script/audit-s | Metric | Count | |--------|------:| -| `call()` implementations | 183 | -| With JitStringArg/JitLongArg (or zero-arg LLVM) | 177 | +| `call()` implementations | 186 | +| With JitStringArg/JitLongArg (or zero-arg LLVM) | 180 | | Missing arg helpers (actionable for JIT) | 0 | | Deferred (VM-only) | 6 | -| Self-host auto-stub batch | 31 | +| Self-host auto-stub batch | 32 | ## Missing (sorted) @@ -47,6 +47,7 @@ _None — all JIT `call()` builtins are lowered or deferred._ - `array_unique` — `ext/standard/array_unique.php` - `array_unshift` — `ext/standard/array_unshift.php` - `array_values` — `ext/standard/array_values.php` +- `atan2` — `ext/standard/atan2.php` - `base64_decode` — `ext/standard/base64_decode.php` - `base64_encode` — `ext/standard/base64_encode.php` - `basename` — `ext/standard/basename.php` @@ -60,6 +61,7 @@ _None — all JIT `call()` builtins are lowered or deferred._ - `compact` — `ext/standard/compact_.php` - `copy` — `ext/standard/copy_.php` - `cos` — `ext/standard/cos.php` +- `crc32` — `ext/standard/crc32.php` - `date` — `ext/standard/date.php` - `decbin` — `ext/standard/decbin.php` - `dechex` — `ext/standard/dechex.php` @@ -185,6 +187,7 @@ _None — all JIT `call()` builtins are lowered or deferred._ - `strstr` — `ext/standard/strstr.php` - `strtolower` — `ext/standard/strtolower.php` - `strtoupper` — `ext/standard/strtoupper.php` +- `strtr` — `ext/standard/strtr.php` - `strval` — `ext/standard/strval.php` - `substr` — `ext/standard/substr.php` - `substr_count` — `ext/standard/substr_count.php` diff --git a/lib/JIT/SelfHostBuiltinPolicy.php b/lib/JIT/SelfHostBuiltinPolicy.php index c9142230..1ec44a1e 100644 --- a/lib/JIT/SelfHostBuiltinPolicy.php +++ b/lib/JIT/SelfHostBuiltinPolicy.php @@ -30,6 +30,7 @@ final class SelfHostBuiltinPolicy + self::CATEGORY_ARRAY + self::CATEGORY_HASH + self::CATEGORY_PREG + + self::CATEGORY_FILTER + self::CATEGORY_JSON + self::CATEGORY_NUMERIC; @@ -83,6 +84,9 @@ final class SelfHostBuiltinPolicy /** @var array */ private const CATEGORY_PREG = ['preg_match' => 'preg', 'preg_quote' => 'preg']; + /** @var array */ + private const CATEGORY_FILTER = ['filter_var' => 'filter', 'filter_input' => 'filter']; + /** @var array */ private const CATEGORY_JSON = ['json_encode' => 'json']; diff --git a/script/audit-stdlib-jit.php b/script/audit-stdlib-jit.php index 8989b4fb..6eb8122e 100755 --- a/script/audit-stdlib-jit.php +++ b/script/audit-stdlib-jit.php @@ -9,7 +9,7 @@ $hasJitLowering = static function (string $source): bool { return (bool) preg_match( '/JitStringArg|JitLongArg|JitBoolArg|->jitString\s*\(|->jitLong\s*\(|->jitBool\s*\(|' - .'ArrayBuiltinHelper::|pow::toJitDouble|JitDate::|JitGetallheaders::|JitPendingHeaders::|constReal\s*\(/', + .'ArrayBuiltinHelper::|pow::toJitDouble|JitDate::|JitFilter::|JitGetallheaders::|JitPendingHeaders::|constReal\s*\(/', $source ); }; diff --git a/test/unit/SelfHostBuiltinPolicyTest.php b/test/unit/SelfHostBuiltinPolicyTest.php index 5f4aec75..fb5243d3 100644 --- a/test/unit/SelfHostBuiltinPolicyTest.php +++ b/test/unit/SelfHostBuiltinPolicyTest.php @@ -32,6 +32,11 @@ public function testRequiredBundleCategories(): void $this->assertFalse(SelfHostBuiltinPolicy::shouldExternalStub('mkdir')); $this->assertFalse(SelfHostBuiltinPolicy::shouldExternalStub('file_put_contents')); $this->assertFalse(SelfHostBuiltinPolicy::shouldExternalStub('fopen')); + $this->assertTrue(SelfHostBuiltinPolicy::isRequiredForBundle('filter_var')); + $this->assertSame('filter', SelfHostBuiltinPolicy::categoryFor('filter_input')); + $this->assertFalse(SelfHostBuiltinPolicy::shouldExternalStub('filter_var')); + $this->assertFalse(SelfHostBuiltinPolicy::shouldExternalStub('hash')); + $this->assertFalse(SelfHostBuiltinPolicy::shouldExternalStub('preg_match')); } public function testCompileFuncRegistersExternalMethodStub(): void