Skip to content

Latest commit

 

History

History
179 lines (156 loc) · 36.9 KB

File metadata and controls

179 lines (156 loc) · 36.9 KB

Language construct capability matrix

Auto-generated by script/capability-syntax.php. Do not edit by hand.

User-defined classes, methods, visibility, instanceof, match, and arrow functions. Builtin functions are in capabilities.md.

Tracking issues: #58, #145, #138, #568 (link closed), #764 (execute closed), #143, #142, #199.

Construct VM JIT AOT Issue Notes
class / new yes yes yes #58 compliance PHPT; bootstrap AOT; AOT PHPT
Anonymous class new class { } yes yes yes #1233 php-cfg inline Stmt\Class_ in parseExpr_New; Zend @anonymous\0path:line$id name (#4510, #6281 get_class/static::class); AOT: user AnonymousClass@* methods lowered when PHP_COMPILER_SELFHOST_AOT=1 (#3098)
Enum declarations enum Foo: string { case Bar = 'x'; } yes yes yes #1356 Backed enum case objects with ->name / ->value; echo $case throws Error (#4891); double-quoted "$case" throws Error (#4785); Foo::Bar singleton fetch; enum_exists registry; implements interface list + instance methods + instanceof (#3373); static methods (#2299); Enum::cases() JIT (#3308, #4068); AOT fixture enum_backed.phpt (#3076); BackedEnum::from() / tryFrom() VM + JIT lookup with Zend-parity ValueError (#3114, #4053); compliance PHPT; AOT PHPT
Abstract enum abstract enum E { case A; } yes yes yes #3737 Source rewriter + php-cfg flags; new E() fatals; case fetch works on VM
Instance methods (ClassMethod / Expr_MethodCall) yes yes yes #58 MiniWebApp $router->dispatch() (#2059); compliance PHPT; bootstrap AOT; AOT PHPT
Static methods on user classes (Expr_StaticCall) yes yes yes #2209 Public static methods without $this; Router::fromConfig() factory (#2059); Late static static::method() tracked separately (#1231)
Constructors (__construct) yes yes yes #145 Router __construct(array $config) (#2059); compliance PHPT; bootstrap AOT; AOT PHPT
clone + __clone() magic method yes yes yes #3170 Zend zend_std_clone_object: shallow copy then __clone when defined; VM invokePhpFunction; JIT invokeCloneMagicIfPresent after cloneObject; compliance PHPT
PHP 8.3+ clone $obj with { prop: $value } yes yes yes #4513 Ast\CloneWithDesugar before php-parser (#4513); lowers to IIFE clone + property writes; Zend/zend_language_parser.y clone_expr with clause; zend_clones.c property overrides; compliance PHPT
Magic methods __get / __set / __call / __toString yes yes yes #146 Zend zend_object_handlers.c: zend_std_read_property, zend_std_write_property, zend_std_get_method, __toString cast; VM slow path on undeclared property read/write and missing method call; JIT MagicMethodDispatch (#4022, #4066 dynamic $obj->$name); __callStatic (#3273) VM-only; compliance PHPT
Private methods yes yes yes #145 Router private render* paths (#2059); compliance PHPT; bootstrap AOT; AOT PHPT
Property fetch $this->x yes yes yes #58 compliance PHPT; bootstrap AOT; AOT PHPT
Constructor property promotion yes yes yes #1359 Promoted params declare property + assign in __construct
Method return types (: string / : void) yes yes yes #55 #55 native : string/: int/: bool/: float/: array/: ?T LLVM returns; MCJIT execute #2055; compliance PHPT; bootstrap AOT; AOT PHPT
Dynamic property access $obj->$name yes yes yes #1227 JIT compares runtime name to declared properties; unknown names abort at runtime; compliance PHPT; AOT PHPT
Variable function call $fn() yes yes yes #56 VM resolves callee at runtime; JIT when callee name is compile-time string in variable (#56)
Native user-class link (phpc build --project) yes yes yes #764 AOT link yes (#568 closed); native execute ✅ (#764 closed); compliance PHPT; bootstrap AOT; AOT PHPT
instanceof yes yes yes #138 compliance PHPT; bootstrap AOT; AOT PHPT
instanceof union RHS `(A B)` yes yes yes #3461
PHP 8.3+ in operator ($needle in $haystack) yes yes yes #4682 Ast\InOperatorDesugar + InOperatorResolver (#4682); VM InOperator::contains (===); JIT TYPE_IN via ArrayBuiltinHelper::inArray strict (#4716); EnumInOperatorJitCompileTest; compliance PHPT; bootstrap AOT; AOT PHPT
match expression yes yes yes #143 Lowered in php-cfg to === / jump-if / assign (#143); Wave-3 literal-arm subset (#2398); acceptance PHPT (#2428); Guard arms: expression patterns evaluated before === compare; nested match patterns (#3397); match_guard.phpt; Enum case arms: === identity on case singletons, not backed scalar (#4274); match_enum_case.phpt; Arm assignment side effects bind variables when arm matches (#3787); match_arm_assign.phpt; compliance PHPT; bootstrap AOT; AOT PHPT
Closures function () { } / use ($var) yes yes yes #72 VM ClosureState + __invoke; Closure::bind/bindTo (#3266, #3673); JIT bindTo/bind + bound invoke via ClosureBindHelper (#4192); use() by-value and by-ref (#3081, #3108); array_map/filter/usort callbacks (#3086); JIT ClosureHelper: TYPE_CLOSURE + use() value/ref IR (#3092, #3108); use ($x) MCJIT snapshot via aliasVariableOpFromSlot (#2483); use (&$x) MCJIT via valueBoxAliasPtr (#72, #4625); indirect $arr0 via __closure_target (#3089, #3092); AOT user scripts: real ClosureHelper lowering via PHP_COMPILER_AOT_USER_SCRIPT (#3725); use (&$x) AOT fixture closure_use_byref.phpt (#2483); bootstrap spine still stubs null; bin/jit.php MCJIT execute still probe-dependent (#98); compliance PHPT; AOT PHPT
Arrow functions fn () => yes yes yes #142 Desugars to TYPE_CLOSURE (#142); VM + JIT + AOT same as closures (#3725); compliance PHPT; AOT PHPT
Generators (yield / foreach) yes yes yes #167 VM GeneratorState + foreach; keyed yield (#3085); MCJIT/AOT resume lowering for nested generator funcs (#3074, #3115); script-scope yield blocked; JIT linear yield + yield from array/generator delegation (#3074, #4014); try/catch in generator bodies via resume prefixes (#4069); see docs/generators-jit-aot.md; AOT fixture generator_yield.phpt + generator_yield_keys.phpt; compliance PHPT; AOT PHPT
Fibers (Fiber, Fiber::suspend(), start/resume) yes yes yes #3130 VM FiberState + builtin Fiber class (#3130); php-src Zend/zend_fibers.c; JIT/AOT resume lowering (#4019); MCJIT execute green for nested callbacks (#6437); script-scope suspend still VM-fallback via Block::containsFiberSuspendOpcodesInScriptScope (#4097)
ClassName::class / static::class yes yes yes #740 Compile-time class name string; related to CLASS (#199); compliance PHPT; bootstrap AOT; AOT PHPT
Class member constants public / private / protected const yes yes yes #2199 MiniWebApp Router::DEFAULT_CONTACT_NAME_MAX (#2059); JIT: literal class + dynamic const name (#3150); runtime $class::CONST class operand (#4095); compliance PHPT; bootstrap AOT; AOT PHPT
PHP 8.3 typed class constants (const array X = [1,2];, const string S = 'a';) yes yes yes #3592 Compile-time literal fold for array/scalar const values; typed mismatch is compile-time TypeError; JIT lowers immutable array constants (#3592); Typed trait constants enabled on 8.3+ target (#5993); rejected on 8.2 (Zend parse error parity, #5212)
PHP 8.3+ file/namespace typed constants (const string X = 'a';) yes yes yes #7081 GlobalTypedConstRewriter + PHPCfg marker for nikic/php-parser 4.x; compile-time type check reuses class-const path
PHP 8.3 typed interface constants (interface I { public const string X = 'a'; }) yes yes yes #5980 Implements/inheritance typed constant compatibility enforced at compile time (#5953, #5980).; compliance PHPT
Class constants with new object expressions (PHP 8.3) yes yes yes #3196 Zend zend_compile_const_expr / zend_constants.c — materialize at class definition; shared identity on fetch; VM: ClassConstMaterializer; JIT/AOT: module-global singleton in init (#4021, #4028); MCJIT: ClassConstObjectJitCompileTest + ClassConstObjectJitExecuteTest
Late static binding static::method() / static::class yes yes yes #1231 VM/JIT called-class propagation; parent::method/class/$prop and static:: LSB (#1858, #3093); child method override AOT fixture extends_method_override.phpt (#2483)
new static() and : static return type (late-bound class) yes yes yes #3412 VM resolveClassScopeName on TYPE_NEW; returnTypeStatic verify (#3412)
Magic constants __CLASS__, __METHOD__, __FUNCTION__ yes yes yes #199 Lowered at parse time via php-cfg MagicStringResolver; compliance PHPT
Magic constant __NAMESPACE__ yes yes yes #199 Requires namespace declaration (#84); compliance PHPT
Magic constants __DIR__, __FILE__ yes yes yes #707 VM script stack on include; JIT uses per-unit script path; compliance PHPT; bootstrap AOT
Magic constant __LINE__ yes yes yes #715 Per-site line on TYPE_SCRIPT_MAGIC; include stack for multi-file units; compliance PHPT
Literal include/require with __DIR__ yes yes yes #475 Compile-time inlining via IncludeHelper; two-file PHPT + MiniWebApp JIT gate (#587)
foreach by-reference (&$v) yes yes yes #1222 Packed and string-keyed arrays; VM + JIT/AOT lowering (#1222, #4364); AOT: borrowed hashtable entry refs skip valueDelref (IteratorHelper); AOT PHPT: foreach_by_ref.phpt, foreach_by_ref_assoc.phpt
foreach over Iterator / IteratorAggregate objects yes yes yes #4067 VM + JIT/AOT call rewind/valid/current/key/next (Zend zend_iterators.c parity); IteratorProtocolHelper + IteratorHelper (#4011); IteratorAggregate::getIterator(); TypeError for non-iterable objects; compliance foreach_iterator_jit.phpt
ArrayAccess interface — $obj[$key] read/write/isset/unset yes yes yes #3331 VM dispatches offsetGet/Set/Exists/Unset (Zend zend_object_handlers.c read_dimension); JIT ArrayAccessHelper + RuntimeIndirectInstanceMethodCall (#4012); Non-ArrayAccess objects keep Illegal offset (abort); compliance PHPT
By-reference parameters (function f(&$x)) yes yes yes #140 VM TYPE_INDIRECT; JIT aliases caller value* via paramByRef (#3161); Return-by-ref function &f() + $x = &f() on VM (#3414)
Return-by-reference (function &f() / $x = &f()) yes yes yes #4054 VM + JIT propagate reference cells via FLAG_RETURNS_REF (#3414, #3778); AOT aliases value* return slots (#4054)
Static property Class::$prop yes yes yes #1225 Class-scoped storage; self:: / static::; runtime property name on JIT/AOT (#4597)
Error-control operator @ on expressions yes yes yes #3546 php-cfg ErrorSuppressBlock + Simplifier preserve (#3546); VM masks error_reporting; JIT/AOT __compiler_begin_silence / __compiler_end_silence (#4070)
unset() on variables, array offsets, and object properties yes yes yes #2273 Locals, $this->prop, public properties, string/int keys (#1224); Static properties via TYPE_STATIC_PROPERTY_UNSET (#2256)
Function-local static $var / static $var = <literal> yes yes yes #2286 Compile-time literal init (int/string/array) plus runtime constant init (new, etc.) — VM + JIT + AOT (#4352, #4027); Uninitialized static $x; with isset guard — Zend parity (#3533); static &$x is not valid PHP syntax (php-src static_var grammar)
Keyed array destructuring (["a" => $x]) yes yes yes #1234 Skip string-key CFG split for fetch+assign destructuring pairs (#1234)
goto / labels (function scope) yes yes yes #1228 php-cfg lowers labels to CFG Jump; VM avoids frame nesting on same-block back-edges; AOT native execute via TYPE_JUMP lowering (issue #4042); compliance PHPT; AOT PHPT
declare(strict_types=1) scalar parameter checks yes yes yes #1229 VM #156; JIT enforces at user call sites via JIT\TypeCheck + Native::compileArg weak casts
PHP 8.3+ generic array types list<T> / array<K,V> (parameters and properties) yes yes yes #3705 Source rewrite to magic identifier types for php-parser v4; VM list shape check (#3705); Zend generic-array RFC not merged in php-src 8.4 — parity target is proposed list/array forms
Variable variables ($$name) yes yes yes #1226 php-cfg nests Operand\Variable name; VM resolves runtime local by name; JIT compile-time name fold (#1226); compliance PHPT
Variable function calls ($fn()) yes yes yes #56 VM resolves callee at runtime; compiler folds literal assignment; JIT uses compile-time string
Invokable objects ($obj() / __invoke) yes yes yes #1232 Object-typed FuncCall lowered to __invoke method dispatch; VM runtime fallback
First-class callable syntax (foo(...), Class::m(...)) yes yes yes #1363 php-cfg Expr_FirstClassCallable (#1230); VM/JIT TYPE_FROM_CALLABLE → Closure (#4810); Instance method $obj->m(...) VM + JIT bound [object, method] array callable (#3566, #4040); JIT folds strlen(...) / Class::m(...) via compileTimeString assign chains (#1363); php-types TypeReconstructor patch for Expr_FirstClassCallable (#2315)
PHP 8.5 pipe operator (` >`) yes yes yes #7219
use function / use const imports yes yes yes #2325 php-cfg resolves imported names at parse time; no Stmt_Use lowering required
Namespace group use (use Foo\{Bar, Baz}) yes yes yes #2443 PhpParser Stmt_GroupUse; NameResolver registers aliases; GroupUseStripper before PHPCfg
Flexible heredoc/nowdoc indentation stripping (PHP 7.3+) yes yes yes #3636 php-parser Emulative FlexibleDocStringEmulator + parseDocString stripIndentation (#3636); Indented closing label sets docIndentation column; basic heredoc/nowdoc #178; Zend/zend_language_scanner.l flexible heredoc/nowdoc parity; compliance PHPT
never return type yes yes yes #1358 php-cfg Op\Type\Never_; any return in body is a compile error; normal completion via throw/exit
Intersection types (A&B) yes yes yes #1357 php-cfg Op\Type\Intersection; VM checks object implements each interface at call
DNF types (`(A&B) null`, union of intersections) yes yes yes #3094
trait declarations with method bodies yes yes yes #2312 VM registers traits in class table with isTrait; trait use in classes is #144; interface_exists/trait_exists distinguish from class_exists
Simple use Trait; in class body yes yes yes #2314 php-cfg-trait-use.patch; VM merges trait methods into class; JIT/AOT alias trait-merged methods onto using class (#3789); TraitUseAdaptation alias/insteadof/visibility on VM (#3238, #144); Horizontal trait method collision fatals at compile time (#3416)
Trait use adaptations (as rename, insteadof precedence) yes yes yes #3238 Zend/zend_compile.c trait alias/precedence; VM applyTraitUsesWithAdaptations; JIT/AOT batch trait use with insteadof/as (#2483, #3238); Visibility `as private
Built-in LazyGhostTrait marker (PHP 8.4 lazy objects) yes yes yes #6096 Zend/zend_lazy_objects.c — internal empty trait; trait_exists true; use in class bodies; ReflectionClass::newLazyGhost on trait-marked classes (#5968)
Array/argument unpack ...$x yes yes yes #1361 php-cfg spread.patch (#141); VM HashTable::spreadFrom; JIT HashTableHelper::spreadInto + mergeCallArgEntries; compliance PHPT; AOT PHPT
__serialize / __unserialize magic methods yes yes yes #1365 serialize()/unserialize() call __serialize/__unserialize when present; VM via VmSerialize (#3368)
Multi-type catch `catch (A B $e)` yes yes yes #1362
try / catch / throw yes yes yes #57 throw lowering #195; php-cfg TryCatch overlay (#2084); VM TYPE_TRY/CATCH/THROW/FINALLY; VM finally-before-catch + return-through-finally (#3081, #3106); TryCatchComplianceTest (10 tests); JIT TryCatchHelper IR verify (#3107); bin/jit.php VM fallback via requiresVmLowering (#2114); MCJIT execute probe TryCatchJitExecuteTest; compliance PHPT; bootstrap AOT; AOT PHPT
throw expressions (PHP 8.0) — throw in expression context yes yes yes #3802 php-cfg Op\Expr\Throw_ overlay (#3802); php-types Expr_Throw type reconstructor patch; Compiler: skip duplicate New before Throw; fresh slot for ?: merge; ?? RHS via compileThrowExpression; VM/JIT reuse TYPE_THROW; compliance throw_expression.phpt (?:, ??, &&); AOT: splitMergeBeforeNestedTry for sequential try merge (#4041); JitThrow LLVM pending globals in standalone; compliance PHPT
readonly classes yes yes yes #1360 php-cfg Class_::flags MODIFIER_READONLY; VM rejects instance property writes after __construct; JIT ReadonlyClassGuard + readonlyClassIds; bin/jit.php VM fallback via containsReadonlyClassOpcodes (#4082); AOT pending raise + phpc_jit_abort_if_pending_logic_exception; compliance readonly_class_jit.phpt; php-src: Zend/zend_object_handlers.c readonly class write guard
readonly properties (per-property) yes yes yes #3149 php-cfg readonly / propertyFlags MODIFIER_READONLY; VM/JIT reject writes and unset() after __construct; JIT ReadonlyClassGuard IR + ReadonlyPropertyTest; MCJIT execute + compliance phpt; php-src: Zend/zend_object_handlers.c zend_std_write_property / zend_std_unset_property
Property hooks (get / set on properties) yes yes yes #3145 SourcePreprocessor lowers hooks to _phpc_property* methods (#3145); Promoted constructor parameters with hook blocks preprocess to promoted param + _phpc_property* methods (#7313); VM dispatches set/get on property access; JIT PropertyHookDispatch (#3723); Static property hooks rejected at compile time (#6619, php-src 8.4 zend_compile.c); AOT: user-class hook methods lower under PHP_COMPILER_SELFHOST_AOT; set-hook smoke in property_hook_set.phpt; JIT: raw backing access in hook bodies via jitPropertyHookRawProperty (set + get methods, #4025, #4205)
PHP 8.4 asymmetric property visibility (private(set), protected(set), etc.) yes yes yes #3165 Ast\AsymmetricVisibilityRewriter normalizes private(set) for php-parser 4.x; VM/JIT enforce set visibility with catchable Error (#3165, #4020); php-src: Zend/zend_compile.c ZEND_ACC_*_SET; AsymmetricVisibilityGuard + AsymmetricVisibilityJitCompileTest (#4020)
User __destruct() yes yes yes #4096 VM refcount + shutdown pass (#3144); unset/end-of-scope invoke before later statements (#4096); JIT/AOT: __object__invoke_destructor + phpc_destruct_try_invoke on delref; shutdown via phpc_gc_run_shutdown_destructors (#4013); AOT unset($o) before later statements verified (destruct_unset_echo_4096.php, class_destruct_user.phpt); Cyclic graphs: Zend defers __destruct until gc_collect_cycles(); refcount-zero path runs immediately — see #4023 for gc JIT/AOT; MCJIT execute deferred when harness MCJIT unstable (#98)
PHP 8 attributes — ReflectionClass / ReflectionMethod metadata yes yes yes #1936 php-cfg preserves attrGroups; compiler stores attribute class names on TYPE_DECLARE_CLASS / TYPE_DECLARE_METHOD; VM reflection reads from VM ClassEntry; JIT/AOT mirror class+method attribute tables into VMContext for reflection; Read path: getAttributes() count + ReflectionAttribute::getName() + newInstance() with compile-time ctor args (#3206, #3216); Parameter/property reflection attributes still deferred; JIT newInstance() deferred (#2467)
WeakReference / WeakMap yes yes yes #3667 VM: WeakReference::create/get via indirect target slot; unset clears get immediately; GC-backed weak refs via WeakRefRegistry — referent collected by gc_collect_cycles() clears get(); WeakMap uses object-id string keys; entries removed when key object is collected; JIT: WeakRefRegistryRuntime LLVM registry (#3667, #5684)
Heredoc / nowdoc string literals (<<<LABEL / <<<'LABEL') yes yes yes #3187 php-cfg Scalar_Encapsed → ConcatList; plain heredoc/nowdoc → Scalar_String (#178); PhpParser FlexibleDocStringEmulator (PHP 7.3+ flexible closing labels); php-src Zend/zend_compile.c zend_compile_encapsed_string; compliance PHPT; AOT PHPT
DateTime / DateTimeZone OOP yes no no #3072 VM builtins: DateTime::__construct/format/getTimestamp/setTimezone; DateTimeZone::__construct; Host PHP date extension for parsing/formatting; UTC and named timezone subset (php-src ext/date/php_datetime.c); JIT/AOT method bodies VM-only in phase 1; VM-only lowering

