1.7 KiB
Wasm generation hang in wasmJs browser tests
Summary
The wasmJs browser test runner hung after commit 5f819dc. The root cause was invalid WebAssembly generated by the Kotlin/Wasm backend when certain compiler paths emitted suspend lambdas for Statement execution. The invalid module failed to instantiate in the browser, and Karma kept the browser connected but never ran tests.
Symptoms
:lynglib:wasmJsBrowserTesthangs indefinitely in ChromeHeadless.:lynglib:wasmJsNodeTestfails with a WebAssembly compile error similar to:struct.set expected type (ref null XXXX), found global.get of type (ref null YYYY)
- The failing function name in the wasm name section looks like:
net.sergeych.lyng.$invokeCOROUTINE$.doResume
Root cause
The delegation/var-declaration changes introduced compiler-generated suspend lambdas inside Statement construction (e.g., statement { ... } wrappers). Kotlin/Wasm generates extra coroutine state for those suspend lambdas, which in this case produced invalid wasm IR (mismatched GC reference types). The browser loader then waits forever because the module fails to instantiate.
Fix
Avoid suspend-lambda Statement construction in compiler code paths. Replace statement { ... } and other anonymous suspend lambdas with explicit object : Statement() implementations and move logic into override suspend fun execute(...). This keeps the resulting wasm IR valid while preserving behavior.
Where it was fixed
lynglib/src/commonMain/kotlin/net/sergeych/lyng/Compiler.ktlynglib/src/commonMain/kotlin/net/sergeych/lyng/Scope.kt
Verification
./gradlew :lynglib:wasmJsNodeTest --info./gradlew :lynglib:wasmJsBrowserTest --info
Both tests finish quickly after the change.