Commit Graph

261 Commits

Author SHA1 Message Date
193b0c04be erlang: list comprehensions (+12 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 06:19:14 +00:00
8e809614ba erlang: register/whereis, Phase 5 complete (+12 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 05:43:57 +00:00
47a59343a1 erlang: supervisor one-for-one (+7 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 05:09:41 +00:00
8717094e74 erlang: gen_server behaviour (+10 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 04:36:29 +00:00
424b5ca472 erlang: -module/M:F cross-module calls (+10 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 04:01:14 +00:00
882205aa70 erlang: try/catch/of/after, Phase 4 complete (+19 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 03:26:01 +00:00
1a5a2e8982 erlang: exit-signal propagation + trap_exit (+11 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 02:51:32 +00:00
c363856df6 erlang: link/unlink/monitor/demonitor + refs (+17 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 02:16:04 +00:00
aa7d691028 erlang: ring benchmark + results — Phase 3 closed
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 01:41:54 +00:00
089e2569d4 erlang: conformance.sh + scoreboard (358/358 across 9 suites)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 01:06:23 +00:00
1516e1f9cd erlang: fib_server.erl, 5/5 classic programs (+8 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 00:33:18 +00:00
51ba2da119 erlang: echo.erl minimal server (+7 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-25 00:00:47 +00:00
8a8d0e14bd erlang: bank.erl account server (+8 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 23:28:24 +00:00
0962e4231c erlang: ping_pong.erl (+4 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 22:56:28 +00:00
2a3340f8e1 erlang: ring.erl + call/cc suspension rewrite (+4 ring tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 22:24:17 +00:00
97513e5b96 erlang: exit/1 + process termination (+9 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 21:34:21 +00:00
e2e801e38a erlang: receive...after Ms timeout clause (+9 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 21:01:39 +00:00
d191f7cd9e erlang: send + selective receive via shift/reset (+13 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 20:27:59 +00:00
266693a2f6 erlang: spawn/1 + self/0 + is_pid (+13 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 19:50:09 +00:00
bc1a69925e erlang: scheduler + process record foundation (+39 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 19:16:01 +00:00
1dc96c814e erlang: core BIFs + funs, Phase 2 complete (+35 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 18:43:25 +00:00
7f4fb9c3ed erlang: guard BIFs + call dispatch (+20 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 18:08:48 +00:00
4965be71ca erlang: pattern matching + case (+21 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 17:36:44 +00:00
efbab24cb2 erlang: sequential eval (+54 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
2026-04-24 17:03:00 +00:00
99753580b4 Recover agent-loop progress: lua/prolog/forth/erlang/haskell phases 1-2
Salvaged from worktree-agent-* branches killed during sx-tree MCP outage:
- lua: tokenizer + parser + phase-2 transpile (~157 tests)
- prolog: tokenizer + parser + unification (72 tests, plan update lost to WIP)
- forth: phase-1 reader/interpreter + phase-2 colon/VARIABLE (134 tests)
- erlang: tokenizer + parser (114 tests)
- haskell: tokenizer + parse tests (43 tests)

Cherry-picked file contents only, not branch history, to avoid pulling in
unrelated ocaml-vm merge commits that were in those branches' bases.
2026-04-24 16:03:00 +00:00
b45a69b7a4 sx: format_number helper — defuse int_of_float overflow on huge floats
Shared formatter in sx_types.ml. Small integer-valued floats still print
as plain ints; floats outside safe-int range (|n| >= 1e16) now print as
%.17g (full precision) instead of silently wrapping to negative or 0.
Non-integer values keep %g 6-digit behavior — no existing SX tests regress.

Unblocks Number.MAX_VALUE / Math.pow(2,N) style tests in js-on-sx where
iterative float loops were collapsing to 0 at ~2^63.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 15:09:11 +00:00
8f202e03c2 js-on-sx: .constructor backlink on Number/String/Array/Object protos (+1)
Number.prototype.constructor === Number etc. Four dict-set! lines add
the backlink after each constructor dict is defined.

new String().constructor === String now returns true. Array literals
don't yet link to Array.prototype so [].constructor === Array is still
false — that would need a boxing refactor.

Unit 521/522, slice 148/148 unchanged.
Number 76/100 → 77/100 (+1). String variance-heavy under CPU load.
2026-04-24 14:18:18 +00:00
6c1da9212a HS: ask/answer + prompt/confirm mock (+4 tests)
Wire up the `ask` and `answer` commands end-to-end:

- tokenizer.sx: register `ask` and `answer` as hs-keywords.

- parser.sx: cmd-kw? gains both; parse-cmd dispatches to new
  parse-ask-cmd (emits `(ask MSG)`) and parse-answer-cmd, which
  reads `answer MSG [with YES or NO]`. The with/or pair reads
  yes/no via parse-atom — parse-expr would collapse
  `"Yes" or "No"` into `(or "Yes" "No")` before match-kw "or"
  could fire. The no-`with` form emits `(answer-alert MSG)`.

- compiler.sx: three new cond branches (ask, answer, answer-alert)
  compile to a let that binds __hs-a, sets `the-result` and `it`,
  and returns the value — so `then put it into ...` works.

- runtime.sx: hs-ask / hs-answer / hs-answer-alert call
  window.prompt / confirm / alert via host-call + host-global.

- tests/hs-run-filtered.js: test-name-keyed globalThis.{alert,
  confirm,prompt}; __currentHsTestName is updated before each
  test. Host-set! for innerHTML/textContent now coerces JS
  null → "null" (browser behaviour) so `prompt → null` →
  `put it into #out` renders literal text "null", which the
  fourth test depends on.

Suite hs-upstream-askAnswer: 1/5 -> 5/5.
Smoke 0-195: 166/195 -> 170/195.
2026-04-24 14:08:25 +00:00
d7a88d85ae HS: parenthesized commands and features (+1 test)
Three parser additions so scripts like `(on click (log me) (trigger foo))`
parse into a single feature with both commands in its body:

1. parse-feat: new cond branch for `paren-open` — advance, recurse
   parse-feat, consume `paren-close`. Allows a feature like `(on click
   ...)` to be grouped in parens.

2. parse-cmd: two new cond branches — on `paren-close` return nil (so
   cl-collect terminates at an outer group close), and on `paren-open`
   advance / recurse / close. Allows single parenthesized commands like
   `(log me)`.

3. cl-collect: previously only recursed when the next token was a
   recognised command keyword (`cmd-kw?`), so after `(log me)` the
   sibling `(trigger foo)` would end the feature body and re-surface as
   a top-level feature. Extended the recursion predicate to also fire
   when the next token is `paren-open`.

Suite hs-upstream-core/parser: 9/14 -> 10/14.
Smoke 0-195: 165/195 -> 166/195.
2026-04-24 13:53:36 +00:00
9db703324d scoreboard: 162/300 (54.0%) wide, +48 over session baseline 2026-04-24 13:27:55 +00:00
b2810db1a0 js-on-sx: strip leading zeros from exponent in num→string (+3)
SX's (str 1e-7) gives "1e-07" but JS spec is "1e-7" — no padding, no
leading zeros in the exponent (sign stays). We stepped through:
  mant "e" expraw  →  mant "e" (sign (strip-zeros body))

Added four small helpers: js-normalize-num-str, js-split-sign,
js-strip-leading-zeros, js-strip-zeros-loop. All pure string walkers.

Unit 521/522, slice 148/148 unchanged.
String 40 → 42, Number 75 → 76 (+3 total).
Fixes S9.8.1_A9_T1, fromCharCode/S9.7_A3.1_T1..T2 family.
2026-04-24 13:23:08 +00:00
2af31248f2 js-on-sx: js-num-to-int guards NaN/Infinity → 0 (+2 String)
Spec ToUint16 (String.fromCharCode argument coercion) maps non-finite
values to 0. We had bare (floor v) which left inf/-inf/nan through,
breaking:
  String.fromCharCode(Infinity).charCodeAt(0) === 0      // was "" → err
  String.fromCharCode(NaN).charCodeAt(0) === 0           // was "" → err

Add NaN/inf/-inf guards returning 0 before the floor+signed-flip path.

Unit 521/522, slice 148/148 unchanged.
String 38/100 → 40/100 (+2: fromCharCode/S9.7_A1, S9.7_A2.1).
2026-04-24 13:14:23 +00:00
81059861fd js-on-sx: Function.prototype.isPrototypeOf recognises callable recvs (+3)
Tests expected Function.prototype.isPrototypeOf(Number/String/…) ===
true because every built-in ctor inherits from Function.prototype.
Our model doesn't link Number.__proto__ anywhere, so the default
Object.isPrototypeOf walked an empty chain and returned false.

Fix: post-definition dict-set! adds an explicit isPrototypeOf override
on js-function-global.prototype that returns (js-function? x) — which
accepts lambdas, functions, components, and __callable__ dicts. Good
enough to satisfy the spec for every case that isn't a bespoke proto
chain.

Unit 521/522, slice 148/148 unchanged.
Wide scoreboard: 156/300 → 159/300 (+3, Number/S15.7.3_A7 and the
three S15.5.3_A2 / S15.6.3_A2 / S15.9.3_A2 twins).
2026-04-24 13:07:33 +00:00
52fc87f222 scoreboard: 156/300 (52%) wide, +42 from session-start 114/300 2026-04-24 12:54:44 +00:00
2caf356fc4 js-on-sx: Math.X.name / Number.X.name via SX→JS name unmap (+4)
Every built-in JS function on Math/Number/Array/Object had .name === ""
because js-invoke-function-method/js-get-prop returned bare "" for the
"name" slot. That breaks tests like Math.abs.name === "abs" and
Array.isArray.name === "isArray".

Fix: extract the SX symbol name from (inspect fn) which prints
<js-math-abs(x)>, then unmap through a small string table that maps
js-math-abs → "abs", js-array-is-array → "isArray" etc. Also strips
the angle-bracket marker and stops at ( or space.

Non-mapped lambdas (user fns) fall through to the raw "js-foo" form
rather than "", which is slightly worse but only hit in debug prints.

Unit 521/522, slice 148/148 unchanged.
Scoreboard: Math 40/100 → 43/100 (+3); Number 74 → 75 (+1).

Sample: Math/abs/name.js, Math/floor/name.js, Math/max/name.js,
Number/isNaN/name.js — all flipped. length.js tests still fail for
trig because the underlying fn isn't implemented.
2026-04-24 12:49:56 +00:00
67df95508d js-on-sx: format Infinity/-Infinity/NaN per JS spec (+4 String)
js-number-to-string did (str n), which gives OCaml-native "inf"/"-inf"/
"nan"/"-nan" strings. JS spec requires "Infinity"/"-Infinity"/"NaN".

Fix: cond-check js-number-is-nan, and =infinity-value first, fall
through to (str n) for finite.

Unit 521/522, slice 148/148 unchanged.
String scoreboard: 34/100 → 38/100 (+4, S15.5.1.1_A1_T11/T12 family —
String(1/0)/String(-1/0)/String(0/0)).
2026-04-24 12:39:06 +00:00
679d6bd590 js-on-sx: fall-off-end functions return undefined, not null (+2)
Previously a JS function body with no return fell through the call/cc
begin as nil, making `(function(){}())` return null and typeof → object.
Spec: falls-off-end gives undefined.

Wrap the call/cc in (let ((__r__ ...)) (if (= __r__ nil) :js-undefined __r__)).
Downside: explicit `return null` also returns nil, but so does (pick
your last expression evaluating to null). For 99% of cases it's
fall-off-end and the fix is correct. Code that genuinely needs
distinguishable null would need separate nil/undef handling in the
evaluator.

Unit 521/522, slice 148/148 unchanged.
Number 73/100 → 74/100 (+1), String 33/100 → 34/100 (+1).
Fixes S15.5.1.1_A1_T1 family (String(function(){}()) should be "undefined").
2026-04-24 12:31:32 +00:00
83c9d60d72 scoreboard: 147/300 (49.0%) wide, up from 114/300 baseline
Math 40% / Number 73% / String 33% = 147/300 (49.0%), +33 tests since
session-3 start. Wall time 277s (vs prior 593s baseline → 2.14× via
harness cache).

Top remaining failure modes (141 fails, 12 timeouts):
- 115× Test262Error (assertion failed) — numeric precision at
  MAX_VALUE/MIN_VALUE boundary, (new Number()).constructor chain,
  toFixed edge cases, String.fromCharCode code-point ranges
- 34× TypeError: not a function — still the missing Math trig
  primitives (filed as Blocker)
- 12× Timeout — long-running String loops
2026-04-24 12:19:45 +00:00
00edae49e4 js-on-sx: hex-literal string→number coercion (+15 Number)
ES spec: ToNumber("0x0") == 0, ToNumber("0xFF") == 255. Our parser
returned NaN for anything with a 0x/0X prefix, failing S9.3.1_A16..A32
(every hex-literal assertion test case).

Added:
- js-hex-prefix?      — is this an 0x/0X prefix?
- js-is-hex-body?     — all remaining chars are [0-9a-fA-F]?
- js-parse-hex        — walk chars, accumulate in base 16, NaN on bad char
- js-hex-digit-value  — char → 0..15 (or -1)

js-is-numeric-string? short-circuits to the hex-body check on 0x*
prefix; js-num-from-string dispatches to js-parse-hex on same.

Unit 521/522, slice 148/148 unchanged.
Number scoreboard: 58/100 → 73/100 (+15).

Sample flipped: S9.3.1_A16 (0x0/0X0), A17..A31 (0x0..0xF and 0x10..0x1F
range coverage). Many of the remaining 22 fails are (new Number()).x
style prototype-chain introspection and MAX_VALUE precision.
2026-04-24 12:14:47 +00:00
bf09055c4e js-on-sx: new Number/String/Array link to ctor.prototype (+5 Number)
js-get-ctor-proto used to always synthesise a per-ctor-id empty dict in
__js_proto_table__, ignoring the :prototype slot that every built-in
constructor dict (Number, String, Array, Boolean, Object, Function)
already carries. So `new Number()` got `{__proto__: {}}` instead of
`{__proto__: Number.prototype}`, breaking every prototype-chain-method
lookup:

  (new Number()).toLocaleString            // undefined → function
  (new Number()).toLocaleString === Number.prototype.toLocaleString

Fix: when the receiver is a dict with a "prototype" key, return that
directly; otherwise fall through to the existing proto-table path.
Declared classes from JS still go through the table because they emit
js-set-ctor-proto! at definition.

Unit 521/522, slice 148/148 unchanged.
Number scoreboard: 53/100 → 58/100 (+5). Sample: S15.7.5_A1_T03..T07
(toLocaleString/toString/toFixed/toExponential prototype identity).
2026-04-24 11:59:47 +00:00
f63934b15e js-on-sx: constructor .length and .name on Number/String/Array/Boolean/Object (+1)
Six post-definition dict-set! calls add .length=1 and .name="<Ctor>"
to the global constructor dicts. Per spec Number/String/Array/Boolean/
Object all have length 1 (they take one arg).

Unit 521/522, slice 148/148 unchanged.
Number scoreboard: 52/100 → 53/100 (+1, S15.7.3_A8: Number.length==1).
2026-04-24 11:55:03 +00:00
05aef11bf5 js-on-sx: callable-dict receivers get dict hasOwnProperty (+6 Number)
Root cause of many Number/String/Object.hasOwnProperty false-negatives:
global dicts like Number/String/Object carry a :__callable__ slot so
they can be invoked (Number(5) coerces, Array(3) makes length-3 list).
That makes js-function? return true for them, so js-invoke-method
dispatched hasOwnProperty/isPrototypeOf/propertyIsEnumerable through
js-invoke-function-objproto (whose name/length/prototype-only check
returns false for real dict keys like MAX_VALUE).

Fix: in the invoke-method cond, exclude dicts from the function-proto
branch. Callable dicts fall through to js-invoke-object-method, which
walks (keys recv) properly.

One line in a compound `and` — minimal surface, easy to revert.

Unit: 521/522 unchanged.
Conformance: 148/148 unchanged.
Number scoreboard: 46/100 → 52/100 (+6).

Impacted sample: Number.hasOwnProperty("MAX_VALUE") → true (was false),
plus S15.7.3_A2..A8 family (MAX_VALUE/MIN_VALUE/POSITIVE_INFINITY/
NEGATIVE_INFINITY existence checks) and S15.7.2.1_A2..A4.
2026-04-24 11:47:15 +00:00
7cffae2148 js-on-sx: exponent notation in js-string-to-number (+3 Number tests)
js-num-from-string now finds an e/E split, parses mantissa and exponent
separately, and combines via js-pow-int (positive-exp loop for >=0, 1/
reciprocal for negative). Previously `.12345e-3` parsed as 0.12345 and
"1e3" returned NaN — the parser walked decimals/dots only.

New helpers:
- js-find-exp-char / -loop : linear scan for e/E, returns -1 if absent
- js-pow-int base exp : integer-exp power, handles negative

Also fixed `js-string-trim` typo → `js-trim` in the rewritten num-from-
string, and corrected test 903's expected part count (3, not 2 — the
lexer has always split `hi ${x}!` into str+expr+str, the test just had
the wrong count).

Unit: 521/522 (was 520/522, 934 still blocked on SX \` escape).
Conformance: 148/148 unchanged.
Number scoreboard: 43/100 → 46/100 (+3).

Impacted test262 paths (sample): built-ins/Number/S9.3.1_A11.js and
A12/A16/A17 (".12345e-3", scientific notation round-trips).
2026-04-24 11:36:56 +00:00
4a277941b6 js-on-sx: harness cache — precompute HARNESS_STUB SX once per run
Root cause: every sx_server worker session used js-eval on the 3.6KB
HARNESS_STUB, paying ~15s for tokenize+parse+transpile even though every
session does the same thing. Over a full scoreboard with periodic worker
restarts that's minutes of wasted work.

Fix: transpile once per Python process. Spin up a throwaway sx_server,
run (inspect (js-transpile (js-parse (js-tokenize HARNESS_STUB)))), write
the resulting SX source to lib/js/.harness-cache/stub.<fingerprint>.sx and
a stable-name symlink-ish copy stub.sx. Every worker session then does a
single (load .harness-cache/stub.sx) instead of re-running js-eval.

Fingerprint: sha256(HARNESS_STUB + lexer.sx + parser.sx + transpile.sx).
Transpiler edits invalidate the cache automatically. Runs back-to-back
reuse the cache — only the first run after a transpiler change pays the
~15s precompute.

Transpile had to gain a $-to-_js_dollar_ name-mangler: the SX tokenizer
rejects $ in identifiers, which broke round-tripping via inspect. JS
$DONOTEVALUATE → SX _js_dollar_DONOTEVALUATE. Internal JS-on-SX names are
unaffected (none contain $).

Measured: 300-test wide (Math+Number+String @ 100/cat, --per-test-timeout 5):
593.7s → 288.0s, 2.06x speedup. Scoreboard 114→115/300 (38.3%, noise band).
Math 40%, Number 44%, String 30% — same shape as prior.

Baselines: 520/522 unit, 148/148 slice — unchanged.
2026-04-24 11:20:55 +00:00
c932ad59e1 HS: repeat property for-loops + where (+3 tests)
Re-applied from worktree-agent-a7c6dca2be5bbada0 (commit c4241d57)
onto HEAD that already has clusters 30, 26, 27 runtime changes —
straight cherry-pick conflicted on the cluster-30 log-all block
and cluster-27 intersection helper, so the logical diff was
replayed surgically.

Parser (parse-atom object-literal):
- obj-collect now `append`s pairs in source order instead of
  `cons`'ing, so `{foo:1, bar:2, baz:3}` reaches hs-make-object
  as `((foo 1) (bar 2) (baz 3))`.

Compiler (emit-for, array-index emission):
- emit-for detects `for x in COLL where COND` (parser wraps COLL
  as `(coll-where INNER COND)`) and rewrites the filter lambda
  to bind the for-loop variable name rather than the default
  `it`, so `where x.val > 10` sees the right binding. Also
  unwraps `coll-where` so filter targets the real inner coll.
- emit-for now wraps a symbol collection with `cek-try` (not the
  broken `hs-safe-call`, which has an uninitialised CEK call-ref
  in the WASM build) so `for prop in x` after `set x to {…}`
  iterates x's keys instead of nil.
- array-index emits `(hs-index obj key)` instead of
  `(nth obj key)`, which only worked on lists.

Runtime:
- New polymorphic `hs-index` dispatches to get / nth / host-get
  based on target type (dict / list / string / otherwise).
- `hs-put-at!` default branch now detects DOM elements via
  `hs-element?` and delegates to `hs-put!`, so `put X at end of
  elt` on a DOM node appends innerHTML instead of crashing.
- `hs-make-object` tracks insertion order in a hidden `_order`
  list; `hs-for-each` and `hs-coerce` (Keys / Entries / Map
  branches) prefer `_order` when present, filtering the marker
  out of output.

Suite hs-upstream-repeat: 25/30 → 28/30 (+3).
Smoke 0-195 unchanged at 165/195.
2026-04-24 11:02:49 +00:00
0c31dd2735 HS: intersection observer mock + on intersection (+3 tests)
Applied from worktree-agent-ad6e17cbc4ea0c94b (commit 0a0fe314)
with manual re-apply onto post-cluster-26 HEAD:

- Parser: parse-on-feat collects `having margin X threshold Y`
  clauses between `from X` and the body; packs them into a
  `:having {"margin" M "threshold" T}` dict on the parts list.
- Compiler: scan-on threads a new `having-info` parameter through
  all recursions; when event-name is "intersection", wraps the
  hs-on call with `(do on-call (hs-on-intersection-attach! target
  margin threshold))`.
- Runtime: hs-on-intersection-attach! constructs an
  IntersectionObserver with {rootMargin, threshold} options and a
  callback that dispatches an "intersection" DOM event carrying
  {intersecting, entry} detail.
- Runner: HsIntersectionObserver mock fires the callback
  synchronously on observe() with isIntersecting=true so handlers
  run during activation; ignores margin/threshold (tests assert
  only that the handler fires).

Suite hs-upstream-on: 33/70 -> 36/70 (on intersection: 0/3 -> 3/3).
Smoke 0-195 unchanged at 165/195.
2026-04-24 10:44:01 +00:00
64bcefffdc HS: logAll config (+1 test)
Add `_hs-config-log-all` runtime flag + captured log list. When set
via `hs-set-log-all!`, `hs-activate!` pushes "hyperscript:init" onto
`_hs-log-captured` and mirrors to console.log. Covers cluster 30.

Generator side: eval-only path now detects the logAll body pattern
(`_hyperscript.config.logAll = true`) and emits a deftest that:

  - resets captured list
  - toggles log-all on
  - builds a div with `_="on click add .foo"` and `hs-boot-subtree!`s
  - asserts `(some string-contains? "hyperscript:")` over captured logs.

hs-upstream-core/bootstrap: 19/26 -> 20/26. Smoke 0-195: 164 -> 165.
2026-04-24 10:07:18 +00:00
c3b0aef1f8 js-on-sx: URIError and EvalError constructors
Mirrors the existing Error/TypeError/RangeError/SyntaxError/ReferenceError
shims. Each sets .message and .name on the new object. Unblocks tests
that use these error types in type-check assertions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 09:56:54 +00:00
38e9376573 js-on-sx: Function global stub (constructor throws, prototype has stubs)
Several tests check 'new Function("return 1")' — we can't actually
implement that (would need runtime JS eval). Now Function is a dict with
__callable__ that throws TypeError, and a prototype containing call/apply/
bind/toString/length/name stubs so code that probes Function.prototype
doesn't crash with 'Undefined symbol: Function'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 09:54:42 +00:00
094945d86a js-on-sx: globalThis + eval stub transpile-time mappings
JS 'globalThis' now rewrites to SX (js-global) — the global object dict.
JS 'eval' rewrites to js-global-eval, a no-op stub that echoes its first
arg. Many test262 tests probe eval's existence or pass simple literals
through it; a no-op is better than 'Undefined symbol: eval'.

A full eval would require plumbing js-eval into the runtime with access
to the enclosing lexical scope — non-trivial. The stub unblocks tests
that just need eval to be callable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 09:39:28 +00:00