Syntax AOT column reflects Runtime::MODE_AOT compile probes unless a row pins AOT (e.g. native user-class link).

Stdlib array builtins (sort / merge)

Recent stdlib coverage for associative arrays and packed lists. ROADMAP Phase 2/4: #78, assoc arrays #66. Full builtin matrix: capabilities.md.

Builtin VM JIT AOT Issue Notes
ksort() (string/int keys, preserve values) yes yes yes #2271 String-key hashtable + packed list no-op; assoc subset (#66)
krsort() (keys descending) yes yes yes #2282 String-key hashtable; packed list no-op
asort() (values ascending, preserve keys) yes yes yes #2290 Homogeneous string/int values; packed + string-key assoc
arsort() (values descending, preserve keys) yes yes yes #2296 Homogeneous string/int values; packed + string-key assoc
rsort() (values descending, reindex) yes yes yes #2300 Packed homogeneous string/int lists; __hashtable__sortPackedReverse
shuffle() (packed list, Fisher–Yates) yes yes yes #2310 Packed lists without holes; CSPRNG via random_bytes lowering
array_rand() (packed list keys) yes yes yes #2321 Packed lists; num=1 JIT/AOT; num>1 VM-only; CSPRNG via random_bytes
array_merge() on string-key associative arrays yes yes yes #2287 String-key maps; packed list append unchanged

