Very low syntactic nesting limit: 29 nested function expressions (or 70 nested array literals) fail to compile with "InternalError: too much recursion"
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- c, wasm
- Ambito
- backend, performance
Direzione di ricerca
Start by reading cmake/compile-flags.cmake and runtime/engine.cpp, which the report identifies as unchanged on main; then check how the WASI stack limit and SpiderMonkey’s native stack quota are configured. Reproduce the failure with the nested IIFE generator or test262’s language/statements/function/S13.2.1_A1_T1.js. Done means the reported nesting compiles and runs without weakening runtime recursion protection.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
StarlingMonkey fails to compile scripts with modest syntactic nesting. 29 nested function expressions, or 70 nested
array literals, make the whole script fail with InternalError: too much recursion and no source location. The same
code compiles in SpiderMonkey's own shell. test262's language/statements/function/S13.2.1_A1_T1.js (32 nested
function expressions) fails for this reason.
Environment
- StarlingMonkey v0.4.0 release
starling.wasm, wasmtime 50.0.1,--legacy-script. cmake/compile-flags.cmakeandruntime/engine.cppare unchanged onmain(54b3329b).- Checked on 2026-11-03. Reference: SpiderMonkey jsshell 147.0.4 (the SpiderMonkey version StarlingMonkey v0.4.0 embeds).
Reproduction
Generate N nested IIFEs:
// node gen.js 29 > nested.js
const d = +process.argv[2];
console.log("(function(){".repeat(d) + "console.log('ok');" + "})()".repeat(d) + ";");
| input | StarlingMonkey | jsshell 147.0.4 |
|---|---|---|
| 28 nested IIFEs | ok |
ok |
| 29 nested IIFEs | InternalError: too much recursion |
ok |
69 nested array literals [[[…]]] |
ok | ok |
| 70 nested array literals | InternalError: too much recursion |
ok |
the 29-level code inside if (false) { … } (never executed) |
InternalError: too much recursion |
ok |
The last row shows that the limit is hit while compiling (parser / bytecode emitter), not while running. Runtime
recursion is fine (function f(n){return n?1+f(n-1):0} f(50000) works). Through indirect eval inside try the
error is catchable, so it is a regular over-recursion check, not a crash.
Why it matters
ECMA-262 allows implementation limits, but 29 nested functions is easily reached by real code: bundler output (module
wrapper, UMD wrapper, nested callbacks), generated parsers, and deeply nested inline callback chains. Such a script
currently fails as a whole, with no location.
Likely cause
cmake/compile-flags.cmake links with -Wl,-z,stack-size=1048576 -Wl,--stack-first, a 1 MiB stack, and no native
stack quota is configured for the context. SpiderMonkey's recursive-descent parser and BytecodeEmitter use a lot of
stack per nesting level, so the recursion check trips after a few dozen levels. (I have not confirmed where the
effective limit for the WASI build is computed; maintainers will know better.)
Suggested fix (sketch)
Raise the stack size (for example to 8 MiB, the usual native default) and set a matching quota after context creation
(JS_SetNativeStackQuota(cx, stack_size - safety_margin)), or make the stack size a build option so embedders can
trade memory for depth. A regression test can be the generator above or test262's S13.2.1_A1_T1.js.
Related
- #298 (silent failure when the runtime call-stack limit is exceeded in async handlers; different symptom).
- bytecodealliance/ComponentizeJS#206 (minimum stack size for AOT builds).
- Lingua principale
- C
- Stelle
- 297
- Fork
- 64
- Merge medio
- 1g 17h
- PR unite (30g)
- 16
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di bytecodealliance/StarlingMonkey
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
bytecodealliance/StarlingMonkey#359 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
bytecodealliance/StarlingMonkey#355 ·
I maintainer di solito rispondono entro 1 giorno
-
CryptoKey class should use Finalizable class policyForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
bytecodealliance/StarlingMonkey#343 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 1-2 giorni Idoneità per principianti 68/100
bytecodealliance/StarlingMonkey#358 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
bytecodealliance/StarlingMonkey#356 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di bytecodealliance/StarlingMonkey
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
containers/bubblewrap#826 ·
I maintainer di solito rispondono entro 1 giorno
-
Vulkan: create_device reads the device extension list after freeing it (random crash at start)Aperta
Difficoltà 1/5 1-3 ore Idoneità per principianti 62/100
Revivedx/SavageWindRecomp#488 ·
I maintainer di solito rispondono entro 1 giorno
-
needs-device
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
feature/themes QA/No release-notes/exclude tests tests/missing-coverage tests/test-quality
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
brave/brave-browser#60971 ·
I maintainer di solito rispondono entro 1 giorno