Commit Graph
3145 Commits
Author SHA1 Message Date
Malte Ubl c76892dc74 Revert "Continue a failed checked cast with its value in a dynamic tail (#1561)"
This reverts commit 6bb2711c4b, reversing
changes made to cd833e68a4.
2026-10-20 16:42:01 -07:00
Chris Tate 71325b2a00 Keep exported const arrays out of fresh spread conversion
Another module can import an exported const (`export const` or an
`export { name }` specifier) and reach its elements, so a spread of it
is not their only reference. Those spreads keep the element-layout
refusal instead of copying the elements.
2026-10-20 18:40:37 -05:00
Chris Tate 3df33dc0ab Keep the process.versions scan flag on the lowerer (#1579) 2026-10-20 18:38:46 -05:00
Chris Tate 32630717ed Return the Set from add() when its result is used (#1523) 2026-10-20 18:36:59 -05:00
Chris Tate c5eb832ef1 Keep the process.versions scan flag on the lowerer 2026-10-20 18:36:38 -05:00
Chris Tate 9baa93b799 Keep missing runtime-key entries undefined at module scope, and check nullish sources before runtime keys
- The indexed-read prepass now treats a computed pattern key like the name it folds to, and a runtime key over a record with no declared fields as an index-signature read. A module-scope binding from a missing entry (`const { [name]: v } = table` over `Record<string, number>`) now holds undefined instead of throwing a TypeError.
- An object pattern over a checked-dynamic value whose first key is computed at run time checks the source first. A null or undefined source throws a TypeError before the key's expression runs, as in Node. In JavaScript declarations whose source V8 can spell, the message is Node's ("Cannot destructure 'f(...)' as it is null.").
- Corpus 6492 adds a module-scope missing entry; 6493 adds nullish sources in front of side-effecting keys, including a nested pattern and an element default.
- The retired-engine-2104 diagnostics snapshot drops the refusals of `const { [key]: got } = src` over an `any` source, which now compile. The remaining refusals are unchanged.
2026-10-20 18:34:42 -05:00
Chris Tate 710d203a97 Shrink the array header to 48 bytes (#1489) 2026-10-20 18:30:40 -05:00
Chris Tate f3da708774 Compile polyfill packages that are Node builtins as the builtins (#1458) 2026-10-20 18:28:42 -05:00
Chris Tate a24542e772 Keep inferred Promise.prototype bindings checked-dynamic in TypeScript
The checker types Promise.prototype as Promise<any>, so an inferred binding
of it, a module const or a local, inserted a promise check against the
ordinary object and threw a TypeError at initialization. Such bindings,
including promise.constructor.prototype, now stay checked-dynamic in
TypeScript as they already did in JavaScript, and corpus 6590 covers them.
2026-10-20 18:26:08 -05:00
Chris Tate 5b20bf1e77 Merge main 2026-10-20 18:25:49 -05:00
Chris Tate 7f777f36a3 Carry runtime-decided dns.lookup answers dynamically, dial Node-typed net lookups, and keep tsc enum exports undefined until assigned (#1528) 2026-10-20 18:25:22 -05:00
Chris Tate 90315ca7ea Bind builtin static functions and read Buffer.alloc, fs.realpathSync and String methods as values (#1553) 2026-10-20 18:21:56 -05:00
Chris Tate 74633db92f Merge main 2026-10-20 18:21:35 -05:00
Chris Tate 71a5f2c02c Compile SDK-declared data types, any-valued members and Pick views of classes (#1466) 2026-10-20 18:18:56 -05:00
Chris Tate 18400d098d Sort the runtime feature lists (#1569) 2026-10-20 18:17:35 -05:00
Chris Tate 4e5864bed4 Iterate generators from Symbol.asyncIterator and check return() results in for await
A Symbol.asyncIterator method that returns a compiled generator is iterated
instead of refused. Async yield* awaits a synchronous delegate's final value,
and return() results that are not objects throw V8's TypeError, which names
primitive results. The coverage fixture drops its async yield* example, which
now compiles.
2026-10-20 18:16:20 -05:00
Chris Tate 40ed0e3aff Merge main 2026-10-20 18:16:00 -05:00
Chris Tate 7bf257128c Format the ProcessVersions check (#1573) 2026-10-20 18:15:25 -05:00
Chris Tate 6bb2711c4b Continue a failed checked cast with its value in a dynamic tail (#1561) 2026-10-20 18:15:01 -05:00
Chris Tate 7cbc9c38c7 Merge main 2026-10-20 18:14:12 -05:00
Chris Tate cd833e68a4 Keep the class id of hierarchy instances in the rc word (#1486) 2026-10-20 18:12:51 -05:00
Chris Tate 826776a7e3 Format the ProcessVersions check 2026-10-20 18:12:21 -05:00
Chris Tate 3195f98401 Convert a const array spread only when it runs once per initializer
A const initialized by an array literal and spread once can still run
that spread more than once: in a loop body, loop test or update, a
function, or a class field initializer. Each run inserts the same
elements in JavaScript, so copying them into the destination's layout
would break identity. Those spreads keep the element-layout refusal.
2026-10-20 18:11:57 -05:00
Chris Tate 691ee9841f Answer promises from thunked and dispatched untyped async methods (#1534) 2026-10-20 18:11:10 -05:00
Chris Tate 8441f452d7 Bound the tail copies of sequential checked casts
Each armed site lowers the code after it twice, and a cast inside another
site's tail is lowered in both copies, so n sequential casts produced 2^n
copies of the code after the last one. A site now arms only while fewer
than two splits enclose its tail or share its split point; later casts
keep the throwing cast.
2026-10-20 18:10:51 -05:00
Chris Tate da0b70bc8d Leave an Error's code to the generic store, and allow test units to include scr_js.h
The generic store keeps a native Error's code slot in step with writes
through its checked view, as it does for name, message, stack and cause,
so the store cache leaves `code` to it. The header invariant accepts
scr_js_*.test.c units, which link the dynamic tier.
2026-10-20 18:10:27 -05:00
Chris Tate 3f1cded4c3 Convert booleans with ToNumber in bitwise operators (#1547) 2026-10-20 18:10:03 -05:00
Chris Tate fa098689f1 Check for a class id before reading a stream's vtable word
The stream probes for untyped values (pipe destinations, pipeline
stages, readline input and output, and the checks against the stream
classes) read the vtable word of any boxed object. Instances with a
class id in the rc word have no vtable word, so a hierarchy instance
whose first field is a number crashed those probes. scr_stream_vt_of
answers NULL for them, and each probe treats that as no stream.
2026-10-20 18:09:22 -05:00
Chris Tate 14ee145399 Merge main and keep inferred method returns for object literals under satisfies 2026-10-20 18:07:48 -05:00
Chris Tate d9df51594c Sort the runtime feature lists
The lib-fn sets and prefix lists in runtime-features.ts grew by
appending, so changes that added different entries to one list touched
the same last lines and conflicted. Each list's entries are now sorted
within its commented groups, and the all-off feature literal follows the
rules table's name order. Entry order is unobservable: the lists feed
membership maps and prefix tests that each set their own flag.
2026-10-20 18:06:49 -05:00
Chris Tate 762632b6b1 Give require declarators beside other declarators no storage (#1537) 2026-10-20 18:06:37 -05:00
Chris Tate be6ee5cb23 Merge main 2026-10-20 18:06:16 -05:00
Chris Tate f45a37f307 Merge main 2026-10-20 18:05:28 -05:00
Chris Tate c85f2380fc Merge main 2026-10-20 18:04:46 -05:00
Chris Tate bb78ea2ce7 Run buffer-crc32's and yazl's capability probes as Node does (#1549) 2026-10-20 18:02:43 -05:00
Malte Ubl 73ae23a5eb Merge remote-tracking branch 'origin/main' into opt/emitter-mixed-events 2026-10-20 16:01:47 -07:00
Chris Tate 450c8ac2a5 Gate thenable adoption on then fields, keep Promise.prototype bindings checked, and cache the gate on the lowerer 2026-10-20 17:59:43 -05:00
Chris Tate c635475877 Read non-ASCII strings' units inline in worker executables and for longer texts (#1541) 2026-10-20 17:58:47 -05:00
Chris Tate 37834ed189 Merge main 2026-10-20 17:57:40 -05:00
Malte UblandClaude Opus 5.5 2f50141c0c Compile the hot-shots StatsD client over UDP
hot-shots, a StatsD client compiled from its JavaScript, failed when a
program constructed a client. Each gap on its UDP path is closed
generically:

- Sloppy-mode functions with named parameters may read `arguments`
  where the aliasing of their parameters cannot show: only
  `arguments.length`, or element reads without parameter or element
  writes.
- An `any` slot admits any boxable function value, including functions
  with optional parameters (`C.prototype.m = function (...)` through an
  untyped receiver).
- In a JavaScript file TypeScript does not check, a prototype method
  takes its documented parameters as checked-dynamic values, as
  constructors already did.
- JavaScript dgram sends run completion callbacks, buffer lists,
  connected sends and the six-argument offset/length form.
- A dgram socket crosses into the checked-dynamic tree as a handle
  (SCR_DYNH_DGRAM_SOCKET) whose methods are function values, with
  untyped listeners that survive 'close'. The handle lives in its own
  runtime unit (scr_dgram_dyn.c, the dgramDyn feature), linked only
  when a program converts a socket to or from an untyped value.
- `String.prototype.concat` on strings, and `parseInt` over a possibly
  missing or untyped value in JavaScript.

Corpus programs 6590-6596 and the hot-shots-udp npm
case (hot-shots 8.5.0 vendored) match Node in both lanes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 15:56:59 -07:00
Chris Tate b70cadb402 Merge main 2026-10-20 17:56:44 -05:00
Chris Tate 1c8349333a Read the ProcessVersions symbol's name with symbolName (#1565) 2026-10-20 17:55:43 -05:00
Chris Tate b6fd72e47f Name the deepest failing path when a checked cast fails inside an optional record (#1548) 2026-10-20 17:52:53 -05:00
Chris Tate 05c6322519 Read the ProcessVersions symbol's name with symbolName 2026-10-20 17:48:25 -05:00
Chris Tate 6bbf1123dc Give the left bitwise operand a temporary when the right one takes one
When an operand of a bitwise operator is a hoisted optional boolean, the
operands evaluate into temporaries before the operation. A left operand
that is safe to repeat, such as a variable read, kept its place in the
operation while the right operand's temporary ran first, so a right
operand that assigns that variable changed the value the left operand
read: `seen ^ (seen = !seen)` gave 0 where Node gives 1.

The left operand now takes a temporary whenever the right one does, so
both evaluate in source order. The corpus program covers an assignment
in the right operand of ^ and <<.
2026-10-20 17:47:40 -05:00
Chris Tate dc5e0cb5bb Merge main 2026-10-20 17:46:26 -05:00
Chris Tate f446620ae5 Read absent process.versions entries as undefined under @types/node (#1550) 2026-10-20 17:46:00 -05:00
Chris Tate 85936f9035 Merge main 2026-10-20 17:44:58 -05:00
Chris Tate 8dd2b95e16 Merge main 2026-10-20 17:44:17 -05:00
Chris Tate f0fcf6e30c Fence fs.realpathSync's function value with realpathSync
fs.realpathSync and fs.realpathSync.native read as function values
lower to the fs.realpathValue libCall. The library sidecar's determinism
attestation demotes on every fs.* spelling, so a fence on realpathSync
has to witness that one too. It is now an alias of both members, and
the surface-manifest attestation parity test passes again.
2026-10-20 17:43:47 -05:00