diff --git a/README.md b/README.md index 68561f49e4..6d51e3acfd 100755 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ > **Stable line (2026)** — First maintained **stable** release **[v1.0.0](https://github.com/PurHur/php-compiler/releases/tag/v1.0.0)**; **v1.1.0** prep adds M5 fast-path stability, enum/property-hook parity, `preg_match` JIT, `spl_autoload*`, and php-in-PHP JIT helpers. Demo-ready VM + AOT for a **web-capable PHP subset**, reference examples **000–009**, and an experimental **self-host** path. Not full Zend PHP compatibility — see [what’s missing](https://purhur.github.io/php-compiler/docs/pages/missing-implementation.html). -**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **3992** / **3995** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms** +**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **4031** / **4031** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms** --- @@ -23,7 +23,7 @@ | **AOT (`phpc build`)** | ✅ For curated subset | Standalone binaries for examples **000–009** and small CGI apps; not arbitrary Composer stacks | | **JIT (`bin/jit.php`)** | 🚧 Partial | LLVM IR for many constructs; **MCJIT execute** still flaky ([#98](https://github.com/PurHur/php-compiler/issues/98)); EH scripts VM-fallback ([#2114](https://github.com/PurHur/php-compiler/issues/2114)) | | **Language wave 3** | ✅ Closed batch | **12/12** language + **13/13** stdlib tracker items ([#1380](https://github.com/PurHur/php-compiler/issues/1380)); closures, try/catch, generators (VM), `parent::class`, backed enums (VM), intersection AOT checks | -| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **3992** / **3995**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) | +| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **4031** / **4031**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) | ### What you can rely on today @@ -40,7 +40,7 @@ Counts from `php script/bootstrap-spine-count.php` (literal `require_once` in `c | Milestone | Status | What it means | |-----------|--------|----------------| | **M0–M1** | ✅ | `compiler_minimal` + compile-smoke bundles link and run natively | -| **M2** | ✅ **3992** / **3995** | Full Phase A inventory in spine smoke; native link + lint ✅ | +| **M2** | ✅ **4031** / **4031** | Full Phase A inventory in spine smoke; native link + lint ✅ | | **M3** | ✅ | HelloWorld strict native ✅; inventory argv `bin/compile.php` ✅ | | **M4** | ✅ | `make bootstrap-loop-probe` full ladder ✅ (gen-1→gen-2→gen-3 + full-revision) | | **M5** | ✅ | `make north-star5-verify-fast` (daily); `--strict` pre-merge ✅; vendor **3/3** ✅; gen-0 sidecars refreshed | @@ -259,7 +259,7 @@ Full matrices (auto-generated): [`docs/capabilities.md`](docs/capabilities.md) ( **Self-host (experimental, not “stable app” scope)** -See [Current implementation status](#current-implementation-status-june-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **3992** / **3995**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) + **`--strict`** pre-merge ✅ ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)). +See [Current implementation status](#current-implementation-status-june-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **4031** / **4031**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) + **`--strict`** pre-merge ✅ ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)). **What we do not target in v1.x** diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md index b06f10d0b7..eac4f47b60 100644 --- a/docs/bootstrap-inventory.md +++ b/docs/bootstrap-inventory.md @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php` | Metric | Count | |--------|------:| -| PHP files on vm.php path | 4027 | -| Phase A inventory files (M2 ratio SSOT) | 4027 | +| PHP files on vm.php path | 4031 | +| Phase A inventory files (M2 ratio SSOT) | 4031 | | Phase A ratio-deferred paths | 0 | | Source constructs flagged (blockers) | 0 | -| Source constructs flagged (warnings) | 10861 | +| Source constructs flagged (warnings) | 10865 | ## Compiler CFG gaps (`lib/Compiler.php`) @@ -637,6 +637,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `ext/standard/ChmodJitHelper.php` | 0 | 1 | | `ext/standard/ChownJitHelper.php` | 0 | 1 | | `ext/standard/ChunkSplitJitHelper.php` | 0 | 1 | +| `ext/standard/ClassExistsJitHelper.php` | 0 | 1 | | `ext/standard/CliArgvJitHelper.php` | 0 | 2 | | `ext/standard/ClockGettimeJitHelper.php` | 0 | 1 | | `ext/standard/CloneWithJitHelper.php` | 0 | 1 | @@ -739,6 +740,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `ext/standard/IniIntrospectionJitHelper.php` | 0 | 1 | | `ext/standard/IniJitHelper.php` | 0 | 1 | | `ext/standard/IniParseQuantityJitHelper.php` | 0 | 1 | +| `ext/standard/InterfaceExistsJitHelper.php` | 0 | 1 | | `ext/standard/IsFiniteJitHelper.php` | 0 | 1 | | `ext/standard/IsInfiniteJitHelper.php` | 0 | 1 | | `ext/standard/IsNanJitHelper.php` | 0 | 1 | @@ -2998,6 +3000,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/Builtin/StringCaseCompare.php` | 0 | 3 | | `lib/JIT/Builtin/StringChmod.php` | 0 | 1 | | `lib/JIT/Builtin/StringChunkSplit.php` | 0 | 3 | +| `lib/JIT/Builtin/StringClassExists.php` | 0 | 1 | | `lib/JIT/Builtin/StringClockGettime.php` | 0 | 1 | | `lib/JIT/Builtin/StringClockGettimeRuntime.php` | 0 | 2 | | `lib/JIT/Builtin/StringConvertUu.php` | 0 | 3 | @@ -3054,6 +3057,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/Builtin/StringIdate.php` | 0 | 3 | | `lib/JIT/Builtin/StringImageTypeToExtension.php` | 0 | 3 | | `lib/JIT/Builtin/StringInfo.php` | 0 | 1 | +| `lib/JIT/Builtin/StringInterfaceExists.php` | 0 | 1 | | `lib/JIT/Builtin/StringJsonDecode.php` | 0 | 3 | | `lib/JIT/Builtin/StringJsonDecodeInventoryStubs.php` | 0 | 1 | | `lib/JIT/Builtin/StringJsonEncode.php` | 0 | 3 | @@ -5076,45 +5080,45 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new ObjectEntry (line 1450) - new DomNodeState (line 1455) - new Variable (line 1460) -- new ObjectEntry (line 1845) -- new DomNodeState (line 1847) -- new DOMException (line 1994) -- new DOMException (line 2020) -- new DOMException (line 2038) -- new DOMException (line 2041) -- new DOMException (line 2049) -- new DOMException (line 2075) -- new DOMException (line 2088) -- new DOMException (line 2243) -- new DOMException (line 2337) -- new DOMException (line 2341) +- new ObjectEntry (line 1934) +- new DomNodeState (line 1936) +- new DOMException (line 2083) +- new DOMException (line 2109) +- new DOMException (line 2127) +- new DOMException (line 2130) +- new DOMException (line 2138) +- new DOMException (line 2164) +- new DOMException (line 2177) +- new DOMException (line 2332) +- new DOMException (line 2426) - new DOMException (line 2430) -- new DOMException (line 2434) -- new DOMException (line 2492) -- new DOMException (line 2509) -- new DOMException (line 2538) -- new DOMException (line 2579) -- new DOMException (line 2604) -- new DOMException (line 3038) -- new Variable (line 3062) -- new DOMException (line 3252) -- new DOMException (line 3333) -- new DOMException (line 3375) -- new ObjectEntry (line 3452) -- new DomNodeState (line 3456) -- new Variable (line 3463) -- new DOMException (line 3528) -- new DOMException (line 3535) -- new DOMException (line 3542) -- new DOMException (line 3546) -- new DOMException (line 3549) -- new DOMException (line 3558) -- new Variable (line 4206) -- new Variable (line 4219) -- new DOMException (line 4297) -- new DOMException (line 4308) -- new DOMException (line 4374) -- 213 class method(s) +- new DOMException (line 2519) +- new DOMException (line 2523) +- new DOMException (line 2581) +- new DOMException (line 2598) +- new DOMException (line 2627) +- new DOMException (line 2668) +- new DOMException (line 2693) +- new DOMException (line 3167) +- new Variable (line 3191) +- new DOMException (line 3381) +- new DOMException (line 3462) +- new DOMException (line 3504) +- new ObjectEntry (line 3581) +- new DomNodeState (line 3585) +- new Variable (line 3592) +- new DOMException (line 3657) +- new DOMException (line 3664) +- new DOMException (line 3671) +- new DOMException (line 3675) +- new DOMException (line 3678) +- new DOMException (line 3687) +- new Variable (line 4335) +- new Variable (line 4348) +- new DOMException (line 4426) +- new DOMException (line 4437) +- new DOMException (line 4503) +- 217 class method(s) - 2 closure(s) ### `ext/filter/BuiltinEnums.php` @@ -8412,6 +8416,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 1 class method(s) +### `ext/standard/ClassExistsJitHelper.php` + +**Warnings** (review for bootstrap subset): +- 1 class method(s) + ### `ext/standard/CliArgvJitHelper.php` **Warnings** (review for bootstrap subset): @@ -8949,6 +8958,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 1 class method(s) +### `ext/standard/InterfaceExistsJitHelper.php` + +**Warnings** (review for bootstrap subset): +- 1 class method(s) + ### `ext/standard/IsFiniteJitHelper.php` **Warnings** (review for bootstrap subset): @@ -20241,7 +20255,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `ext/xml/VmXml.php` **Warnings** (review for bootstrap subset): -- 13 class method(s) +- 14 class method(s) ### `ext/xml/xml_get_error_code.php` @@ -23729,6 +23743,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - 7 class method(s) - 1 closure(s) +### `lib/JIT/Builtin/StringClassExists.php` + +**Warnings** (review for bootstrap subset): +- 4 class method(s) + ### `lib/JIT/Builtin/StringClockGettime.php` **Warnings** (review for bootstrap subset): @@ -24060,6 +24079,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 12 class method(s) +### `lib/JIT/Builtin/StringInterfaceExists.php` + +**Warnings** (review for bootstrap subset): +- 4 class method(s) + ### `lib/JIT/Builtin/StringJsonDecode.php` **Warnings** (review for bootstrap subset): diff --git a/docs/bootstrap-profile.json b/docs/bootstrap-profile.json index 3770cc9d1b..16b5edc9c4 100644 --- a/docs/bootstrap-profile.json +++ b/docs/bootstrap-profile.json @@ -145,6 +145,7 @@ "ext/dom/ElementGetElementsByTagNameNS.php", "ext/dom/ElementHasAttribute.php", "ext/dom/ElementHasAttributeNS.php", + "ext/dom/ElementInsertAdjacentHTML.php", "ext/dom/ElementRemoveAttribute.php", "ext/dom/ElementRemoveAttributeNS.php", "ext/dom/ElementRemoveAttributeNode.php", @@ -275,13 +276,17 @@ "ext/intl/IntlDateFormatterCreate.php", "ext/intl/IntlExtensionPolicy.php", "ext/intl/JitGrapheme.php", + "ext/intl/LocaleGetDefault.php", + "ext/intl/LocaleSetDefault.php", "ext/intl/Module.php", "ext/intl/UnicodeCanonical.php", "ext/intl/VmGrapheme.php", + "ext/intl/VmLocale.php", "ext/intl/grapheme_extract.php", "ext/intl/grapheme_levenshtein.php", "ext/intl/grapheme_str_contains.php", "ext/intl/grapheme_str_split.php", + "ext/intl/grapheme_strimwidth.php", "ext/intl/grapheme_stripos.php", "ext/intl/grapheme_stristr.php", "ext/intl/grapheme_strlen.php", @@ -290,6 +295,8 @@ "ext/intl/grapheme_strstr.php", "ext/intl/grapheme_substr.php", "ext/intl/intl_get_error_code.php", + "ext/intl/locale_get_default.php", + "ext/intl/locale_set_default.php", "ext/libxml/BuiltinClasses.php", "ext/libxml/LibxmlConstants.php", "ext/libxml/LibxmlFunction.php", @@ -636,6 +643,7 @@ "ext/standard/ArrayPopJitHelper.php", "ext/standard/ArrayProductJitHelper.php", "ext/standard/ArrayPushJitHelper.php", + "ext/standard/ArrayRandJitHelper.php", "ext/standard/ArrayReduceJitHelper.php", "ext/standard/ArrayReplaceJitHelper.php", "ext/standard/ArrayReplaceKeyJitHelper.php", @@ -662,6 +670,7 @@ "ext/standard/BuiltinAttributes.php", "ext/standard/BuiltinClasses.php", "ext/standard/BuiltinEnums.php", + "ext/standard/BuiltinIntrospectionPolicy.php", "ext/standard/BuiltinRegistry.php", "ext/standard/CaseCompareJitHelper.php", "ext/standard/CeilJitHelper.php", @@ -671,6 +680,7 @@ "ext/standard/ChmodJitHelper.php", "ext/standard/ChownJitHelper.php", "ext/standard/ChunkSplitJitHelper.php", + "ext/standard/ClassExistsJitHelper.php", "ext/standard/CliArgvJitHelper.php", "ext/standard/ClockGettimeJitHelper.php", "ext/standard/CloneWithJitHelper.php", @@ -695,6 +705,7 @@ "ext/standard/DirHandleJitHelper.php", "ext/standard/DirectoryBuiltin.php", "ext/standard/EmbedObJitHelper.php", + "ext/standard/EnumExistsJitHelper.php", "ext/standard/EnvLocalJitHelper.php", "ext/standard/ErrorHandlerJitHelper.php", "ext/standard/ErrorLastJitHelper.php", @@ -774,6 +785,7 @@ "ext/standard/IniIntrospectionJitHelper.php", "ext/standard/IniJitHelper.php", "ext/standard/IniParseQuantityJitHelper.php", + "ext/standard/InterfaceExistsJitHelper.php", "ext/standard/IsFiniteJitHelper.php", "ext/standard/IsInfiniteJitHelper.php", "ext/standard/IsNanJitHelper.php", @@ -787,7 +799,6 @@ "ext/standard/JitArrayMergeRecursive.php", "ext/standard/JitArrayPointer.php", "ext/standard/JitArrayPush.php", - "ext/standard/JitArrayRand.php", "ext/standard/JitAssert.php", "ext/standard/JitAssertOptions.php", "ext/standard/JitAttributeExists.php", @@ -1219,12 +1230,14 @@ "ext/standard/JitVfprintf.php", "ext/standard/JitVfscanf.php", "ext/standard/JitVsprintf.php", + "ext/standard/JitVsprintfArrayArg.php", "ext/standard/JitWebParams.php", "ext/standard/JitZendScalarCast.php", "ext/standard/JitZlib.php", "ext/standard/JsonDecodeJitHelper.php", "ext/standard/JsonEncodeJitHelper.php", "ext/standard/KeySortJitHelper.php", + "ext/standard/LcgJitHelper.php", "ext/standard/LdexpJitHelper.php", "ext/standard/LevenshteinJitHelper.php", "ext/standard/LinkJitHelper.php", @@ -1264,6 +1277,7 @@ "ext/standard/PackEngineEncode.php", "ext/standard/PackJitEngine.php", "ext/standard/PackJitHelper.php", + "ext/standard/ParamSensitiveJitHelper.php", "ext/standard/ParseIniEngine.php", "ext/standard/ParseStrEngine.php", "ext/standard/ParseStrJitHelper.php", @@ -1391,10 +1405,12 @@ "ext/standard/TimezoneFallbackData.php", "ext/standard/TimezoneLocationJitHelper.php", "ext/standard/TimezoneOffsetJitHelper.php", + "ext/standard/TraitExistsJitHelper.php", "ext/standard/TriggerErrorJitHelper.php", "ext/standard/UcwordsJitHelper.php", "ext/standard/UmaskJitHelper.php", "ext/standard/UniqidJitHelper.php", + "ext/standard/UnitEnumExistsJitHelper.php", "ext/standard/UnlinkJitHelper.php", "ext/standard/UnpackEngine.php", "ext/standard/UnpackJitHelper.php", @@ -1439,6 +1455,7 @@ "ext/standard/VmCliProcessTitlePure.php", "ext/standard/VmClockGettime.php", "ext/standard/VmClosureCall.php", + "ext/standard/VmCombinedLcg.php", "ext/standard/VmConnection.php", "ext/standard/VmConstants.php", "ext/standard/VmConvertCyrString.php", @@ -1609,6 +1626,7 @@ "ext/standard/VmPregBacktrackLimitException.php", "ext/standard/VmPregEngine.php", "ext/standard/VmPregFailure.php", + "ext/standard/VmPregJitStackLimitException.php", "ext/standard/VmPregLimits.php", "ext/standard/VmPregMatches.php", "ext/standard/VmPregNative.php", @@ -1717,6 +1735,7 @@ "ext/standard/VmZlibCore.php", "ext/standard/VmZlibLibzReference.php", "ext/standard/VmZlibStreamFilter.php", + "ext/standard/VsprintfJitHelper.php", "ext/standard/WeakRefRegistryJitHelper.php", "ext/standard/WordwrapJitHelper.php", "ext/standard/ZendSort.php", @@ -2147,6 +2166,7 @@ "ext/standard/krsort_.php", "ext/standard/ksort_.php", "ext/standard/lcfirst.php", + "ext/standard/lcg_value.php", "ext/standard/lchgrp_.php", "ext/standard/lchown_.php", "ext/standard/ldexp.php", @@ -2175,6 +2195,7 @@ "ext/standard/mktime.php", "ext/standard/modf.php", "ext/standard/move_uploaded_file.php", + "ext/standard/mt_rand.php", "ext/standard/mt_srand.php", "ext/standard/natcasesort_.php", "ext/standard/natsort_.php", @@ -2238,6 +2259,8 @@ "ext/standard/phpc_native_ht_set_string_key.php", "ext/standard/phpc_native_ht_set_string_key_ht.php", "ext/standard/phpc_run_command.php", + "ext/standard/phpc_weakref_null_slot.php", + "ext/standard/phpc_weakref_unset_map_key.php", "ext/standard/phpcredits.php", "ext/standard/phpinfo.php", "ext/standard/phpversion.php", @@ -2359,6 +2382,7 @@ "ext/standard/spl_object_id.php", "ext/standard/sprintf_.php", "ext/standard/sqrt.php", + "ext/standard/srand.php", "ext/standard/sscanf.php", "ext/standard/stat_.php", "ext/standard/str_contains.php", @@ -2732,6 +2756,7 @@ "lib/JIT/Builtin/ArrayPopRuntime.php", "lib/JIT/Builtin/ArrayProductRuntime.php", "lib/JIT/Builtin/ArrayPushRuntime.php", + "lib/JIT/Builtin/ArrayRandRuntime.php", "lib/JIT/Builtin/ArrayReduceRuntime.php", "lib/JIT/Builtin/ArrayReplaceKeyRuntime.php", "lib/JIT/Builtin/ArrayReplaceRecursiveRuntime.php", @@ -2846,6 +2871,7 @@ "lib/JIT/Builtin/LastErrorRuntime.php", "lib/JIT/Builtin/LateStaticBindingGlobals.php", "lib/JIT/Builtin/LateStaticBindingRuntime.php", + "lib/JIT/Builtin/Lcg.php", "lib/JIT/Builtin/ListUnpackRuntime.php", "lib/JIT/Builtin/MathAbs.php", "lib/JIT/Builtin/MathAcos.php", @@ -2911,6 +2937,8 @@ "lib/JIT/Builtin/PackArgvSerialize.php", "lib/JIT/Builtin/PackJitRuntime.php", "lib/JIT/Builtin/PadTypeJit.php", + "lib/JIT/Builtin/ParamSensitiveLookupRuntime.php", + "lib/JIT/Builtin/ParamSensitiveLowering.php", "lib/JIT/Builtin/ParseStrNativeOpsJit.php", "lib/JIT/Builtin/ParseStrRuntime.php", "lib/JIT/Builtin/ParseUrl.php", @@ -3032,6 +3060,7 @@ "lib/JIT/Builtin/StringCaseCompare.php", "lib/JIT/Builtin/StringChmod.php", "lib/JIT/Builtin/StringChunkSplit.php", + "lib/JIT/Builtin/StringClassExists.php", "lib/JIT/Builtin/StringClockGettime.php", "lib/JIT/Builtin/StringClockGettimeRuntime.php", "lib/JIT/Builtin/StringConvertUu.php", @@ -3042,6 +3071,7 @@ "lib/JIT/Builtin/StringDir.php", "lib/JIT/Builtin/StringDirJit.php", "lib/JIT/Builtin/StringDirRuntime.php", + "lib/JIT/Builtin/StringEnumExists.php", "lib/JIT/Builtin/StringErrorLog.php", "lib/JIT/Builtin/StringExplode.php", "lib/JIT/Builtin/StringFgetcsvJit.php", @@ -3087,6 +3117,7 @@ "lib/JIT/Builtin/StringIdate.php", "lib/JIT/Builtin/StringImageTypeToExtension.php", "lib/JIT/Builtin/StringInfo.php", + "lib/JIT/Builtin/StringInterfaceExists.php", "lib/JIT/Builtin/StringJsonDecode.php", "lib/JIT/Builtin/StringJsonDecodeInventoryStubs.php", "lib/JIT/Builtin/StringJsonEncode.php", @@ -3174,6 +3205,7 @@ "lib/JIT/Builtin/StringSysGetloadavg.php", "lib/JIT/Builtin/StringSyslog.php", "lib/JIT/Builtin/StringTempnam.php", + "lib/JIT/Builtin/StringTraitExists.php", "lib/JIT/Builtin/StringTriggerError.php", "lib/JIT/Builtin/StringTriggerErrorJit.php", "lib/JIT/Builtin/StringTrimMask.php", @@ -3181,6 +3213,7 @@ "lib/JIT/Builtin/StringUcwords.php", "lib/JIT/Builtin/StringUmask.php", "lib/JIT/Builtin/StringUniqid.php", + "lib/JIT/Builtin/StringUnitEnumExists.php", "lib/JIT/Builtin/StringUnlink.php", "lib/JIT/Builtin/StringUnpack.php", "lib/JIT/Builtin/StringUnserialize.php", @@ -3193,6 +3226,7 @@ "lib/JIT/Builtin/StringVersionCompare.php", "lib/JIT/Builtin/StringVersionCompareJit.php", "lib/JIT/Builtin/StringVfscanf.php", + "lib/JIT/Builtin/StringVsprintf.php", "lib/JIT/Builtin/StringWordwrap.php", "lib/JIT/Builtin/StringZlib.php", "lib/JIT/Builtin/StringZstd.php", @@ -3231,6 +3265,7 @@ "lib/JIT/Builtin/VarArg.php", "lib/JIT/Builtin/VarFetchRuntime.php", "lib/JIT/Builtin/WeakRefNative.php", + "lib/JIT/Builtin/WeakRefNativeOpsJit.php", "lib/JIT/Builtin/WeakRefRegistryRuntime.php", "lib/JIT/Builtin/WeakRefRuntime.php", "lib/JIT/Builtin/WeakRefSetup.php", @@ -3286,6 +3321,7 @@ "lib/JIT/Call/ReflectionEnumIsBacked.php", "lib/JIT/Call/ReflectionEnumUnitCaseGetName.php", "lib/JIT/Call/ReflectionMethodGetAttributes.php", + "lib/JIT/Call/ReflectionParameterIsSensitiveParameter.php", "lib/JIT/Call/ReflectionPropertyConstruct.php", "lib/JIT/Call/ReflectionPropertyGetAttributes.php", "lib/JIT/Call/RuntimeIndirectClosureCall.php", @@ -3736,6 +3772,7 @@ "lib/VM/Builtin/ReflectionParameterGetValue.php", "lib/VM/Builtin/ReflectionParameterIsDeprecated.php", "lib/VM/Builtin/ReflectionParameterIsSensitive.php", + "lib/VM/Builtin/ReflectionParameterIsSensitiveParameter.php", "lib/VM/Builtin/ReflectionPropertyAccessProbe.php", "lib/VM/Builtin/ReflectionPropertyAsymmetricProbe.php", "lib/VM/Builtin/ReflectionPropertyConstruct.php", @@ -4228,9 +4265,9 @@ "test/bootstrap-aot/lib_opcode/main.php" ], "totals": { - "inventory_files": 3994, + "inventory_files": 4031, "excluded": 0, - "eligible": 3994, + "eligible": 4031, "aot_lint_targets": 113, "aot_link_targets": 100, "aot_link_lib_targets": 1 diff --git a/docs/bootstrap-selfhost.md b/docs/bootstrap-selfhost.md index cdec748b83..7ee7ca3822 100644 --- a/docs/bootstrap-selfhost.md +++ b/docs/bootstrap-selfhost.md @@ -2,7 +2,7 @@ **Gen-0 without Zend:** `BOOTSTRAP_M5_NO_ZEND=1 make bootstrap-selfhost-link` installs `prelinked/bootstrap-gen0/bin-compile-aot` and links `compiler_minimal` without `php bin/compile.php` ([#3053](https://github.com/PurHur/php-compiler/issues/3053)). **M5 lib spine compile:** `BOOTSTRAP_NO_ZEND_FALLBACK=1 make bootstrap-selfhost-lib-spine-smoke` (default in link script) refuses host `php bin/compile.php` on the spine emit path ([#8716](https://github.com/PurHur/php-compiler/issues/8716)). **Contributor workflow:** [bootstrap-dev-workflow.md](bootstrap-dev-workflow.md) (tiered gen-1+ path, spine checklist, CI). -**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **3992** / **3995** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **3/3** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella). +**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **4031** / **4031** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **3/3** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella). ## Current gates diff --git a/docs/pages/capability-comparison.html b/docs/pages/capability-comparison.html index 1e75230373..7f6513066c 100644 --- a/docs/pages/capability-comparison.html +++ b/docs/pages/capability-comparison.html @@ -59,12 +59,12 @@

PHP capability comparison

Language constructs
- 80 / 89 full (VM+JIT+AOT) -

5 partial · 4 gaps

+ 81 / 89 full (VM+JIT+AOT) +

4 partial · 4 gaps

Stdlib builtins
- 865 / 896 full (VM+JIT+AOT) + 870 / 901 full (VM+JIT+AOT)

11 partial · 20 gaps

@@ -163,7 +163,7 @@

Language constructs

readonly classesyesyesyesyes#1360 readonly properties (per-property)yesyesyesyes#3149 Property hooks (`get` / `set` on properties)yesyesyesyes#3145 -PHP 8.4 asymmetric property visibility (private(set), protected(set), etc.)yesyesyesno#3165 +PHP 8.4 asymmetric property visibility (private(set), protected(set), etc.)yesyesyesyes#3165 User __destruct()yesyesyesyes#4096 PHP 8 attributes — `ReflectionClass` / `ReflectionMethod` metadatayesyesyesyes#1936 WeakReference / WeakMapyesyesyesyes#3667 @@ -614,12 +614,15 @@

Stdlib builtins

`krsort`yesyesyesyes— `ksort`yesyesyesyes— `lcfirst`yesyesyesyes— +`lcg_value`yesyesyesyes— `lchgrp`yesyesyesyes— `lchown`yesyesyesyes— `ldexp`yesyesyesyes— `levenshtein`yesyesyesyes— `link`yesyesyesyes— `linkinfo`yesyesyesyes— +`locale_get_default`yesyesyesyes— +`locale_set_default`yesyesyesyes— `localeconv`yesyesyesyes— `localtime`yesyesyesyes— `log`yesyesyesyes— @@ -681,6 +684,7 @@

Stdlib builtins

`mktime`yesyesyesyes— `modf`yesyesyesyes— `move_uploaded_file`yesyesyesyes— +`mt_rand`yesyesyesyes— `mt_srand`yesyesyesyes— `natcasesort`yesyesyesyes— `natsort`yesyesyesyes— @@ -925,6 +929,7 @@

Stdlib builtins

`spl_object_id`yesyesyesyes— `sprintf`yesyesyesyes— `sqrt`yesyesyesyes— +`srand`yesyesyesyes— `sscanf`yesyesyesyes— `stat`yesyesyesyes— `stats_covariance`yesyesyesyes— diff --git a/docs/pages/development-status.md b/docs/pages/development-status.md index 7c1c8405f3..2b3c1cab1f 100644 --- a/docs/pages/development-status.md +++ b/docs/pages/development-status.md @@ -15,7 +15,7 @@ permalink: /development-status.html | **North star** | Compiler compiles itself without Zend ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) | | **v1.1.0 theme** | M5 fast-path stability; enum/property hooks; `preg_match` JIT; `spl_autoload*`; php-in-PHP JIT helpers ([#78](https://github.com/PurHur/php-compiler/issues/78)) | | **Wave 3** | Language **12/12** · Stdlib **13/13** on master ([#1380](https://github.com/PurHur/php-compiler/issues/1380)) | -| **Spine SSOT** | `php script/bootstrap-spine-count.php` → **3992** / **3995** | +| **Spine SSOT** | `php script/bootstrap-spine-count.php` → **4031** / **4031** | | **Builtin matrix** | **852** functions ([`docs/capabilities.md`](https://github.com/PurHur/php-compiler/blob/master/docs/capabilities.md)) | | **Try it** | [`docs/GETTING-STARTED.md`](https://github.com/PurHur/php-compiler/blob/master/docs/GETTING-STARTED.md) | @@ -50,7 +50,7 @@ permalink: /development-status.html ### Still open (high signal) - **MCJIT execute** — `bin/jit.php -r` SIGSEGV ([#98](https://github.com/PurHur/php-compiler/issues/98)) -- **Literal spine ratio** — **3992/3995** ✅ (Jul 2026) +- **Literal spine ratio** — **4031/4031** ✅ (Jul 2026) - **Compile-spine stub retirement** — shrink `PHP_COMPILER_SELFHOST_AOT` on M3 allowlist ([#1402](https://github.com/PurHur/php-compiler/issues/1402)) - **007-ThrowsWeb AOT execute** — invalid POST segfault at runtime (link OK; slice `EXAMPLES_AOT_SMOKE_ONLY=007`) - **LLVM 14+ upgrade** — experimental `script/install-llvm14.sh` ([#174](https://github.com/PurHur/php-compiler/issues/174)) @@ -62,7 +62,7 @@ permalink: /development-status.html - **`phpc` CLI** — `run`, `serve`, `build`, `deploy`, `lint`, `test`, `init`, `doctor` - **Examples 000–009** — VM and AOT link/execute for the curated web subset - **Self-host M0** — `compiler_minimal bundle OK` ✅ -- **Self-host M2** — spine **3992/3995** ✅; native link + lint ✅ +- **Self-host M2** — spine **4031/4031** ✅; native link + lint ✅ - **Self-host M3** — HelloWorld strict `emit_path=native` ✅ ([#1493](https://github.com/PurHur/php-compiler/issues/1493)); inventory argv `bin/compile.php` ✅ ([#3024](https://github.com/PurHur/php-compiler/issues/3024) closed); compile-smoke strict native ✅ ([#1937](https://github.com/PurHur/php-compiler/issues/1937)) - **Self-host M4** — `make bootstrap-loop-probe` full ladder ✅; gen-2→gen-3 full-spine recompile ✅ - **Self-host M5** — vendor prelink **3/3** ✅; **`make north-star5-verify-fast`** daily ✅; `--strict` pre-merge; gen-0 refreshed; VM probe ~**20ms** @@ -92,7 +92,7 @@ See [`docs/bootstrap-selfhost.md`](https://github.com/PurHur/php-compiler/blob/m |-----------|--------| | **M0** — Small `lib/` bundle runs | ✅ | | **M1** — Compiler-shaped bundle + compile-smoke | ✅ | -| **M2** — Spine toward full inventory | ✅ **3992** / **3995** | +| **M2** — Spine toward full inventory | ✅ **4031** / **4031** | | **M3** — Native compiles PHP (no Zend emit) | ✅ Smoke + inventory argv driver strict native | | **M4** — Bootstrap loop (next revision) | ✅ `bootstrap-loop-probe` full ladder | | **M5** — Full self-host, no `vendor/` cold boot | ✅ Presenter strict + compiled-only empty `build/` cold boot ([#3053](https://github.com/PurHur/php-compiler/issues/3053)) | diff --git a/docs/pages/index.html b/docs/pages/index.html index c7b9714eec..306077c0ad 100644 --- a/docs/pages/index.html +++ b/docs/pages/index.html @@ -70,7 +70,7 @@

A compiler for PHP in PHP that compiles itself

VM + JIT + AOT Closures · try/catch 321 builtins - Spine **3992** / **3995** + Spine **4031** / **4031** M5 strict ✅ M3 strict emit MCJIT execute @@ -386,12 +386,12 @@

Self-host progress

Toward full self-host (M5) 100%
-
+

fix/spine-aot-jit-blockers @ a8cffaa0e (15 Jun 2026, LLVM 9). - M2 spine SSOT: php script/bootstrap-spine-count.php**3992** / **3995** Phase A inventory (literal coverage ✅). + M2 spine SSOT: php script/bootstrap-spine-count.php**4031** / **4031** Phase A inventory (literal coverage ✅). M4: make bootstrap-loop-probe full ladder ✅. M5: make north-star5-verify-fast ✅ daily; --strict pre-merge; VM driver probe ~20ms in CI loops. Remaining: MCJIT execute ([#98](https://github.com/PurHur/php-compiler/issues/98)); honest PHP main() in full spine AOT (native bundle-OK probe is bootstrap smoke). @@ -416,7 +416,7 @@

M0–M1

  • M2

    -

    Spine **3992** / **3995** Phase A inventory — literal coverage ✅; native link + lint ✅ +

    Spine **4031** / **4031** Phase A inventory — literal coverage ✅; native link + lint ✅ (#8559).

  • @@ -437,7 +437,7 @@

    M4

    M5

    Vendor prelink 3/3 ✅; committed .o cold boot ✅; - north-star5-verify-fast ✅ daily; --strict pre-merge; spine **3992** / **3995**; prelinked gen-0 refreshed; + north-star5-verify-fast ✅ daily; --strict pre-merge; spine **4031** / **4031**; prelinked gen-0 refreshed; fast VM execute probe (~20ms); compiled-only cold boot via BOOTSTRAP_M5_NO_ZEND=1 ✅ (#3053, #8559, @@ -494,7 +494,7 @@

    Get involved

    PHP compare · Getting started

    - + diff --git a/docs/roadmap-wave3.md b/docs/roadmap-wave3.md index 2067159315..e76aac1ac6 100644 --- a/docs/roadmap-wave3.md +++ b/docs/roadmap-wave3.md @@ -19,7 +19,7 @@ Regenerate capability truth: `php script/capability-matrix.php`, `php script/cap Related merges outside this wave: `goto` ([#1228](https://github.com/PurHur/php-compiler/issues/1228) / [#1333](https://github.com/PurHur/php-compiler/pull/1333)), anonymous classes ([#1233](https://github.com/PurHur/php-compiler/issues/1233) / [#1386](https://github.com/PurHur/php-compiler/pull/1386)). -**M2 spine:** **3992** / **3995** (`php script/bootstrap-spine-count.php`) — full Phase A inventory in `compiler_lib_spine_smoke`; coverage sync ✅ (`check-selfhost-spine-coverage-sync.php`). Native spine **link** + **lint** ✅ ([#2134](https://github.com/PurHur/php-compiler/issues/2134), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). **M5 daily gate:** `make north-star5-verify-fast` + VM probe ~20ms ([#2201](https://github.com/PurHur/php-compiler/issues/2201)); `--strict` pre-merge only. M4 gen-2→gen-3 recompile ✅. Target doc: [self-host-target.md](self-host-target.md) +**M2 spine:** **4031** / **4031** (`php script/bootstrap-spine-count.php`) — full Phase A inventory in `compiler_lib_spine_smoke`; coverage sync ✅ (`check-selfhost-spine-coverage-sync.php`). Native spine **link** + **lint** ✅ ([#2134](https://github.com/PurHur/php-compiler/issues/2134), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). **M5 daily gate:** `make north-star5-verify-fast` + VM probe ~20ms ([#2201](https://github.com/PurHur/php-compiler/issues/2201)); `--strict` pre-merge only. M4 gen-2→gen-3 recompile ✅. Target doc: [self-host-target.md](self-host-target.md) ## Language (#1354–#1366) diff --git a/docs/self-host-target.md b/docs/self-host-target.md index 96fd568d1d..f553f2b348 100644 --- a/docs/self-host-target.md +++ b/docs/self-host-target.md @@ -79,7 +79,7 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to | Indicator | Formula | Jun 2026 | |-----------|---------|----------| -| **M2 spine progress** | `require_once` units in `compiler_lib_spine_smoke` ÷ Phase A inventory file count | **3992 / 3995** (`php script/bootstrap-spine-count.php`) | +| **M2 spine progress** | `require_once` units in `compiler_lib_spine_smoke` ÷ Phase A inventory file count | **4031** / **4031** (`php script/bootstrap-spine-count.php`) | | **Public “Self-host” row** | Same M2 ratio until M3–M5 gates add weight ([`development-status.md`](pages/development-status.md)) | **~97%** | | **M5 vendor prelink** | `object_ok` packages ÷ 3 | **3 / 3** (cfg, types, llvm) | | **Composite (internal)** | Milestone weights in table above (M0–M1 = 100%, M2 = spine %, M3–M5 = gate %) | **~90%** | diff --git a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha index 19aba6ff2f..677cdb9cd4 100755 --- a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha +++ b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha @@ -1 +1 @@ -1b17133a550f88642bc3ebee03f98beafda2dd06 \ No newline at end of file +c273dbba76f4aa8178efa9c664fd030270de392a \ No newline at end of file diff --git a/prelinked/bootstrap-gen0/manifest.json b/prelinked/bootstrap-gen0/manifest.json index a456a52247..1efa4a5879 100644 --- a/prelinked/bootstrap-gen0/manifest.json +++ b/prelinked/bootstrap-gen0/manifest.json @@ -1,6 +1,6 @@ { "version": 1, - "generated_at": "2026-07-04T07:29:38+00:00", + "generated_at": "2026-07-04T20:58:52+00:00", "driver": "prelinked/bootstrap-gen0/bin-compile-aot", "compiler_minimal_sidecar": "prelinked/bootstrap-gen0/compiler_minimal_aot_blob", "compiler_lib_sidecar": "prelinked/bootstrap-gen0/compiler_lib_aot_blob", diff --git a/test/selfhost/compiler_lib_spine_smoke/main.php b/test/selfhost/compiler_lib_spine_smoke/main.php index f7f1f628cb..7da3e7d242 100644 --- a/test/selfhost/compiler_lib_spine_smoke/main.php +++ b/test/selfhost/compiler_lib_spine_smoke/main.php @@ -160,6 +160,7 @@ require_once __DIR__.'/../../../ext/dom/ElementGetAttributeNode.php'; require_once __DIR__.'/../../../ext/dom/ElementGetElementsByTagName.php'; require_once __DIR__.'/../../../ext/dom/ElementGetElementsByTagNameNS.php'; +require_once __DIR__.'/../../../ext/dom/ElementInsertAdjacentHTML.php'; require_once __DIR__.'/../../../ext/dom/ElementHasAttribute.php'; require_once __DIR__.'/../../../ext/dom/ElementHasAttributeNS.php'; require_once __DIR__.'/../../../ext/dom/ElementRemoveAttribute.php'; @@ -462,17 +463,20 @@ require_once __DIR__.'/../../../ext/session/SessionFileStorage.php'; require_once __DIR__.'/../../../ext/session/session_abort.php'; require_once __DIR__.'/../../../ext/session/session_cache_expire.php'; +require_once __DIR__.'/../../../ext/session/session_cache_limiter.php'; require_once __DIR__.'/../../../ext/session/session_commit.php'; require_once __DIR__.'/../../../ext/session/session_create_id.php'; require_once __DIR__.'/../../../ext/session/session_decode.php'; require_once __DIR__.'/../../../ext/session/session_destroy.php'; require_once __DIR__.'/../../../ext/session/session_encode.php'; require_once __DIR__.'/../../../ext/session/session_gc.php'; +require_once __DIR__.'/../../../ext/session/session_get_cookie_params.php'; require_once __DIR__.'/../../../ext/session/session_id.php'; require_once __DIR__.'/../../../ext/session/session_module_name.php'; require_once __DIR__.'/../../../ext/session/session_name.php'; require_once __DIR__.'/../../../ext/session/session_regenerate_id.php'; require_once __DIR__.'/../../../ext/session/session_reset.php'; +require_once __DIR__.'/../../../ext/session/session_set_cookie_params.php'; require_once __DIR__.'/../../../ext/session/session_start.php'; require_once __DIR__.'/../../../ext/session/session_status.php'; require_once __DIR__.'/../../../ext/session/session_unset.php'; @@ -1603,6 +1607,7 @@ require_once __DIR__.'/../../../ext/standard/VmPregBacktrackLimitException.php'; require_once __DIR__.'/../../../ext/standard/VmPregEngine.php'; require_once __DIR__.'/../../../ext/standard/VmPregFailure.php'; +require_once __DIR__.'/../../../ext/standard/VmPregJitStackLimitException.php'; require_once __DIR__.'/../../../ext/standard/VmPregLimits.php'; require_once __DIR__.'/../../../ext/standard/VmPregMatches.php'; require_once __DIR__.'/../../../ext/standard/VmPregNative.php'; @@ -2900,6 +2905,8 @@ require_once __DIR__.'/../../../lib/JIT/Builtin/ParseUrl.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/ParseUrlComponentJit.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/ParseUrlRuntime.php'; +require_once __DIR__.'/../../../lib/JIT/Builtin/ParamSensitiveLookupRuntime.php'; +require_once __DIR__.'/../../../lib/JIT/Builtin/ParamSensitiveLowering.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/PasswordCryptoRuntime.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/PendingHeaders.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/PendingHeadersJitBridge.php'; @@ -3272,6 +3279,7 @@ require_once __DIR__.'/../../../lib/JIT/Call/ReflectionEnumIsBacked.php'; require_once __DIR__.'/../../../lib/JIT/Call/ReflectionEnumUnitCaseGetName.php'; require_once __DIR__.'/../../../lib/JIT/Call/ReflectionMethodGetAttributes.php'; +require_once __DIR__.'/../../../lib/JIT/Call/ReflectionParameterIsSensitiveParameter.php'; require_once __DIR__.'/../../../lib/JIT/Call/ReflectionPropertyConstruct.php'; require_once __DIR__.'/../../../lib/JIT/Call/ReflectionPropertyGetAttributes.php'; require_once __DIR__.'/../../../lib/JIT/Call/RuntimeIndirectClosureCall.php'; diff --git a/test/unit/BootstrapSelfhostBundleTest.php b/test/unit/BootstrapSelfhostBundleTest.php index 4e884bd98d..8d5845063f 100644 --- a/test/unit/BootstrapSelfhostBundleTest.php +++ b/test/unit/BootstrapSelfhostBundleTest.php @@ -505,7 +505,7 @@ public function testCompilerLibSpineSmokeBundleUnitCountAndKeyUnits(): void $this->assertFileExists($entry); $contents = (string) file_get_contents($entry); $count = bootstrap_spine_counts(self::$root)['spine']; - $this->assertSame(3992, $count, 'M2 spine require_once units track Phase A inventory (#8559, #9234, #11629)'); + $this->assertSame(4031, $count, 'M2 spine require_once units track Phase A inventory (#8559, #9234, #11629)'); foreach (self::LIB_SPINE_SMOKE_NEW_UNITS as $unit) { $this->assertStringContainsString( "require_once __DIR__.'/../../../{$unit}';",