Skip to content

Commit 709c8d9

Browse files
committed
bump version to 1.0 tag
1 parent db18150 commit 709c8d9

File tree

9 files changed

+137
-132
lines changed

9 files changed

+137
-132
lines changed

exec/Main.hs

+2-7
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ import qualified Data.ByteString.Lazy as LBS
55
import qualified Data.ByteString.Base64.Lazy as Base64
66
import Data.Maybe (fromMaybe)
77

8-
import qualified Language.Wasm.Lexer as Lexer
9-
import qualified Language.Wasm.Parser as Parser
10-
import qualified Language.Wasm.Binary as Binary
8+
import qualified Language.Wasm as Wasm
119

1210
import Options.Applicative
1311
import Data.Semigroup ((<>))
@@ -105,10 +103,7 @@ config = subparser (
105103
)
106104

107105
toBinary :: LBS.ByteString -> Either String LBS.ByteString
108-
toBinary content = do
109-
lexemes <- Lexer.scanner content
110-
mod <- Parser.parseModule lexemes
111-
return $ Binary.dumpModuleLazy mod
106+
toBinary = fmap Wasm.encodeLazy . Wasm.parse
112107

113108
compileAs :: (LBS.ByteString -> LBS.ByteString) -> String -> String -> IO ()
114109
compileAs transform input output = do

src/Language/Wasm.hs

+45-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,48 @@
11
module Language.Wasm (
2-
something
2+
Module,
3+
ValidModule,
4+
ValidationError(..),
5+
parse,
6+
validate,
7+
Language.Wasm.parseScript,
8+
encode,
9+
encodeLazy,
10+
decode,
11+
decodeLazy,
12+
Script,
13+
runScript
314
) where
415

5-
something :: Int
6-
something = 42
16+
import qualified Data.ByteString as BS
17+
import qualified Data.ByteString.Lazy as LBS
18+
19+
import Language.Wasm.Structure as Struct
20+
import Language.Wasm.Script as Script
21+
import Language.Wasm.Lexer as Lexer
22+
import Language.Wasm.Parser as Parser
23+
import Language.Wasm.Validate as Valid
24+
import Language.Wasm.Binary as Binary
25+
26+
-- | Parse WebAssembly text representation to `Module`
27+
parse :: LBS.ByteString -> Either String Module
28+
parse content = Lexer.scanner content >>= Parser.parseModule
29+
30+
-- | Parse WebAssembly extended scipt grammar
31+
parseScript :: LBS.ByteString -> Either String Script
32+
parseScript content = Lexer.scanner content >>= Parser.parseScript
33+
34+
-- | Dump `Module` to binary representation
35+
encode :: Module -> BS.ByteString
36+
encode = dumpModule
37+
38+
-- | Dump `Module` to binary representation lazily
39+
encodeLazy :: Module -> LBS.ByteString
40+
encodeLazy = dumpModuleLazy
41+
42+
-- | Decode `Module` from binary representation
43+
decode :: BS.ByteString -> Either String Module
44+
decode = decodeModule
45+
46+
-- | Decode `Module` from binary representation lazily
47+
decodeLazy :: LBS.ByteString -> Either String Module
48+
decodeLazy = decodeModuleLazy

src/Language/Wasm/Interpreter.hs

+4-4
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ import Numeric.IEEE (IEEE, copySign, minNum, maxNum, identicalIEEE)
5353
import Control.Monad.Except (ExceptT, runExceptT, throwError)
5454
import Control.Monad.IO.Class (liftIO)
5555

56-
import Debug.Trace as Debug
57-
5856
import Language.Wasm.Structure as Struct
57+
import Language.Wasm.Validate as Valid
5958
import Language.Wasm.FloatUtils (
6059
wordToFloat,
6160
floatToWord,
@@ -532,8 +531,9 @@ initialize inst Module {elems, datas, start} store = do
532531
initData (from, mem, chunk) =
533532
mapM_ (\(i,b) -> IOVector.write mem i b) $ zip [from..] $ LBS.unpack chunk
534533

535-
instantiate :: Store -> Imports -> Module -> IO (Either String (ModuleInstance, Store))
536-
instantiate st imps m = runExceptT $ do
534+
instantiate :: Store -> Imports -> Valid.ValidModule -> IO (Either String (ModuleInstance, Store))
535+
instantiate st imps mod = runExceptT $ do
536+
let m = Valid.getModule mod
537537
inst <- calcInstance st imps m
538538
let functions = funcInstances st <> (allocFunctions inst $ Struct.functions m)
539539
globals <- liftIO $ (globalInstances st <>) <$> (allocAndInitGlobals inst st $ Struct.globals m)

src/Language/Wasm/Lexer.x

-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ import Data.Word (Word8)
2121
import Data.List (isPrefixOf)
2222
import Text.Read (readEither)
2323

24-
import qualified Debug.Trace as Debug
25-
2624
}
2725

