report multiple start sections in text representation as parsing error
This commit is contained in:
@@ -1501,6 +1501,7 @@ constInstructionToValue _ = error "Only const instructions supported as argument
|
|||||||
desugarize :: [ModuleField] -> Either String S.Module
|
desugarize :: [ModuleField] -> Either String S.Module
|
||||||
desugarize fields = do
|
desugarize fields = do
|
||||||
checkImportsOrder fields
|
checkImportsOrder fields
|
||||||
|
checkStartCount fields
|
||||||
let mod = Module {
|
let mod = Module {
|
||||||
types = reverse $ foldl' extractTypeDef (reverse $ explicitTypeDefs fields) fields,
|
types = reverse $ foldl' extractTypeDef (reverse $ explicitTypeDefs fields) fields,
|
||||||
functions = extract extractFunction fields,
|
functions = extract extractFunction fields,
|
||||||
@@ -1563,6 +1564,15 @@ desugarize fields = do
|
|||||||
checkDef _ (MFTable _) = return True
|
checkDef _ (MFTable _) = return True
|
||||||
checkDef nonImportOccured _ = return nonImportOccured
|
checkDef nonImportOccured _ = return nonImportOccured
|
||||||
|
|
||||||
|
checkStartCount :: [ModuleField] -> Either String ()
|
||||||
|
checkStartCount fields = foldM checkDef False fields >> return ()
|
||||||
|
where
|
||||||
|
checkDef startOccured (MFStart _) =
|
||||||
|
if startOccured
|
||||||
|
then Left "Multiple start sections"
|
||||||
|
else Right True
|
||||||
|
checkDef startOccured _ = return startOccured
|
||||||
|
|
||||||
extractTypeDef :: [TypeDef] -> ModuleField -> [TypeDef]
|
extractTypeDef :: [TypeDef] -> ModuleField -> [TypeDef]
|
||||||
extractTypeDef defs (MFType _) = defs -- should be extracted before implicit defs
|
extractTypeDef defs (MFType _) = defs -- should be extracted before implicit defs
|
||||||
extractTypeDef defs (MFImport Import { desc = ImportFunc _ typeUse }) =
|
extractTypeDef defs (MFImport Import { desc = ImportFunc _ typeUse }) =
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ import qualified Data.List as List
|
|||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
files <- filter (List.isSuffixOf ".wast") <$> Directory.listDirectory "tests/spec"
|
files <- filter (List.isSuffixOf ".wast") <$> Directory.listDirectory "tests/spec"
|
||||||
-- let files = ["linking.wast"]
|
-- let files = ["start.wast"]
|
||||||
scriptTestCases <- (`mapM` files) $ \file -> do
|
scriptTestCases <- (`mapM` files) $ \file -> do
|
||||||
test <- LBS.readFile ("tests/spec/" ++ file)
|
test <- LBS.readFile ("tests/spec/" ++ file)
|
||||||
return $ testCase file $ do
|
return $ testCase file $ do
|
||||||
|
|||||||
Reference in New Issue
Block a user