You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Everything the Perry compiler is missing for absolute parity with Node.js running TypeScript, as of v0.4.56.
Current status: 100% pass rate on 87 parity tests (27 edge-case + 60 existing). The gaps below are features NOT covered by those tests — they either aren't tested or aren't implemented.
Language Features
Generators & Iterators
Feature
Status
Notes
function* syntax
Parsed
Expr::Yield exists in HIR but no generator object protocol
yield / yield*
Partial
Expression exists but .next() / .return() / .throw() not callable on result
Generator iterator protocol
Missing
function* doesn't produce an object with .next()
Symbol.iterator
Missing
No custom iterable protocol — for...of only works on arrays, strings, Maps, Sets
Symbol.asyncIterator
Missing
No async iterable protocol
async function*
Missing
Async generators not supported
for await...of
Missing
Async iteration not supported
Symbols
Feature
Status
Notes
Symbol() constructor
Missing
No runtime Symbol creation
Symbol.iterator
Missing
Can't make custom iterables
Symbol.toPrimitive
Missing
Can't customize type coercion
Symbol.hasInstance
Missing
Can't customize instanceof
Symbol.toStringTag
Missing
Can't customize Object.prototype.toString
Symbol.species
Missing
Can't customize derived constructors
Well-known symbols
Missing
None of the Symbol.* constants exist
Metaprogramming
Feature
Status
Notes
Proxy
Missing
Explicitly skipped — would require trap checks on every property access
Reflect
Missing
No reflection API
eval()
Missing
Fundamentally hard for AOT compiler — would need bundled interpreter
new Function('...')
Missing
Same constraint as eval
Object.defineProperty()
Missing
No property descriptor model
Object.getOwnPropertyDescriptor()
Missing
No property descriptor model
Object.getPrototypeOf()
Missing
No prototype chain at runtime
Object.setPrototypeOf()
Missing
No prototype mutation
Object.create()
Exists
But limited — no property descriptors argument
Classes (advanced)
Feature
Status
Notes
Private methods #method()
Missing
Private fields #field work but not methods
Static class blocks static { ... }
Missing
Static field initializers work but not blocks
Class decorators (stage 3)
Partial
Basic decorator syntax parsed, limited runtime support
abstract classes
Missing
No enforcement — abstract methods not checked
Async (advanced)
Feature
Status
Notes
for await...of
Missing
Promise.allSettled()
Missing
Promise.any()
Missing
Promise.race()
Partial
Runtime function exists (v0.4.47) but may have edge cases
Async generators
Missing
async function* not supported
Async disposal await using
Missing
TC39 stage 3
Error Handling (advanced)
Feature
Status
Notes
Error.cause
Missing
new Error("msg", { cause: err }) not supported
AggregateError
Missing
Used by Promise.any()
Error.captureStackTrace
Missing
V8-specific, not in spec
Custom error .stack formatting
Missing
Stack traces are basic
Dynamic Features
Feature
Status
Notes
Dynamic import()
Broken
Returns undefined with warning
with statement
Missing
Intentional — deprecated in strict mode
Computed property access on unknown types
Partial
Works for known types, falls through for any
arguments object
Missing
Arrow functions don't have it (correct), regular functions should
These are features that are fundamentally difficult for an AOT native compiler:
eval() / new Function() — requires a runtime interpreter. Perry has QuickJS fallback but it's opt-in.
Proxy/Reflect — every property access would need a trap check. Devastating for performance.
Full Symbol.iterator protocol — requires all for...of loops to go through a .next() call chain instead of direct indexed access.
Dynamic import() — requires lazy compilation or pre-bundling. Perry resolves all imports at compile time.
with statement — deprecated in strict mode, would break all scope resolution optimizations.
Full prototype chain — Perry uses flat field arrays, not prototype chains. Object.getPrototypeOf() etc. are impossible without restructuring object layout.
Full Intl — requires ICU data (~27MB) or system ICU linkage.
SharedArrayBuffer/Atomics — Perry uses deep-copy semantics across threads. Shared mutable memory would require a different threading model.
Summary Statistics
Category
Implemented
Missing
Coverage
Core language syntax
48/52
4
92%
Built-in object methods
~120/180
~60
67%
Node.js std lib functions
~65/200+
~135+
~30%
Global APIs
~15/30
~15
50%
Overall language parity
~85%
Overall Node.js API parity
~35%
The language itself is nearly complete. The gap is primarily in the Node.js standard library, the Intl namespace, advanced async patterns (generators, async iterators), and metaprogramming (Symbol, Proxy, Reflect).