2826
%wrapper "monadUserState-bytestring"

src/Language/Wasm/Parser.y

-2
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ import Language.Wasm.Lexer (
9696
asDouble
9797
)
9898
99-
import Debug.Trace as Debug
100-
10199
}
102100
103101
%name parseModule mod

src/Language/Wasm/Script.hs

+9-9
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ runScript onAssertFail script = do
9595
addModule :: Maybe Ident -> Struct.Module -> ScriptState -> IO ScriptState
9696
addModule ident m st =
9797
case Validate.validate m of
98-
Validate.Valid -> do
98+
Right m -> do
9999
res <- Interpreter.instantiate (store st) (buildImports st) m
100100
case res of
101101
Right (modInst, store') -> return $ addToStore ident modInst $ st { lastModule = Just modInst, store = store' }
102102
Left reason -> error $ "Module instantiation failed dut to invalid module with reason: " ++ show reason
103-
reason -> error $ "Module instantiation failed dut to invalid module with reason: " ++ show reason
103+
Left reason -> error $ "Module instantiation failed dut to invalid module with reason: " ++ show reason
104104

105105
getModule :: ScriptState -> Maybe Ident -> Maybe Interpreter.ModuleInstance
106106
getModule st (Just (Ident i)) = Map.lookup i (modules st)
@@ -156,7 +156,7 @@ runScript onAssertFail script = do
156156
checkModuleInvalid :: Struct.Module -> IO ()
157157
checkModuleInvalid _ = return ()
158158

159-
getFailureString :: Validate.ValidationResult -> [TL.Text]
159+
getFailureString :: Validate.ValidationError -> [TL.Text]
160160
getFailureString (Validate.TypeMismatch _ _) = ["type mismatch"]
161161
getFailureString Validate.ResultTypeDoesntMatch = ["type mismatch"]
162162
getFailureString Validate.MoreThanOneMemory = ["multiple memories"]
@@ -194,8 +194,8 @@ runScript onAssertFail script = do
194194
runAssert st assert@(AssertInvalid moduleDef failureString) =
195195
let (_, m) = buildModule moduleDef in
196196
case Validate.validate m of
197-
Validate.Valid -> onAssertFail "Invalid module pass validation" assert
198-
reason ->
197+
Right _ -> onAssertFail "Invalid module pass validation" assert
198+
Left reason ->
199199
if failureString `elem` getFailureString reason
200200
then return ()
201201
else
@@ -216,12 +216,12 @@ runScript onAssertFail script = do
216216
runAssert st assert@(AssertUnlinkable moduleDef failureString) =
217217
let (_, m) = buildModule moduleDef in
218218
case Validate.validate m of
219-
Validate.Valid -> do
219+
Right m -> do
220220
res <- Interpreter.instantiate (store st) (buildImports st) m
221221
case res of
222222
Left err -> return ()
223223
Right _ -> onAssertFail ("Module linking should fail with failure string " ++ show failureString) assert
224-
reason -> error $ "Module linking failed dut to invalid module with reason: " ++ show reason
224+
Left reason -> error $ "Module linking failed dut to invalid module with reason: " ++ show reason
225225
runAssert st assert@(AssertTrap (Left action) failureString) = do
226226
result <- runAction st action
227227
if isNothing result
@@ -230,12 +230,12 @@ runScript onAssertFail script = do
230230
runAssert st assert@(AssertTrap (Right moduleDef) failureString) =
231231
let (_, m) = buildModule moduleDef in
232232
case Validate.validate m of
233-
Validate.Valid -> do
233+
Right m -> do
234234
res <- Interpreter.instantiate (store st) (buildImports st) m
235235
case res of
236236
Left "Start function terminated with trap" -> return ()
237237
_ -> onAssertFail ("Module linking should fail with trap during execution of a start function") assert
238-
reason -> error $ "Module linking failed dut to invalid module with reason: " ++ show reason
238+
Left reason -> error $ "Module linking failed dut to invalid module with reason: " ++ show reason
239239
runAssert st assert@(AssertExhaustion action failureString) = do
240240
result <- runAction st action
241241
if isNothing result

0 commit comments

Comments
 (0)