tweag/asterius

"RuntimeError: unreachable"

lemmih opened this issue · 7 comments

Describe the bug
Running this code fails with 'RuntimeError: unreachable':

{-# LANGUAGE PackageImports #-}
module Main where

import Graphics.SvgTree
import Graphics.SvgTree.Printer
import "lens" Control.Lens

main :: IO ()
main = putStrLn $ ppTree (CircleTree $ Circle mempty (Num 0, Num 0) (Num 2))
root@ac07adc0d6f9:/workspace# ahc-link --input-hs test.hs --run
[INFO] Compiling test.hs to WebAssembly
[INFO] Converting linked IR to binaryen IR
[INFO] Running binaryen optimization
[INFO] Validating binaryen IR
[INFO] Writing WebAssembly binary to "./test.wasm"
[INFO] Writing JavaScript runtime modules to "."
[INFO] Writing JavaScript loader module to "./test.wasm.mjs"
[INFO] Writing JavaScript req module to "./test.req.mjs"
[INFO] Writing JavaScript entry module to "./test.mjs"
[INFO] Running ./test.mjs
test: JSException "RuntimeError: unreachable\n    at <anonymous>:wasm-function[5314]:0x1320cb\n    at <anonymous>:wasm-function[12289]:0x2db0f9\n    at scheduleTSO (<anonymous>:wasm-function[12290]:0x2db126)\n    at Scheduler.tick (file:///workspace/rts.scheduler.mjs:346:22)\n    at Immediate.<anonymous> (file:///workspace/rts.scheduler.mjs:381:29)\n    at processImmediate (internal/timers.js:458:21)"

Running the same code but with a circle radius of '0' works fine:

main = putStrLn $ ppTree (CircleTree $ Circle mempty (Num 0, Num 0) (Num 0))
root@ac07adc0d6f9:/workspace# ahc-link --input-hs test.hs --run
[INFO] Compiling test.hs to WebAssembly
[INFO] Converting linked IR to binaryen IR
[INFO] Running binaryen optimization
[INFO] Validating binaryen IR
[INFO] Writing WebAssembly binary to "./test.wasm"
[INFO] Writing JavaScript runtime modules to "."
[INFO] Writing JavaScript loader module to "./test.wasm.mjs"
[INFO] Writing JavaScript req module to "./test.req.mjs"
[INFO] Writing JavaScript entry module to "./test.mjs"
[INFO] Running ./test.mjs
<circle />

Oh, running with --verbose-err gives this (reformatted):

test: JSException "RuntimeError: barf: _hs_ToFixedLength\n
    at ExceptionHelper.barf (file:///workspace/rts.exception.mjs:147:13)\n
    at barf (<anonymous>:wasm-function[817]:0x3f822)\n
    at doublezmconversionzm2zi0zi2zi0zmL7SF9hmoOH71AQFMRAfBSp_DataziDoubleziConversionziText_toFixedzulen_entry (<anonymous>:wasm-function[5319]:0x13237f)\n
    at scheduleTSO (<anonymous>:wasm-function[12294]:0x2db6b4)\n
    at scheduleTSO_wrapper (<anonymous>:wasm-function[12295]:0x2db6e1)\n
    at Scheduler.tick (file:///workspace/rts.scheduler.mjs:346:22)\n
    at Immediate.<anonymous> (file:///workspace/rts.scheduler.mjs:381:29)\n
    at processImmediate (internal/timers.js:458:21)"

To Reproduce
Put the above code in test.hs and run it with: ahc-link --input-hs test.hs --run. It depends on 'reanimate-svg' which is already included in the docker image.

Expected behavior
I expected it to print <circle r="2"/>.

Environment

  • OS name + version: Ubuntu 20.04
  • Version of the code: Latest docker image

Ah, it must be because I'm using double-conversion which uses cbits. Guess you can close this issue.

Can I manually compile the C code with emscripten and make it available somehow?

compile the C code with emscripten and make it available somehow?

That code can only be used via foreign import javascript, which means one needs to patch the ccall logic for now and handle the emscripten packaging logic themselves. This is the best we can do for now, but we've about to start working on adding a C toolchain to handle C stuff, so the status quo will be improved; can't give an exact ETA yet though.

Alright. Can I detect when my package is being compiled by asterius? Something like if impl(asterius) {} in the cabal file?

#725 solves my issue but no new docker image has been built. Are new docker images not built automatically when new patches are pushed?

terrorjack/asterius:latest has now been updated to terrorjack/asterius:200805. The docker images are built with a different CI infra, and takes a lot of time to build.

My library now works with Asterius. :)
But it requires a lot of memory to compile, a little more than 6GB. Do you have any tips or tricks for reducing the memory requirements?