mirror of
https://github.com/anoma/juvix.git
synced 2024-12-15 01:52:11 +03:00
f2298bd674
An implementation of the translation from JuvixCore to JuvixAsm. After merging this PR, the only remaining step to complete the basic compilation pipeline (#1556) is the compilation of complex pattern matching (#1531). * Fixes several bugs in lambda-lifting. * Fixes several bugs in the RemoveTypeArgs transformation. * Fixes several bugs in the TopEtaExpand transformation. * Adds the ConvertBuiltinTypes transformation which converts the builtin bool inductive type to Core primitive bool. * Adds the `juvix dev core strip` command. * Adds the `juvix dev core asm` command. * Adds the `juvix dev core compile` command. * Adds two groups of tests: - JuvixCore to JuvixAsm translation: translate JuvixCore tests to JuvixAsm and run the results with the JuvixAsm interpreter, - JuvixCore compilation: compile JuvixCore tests to native code and WASM and execute the results. * Closes #1520 * Closes #1549
38 lines
1.3 KiB
Haskell
38 lines
1.3 KiB
Haskell
module AsmInterpreter where
|
|
|
|
import App
|
|
import CommonOptions
|
|
import Juvix.Compiler.Asm.Data.InfoTable qualified as Asm
|
|
import Juvix.Compiler.Asm.Extra qualified as Asm
|
|
import Juvix.Compiler.Asm.Interpreter qualified as Asm
|
|
import Juvix.Compiler.Asm.Pretty qualified as Asm
|
|
import Juvix.Compiler.Asm.Transformation.Validate qualified as Asm
|
|
|
|
runAsm :: forall r. Members '[Embed IO, App] r => Bool -> Asm.InfoTable -> Sem r ()
|
|
runAsm bValidate tab =
|
|
let v = if bValidate then Asm.validate' tab else Nothing
|
|
in case v of
|
|
Just err ->
|
|
exitJuvixError (JuvixError err)
|
|
Nothing ->
|
|
case tab ^. Asm.infoMainFunction of
|
|
Just sym -> do
|
|
r <- doRun tab (Asm.getFunInfo tab sym)
|
|
case r of
|
|
Left err ->
|
|
exitJuvixError (JuvixError err)
|
|
Right Asm.ValVoid ->
|
|
return ()
|
|
Right val -> do
|
|
renderStdOut (Asm.ppOut (Asm.defaultOptions tab) val)
|
|
embed (putStrLn "")
|
|
Nothing ->
|
|
exitMsg (ExitFailure 1) "no 'main' function"
|
|
where
|
|
doRun ::
|
|
Asm.InfoTable ->
|
|
Asm.FunctionInfo ->
|
|
Sem r (Either Asm.AsmError Asm.Val)
|
|
doRun tab' funInfo =
|
|
embed $ Asm.catchRunErrorIO (Asm.runCodeIO tab' funInfo)
|