Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 **3670**/**3670** · **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 **3673**/**3673** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms**

---

Expand All @@ -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 **3670**/**3670**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **3673**/**3673**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |

### What you can rely on today

Expand All @@ -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** | ✅ **3670**/**3670** | Full Phase A inventory in spine smoke; native link + lint ✅ |
| **M2** | ✅ **3673**/**3673** | 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 |
Expand Down Expand Up @@ -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 **3670**/**3670**; 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 **3673**/**3673**; 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**

Expand Down
33 changes: 20 additions & 13 deletions docs/bootstrap-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php`

| Metric | Count |
|--------|------:|
| PHP files on vm.php path | 3672 |
| Phase A inventory files (M2 ratio SSOT) | 3672 |
| PHP files on vm.php path | 3673 |
| Phase A inventory files (M2 ratio SSOT) | 3673 |
| Phase A ratio-deferred paths | 0 |
| Source constructs flagged (blockers) | 0 |
| Source constructs flagged (warnings) | 10005 |
| Source constructs flagged (warnings) | 10007 |

## Compiler CFG gaps (`lib/Compiler.php`)

Expand Down Expand Up @@ -2386,6 +2386,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
| `lib/Compiler/TypedClassConstInheritCheck.php` | 0 | 5 |
| `lib/CompilerVersion.php` | 0 | 1 |
| `lib/CurlyBraceOffsetRejector.php` | 0 | 2 |
| `lib/DnfParenIntersectionSyntaxRejector.php` | 0 | 2 |
| `lib/DnfType.php` | 0 | 2 |
| `lib/Doctor.php` | 0 | 1 |
| `lib/EncapsedCoalesceRejector.php` | 0 | 2 |
Expand Down Expand Up @@ -18461,7 +18462,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `lib/Ast/DnfParenTypeRewriter.php`

**Warnings** (review for bootstrap subset):
- 12 class method(s)
- 15 class method(s)

### `lib/Ast/EncapsedCoalesceDesugar.php`

Expand Down Expand Up @@ -19376,14 +19377,20 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `lib/CompilerVersion.php`

**Warnings** (review for bootstrap subset):
- 71 class method(s)
- 72 class method(s)

### `lib/CurlyBraceOffsetRejector.php`

**Warnings** (review for bootstrap subset):
- new CompileFatal (line 67)
- 8 class method(s)

### `lib/DnfParenIntersectionSyntaxRejector.php`

**Warnings** (review for bootstrap subset):
- new CompileFatal (line 28)
- 1 class method(s)

### `lib/DnfType.php`

**Warnings** (review for bootstrap subset):
Expand Down Expand Up @@ -24137,14 +24144,14 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
- new ext\standard\Module (line 242)
- new JIT (line 318)
- new JITContext (line 332)
- new SealedClassPreprocessor (line 375)
- new StaticClassPreprocessor (line 378)
- new SourcePreprocessor\PropertyHooks (line 381)
- new State (line 504)
- new ReflectionProperty (line 531)
- new ReflectionProperty (line 534)
- new LintCompiler (line 925)
- new Variable (line 1052)
- new SealedClassPreprocessor (line 376)
- new StaticClassPreprocessor (line 379)
- new SourcePreprocessor\PropertyHooks (line 382)
- new State (line 505)
- new ReflectionProperty (line 532)
- new ReflectionProperty (line 535)
- new LintCompiler (line 926)
- new Variable (line 1053)
- 53 class method(s)

### `lib/RuntimeStrictness.php`
Expand Down
4 changes: 2 additions & 2 deletions docs/bootstrap-profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -3900,9 +3900,9 @@
"test/bootstrap-aot/lib_opcode/main.php"
],
"totals": {
"inventory_files": 3670,
"inventory_files": 3673,
"excluded": 0,
"eligible": 3670,
"eligible": 3673,
"aot_lint_targets": 111,
"aot_link_targets": 98,
"aot_link_lib_targets": 1
Expand Down
2 changes: 1 addition & 1 deletion docs/bootstrap-selfhost.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)).

**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:** **3670** / **3670** 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:** **3673** / **3673** 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

Expand Down
6 changes: 3 additions & 3 deletions docs/pages/development-status.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` → **3670** / **3670** |
| **Spine SSOT** | `php script/bootstrap-spine-count.php` → **3673** / **3673** |
| **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) |