Rows curated from closed stdlib issues (#2271, #2282, #2290, #2296, #2300, #2287); regenerate via php script/capability-syntax.php.

Web north-star (examples/003-MiniWebApp)

PATH_INFO routing, deploy-root includes, and CGI drivers for the reference web app. ROADMAP Phase 3/4: #78, runtime tracker #539. Builtin matrix: capabilities.md.

Construct VM JIT AOT Issue Notes
PATH_INFO / ?route= fallback yes partial partial #489 #489 VM closed; AOT execute ✅ (#764 closed); default-off gates #1760
phpc_deploy_path() + PHPC_DEPLOY_ROOT yes partial partial #585 #585 closed; deploy includes #623; execute ✅ (#764 closed); gates #1760
Runtime template include from deploy tree yes no partial #623 #623 VM/AOT lint; execute ✅ (#764 closed); gates #1760
CGI/1.1 driver (bin/cgi.php) yes n/a n/a #50 #50 VM closed; #656 CgiDriverTest; #666 MiniWebApp PATH_INFO
AOT CGI (cgi-wrapper + phpc cgi) n/a n/a partial #665 #665 closed; 001 green; 003 execute ✅ (#764 closed); #682; gates #1760
FastCGI loop partial n/a partial #173 bin/fcgi.php + phpc fcgi; FASTCGI_SMOKE_GATE=1 (#173, #1899)

Web rows are curated from ROADMAP issue state; native link #568 closed; AOT execute #764 closed; default-off CI gates #1760.

OOP reference (examples/003-MiniWebApp)

Class methods, visibility, constructors, and return types for the MiniWebApp Router. ROADMAP Phase 1/4: #78, acceptance #2059. Builtin matrix: capabilities.md.

Construct VM JIT AOT Issue Notes
003-MiniWebApp Router OOP (VM serve) yes partial yes #2059 #2059 VM OOP e2e; lint zero (#2078); serve smoke default-on; JIT project opt-in (#587)
Public instance methods (Expr_MethodCall) yes partial yes #58 #58 ClassMethod + method dispatch; compliance PHPT; native execute ✅ (#764 closed)
Static methods (Expr_StaticCall) yes partial yes #2209 #2209 user static methods; factory Class::method() + instance chain
Private methods + __construct yes partial yes #145 #145 visibility + ctor; Router private render paths
Method return types (: string / : void) yes yes yes #55 #55 native scalar/array returns; nullable via value*; MCJIT execute #2055

OOP rows are curated from ROADMAP issue state; methods #58; visibility/ctor #145; return types #55. Opt-in gates: MINIWEBAPP_VM_OOP_GATE (#2189), MINIWEBAPP_JIT_PROJECT_GATE (#587); drift guard CAPABILITIES_OOP_SYNC_GATE (#2190).

Sessions reference (examples/005-SessionsWeb)

File-backed $_SESSION flash across HTTP requests for the sessions north-star example. ROADMAP Phase 4/5: #78, tracker #1881. Builtin matrix: capabilities.md.

Construct VM JIT AOT Issue Notes
005-SessionsWeb reference app yes yes yes #1881 #1881 VM serve + session smoke (#1887); AOT link #1946; execute #1891; ci-local gates opt-in (#1923, #1967)
session_start / $_SESSION flash across requests yes yes yes #1938 #1882 JIT; AOT persistence #1938; two-request execute #1891
AOT project link (phpc build --project) n/a n/a yes #1946 ExamplesCompileTest link-before-execute (#1946); SESSIONS_WEB_AOT_LINK_GATE opt-in
AOT CLI execute (two-request session flash) n/a n/a yes #1891 SessionsWebAotExecuteTest; opt-in SESSIONS_WEB_AOT_SMOKE_GATE (#1923)

Sessions rows are curated from ROADMAP issue state; AOT persistence #1938; link #1946; execute #1891. Opt-in ci-local gates: SESSIONS_WEB_AOT_SMOKE_GATE, SESSIONS_WEB_DEPLOY_SMOKE_GATE.

File upload reference (examples/006-FileUploadWeb)

Nested $_FILES and move_uploaded_file() for the multipart upload north-star example. ROADMAP Phase 4/5: #78, tracker #1999. Builtin matrix: capabilities.md.

Construct VM JIT AOT Issue Notes
006-FileUploadWeb reference app yes yes yes #1999 #1999 VM serve + multipart smoke (#2009); AOT link #2011; execute #2012 (FILE_UPLOAD_WEB_AOT_SMOKE_GATE default-on)
multipart $_POST / nested $_FILES (web runtime) yes yes yes #87 #52 multipart POST; #87 nested keys; AOT CGI REQUEST_BODY (#2012)
AOT project link (phpc build --project) n/a n/a yes #2011 ExamplesCompileTest::test006FileUploadWebAotLink; FILE_UPLOAD_WEB_AOT_LINK_GATE default-on
AOT CGI execute (multipart upload probe) n/a n/a yes #2012 FileUploadWebAotExecuteTest; FILE_UPLOAD_WEB_AOT_SMOKE_GATE default-on (#2012)
AOT deploy CGI (multipart upload smoke) n/a n/a yes #2028 deploy-smoke.sh --example 006; opt-in FILE_UPLOAD_WEB_DEPLOY_SMOKE_GATE (#2028, #2038)

File upload rows are curated from ROADMAP issue state; multipart #52; nested FILES #87; move_uploaded_file #2005; deploy #2028. Opt-in ci-local gates: FILE_UPLOAD_WEB_SMOKE_GATE, FILE_UPLOAD_WEB_AOT_LINK_GATE, FILE_UPLOAD_WEB_AOT_SMOKE_GATE (execute default-on #2012), FILE_UPLOAD_WEB_DEPLOY_SMOKE_GATE.

Throws reference (examples/007-ThrowsWeb)

Caught throw / catch on invalid POST for the throws north-star example. ROADMAP Phase 4/5: #78, tracker #2076. Builtin matrix: capabilities.md.

Construct VM JIT AOT Issue Notes
007-ThrowsWeb reference app yes yes yes #2076 #2076 VM serve + caught invalid POST (THROWS_WEB_SMOKE_GATE default #2125); AOT link/execute default #2135
throw / catch on invalid POST (web serve) yes yes yes #195 #195 throw lowering; #57 catch; #2084 compliance PHPT pack; empty user class JIT #2167; AOT #2157
AOT project link (phpc build --project) n/a n/a yes #2101 ExamplesCompileTest 007 link; THROWSWEB_AOT_LINK_GATE default-on (#2135)
AOT CGI execute (caught throw probe) n/a n/a yes #2104 examples-aot-smoke 007 slice; THROWSWEB_AOT_SMOKE_GATE default-on (#2135)

Throws rows are curated from ROADMAP issue state; throw #195; try/catch #57; overlay #2084. ci-local gates: THROWS_WEB_SMOKE_GATE (VM serve default-on #2125), THROWSWEB_AOT_LINK_GATE / THROWSWEB_AOT_SMOKE_GATE (AOT default-on #2135; set 0 to skip).