Expand Down Expand Up @@ -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** — **3670/3670** ✅ (Jul 2026)
- **Literal spine ratio** — **3673/3673** ✅ (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))
Expand All @@ -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 **3670/3670** ✅; native link + lint ✅
- **Self-host M2** — spine **3673/3673** ✅; 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**
Expand Down
12 changes: 6 additions & 6 deletions docs/pages/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ <h1>A compiler for PHP in PHP that compiles itself</h1>
<span class="badge badge--live">VM + JIT + AOT</span>
<span class="badge badge--live">Closures · try/catch</span>
<span class="badge badge--live">321 builtins</span>
<span class="badge badge--live">Spine **3670**/**3670**</span>
<span class="badge badge--live">Spine **3673**/**3673**</span>
<span class="badge badge--live">M5 strict ✅</span>
<span class="badge badge--live">M3 strict emit</span>
<span class="badge badge--wip">MCJIT execute</span>
Expand Down Expand Up @@ -386,12 +386,12 @@ <h2>Self-host progress</h2>
<span>Toward full self-host (M5)</span>
<span class="overall-progress__pct">100%</span>
</div>
<div class="progress-track" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" aria-label="Self-host spine ratio 3670 of 3670 Phase A inventory files">
<div class="progress-track" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" aria-label="Self-host spine ratio 3673 of 3673 Phase A inventory files">
<div class="progress-fill" data-width="100" style="width: 0"></div>
</div>
<p class="overall-progress__note">
<code>fix/spine-aot-jit-blockers</code> @ <a href="https://github.com/PurHur/php-compiler/commit/a8cffaa0e">a8cffaa0e</a> (15 Jun 2026, LLVM 9).
M2 spine SSOT: <code>php script/bootstrap-spine-count.php</code> → <strong>**3670**/**3670**</strong> Phase A inventory (literal coverage ✅).
M2 spine SSOT: <code>php script/bootstrap-spine-count.php</code> → <strong>**3673**/**3673**</strong> Phase A inventory (literal coverage ✅).
M4: <code>make bootstrap-loop-probe</code> full ladder ✅.
M5: <code>make north-star5-verify-fast</code> ✅ daily; <code>--strict</code> pre-merge; VM driver probe ~<strong>20ms</strong> in CI loops.
Remaining: MCJIT execute ([#98](https://github.com/PurHur/php-compiler/issues/98)); honest PHP <code>main()</code> in full spine AOT (native bundle-OK probe is bootstrap smoke).
Expand All @@ -416,7 +416,7 @@ <h4>M0–M1</h4>
<li class="is-done">
<span class="ladder__marker" aria-hidden="true">✓</span>
<h4>M2</h4>
<p>Spine <strong>**3670**/**3670**</strong> Phase A inventory — literal coverage ✅; native link + lint ✅
<p>Spine <strong>**3673**/**3673**</strong> Phase A inventory — literal coverage ✅; native link + lint ✅
(<a href="https://github.com/PurHur/php-compiler/issues/8559">#8559</a>).</p>
</li>
<li class="is-done">
Expand All @@ -437,7 +437,7 @@ <h4>M4</h4>
<span class="ladder__marker" aria-hidden="true">✓</span>
<h4>M5</h4>
<p>Vendor prelink <strong>3/3</strong> ✅; committed <code>.o</code> cold boot ✅;
<code>north-star5-verify-fast</code> ✅ daily; <code>--strict</code> pre-merge; spine <strong>**3670**/**3670**</strong>; prelinked gen-0 refreshed;
<code>north-star5-verify-fast</code> ✅ daily; <code>--strict</code> pre-merge; spine <strong>**3673**/**3673**</strong>; prelinked gen-0 refreshed;
fast VM execute probe (~20ms); compiled-only cold boot via <code>BOOTSTRAP_M5_NO_ZEND=1</code> ✅
(<a href="https://github.com/PurHur/php-compiler/issues/3053">#3053</a>,
<a href="https://github.com/PurHur/php-compiler/issues/8559">#8559</a>,
Expand Down Expand Up @@ -494,7 +494,7 @@ <h2>Get involved</h2>
<a href="capability-comparison.html">PHP compare</a> ·
<a href="https://github.com/PurHur/php-compiler/blob/master/docs/GETTING-STARTED.md">Getting started</a>
</p>
<p class="footer-meta">Site: docs/pages/ · Updated 15 Jun 2026 · Spine **3670**/**3670** · M4 loop ✅ · M5 strict ✅</p>
<p class="footer-meta">Site: docs/pages/ · Updated 15 Jun 2026 · Spine **3673**/**3673** · M4 loop ✅ · M5 strict ✅</p>
</footer>

<script src="js/main.js" defer></script>
Expand Down
2 changes: 1 addition & 1 deletion docs/roadmap-wave3.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:** **3670** / **3670** (`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:** **3673** / **3673** (`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)

Expand Down
Loading