From 18f3758d85328da8b5ccf4e4d40ba710bae99671 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 27 Dec 2023 15:33:34 +0100 Subject: [PATCH 01/99] Add parse of one expression --- lvtc/app/Main.hs | 6 +++- lvtc/lvtc.cabal | 7 +++- lvtc/package.yaml | 2 ++ lvtc/src/Expression.hs | 40 +++++++++++++++++++++ lvtc/src/ParseUtil.hs | 72 +++++++++++++++++++++++++++++++++++++ lvtc/src/Parser.hs | 54 ++++++++++++++++++++++++++++ lvtc/stack.yaml | 4 ++- lvtc/stack.yaml.lock | 16 ++++++++- lvtc/test/Spec.hs | 82 +++++++++++++++++++++++++++++++++++++++++- 9 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 lvtc/src/Expression.hs create mode 100644 lvtc/src/ParseUtil.hs create mode 100644 lvtc/src/Parser.hs diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 52b8bd5..8703237 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -8,6 +8,10 @@ module Main (main) where import Lib +import Expression +import Parser main :: IO () -main = someFunc +-- main = print $ runParser (parseExpresion) "fn main () -> Int \n{\n <- 0;\n};\n" +-- main = print $ runParser (parseExpresion) "alias abc def;\n" +main = print $ runParser (parseExpresion) "// this is a comment\n" diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index b102c44..2f3ff1c 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -1,6 +1,6 @@ cabal-version: 2.2 --- This file has been generated from package.yaml by hpack version 0.35.2. +-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack @@ -25,7 +25,10 @@ source-repository head library exposed-modules: + Expression Lib + Parser + ParseUtil other-modules: Paths_lvtc autogen-modules: @@ -64,4 +67,6 @@ test-suite lvtc-test build-depends: base >=4.7 && <5 , lvtc + , tasty + , tasty-hunit default-language: Haskell2010 diff --git a/lvtc/package.yaml b/lvtc/package.yaml index d6fb3e5..1476033 100644 --- a/lvtc/package.yaml +++ b/lvtc/package.yaml @@ -57,3 +57,5 @@ tests: - -with-rtsopts=-N dependencies: - lvtc + - tasty + - tasty-hunit diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs new file mode 100644 index 0000000..aedd839 --- /dev/null +++ b/lvtc/src/Expression.hs @@ -0,0 +1,40 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Expression +-} + +module Expression ( + Expression (..), + parseExpresion, + ) where + +import Parser +import Control.Applicative +import ParseUtil + +data Expression = Function String | Alias String | Comment String + +instance Show Expression where + show (Function str) = "F:`" ++ str ++ "`" + show (Alias str) = "A:`" ++ str ++ "`" + show (Comment str) = "C:`" ++ str ++ "`" + +instance Eq Expression where + (==) (Function str1) (Function str2) = str1 == str2 + (==) (Alias str1) (Alias str2) = str1 == str2 + (==) (Comment str1) (Comment str2) = str1 == str2 + (==) _ _ = False + +parseFunction :: Parser Expression +parseFunction = Function <$> ((++) <$> (parseString "fn " <|> parseString "export fn") <*> parseAllCharUntil "\n};\n") + +parseAlias :: Parser Expression +parseAlias = Alias <$> ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") + +parseComment :: Parser Expression +parseComment = Comment <$> ((++) <$> parseString "//" <*> parseAllCharUntil "\n") + +parseExpresion :: Parser Expression +parseExpresion = parseAlias <|> parseFunction <|> parseComment diff --git a/lvtc/src/ParseUtil.hs b/lvtc/src/ParseUtil.hs new file mode 100644 index 0000000..cb71290 --- /dev/null +++ b/lvtc/src/ParseUtil.hs @@ -0,0 +1,72 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ParseUtil +-} + +module ParseUtil ( + parseChar, + parseAnyChar, + parseUInt, + parseSign, + parseInt, + parseString, + parseBetween, + parseAfter, + parseBefore, + parseAllCharUntil, + ) where + +import Parser +import Data.Int (Int32) +import Control.Applicative + +parseChar :: Char -> Parser Char +parseChar c = Parser f + where + f [] = Nothing + f (x:xs) | x == c = Just (x, xs) + | otherwise = Nothing + +parseAnyChar :: String -> Parser Char +parseAnyChar str = Parser f + where + f [] = Nothing + f (x:xs) | x `elem` str = Just (x, xs) + | otherwise = Nothing + +parseString :: String -> Parser String +parseString value = Parser f + where + f s | take (length value) s == value = Just (value, drop (length value) s) + | otherwise = Nothing + +parseUInt :: Parser Int32 +parseUInt = read <$> some (parseAnyChar "0123456789") + +parseSign :: Parser Int32 +parseSign = f <$> many (parseAnyChar "-+") + where + f s | even (length (filter (== '-') s)) = 1 + | otherwise = -1 + +parseInt :: Parser Int32 +parseInt = (*) <$> parseSign <*> parseUInt + +parseBetween :: Parser a -> Parser b -> Parser c -> Parser c +parseBetween open close parser = open *> parser <* close + +parseAfter :: Parser a -> Parser b -> Parser b +parseAfter open parser = open *> parser + +parseBefore :: Parser a -> Parser b -> Parser a +parseBefore parser close = parser <* close + +parseAllCharUntil :: String -> Parser String +parseAllCharUntil str = Parser f + where + f [] = empty + f (x:xs) = case runParser (parseString str) (x:xs) of + Nothing -> runParser ((x :) <$> parseAllCharUntil str) xs + Just (y, ys) -> Just (y, ys) diff --git a/lvtc/src/Parser.hs b/lvtc/src/Parser.hs new file mode 100644 index 0000000..77420e0 --- /dev/null +++ b/lvtc/src/Parser.hs @@ -0,0 +1,54 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Parser +-} + +module Parser ( + Parser (..), + ) where + +import Control.Applicative + +data Parser a = Parser { + runParser :: String -> Maybe (a, String) +} + +instance Functor Parser where + fmap fct parser = Parser f + where + f str = case runParser parser str of + Just (x, xs) -> Just (fct x, xs) + Nothing -> Nothing + +instance Applicative Parser where + pure x = Parser f + where + f str = Just (x, str) + p1 <*> p2 = Parser f + where + f str = case runParser p1 str of + Just (x, xs) -> + case runParser p2 xs of + Just (y, ys) -> Just (x y, ys) + Nothing -> Nothing + Nothing -> Nothing + +instance Alternative Parser where + empty = Parser f + where + f _ = Nothing + p1 <|> p2 = Parser f + where + f str = case runParser p1 str of + Just (x, xs) -> Just (x, xs) + Nothing -> runParser p2 str + +instance Monad Parser where + parser >>= fct = Parser f + where + f str = case runParser parser str of + Just (x, xs) -> runParser (fct x) xs + Nothing -> Nothing + return = pure diff --git a/lvtc/stack.yaml b/lvtc/stack.yaml index b2997b7..03d26e7 100644 --- a/lvtc/stack.yaml +++ b/lvtc/stack.yaml @@ -40,7 +40,9 @@ packages: # - git: https://github.com/commercialhaskell/stack.git # commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a # -# extra-deps: [] +extra-deps: +- tasty-1.4.2.2 +- tasty-hunit-0.10.1 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtc/stack.yaml.lock b/lvtc/stack.yaml.lock index a39a124..246c84e 100644 --- a/lvtc/stack.yaml.lock +++ b/lvtc/stack.yaml.lock @@ -3,7 +3,21 @@ # For more information, please see the documentation at: # https://docs.haskellstack.org/en/stable/lock_files -packages: [] +packages: +- completed: + hackage: tasty-1.4.2.2@sha256:b987609178d70c0042b950302161a049be8a878aa8cee4a9c7ba81d22d29a3f5,2719 + pantry-tree: + sha256: a93f5e31aac66a82a885cb2ddc8eada9a8adefe8587da1c4085fae58b6bc4683 + size: 1944 + original: + hackage: tasty-1.4.2.2 +- completed: + hackage: tasty-hunit-0.10.1@sha256:ebc17b490750d4796b21d44001b852688cc39f9c34e387d5e7958e09b9b3f3b9,1602 + pantry-tree: + sha256: c00ed23d8281b6c6f4ec33dd1e9e3a7971b0a769b6140978cfaf2a6eff025c78 + size: 399 + original: + hackage: tasty-hunit-0.10.1 snapshots: - completed: sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index c8cabca..0a62b11 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -5,5 +5,85 @@ -- Tests -} +import Test.Tasty +import Test.Tasty.HUnit + +import Expression +import Parser + main :: IO () -main = putStrLn "Test suite not yet implemented" +main = defaultMain tests + +tests :: TestTree +tests = testGroup "Leviator Tests - Compiler" [ utParserExpression ] + +testParserHelper :: String -> String -> Expression -> IO () +testParserHelper str restExpected expressionExpected = + case runParser (parseExpresion) str of + Just (parsed, rest) -> assertEqual str restExpected rest >>= + (\_ -> assertEqual str expressionExpected parsed) + Nothing -> assertFailure ("Parsing failed: " ++ str) + +testParserHelperFail :: String -> IO () +testParserHelperFail str = case runParser (parseExpresion) str of + Just _ -> assertFailure ("Parsing should have failed: " ++ str) + Nothing -> assertEqual str "" "" + +utParserExpression :: TestTree +utParserExpression = testGroup "Parse Expression" + [ +-- function + testCase "function main" $ + testParserHelper + "fn main() -> Int \n{\n <- 0;\n};\n" + "" + (Function "fn main() -> Int \n{\n <- 0;\n};\n") + , testCase "function bad formated (no end `}`)" $ + testParserHelperFail + "fn main() -> Int \n{\n <- 0;\n" + , testCase "function bad formated (no end `;`)" $ + testParserHelperFail + "fn main() -> Int \n{\n <- 0;\n}\n" + , testCase "function bad formated (no end `\\n`)" $ + testParserHelperFail + "fn main() -> Int \n{\n <- 0;\n};" + , testCase "function export" $ + testParserHelper + "export fn main() -> Int \n{\n <- 0;\n};\n" + "" + (Function "export fn main() -> Int \n{\n <- 0;\n};\n") +-- alias + , testCase "alias" $ + testParserHelper + "alias abc def;\n" + "" + (Alias "alias abc def;\n") + , testCase "alias bad formated (no end `\\n`)" $ + testParserHelperFail + "alias abc def;" + , testCase "alias bad formated (no end `;`)" $ + testParserHelperFail + "alias abc def\n" +-- comment + , testCase "comment" $ + testParserHelper + "// this is a comment\n" + "" + (Comment "// this is a comment\n") + , testCase "comment bad formated (no end `\\n`)" $ + testParserHelperFail + "// this is a comment" +-- bad formated + , testCase "bad formated" $ + testParserHelperFail + "abc" + , testCase "bad formated 2" $ + testParserHelperFail + "/ def;\n" + , testCase "bad formated 3" $ + testParserHelperFail + "def;\n" + , testCase "bad formated 4" $ + testParserHelperFail + "export abc()" + ] From f10900cd272bbd53ff84e8d2c45ac31755056dde Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 27 Dec 2023 16:19:23 +0100 Subject: [PATCH 02/99] Add parser for multiline --- lvtc/src/Expression.hs | 12 ++++++--- lvtc/src/ParseUtil.hs | 22 +++++++-------- lvtc/src/Parser.hs | 4 +-- lvtc/test/Spec.hs | 61 ++++++++++++++++++++++++++++++++++++++---- 4 files changed, 78 insertions(+), 21 deletions(-) diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs index aedd839..427a103 100644 --- a/lvtc/src/Expression.hs +++ b/lvtc/src/Expression.hs @@ -6,9 +6,10 @@ -} module Expression ( - Expression (..), - parseExpresion, - ) where + Expression (..), + parseExpresion, + parseAllExpression, +) where import Parser import Control.Applicative @@ -38,3 +39,8 @@ parseComment = Comment <$> ((++) <$> parseString "//" <*> parseAllCharUntil "\n" parseExpresion :: Parser Expression parseExpresion = parseAlias <|> parseFunction <|> parseComment + +parseAllExpression :: Parser [Expression] +parseAllExpression = some p + where + p = parseExpresion <* many (parseAnyChar "\n") diff --git a/lvtc/src/ParseUtil.hs b/lvtc/src/ParseUtil.hs index cb71290..ce43a45 100644 --- a/lvtc/src/ParseUtil.hs +++ b/lvtc/src/ParseUtil.hs @@ -6,17 +6,17 @@ -} module ParseUtil ( - parseChar, - parseAnyChar, - parseUInt, - parseSign, - parseInt, - parseString, - parseBetween, - parseAfter, - parseBefore, - parseAllCharUntil, - ) where + parseChar, + parseAnyChar, + parseUInt, + parseSign, + parseInt, + parseString, + parseBetween, + parseAfter, + parseBefore, + parseAllCharUntil, +) where import Parser import Data.Int (Int32) diff --git a/lvtc/src/Parser.hs b/lvtc/src/Parser.hs index 77420e0..5bf4bde 100644 --- a/lvtc/src/Parser.hs +++ b/lvtc/src/Parser.hs @@ -6,8 +6,8 @@ -} module Parser ( - Parser (..), - ) where + Parser (..), +) where import Control.Applicative diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 0a62b11..5782ad9 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -15,17 +15,21 @@ main :: IO () main = defaultMain tests tests :: TestTree -tests = testGroup "Leviator Tests - Compiler" [ utParserExpression ] +tests = testGroup "Leviator Tests - Compiler" + [ + utParserExpression, + utParserExpressions + ] testParserHelper :: String -> String -> Expression -> IO () testParserHelper str restExpected expressionExpected = - case runParser (parseExpresion) str of - Just (parsed, rest) -> assertEqual str restExpected rest >>= - (\_ -> assertEqual str expressionExpected parsed) + case runParser parseExpresion str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed Nothing -> assertFailure ("Parsing failed: " ++ str) testParserHelperFail :: String -> IO () -testParserHelperFail str = case runParser (parseExpresion) str of +testParserHelperFail str = case runParser parseExpresion str of Just _ -> assertFailure ("Parsing should have failed: " ++ str) Nothing -> assertEqual str "" "" @@ -87,3 +91,50 @@ utParserExpression = testGroup "Parse Expression" testParserHelperFail "export abc()" ] + + +testParserHelpers :: String -> String -> [Expression] -> IO () +testParserHelpers str restExpected expressionExpected = + case runParser parseAllExpression str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed + Nothing -> assertFailure ("Parsing failed: " ++ str) + +testParserHelperFails :: String -> IO () +testParserHelperFails str = case runParser parseAllExpression str of + Just (x, _) -> assertFailure ("Parsing should have failed: `" ++ str ++ "` But got: `" ++ show x ++ "`") + Nothing -> assertEqual str "" "" + +utParserExpressions :: TestTree +utParserExpressions = testGroup "Parse Expressions" + [ +-- function + testCase "function main" $ + testParserHelpers + "fn main() -> Int \n{\n <- 0;\n};\nexport fn main() -> Int \n{\n <- 0;\n};\n" + "" + [Function "fn main() -> Int \n{\n <- 0;\n};\n", Function "export fn main() -> Int \n{\n <- 0;\n};\n"] + , testCase "function bad formated (no end `}`)" $ + testParserHelperFails + "fn main() -> Int \n{\n <- 0;\n};\nfn main() -> Int \n{\n <- 0;\n" + , testCase "function bad formated (no end `;`)" $ + testParserHelperFails + "fn main() -> Int \n{\n <- 0;\n}\nfn main() -> Int \n{\n <- 0;\n};\n" +-- alias + , testCase "alias" $ + testParserHelpers + "alias abc def;\nalias def def;\n" + "" + [Alias "alias abc def;\n", Alias "alias def def;\n"] + , testCase "alias multiline" $ + testParserHelpers + "alias abc def\nefg hij;\n" + "" + [Alias "alias abc def\nefg hij;\n"] +-- comment + , testCase "comment" $ + testParserHelpers + "// this is a comment\nalias abc def;\n" + "" + [Comment "// this is a comment\n", Alias "alias abc def;\n"] + ] From 9a3aef9f5f63408848eced6df3f811d352202ec1 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 27 Dec 2023 17:17:50 +0100 Subject: [PATCH 03/99] Fix multiple line of expression MINOR --- lvtc/app/Main.hs | 5 ++--- lvtc/src/Expression.hs | 31 +++++++++++++++++++++++++++++-- lvtc/test/Spec.hs | 2 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 8703237..aa337f0 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -7,11 +7,10 @@ module Main (main) where -import Lib import Expression import Parser main :: IO () --- main = print $ runParser (parseExpresion) "fn main () -> Int \n{\n <- 0;\n};\n" +main = print $ runParser (parseExpresion) "fn main () -> Int \n{\n <- 0;\n};\n" -- main = print $ runParser (parseExpresion) "alias abc def;\n" -main = print $ runParser (parseExpresion) "// this is a comment\n" +-- main = print $ runParser (parseExpresion) "// this is a comment\n" diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs index 427a103..711bba1 100644 --- a/lvtc/src/Expression.hs +++ b/lvtc/src/Expression.hs @@ -28,8 +28,29 @@ instance Eq Expression where (==) (Comment str1) (Comment str2) = str1 == str2 (==) _ _ = False +countBracketsForFunction :: Int -> String -> Int +countBracketsForFunction _ [] = 0 +countBracketsForFunction 1 ['\n', '}', ';', '\n'] = 0 +countBracketsForFunction n ['\n', '}', ';', '\n'] = n +countBracketsForFunction 1 ('}':_) = 1 +countBracketsForFunction n ('{':xs) = countBracketsForFunction (n + 1) xs +countBracketsForFunction n ('}':xs) = countBracketsForFunction (n - 1) xs +countBracketsForFunction n ('\\':_:xs) = countBracketsForFunction n xs +countBracketsForFunction n (_:xs) = countBracketsForFunction n xs + parseFunction :: Parser Expression -parseFunction = Function <$> ((++) <$> (parseString "fn " <|> parseString "export fn") <*> parseAllCharUntil "\n};\n") +parseFunction = Parser f + where + f str = case runParser ( + Function <$> + ((++) <$> + (parseString "fn " <|> parseString "export fn") <*> + parseAllCharUntil "\n};\n")) str of + Nothing -> Nothing + Just (Function x, xs) -> case countBracketsForFunction 0 x of + 0 -> Just (Function x, xs) + _ -> Nothing + Just _ -> Nothing parseAlias :: Parser Expression parseAlias = Alias <$> ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") @@ -41,6 +62,12 @@ parseExpresion :: Parser Expression parseExpresion = parseAlias <|> parseFunction <|> parseComment parseAllExpression :: Parser [Expression] -parseAllExpression = some p +parseAllExpression = Parser f where p = parseExpresion <* many (parseAnyChar "\n") + f [] = Just ([], []) + f str = case runParser p str of + Nothing -> Nothing + Just (x, xs) -> case runParser parseAllExpression xs of + Nothing -> Nothing + Just (y, ys) -> Just (x : y, ys) diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 5782ad9..4b717e0 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -26,7 +26,7 @@ testParserHelper str restExpected expressionExpected = case runParser parseExpresion str of Just (parsed, rest) -> assertEqual str restExpected rest >> assertEqual str expressionExpected parsed - Nothing -> assertFailure ("Parsing failed: " ++ str) + Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") testParserHelperFail :: String -> IO () testParserHelperFail str = case runParser parseExpresion str of From 44f05e68e4ea8ebb10bd7c1739671f9288fbfc91 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 27 Dec 2023 17:24:10 +0100 Subject: [PATCH 04/99] Fix norm --- lvtc/app/Main.hs | 3 ++- lvtc/src/Expression.hs | 17 ++++++++++------- lvtc/src/ParseUtil.hs | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index aa337f0..97f8458 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -11,6 +11,7 @@ import Expression import Parser main :: IO () -main = print $ runParser (parseExpresion) "fn main () -> Int \n{\n <- 0;\n};\n" +main = print $ runParser (parseExpresion) + "fn main () -> Int \n{\n <- 0;\n};\n" -- main = print $ runParser (parseExpresion) "alias abc def;\n" -- main = print $ runParser (parseExpresion) "// this is a comment\n" diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs index 711bba1..db13e4e 100644 --- a/lvtc/src/Expression.hs +++ b/lvtc/src/Expression.hs @@ -38,14 +38,15 @@ countBracketsForFunction n ('}':xs) = countBracketsForFunction (n - 1) xs countBracketsForFunction n ('\\':_:xs) = countBracketsForFunction n xs countBracketsForFunction n (_:xs) = countBracketsForFunction n xs +parseFunction' :: Parser Expression +parseFunction' = Function <$> ((++) <$> + (parseString "fn " <|> parseString "export fn") <*> + parseAllCharUntil "\n};\n") + parseFunction :: Parser Expression parseFunction = Parser f where - f str = case runParser ( - Function <$> - ((++) <$> - (parseString "fn " <|> parseString "export fn") <*> - parseAllCharUntil "\n};\n")) str of + f str = case runParser parseFunction' str of Nothing -> Nothing Just (Function x, xs) -> case countBracketsForFunction 0 x of 0 -> Just (Function x, xs) @@ -53,10 +54,12 @@ parseFunction = Parser f Just _ -> Nothing parseAlias :: Parser Expression -parseAlias = Alias <$> ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") +parseAlias = + Alias <$> ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") parseComment :: Parser Expression -parseComment = Comment <$> ((++) <$> parseString "//" <*> parseAllCharUntil "\n") +parseComment = + Comment <$> ((++) <$> parseString "//" <*> parseAllCharUntil "\n") parseExpresion :: Parser Expression parseExpresion = parseAlias <|> parseFunction <|> parseComment diff --git a/lvtc/src/ParseUtil.hs b/lvtc/src/ParseUtil.hs index ce43a45..11c2a40 100644 --- a/lvtc/src/ParseUtil.hs +++ b/lvtc/src/ParseUtil.hs @@ -39,7 +39,8 @@ parseAnyChar str = Parser f parseString :: String -> Parser String parseString value = Parser f where - f s | take (length value) s == value = Just (value, drop (length value) s) + f s | take (length value) s == value = + Just (value, drop (length value) s) | otherwise = Nothing parseUInt :: Parser Int32 From d844b8ca5db4b3c8b721bcf0a35d273ae9ae1954 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Fri, 29 Dec 2023 19:01:08 +0100 Subject: [PATCH 05/99] Adjust parseAllCharUntil to not include the until + Add alias MAJOR --- lvtc/app/Main.hs | 17 +++++---- lvtc/lvtc.cabal | 1 + lvtc/src/Alias.hs | 78 ++++++++++++++++++++++++++++++++++++++++++ lvtc/src/Expression.hs | 8 +++-- lvtc/src/ParseUtil.hs | 2 +- lvtc/test/Spec.hs | 38 +++++++++++++++++--- 6 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 lvtc/src/Alias.hs diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 97f8458..41f8713 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -7,11 +7,16 @@ module Main (main) where -import Expression -import Parser +import Expression (parseAllExpression) +import Parser (runParser) +import Alias (proceedAlias) + +text :: String +text = aliasInt ++ aliasRetValue ++ funcMain + where + aliasInt = "alias int Int;\n" + aliasRetValue = "alias retValue 0;\n" + funcMain = "fn main () -> int \n{\n <- retValue;\n};\n" main :: IO () -main = print $ runParser (parseExpresion) - "fn main () -> Int \n{\n <- 0;\n};\n" --- main = print $ runParser (parseExpresion) "alias abc def;\n" --- main = print $ runParser (parseExpresion) "// this is a comment\n" +main = print $ runParser (proceedAlias <$> parseAllExpression) text diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 2f3ff1c..76130c0 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -25,6 +25,7 @@ source-repository head library exposed-modules: + Alias Expression Lib Parser diff --git a/lvtc/src/Alias.hs b/lvtc/src/Alias.hs new file mode 100644 index 0000000..05cf565 --- /dev/null +++ b/lvtc/src/Alias.hs @@ -0,0 +1,78 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Alias +-} + +module Alias ( + proceedAlias, + parseAlias, + parseAliasKeyword, + parseAliasName, + parseAliasValue, + Alias.Alias (..), +) where + +import Expression +import Parser +import ParseUtil +import Control.Applicative + +data Alias = Alias String String + +instance Show Alias.Alias where + show (Alias.Alias str1 str2) = "ALIAS `" ++ str1 ++ "`:`" ++ str2 ++ "`" + +parseAliasKeyword :: Parser String +parseAliasKeyword = parseString "alias " + +parseAliasName :: Parser String +parseAliasName = parseAllCharUntil " " + +parseAliasValue :: Parser String +parseAliasValue = parseAllCharUntil ";\n" + +parseAlias :: Parser Alias.Alias +parseAlias = Parser f + where + f str = case runParser (parseAliasKeyword *> parseAliasName <* many (parseChar ' ')) str of + Nothing -> Nothing + Just (key, xs) -> case runParser parseAliasValue xs of + Nothing -> Nothing + Just (value, ys) -> Just (Alias.Alias key value, ys) + +replaceAliasInString :: Alias.Alias -> String -> String +replaceAliasInString _ [] = [] +replaceAliasInString (Alias.Alias key value) (x:xs) + | take (length key) (x:xs) == key = + value ++ replaceAliasInString (Alias.Alias key value) (drop (length key) (x:xs)) + | otherwise = x : replaceAliasInString (Alias.Alias key value) xs + +replaceAlias :: Alias -> [Expression] -> [Expression] +replaceAlias _ [] = [] +replaceAlias alias ((Expression.Alias _):xs) = + replaceAlias alias xs +replaceAlias (Alias.Alias key value) ((Expression.Function str):xs) = + (Expression.Function (replaceAliasInString (Alias.Alias key value) str)) : (replaceAlias (Alias.Alias key value) xs) +replaceAlias (Alias.Alias key value) ((Expression.Comment str):xs) = + (Expression.Comment (replaceAliasInString (Alias.Alias key value) str)) : (replaceAlias (Alias.Alias key value) xs) + +replaceAllAlias :: [Alias] -> [Expression] -> [Expression] +replaceAllAlias [] exprs = exprs +replaceAllAlias _ [] = [] +replaceAllAlias (x:xs) exprs = replaceAllAlias xs newExprs + where + newExprs = replaceAlias x exprs + +getListAlias :: [Expression] -> [Alias] +getListAlias [] = [] +getListAlias ((Expression.Alias str):xs) = case runParser parseAlias str of + Just (alias, _) -> alias : getListAlias xs + Nothing -> getListAlias xs +getListAlias (_:xs) = getListAlias xs + +proceedAlias :: [Expression] -> [Expression] +proceedAlias exprs = replaceAllAlias lstAlias exprs + where + lstAlias = getListAlias exprs diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs index db13e4e..370c4c4 100644 --- a/lvtc/src/Expression.hs +++ b/lvtc/src/Expression.hs @@ -39,7 +39,7 @@ countBracketsForFunction n ('\\':_:xs) = countBracketsForFunction n xs countBracketsForFunction n (_:xs) = countBracketsForFunction n xs parseFunction' :: Parser Expression -parseFunction' = Function <$> ((++) <$> +parseFunction' = (\x -> Function (x ++ "\n};\n")) <$> ((++) <$> (parseString "fn " <|> parseString "export fn") <*> parseAllCharUntil "\n};\n") @@ -55,11 +55,13 @@ parseFunction = Parser f parseAlias :: Parser Expression parseAlias = - Alias <$> ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") + (\x -> Alias (x ++ ";\n")) <$> + ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") parseComment :: Parser Expression parseComment = - Comment <$> ((++) <$> parseString "//" <*> parseAllCharUntil "\n") + (\x -> Comment (x ++ "\n")) <$> + ((++) <$> parseString "//" <*> parseAllCharUntil "\n") parseExpresion :: Parser Expression parseExpresion = parseAlias <|> parseFunction <|> parseComment diff --git a/lvtc/src/ParseUtil.hs b/lvtc/src/ParseUtil.hs index 11c2a40..20f020c 100644 --- a/lvtc/src/ParseUtil.hs +++ b/lvtc/src/ParseUtil.hs @@ -70,4 +70,4 @@ parseAllCharUntil str = Parser f f [] = empty f (x:xs) = case runParser (parseString str) (x:xs) of Nothing -> runParser ((x :) <$> parseAllCharUntil str) xs - Just (y, ys) -> Just (y, ys) + Just (_, ys) -> Just ([], ys) diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 4b717e0..4c9879c 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -10,6 +10,7 @@ import Test.Tasty.HUnit import Expression import Parser +import Alias main :: IO () main = defaultMain tests @@ -18,7 +19,8 @@ tests :: TestTree tests = testGroup "Leviator Tests - Compiler" [ utParserExpression, - utParserExpressions + utParserExpressions, + utAlias ] testParserHelper :: String -> String -> Expression -> IO () @@ -61,7 +63,7 @@ utParserExpression = testGroup "Parse Expression" testParserHelper "alias abc def;\n" "" - (Alias "alias abc def;\n") + (Expression.Alias "alias abc def;\n") , testCase "alias bad formated (no end `\\n`)" $ testParserHelperFail "alias abc def;" @@ -125,16 +127,42 @@ utParserExpressions = testGroup "Parse Expressions" testParserHelpers "alias abc def;\nalias def def;\n" "" - [Alias "alias abc def;\n", Alias "alias def def;\n"] + [Expression.Alias "alias abc def;\n", Expression.Alias "alias def def;\n"] , testCase "alias multiline" $ testParserHelpers "alias abc def\nefg hij;\n" "" - [Alias "alias abc def\nefg hij;\n"] + [Expression.Alias "alias abc def\nefg hij;\n"] -- comment , testCase "comment" $ testParserHelpers "// this is a comment\nalias abc def;\n" "" - [Comment "// this is a comment\n", Alias "alias abc def;\n"] + [Comment "// this is a comment\n", Expression.Alias "alias abc def;\n"] + ] + +utAlias :: TestTree +utAlias = testGroup "Alias" + [ + testCase "alias" $ + assertEqual "alias" + [ + Expression.Function "fn main() -> Int \n{\n <- 0;\n};" + ] + (proceedAlias [ + Expression.Alias "alias int Int;\n", + Expression.Alias "alias retValue 0;\n", + Expression.Function "fn main() -> int \n{\n <- retValue;\n};" + ]) + , testCase "nested alias" $ + assertEqual "alias nested" + [ + Expression.Function "fn main() -> Int \n{\n <- 0;\n};" + ] + (proceedAlias [ + Expression.Alias "alias int INT;\n", + Expression.Alias "alias retValue 0;\n", + Expression.Alias "alias INT Int;\n", + Expression.Function "fn main() -> int \n{\n <- retValue;\n};" + ]) ] From bcd2a3239687d59bb4b30e48ff78f23c0ce89fe4 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Fri, 29 Dec 2023 19:02:41 +0100 Subject: [PATCH 06/99] Remove not used export from Alias --- lvtc/src/Alias.hs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lvtc/src/Alias.hs b/lvtc/src/Alias.hs index 05cf565..a12e0c3 100644 --- a/lvtc/src/Alias.hs +++ b/lvtc/src/Alias.hs @@ -7,11 +7,6 @@ module Alias ( proceedAlias, - parseAlias, - parseAliasKeyword, - parseAliasName, - parseAliasValue, - Alias.Alias (..), ) where import Expression From 9b50698d8cd33da4d6d2a1eda1149744a7794fe7 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Fri, 29 Dec 2023 19:06:35 +0100 Subject: [PATCH 07/99] Fix too long line MINOR --- lvtc/src/Alias.hs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lvtc/src/Alias.hs b/lvtc/src/Alias.hs index a12e0c3..fafd5f2 100644 --- a/lvtc/src/Alias.hs +++ b/lvtc/src/Alias.hs @@ -28,10 +28,13 @@ parseAliasName = parseAllCharUntil " " parseAliasValue :: Parser String parseAliasValue = parseAllCharUntil ";\n" +parseAlias' :: Parser String +parseAlias' = (parseAliasKeyword *> parseAliasName <* many (parseChar ' ')) + parseAlias :: Parser Alias.Alias parseAlias = Parser f where - f str = case runParser (parseAliasKeyword *> parseAliasName <* many (parseChar ' ')) str of + f str = case runParser parseAlias' str of Nothing -> Nothing Just (key, xs) -> case runParser parseAliasValue xs of Nothing -> Nothing @@ -41,7 +44,9 @@ replaceAliasInString :: Alias.Alias -> String -> String replaceAliasInString _ [] = [] replaceAliasInString (Alias.Alias key value) (x:xs) | take (length key) (x:xs) == key = - value ++ replaceAliasInString (Alias.Alias key value) (drop (length key) (x:xs)) + value ++ replaceAliasInString + (Alias.Alias key value) + (drop (length key) (x:xs)) | otherwise = x : replaceAliasInString (Alias.Alias key value) xs replaceAlias :: Alias -> [Expression] -> [Expression] @@ -49,9 +54,11 @@ replaceAlias _ [] = [] replaceAlias alias ((Expression.Alias _):xs) = replaceAlias alias xs replaceAlias (Alias.Alias key value) ((Expression.Function str):xs) = - (Expression.Function (replaceAliasInString (Alias.Alias key value) str)) : (replaceAlias (Alias.Alias key value) xs) + (Expression.Function (replaceAliasInString (Alias.Alias key value) str)) + : (replaceAlias (Alias.Alias key value) xs) replaceAlias (Alias.Alias key value) ((Expression.Comment str):xs) = - (Expression.Comment (replaceAliasInString (Alias.Alias key value) str)) : (replaceAlias (Alias.Alias key value) xs) + (Expression.Comment (replaceAliasInString (Alias.Alias key value) str)) + : (replaceAlias (Alias.Alias key value) xs) replaceAllAlias :: [Alias] -> [Expression] -> [Expression] replaceAllAlias [] exprs = exprs From 0b080b53b21dcc9fa3178178e053397f7db86acf Mon Sep 17 00:00:00 2001 From: Tenshi Date: Wed, 20 Dec 2023 18:53:44 +0100 Subject: [PATCH 08/99] add vscode extension --- .../vscode/leviator-lang/.vscode/launch.json | 17 +++ lvtext/vscode/leviator-lang/.vscodeignore | 3 + lvtext/vscode/leviator-lang/CHANGELOG.md | 1 + lvtext/vscode/leviator-lang/README.md | 5 + lvtext/vscode/leviator-lang/assets/icon.png | Bin 0 -> 1398791 bytes .../leviator-lang/language-configuration.json | 30 +++++ lvtext/vscode/leviator-lang/package.json | 41 +++++++ .../syntaxes/leviator.tmLanguage.json | 112 ++++++++++++++++++ lvtext/vscode/leviator-lang/test.lvt | 64 ++++++++++ 9 files changed, 273 insertions(+) create mode 100644 lvtext/vscode/leviator-lang/.vscode/launch.json create mode 100644 lvtext/vscode/leviator-lang/.vscodeignore create mode 100644 lvtext/vscode/leviator-lang/CHANGELOG.md create mode 100644 lvtext/vscode/leviator-lang/README.md create mode 100644 lvtext/vscode/leviator-lang/assets/icon.png create mode 100644 lvtext/vscode/leviator-lang/language-configuration.json create mode 100644 lvtext/vscode/leviator-lang/package.json create mode 100644 lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json create mode 100644 lvtext/vscode/leviator-lang/test.lvt diff --git a/lvtext/vscode/leviator-lang/.vscode/launch.json b/lvtext/vscode/leviator-lang/.vscode/launch.json new file mode 100644 index 0000000..0e191b5 --- /dev/null +++ b/lvtext/vscode/leviator-lang/.vscode/launch.json @@ -0,0 +1,17 @@ +// A launch configuration that launches the extension inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ] + } + ] +} \ No newline at end of file diff --git a/lvtext/vscode/leviator-lang/.vscodeignore b/lvtext/vscode/leviator-lang/.vscodeignore new file mode 100644 index 0000000..19bbe78 --- /dev/null +++ b/lvtext/vscode/leviator-lang/.vscodeignore @@ -0,0 +1,3 @@ +.vscode/** +.vscode-test/** +.gitignore diff --git a/lvtext/vscode/leviator-lang/CHANGELOG.md b/lvtext/vscode/leviator-lang/CHANGELOG.md new file mode 100644 index 0000000..420e6f2 --- /dev/null +++ b/lvtext/vscode/leviator-lang/CHANGELOG.md @@ -0,0 +1 @@ +# Change Log diff --git a/lvtext/vscode/leviator-lang/README.md b/lvtext/vscode/leviator-lang/README.md new file mode 100644 index 0000000..cdcbd2a --- /dev/null +++ b/lvtext/vscode/leviator-lang/README.md @@ -0,0 +1,5 @@ +## About + +Extension to enable syntax highlighting for [Leviator](https://github.com/X-R-G-B/Leviator) in [Visual Studio Code](https://code.visualstudio.com/). + +## Installation diff --git a/lvtext/vscode/leviator-lang/assets/icon.png b/lvtext/vscode/leviator-lang/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7eba1c17b6b0edd2ff215653a8e9551070935634 GIT binary patch literal 1398791 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%0D)G!H*4X?M_v)O- z+13WJWLC1u?&6pNh+89ZUW0@jqQX`OI(m_drxcGbi#yiF-rZ%s${Rh46z&H?8b@}n zGJS~90C**IIUjFC9gkONeus5_MuWE=M?T66%j!e5>s2j=1#-;Aij(^#nT(hW+alSu z$1jQU|LTt;(_&^+lm^qf%25EOUQw`(;iXM~t0AT(lJ4SIC!U6{c$Vu8}nBJ>YPgNvHIkIvaUyDy}-<_L(aMOeXzTkX-?12*vm?E$J@$q4Aa@jY4 z{niQj{QUBww{6>r2DQxhjMM{D%?V*|L`3K=2+OOP`%Rn(NT?^;{h_eP5__LO0f@Ax z_uu{g$DjDPfAj81_*rA`0|82aaby{ppbob%Ar6s@c?_%uoEg@K#97RtKD*W$GNfjF zYzxXDtG{5}0yS0O1t>d)lp26ku?MT66ZEb1B~fjZubtV_h#?;!*z7Iep;Xum z$Bl%LDg@*80=Tca=#ZlO7Of&!V+D^}axy}wwO7b~;45YyXFOHX9#aD5Kx_`mRlOkd zk3YrD$R)fKwhC|wY!ATArzZ;(_a;{-F!x)lQ(Og{t%d$f_4uX6#dam$7dJ(MyS+^B zwLTXsbA%zSOl3x{?I#O1M+Kw5A@8=3GUc;_TSHBcNyUms!kGZnAE#53H~dBE;hu@C zcV9nF+pHIZhTu98VoF9XOr0w~Y03QYT-9d%DBH2ZXVuDO_NO!Z(u{xp0?wauoU&r& z$$DBJ@nceB_3F@D6Ky=UlDIX)l2`8GPYyrgx5N*|2=?2qFFg$*2`4tEmY%e$Us?3m z@|}}$d0tQ+bE-d_2|3^L2CUdlZ8QxMMZSw!buPU>c;aa6+9@t6v$T57GdWNWirwf| zD@liK5`d`bgE5zaM2Q=WejLdYV-3YN9%GqPMZ;j+>iQq<9*oB2Z3~Vm8hydG< zFE6A5l-9IEn&ql@!LAaY`#e-fo+8}2B7hD_2?n$xe*j=>O;y{-nP;2;#Ik`s*Sz$| zchiL4-hX)d>G|{R)92s5-_T92EFC||!Xh~JO7#^&vA8!kDI=T2=rN)MBa5$KK*`nu zX2$10J~D6Dyd?XtI;hFzDoQluggP{qXX0)>c$R0MbLH zDJaeGxto%4&~1{Nq~>H}v}lEd$XdI@=)rp(j^gYfgR+O!4Dyj4*!RXVQ$_27-+W38Ay>ihMO z)w&=5P8=%10`r6SaCLHI57~R|+$T4Wy||H;HpA&hT98~N2w$;y9+UeR0|bB0aMZtF zoYL#}|9aj(jzm95k)dcPv0Un9<

XN2(tWE<_3=SRh(>tZINN%BT9U3f&~w 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 z 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�Tac#g#DJUJBM)(;pW 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%0DsAFm^%M7<`xig|J9{p>)`sh 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

  • g3bl~$YbY@ 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%0Avzh5+m0lA zVbP9AnAu{Itpfn(Qe`u_CV2x$;xMUfY-AwLY3>o@1eB>QD_+=FtsV`%g@&9l3&0xr z<;qD?Sj_vbKuoo21TeBkSg5E_lq#&Hv{n;a#S8EIi%RTg|GJ*P@c6!^QsF^H%q&90Y$PPnvO{sLQ&gB4(cEnsQDkgEG7-mZLWLk6ti1)Q z2F~ODPkw3uVSpHHC`k_tiyoP&#%hL^yVpnwSXo(FT3VdeP2E^fe&8#o0+Cs;82%d- z253|J(@$O~ic(FB=$o@Hsc!Ud5kOoOwZZe!AHDxG+g?0O)c}dvWDHP^C8$Zwg0|dl z|Ljlxt*?FlEt7MPVZ1%wxYA={pkUI_z(@@(Jh{S*)Tk%@&9$wwXU{W>X>b%+)zsg9 z`|aBsn+sv*>z{qo-~YCk-*a8ru063b0$5vSbufYh*a91?QA`YHLW|1_{ZVBS2qfSL z)5T0kgIRyyfnqQe6rcR)$Jcho4WUsVV|LVtyuR^uFXeV)d}ZtM$@2r}h#(@-SjQ44 z8uyCI2Tw2|1`yMHNAFDH)LFFlMI)XOrBWva7jdMygDj>n6A}O{1e2l~oVj?BNJNdJ zPlVYUf+3-c03u>-#neygvKWP8>2er;;_UVx-S_C{FODzjXe^7q7}iovr}(CC{yN8P zU#MMMuQxVersj!q!4spz6RJNEy-}6&vzC+sj zY)-P-(f!Wt#?Uh4l|Qd8Fl z-Lq!A8X;Hy*eNjG)64)|rx8UwIQR53wZ<|U&Zd1~NqMX-ae;C5m?fPdHPv!_bL{FF z9lT4+dCiQPeKD`t%#?xI&jgD?#|L7U_BD#KzVn@>?$u-tFZkl*>6!*F1gL<|avMBy~K( zq&{>`p4mkW84`3}o;fmbdahaPX6wA;t;N$cmVli(tdQ3W(N{_~{Fc^c(8kefQn3eZ$voUAn{^0#O@Coq27i!A@OVTioBP9BplF`Qhrn_@Dpd zYhM5QNxfCKei~?P+=QYx9Q0TBFO|*(RW%iMBou8(u*j2Ug-McKnd?p6tgw_`l8B6Z z(*N9Fe(0gkeD28N(#4I9TVMRlH~i4|K63U+>pOTbIA|b(I6+Xez%eRPtPLh8AN=@d zKKGsvAChWoJaMJ-p)I7es>l7o=I*p5?hl4VZ&396HJ}71Vg})ut27LUy+%Dt%;L{y zFJ7EBaFrDzQ*EUx*DjxZ_S2po>M1!f5`r;28EI(AQKJqd7uPq=T)E=7Y8wMXEV7DK zb3#u85wkZ)Dg8lNjbtaYEQ~^0F;Vv>MCLRD25*#1_zY4g89QbPlXhnV%!T93;TIN1 zu4GpP;y`GkU(Uy*gpy_zo0&xqJ()68f)CBaPqry|L;^R&3_*>kAXs1y6v$Ol4a#by zW$A&IlKvl^J85Oa*~lrHI1Bb}Jx0N$M#?c?pZScO2?kPA{Qqcs?{HhLvp)DOYi4#k z`?TA2uda$ETb8>F7#my&j=>O!!66}p@=+29B!ENj34{+4N+<>lF$5cojlq=AY+-D0 zle;ZhmMmHQ-mBYAKfBD#df)f^W34qa``jxad7f|UK1X}cp1o%E^?QGB6Yy#(Al}rQ z_h165Nh_euif)!=vlVxA_|09-ay+oc<9-_H`mj1f5*21Z<}3qt#4e;FZk`kHC>R28 zSbqQzU0DzffQ%GE0NEhfNC0#|i@zbDe#pfP!Ll6yfJi_9R+rb_@i*_=+Iak@e(Zbq zbw29n16R)H<$)P&p-O{JC|0LYGLM_z%00F01_Y>0w^Ix`z;)v z-Q2$akqfsyX@xKZG9m>Kk&p(#002X3om$I{AN{U>kNBED`|zWVdamg4aJdpAE^4Wb zLedT*A~R7hgRH-OdCQAGe$8=jk`+05dgS8vv2pSAqj_faiKX6Gf6yr`{720+~j!$bx#98Z;V4jOV=q03iw}0Z&EG?`|I-jZiTJmJK{8s1c(IB9W=8 z5+eE96w!#VSeoa9k6)hMb#d>|AUnRibn56~D%>-kdyCc+!XiU_@FRCW>GM8E8AX*C z2{;8ORBX{v$K`Jk1{{F7r$)Ik#et{NCPibXrgyAPF>+PPyoO(Y z^&9g3QdR4utY7}+U+}UoeDQ^gXN2ksb!JYGRe+F+UNNakAll!bjt`ywh1dVV4bS?F zVre*=&kbmMT4|OKmilX}%Z?lX8Z%{Ch=nJr67;WV5<>|FelmD|T5G2XL7zk@X1>~d z@S(fj^{(Tim8zDtYma~V|MOM%pLvjSf*L?ExD_IRiYkJssVbsqRjb#BK7QBjzx(F( zY_LD8^DL{%nmPCCFdNL~CP4k+U@%@9uB}PNUM(+rU`9m26kY22=%IBp5Wvc;GOLV= z{r~~g8zOFRT)y?X>w91U_jwZqC14c=AgBoxw|6IJ&tJ;30SF-y2%w><1~hEZNE-mr z2*%^VcvK8}Zh6=b_EBLiCc%*mI1uFoOyI~EqFFjH5*e10+5W}`%qK9}FE=-;jSJPr z~A`$P-_GM zC=on^1VrgMx8Z8Gc5SwLl14{-))yc$LPOLrItVc_swT~$LD(oFpB-AMN@C!Fgv|(q z)l*%+WzjM)Vp7$H)bmP2jU&Ou3JlS^heOJ#j@11I9>d-O_p)S!OFd`!`0+EG( z5HNR8AS5+Hc+*@&v=Cj3Q5n>sW?&g;2AZijskxeSIkEj6-MK8A7we73{lk;=E(Y$CAt^>VkkkBT3lgt%b z)>O~?Ir(aii0}RICn4*rc~w+H05>h=!p80g?)ZdOtZslV2Lmzy1a_z<2ufrjk`u6- z%*8|gsmIRM7J}Jx(6S+sngOb+4-?tB9)XeV{pk09^D}Q)onCkpW;;~XOr#3NBq5+J ziiB{wh~8T-8*g0RdF;^(zIOFo4EbZ9e)tW4{lr|l8$a^#yH~)mHzX64cr?b?aun&Xu#Q^vA98E7 z7$OmK3Hf%;`+t}?Y<`bd+}(kMT>x+Z6W zXyG9Zo{y8Di@Fz(ds1~Y1=@l8t^$hNrX)j-NY8g4)HR`4X#8RawslBxQ<=;agI_ zbWB996#vr4h5G)(69AxHBi)Y+e^Zs9HU3T-s&?uu%8zMq7Q_Qc&FoAdOO7wCgcNz~ zE9=>)9}=lPvmpMG08tts!#q%`6|f4I85 zROGp1imQrAElh?um6~x3_7955Wh4-6K`}=pA|mzB`1Uvd>3YAHWxP?(zUlkE^Hb*^ z^TWIX1BO~lGhk#?G6OUcBrLK@ou}TJ`#$~l-+9Y1z-lrj2Jb7Ek%&;%6Lf%XFkBjr z$GzdO7M;(0Ui3{Nc)!)E!D@MJeMJ;hL6tUl_ov?GhV#1iB3jRnuP+~4T1EhM90J{= zBC0rtK$+#)_H6dRV`q!3UzZ-xKn;*o6_J40!~hVPgJ;6p>R@%86%IM)<-;pJ^p#>F zCgMlbRs)j_11;z^11rbS=luw5DSL~{vlCFuI_oQ3QA9-$0woZK;y@kv z47`()<`doD_S=`s%je3?3-!(=o$X>(I#V`f3`trIP@?7|E{%!yY!6P0t zm;5p6)v$`yt$=-!qt{MK;Pkq;kfp_(Ebu=mlZZImS zSLDMU7jCdT7_8#71ixq>yWjSIt ztt!{=|Hfwolx4|G=Pv9_%DPrB=8*^xy?VnK z$KT8hv=Yxnp9!Jd`^oS7_k(J4`^*_X+s~-ZouUDQ%Z!`>5ur=AGb&5{@$T04*~iY7 zGufZi!$ZfX`SS1n<-0$1VQ)%~Gwu7Gr>y7S^{>C=x`Fk}y|un0tr5WyQ%Ll!61<3r zsjBCqGFl$=M+F+@D0wCdT6$YMaZ15C#S0HSy0c$;V^OHQdeO`kd%Ig-{^c)aG-rJ8 zM?OBx3&O^2DB2$rA`u{CVxf$Ph?uCQYcTvxtREsGlYk-tXD%9E8z7N@2CphpFf=9> z@h6X+y!+Gl*TgB67@8O(fdpbPhPw*38U!dJfaC?Dn2$x)AHr~HL)_hGFF)gjFSkR}lajMz{luTkw=@j$3~8z=QvuW_01sfoio_#h&>0Eo_bdPfi6-2>tEA z-(+$T1i{w2sZp0+rI5d;G62vRSF{Mb(>d{Ri^J8eRMW!?{c)wa|3ZcADj&OlyOj)e zvouaESZ`&8C`5(YcWv1lG3&rf<571&uxg)rWi_yEXM9*1x@HEoLKH&sLxspOhtobP z=u@*(qvBe!#(yGqIaV4Ii$#IEg}c^B1#O=MZo47)Q*@k$@(%`SN$n7XgtW7zk&jTI z?G0;hh=BJ{Bq!ZSNE~lv+=G*hHJ(p$y$v7(=2UB)lMDXseVE^?UM}1 zf}M1;qlCQ=RFiB*^V%kw{m_s64CaHfrdyx)+~730zA69dix*!d2Z~o{v#JIe*2Gp&qL=Qa{XMZ5L?O|Is>Vt4iVy&j0>FZ z?`M`j^wCfL#c#Z6*}K`KHbk!?2xLT%D;NFMLrX_i2dhi2Kk~%htmyX$jS&$D)e3fX zHNF1&;|!*VUa|DDwY#r|RaI9aVwKLyo31%kRZ~Ro(S*Q3NQr5F?geqPoRH&|PKJ~ks)#k-&>!R*$(QN8!UzlaU4u~-Za!rmR!F3hYPy?h@3L1rU00l!J zv*7V(8ay?l+QAxkw$2{eEX^n_B-i84Vv2iD6R5x}0g-rtP#DC4I4OC)kGq#;^L({& z*6&=l>8_KC)w?JR)B)nh0#xJ1m6meYI~7$yEd-_kLWlva8Usjb;yWQ2N;nA_4atP9 z$_ux8oW@5=E)0>0K+Ql2F_-`)2_gizaY5`+lhCdZ1cq{|y!Sc~Km5jT{GoS$@V;!g zJgKLQO4Vcu_kZ<=zxgFkUbD%$Ypz+zhHmNbczkGe<>;Z|^02=&SU$AeUmY$VTU$SI zbZ~fN{knol=B$_HQY#V*7+_2+N#ugFIpw+Q^|P#h=LbLLEN8JyWn5&ef*QmBP$Za8 zlqR*i{4|4CwrCmR%k@CSW|LSkQ_4aocqtQ%Z zuzrZL41pYS+MVJV$AsoZ%i2T$bXwJWRV8YK( z`bsoJS$E}ke8m@j;WJJayXOy$ddQ+$F`z?oL?A#&-ppma*}R%h%faesw7zVNHJQtM zU_|{vJ{Tc@pO&9|;EcMyny9I%iTB{4NBUW}Js4?IR>6PGB#Yg$J@9)j4vE2*QA9N&spS7he!QnaZ+STR(Q!C+{)e}80Tgm=m_f_$pHT0*8Fk9m8a+p~*H00SuLp z4Z%!IBWy>cNLFEYrFF#5*x1%QzVrg%f-uljE{$U=rvXISJ&kzVk=W_tB$-*#=|wrh zt{j-omEgT#-HDY{?x84aeHJ=wL0bce#y`zSK+}H<55#6P+qG+uY=_d{c7{Y5(3+>D z(GCa&BHmBbMF?jcIt`J)i!hQZ7@#@LR}TH~PyhOkx?Zn0Ts!nd|N37%zPq80gNd+# zks=cj00h9r-T*JmE`)M_kHZnM?d+g!pk_bdg}uE zvOih_bH19@vt2S_6AdU!4N;U>k*F9_e++KmU13N7wSl6dDPn?g3Q8gPCW2}Ri-W;U z6TwJJTrGn+XBQBHk?i${l+r_v7n;@PSQbmkCq&G6%4EtDZwKeJ6H74^*ApS&4`o4 z9(18(8h~)vX_8YFB(5M>VoedNSMTv^FB45(|&2qNuSjj@VMN%y9`4{_k(@R&I1?O2z4?KND7$N-U9CCG?}FAynG zOJDf8<$R({A%0NQQHde}7^*3G&MEU%UG#e@Y6ud7)gdsmWyQRPCq4T!LFHX<`HMdK zKm4`Vyz<-r<6w2PkAh5M!Wi6>LL3ZB!gs*Z3-HfWLxg7NK#QxQ)_?4)bDU$^*8&)g zP$BL`PgwrJL|{!RvGfj3PaJczN7M*)-g2cwNj}`Y&sxU9eCCg$~2vO|DKCi?-hXd zi3fbttov1hiLLw-%52-w4nLqpAAnRsdcJk*(TX=$Yn2&<^+!mEk()$>lsyg5G@^kP zqH3HKmi*hyz{J2M#}#NzjL=MhsH_FCKuFPmtVREAuR+q`q`IczilT2bbg4rdrAi|M zr`}6r&`2D~o~qLaE$0DrXdyi*s>0y?AGz*%Hk;PaTVDZRo75)t+|Mf2rM1=m(h_ks=|j=WdYiz{f7wgVZC&Pmud2Pv7&OpQCIA9JIZ9pmX|-Go z{_=ml>D-4uc8FX#t1+TDFkmnicJ*iljvR)ZhndS<=0(w>88|>NT(d#W`+Jw4{;a2( z7co@>MYz1VBZBI^AkEA94L96?B!FIwnOVIMhFWo1+x?H8rJ@ItgBYR`BQXKO`bzKE z;dQNRK`WwwBlK_KYN+Dd5p!hmN z%boL5*C;z>Jvy{@^D{p4w$J*E!zYf{$WxuyB4*~L#vF@buZJtECyqYtv!79yvv>Z% zUw!IbcdYluIN$ZYHemI29(<0N)Qp3tIP|!;;)Z?YT!;ybv`R}l%q_Cu%$jU$48V{T zCB*$;15kl#=Bv5YrI`eH$z~W>2U8=##ta9beHS!vUA_RISy=7r0f@PwqTWxNg%U!r z$CcAa1qfi8mQ`Ampxr}1Y=Uu7$HJRObjg9{7lBp)Y^($=Ql4O7Ud`7EJA#gj0`d`O z1v^#{K~fV&3aJGE0Et52cm<(&V2Q;oHzjjGZI^!P8;mCYNJbE|3go14CqDeqFL=dEi+a1y7(BdHl^Fp*M4`ychF|$L-#$8e^K^U!dxxp$$^OP{ zr|JWVpCP)}z4k4y`Q`sLn`=H;%7$ycIJAD_Q(*l_?Q$cK5H2`UZG;evQqasuRHoB> zW#CojwNzpfzCsdFCIVvvKocSs6(#~xG0eF*ePVfab!~Hhe>5B5aE-Z8h2RkaOadYT zjA74FWFSUDW}~eOkJmO^x#pPmadhhRAHL__{k_RQ`^;yIy&pP)dhauyeC*JnwO{>{ zzeZjw`%AS{XoQRoS;WY(7tD(OY&L^!T^_n4>r4AnMN`*z{k7%k=4OAe`u>mJ|IJ_D zFH{V)R%9b0@OAyPr=D6J_I9j)_Mx-aKlR!&IP)2W+|H)TI7GX&CYZW4B*ZQzNp3q!UQDBudB{tkwwu6noPS0?GDu)r2e~#taO* z;#Je7ZQpk2-`Lu4#6?!<0JH@|Js`QHd9WZY1fqX&n3^Ydt_0q;JDCkb#>=35Pmjeg z-z<3DVX|}yz||}YGTr5bb1!PZ>8{kgF4MixhYR0#o05J39a<3ELp}Umm~*YPj0=mf zsYLA4X5;`mRcu~u^R4saD2{cMW($C$as04^>)Y?3(E}V9|5R)MUKkb407>5xB3Bq9 zi2;}qF&cTR^TE=EjoDXz&9@F#j%CZefBrT9$}<@<8JQ`D-1DXoV!0xKsRAN1Ak3#q zF0XYeR+Zu_ua>#->N2>1;4P$ok76OE{Mj8O7ZOD`BuZn{7c5E*B))uYO(i_~wf1@9$4SC_*IE5OBhH z3Uc_yYbpnMQMfGgV#tI^3^6cb$cguNH%^^8GU&SstGbqq^Nr2Tx>f@QLNXbTdP~DX zp$zd zp@FDYa?K6b4%WxIAs`_R42L*isA^zH;7PWs>EP(_y%FVo%A5o_8PI~=PtXMbNRVICH$ldy)Rf>AoOX(kg9XxEKwyR@ zfR+{6+DV!2miyZroNhSCF$Ag*V-y)!%(O*eKt+*IO_)$TO{aSJ$aTN+t8dxf+W4XG z{^sfSrBT13FTCm-zwKvUee{_x-0^?{fUM>@q`8fb&c;kax_a!0Lc6@nK%CxMO`k9DFG-C3q4&oY66+l)+B1Bb(l(F1=BTK6>l079W}d<5n(N~RbTuYZ~5E%XZti-s=YZgK*$(Xl^m;;fVMx`T^k=-KeFt-ZeF~c_3Zd{ z*WUf+fXxKB$h7t$Vnq-+0ZdIBVM2U;ptJ{j0zI&;R+$ zmX0i!0G#Ju)N0=&yyuShf9Q@6*OxBzsh4@Q+5_+-R(;eF_lqYz^XZ@U!k6&UQkg;4 z&v(V2e9p69MD(sV{_$vU0bTmWokA5{ku*K3>vfNkg z2Rw-0uKJtq_g#KBd=9-9FD9@CkTCB;QLUj+3-uaMm-g*=B1H__+6x8S@gy8Bn(TBa zqpLU74)oAfni`O8J4!A3kJvhu9g%ihUUT;W31p#jJFv4sU5KKcu|j}klimGQDyNkI zq7^zqGFCB+se%&z4U;0_`cNDJGE(9?MqtT+x7jo? z2@t9JO=*doXrf&#bY`qLruor~W-}8o3~m6Zi~pMLioc4T)BGIUa?+d5PpngBxF>4y z6Q^fUfQzwTEZH14EeN=&nZIeJTbsialhkE|27y_Lpd2701P_(!=;(=$eB#m1|KhKw z{)#zw!wuJ8fBg+}Uz@S1fLRuTV8-gi^zTNbhILgFibM6@&%Kr+le#{3&2fw>RX{*c zivt=39>f?S9D?laL2?I-l(B?xS*Dc{D@yH(h&@rD8)y0`N%W1r&P^Kfbv+t6bIt zGejXU3;E874H?*><1EjKLRwq)W?p6HO9er8NKA$Z=olU1teSrHH+{|SbSEncP%s4| zP*5;qf~n2)=+eLZo^ScO@BNPFyy$az+}oUQaKAog+ksFP; z7*gKPD9bkX_MiPvUs(6CHWM&FFph$6aM;g?iHVCIlAu=POQ*_#rvn2EG#?l!pamlp z1}IE>;&FGgzI3+Uc#QTg7xk<_ab%H_j&A8{=3|_k#uGQLsxa>)>_r9^V(0(_u{OB^ zrYr46)$9d}hXJ-U2|~L<;%ZMeAP_f=w$O#uchy&1Ac^v~w7-GH7|75h`HCnW3=i!G_So&_%ZF}#&dJ-J zJ0C39gRu;j_p_z7Tc3T)OI`-+>q5+&t1220$DJoQ&?CfD*Z|C&7wo3n(@%WtzRm4w zZ!WvD5{PPV-kTbG1vQfJljLZXl0m=?*B-B{X*HcVG%!U9nXNS=22l*ba{vuM&BRE- zAr&CBlrNQ=`&*Bk&pk}4sjVOT*yHoxzWsd{e73Jh&J9@B-26Mg;`5)m?gq6la)+!G zV)Qt4Xjw*rcKq6FhD!q!Kgi+O`nbn%==gGpAibRW#YgXXlwG0bMNLEjK@FLxpE(qr z@6QRbIcX4(kqL(AC z%-JjxbF=xw@B85I{`a5x`0an$pUuiiRU1vgPTuzP&-;c~?ur)E>Fa;yzv0Ep{mMv% zs9D0Hp)L8J+Sq^w==`Nd)PG{g|M$KU+H0BL4oK~8FP--buSNhsz_xNNChVerjAV-~ z`T;jTfvY_F@2hsV%?;-2eCR^ef4Iy}Nl)-a(nQj(+r zjy4CO6+t5%|F)Wq^s|3#o&O%$V4)FLxuI=M2PNZyr(?8+Od?SFL8rikZy}Lp01(5@ zH8ot2+%Q3ROmz%BllsSEQRzv6*l!r?Wb4vc1VxyQ#OM%_2rcBlOt3pz7Xm;-KqXPU ztm}lH5t3*}O?x`6?wt9M>~gWxp>?lDgwq&eg^`MCF#`>JF#t?! z(|)g5U;DYAfBlz#%@1zQvi0%!-~7v$|M2&G>wLQHa`rKBBYIUeKny%#_>W@dO%EBP z)OF=??qO2Tm)6EbuZS5T2?N+Si17@myKQK+=t$YAQl8pySOlI>#A){EryiYd?)047 zolZ|Z^9Jm@vQ$J;RSR*=fe@Tm+S{KZ3@+Wb{i{Fx>OoDsSI&0#h!F$36ELG80D0q; zYpxU5!;B3e%W?wdkn5hEc|);YhLh>`lb>?qq?{R(dN9Mi-F*?Psw!irQa$O$lZ@uF zkU5AL9hz}gJpA~@y;8^us10HmOfW_T3?A7A!TikvGD9?%rnQ+O8lz>Xgo`AgC zgI9d>*Iq7nsGn2jN)ZHu9&Et$sbBPxul``Ps$CWp@Y5+J#UpK~#vr zH^fZLJc1E$+@LxOt2sa{L5k*YGl}8~Yu-gkS({t1Ss#lJNU5(ntGp{1K$64b4c0#F zA9^)MNIaSen}lT$b8`R~k`aZRYyg5_q(qRJy1LSxjdJsx?rmT-BTym$4sneH&=iO< z18<~hz64ifOKUyJ3C;RPKm`RN12RR2Y)ImY{>o7|SgVx~!}|6_p*%zb0s=)c#NaDz zA#wl#5));dsfY3MiQC`tvG4oQpI%xyHm_8XbH}dSI@POx`$xZH@4=4@NST}`66XXA zfDHi&i3r5!j)))|_13OAxf3 zd)Z)rKJ(_8jZl$1GpcibX;>XSa>EN>uyp-R+0j!se$MBtKKZFzhS1BIGZJ6}Fg26t zV_{J{6(YkJ;9xWoF%#Q7zwxJk^4FV{?JJ+(*`KQdJ3tFtoSB*`s1U{=SKiRft&T_a zY}#{9e2v5wLgo^v3KDr#!$_);k%JKTz%t6!+j4)r`}oer!xwv)Pt2;(%0v6``nSLD zqIYx4neqYKP%r=cfA)gstoMrPPLDHVu*}S%IzfchmHwbWL^dE10m4y#aQfzBE5{G- zP3MC_|L%M4&$C=b0L*(eH9%0ax~j7fSD27OZUpQcvS`c%0K~`?A~?kW8*$ntNEX(P zg2vp{0D*uZKnCn(xtK?a`hw663I@_H<7v?58m>d zZ>ToQqRwHiT6=IjH7Tw+dh&VCI`Wyf7S|n_GE9Bh&-mlF|MeSw_J7ouE){5$(Z2VG zZoKKm|MC@Ea~qrf*{}S{a8@!vN=1N>=*32f5f0@m4OVOsNc>}=^Od()XNQVlsfE&4 zzS`Xk02WMutV1;(K;&sRZQ)`Ely`{isFD3gwxX?hV=B@`{M~Y{dgcG>)zrOFm0azOJa;UG{VzX>qf`G+$ko}(In64OrxPpR~E z=R~(;gd6S75sh%>y#kpA>KIcX>`t#o^p8n)hlKbOLQYarb2PVyc_&_Kt71AhOBbIQ z`)o0MXme+Mz4!1;&4|oG=9XA@ zqL2nNR0qL}DPlGkn|tvJO0>GZ9_24p3K7>;DQb)~&ZU6K&=fpjK$)nfO=fr_wGd7m z1Z%zPj*n)F%fsFym(P9COTX;=rAzssUsrXWXGu4Qs^aT%Ww89{ryu$2U;pD9$K%cO z=X^PJ8L0pf1<5C*{>_m~wZYL7bME!oIRq91LO~@UGM}R@4Mz{3`}DJ(b4v{~!VCmz zsAscse^%CF$V7yztILC40TSF66_7v?3^#Xn=cQ!WH_-rW1=!F?L%3KmO>shxCJ4-$_{xvjTw8 z*b)neK&FO3Q6=X<)JOplqol4Dl;A{$;=xNj-<5J^bxA?NlmReB zBulUrI($o@&C{}OkDBoR#n0BRC0sa*+SS#$?`p61_5cH7^*UNu>n{0)m3y!t3|YW1 z=*=K5`F0k<{LX{iA>S zXCKu1zyJLI`+fU6XGb{~?CRP6;ZgS5AN`hB{q%1xAG>*ri@6{ZfQpOdF#v^RvI>5A zZ8ZaT>CB~Gwj?Uv*9I88qJhZeeVWZ5KX>UFH=V3}JrmAC<~cJp1*?l(pZDBb-}b@B zU@)&H8+kut=e+kunI|$g+!bBA@s{3fKFz^;TnniJlIv%gXbliN5D<_Aj1Wu>2vxw4 zxi{>utnHoM>0$nI1|gGKz?4L2ppG;3y1cZ$abe4|9lqh%+$t}`Mdk#pO<@%mh6giaM4*tnqFDpNA#S`5vR>F#9zsn5CP z-S2qsaJ+W*(Q}Zq?kj}&&W2LeI4ifdc1??ZKM(rj)I4h@sOo(a%#2~?54l-gT&6ctgx18FzbZ%@*7w>!IuU`L_ z)7M@z-`E*qp)$*I+O_=YFMiQ8Ui=~)4S-#S-l;g0hwlB5Ko( zSB{@@6ES(wCqM7Dd+)w?&3D+?Gr@005H0nGj8bRj~%cq9E&I zdRAIKF%>{KMS{3t1~I>Pl%xTITWX}*tr9T^io*n*6V~tcMx((9(mMvzfj0I|x09P; zg@}=pA|fgpI%>3b4y0e=!M?TT;sJY~t9=aRC#_IB{o29p3Powutn6itY8>05Z00bMr zqiVGw3Ytgp7JubU9rrFh^7zK%8#%LBnJ*1SM^-BU6(dJpOce>7sFn5p`qJ|Gdmno1 zZ@uxlwefUwr<|9Jie3p2lPnZ13{2d3zN-zC z(2GhfJA2dV%oB3vjBI}T9I6?I5GSNYba8thsQ@z~Lq>yWyG@{ufZ05hCr=z_ zh&jJFL}WyuV1k6iOhh0tRR9nJAZ4yMul7z{f8>XL_9vhJFaGJ$t*4&(C7=JjKmRkm zlPC72c9bb_DGJEQu2vP3wO;<}AOEShzv)eGZ@QX|hcsa7fg33G&Gm@$UOrqNEIG-B zZpfO0GK8eR0H}Zhj6`5avYM<+HlCiSrq$0)U`d zmPziU-}6P`v%F+iF?k{-QcFR3i3PM-Q4rQ;gOJla@2dL@u(1P73OS5x!WNFRu+Ox6 zYl1P0D=w`&#Kzc;BKF5ft6O+#n80bxTKq@RRxkdes9gyDGmR7wcMHJQ(LBUM1;h~J zN71~AqA7~8I+U!Q$@WIQalv-Csj8hBg$IxY$ZvrH2eP=YE1;nQsUb;{cPzy9w;)gv z8xR>8fG}v*%U6%vV5u@tA~iKKW02Lh)Mx+!002ouK~!L4M%qvc7_7Y|?AjJK|FYD< z;P~6#ao6|$*nc0d9WNC;6J;#>o9j6JQ))tCR%YO)KHdjIkB znR*CRGOLmqy2`j@lwseESJZ&fz)I7(*OCi#1!b9;R;I!(@D)q|00IQobE6X{ptm$H z=b&=o@r%FwE5GxaH~sZJJMzG!x-7O?JA+0m0cw!c*02$0o1(*#P9D4Jn z!i+J?6@Wv=upIya6A*e7EU5I=Xf)nFzjN+Wj}?$jL8jU8f*-x^ZSTJ*{i!iH?i2Lo z^4GuY1U|$ub$uyk|!||-*VHx{plaz)m0Q)1A5!7Iiy|VnmuXsf@o8*|?eaCxq zQ%ivnvCDp1>)>bUN<3*h0Qw-^@Q(!0UBG7x*lrQ?cXqCYpT&2bC_s@oOhH0g31tCS z;-Upt531O9uU3i{7_`)A zYSW)UV~BlTXqnB@4hz8bP6wV@^c+oj$Se^M8vuIyfK#v$p`tWgd`qCX0m?YMLo zUFy2@7gNa#!udjbt~M8%r?=vL5**OLtA)7JjO0sSA@|pg{rJ!Q_W%67x6OB^FMPqR zKlZ)<_U2QEe7V)5id0I&{mPe$K+#;;B-l_XqMm+{_ga{6gc zn$%Joua!ydGOUe*gPF_Rc@}tDA?1_bzPiO(s}mzVb0Yy(lswftVVCB8}Ep z9Ffb|F;M_{gbadg16R!Vx0lz4hmIbq)e}-J6{FkO-P@m)jx#jNNpE?|O@2PhauQX? zh+rYP-pfg~6!nM%rbGy80yPprh@A&OvGSpQ zAPUa)YS3NVf6fa(*VdMf7#hD2%Z0HFb4)XNbds1xtP0ynFx3hJ_&&#f*|OOwd*8#pX- z$a|FcC@UayNSTIx0Mty-L}$D8?rs(*Rgf!_$z|N5qAC(0IGjX)9`=~dQfO8=Ld%2& z`$3Cd$c@~WmV451Hy5$lMB2X{W@*L0X7LU1Au6GKz198(0&oQjo|6xr$@{mJ{(|MdU( zZ$G%ZeWuUOu`B20s5kkI|MH#x;iq2X4&AuNu2jniRW&2$eeF000{{o4l~n6T*5;Fn z1g&N>4}buwriSF$?QHEL_vXU;r50IMuo9R0=h2Y*!+d3B*|fU6x%bG!TRD$v30}Dj0E$=xa4|gb z)Tdwi)W_zV7uc7z+TXnE?)Tq);VHMAT3>ai*H66g*-svgJb7b)nEuX`$m+^(Ztf7X zS3$=Jv^47FjOAoL*`2v8tAtdH!oWp`Qi2dV708=1=f0NZ!OHICt#fqt*bUcIQ0?*H z!O8r8z4b$1{rR^Y?^k_inV9L`|MNx9_kaG5Pwthxx(omg*#Q_T2q7y#vIZ3_tI5fe zNB6dC0{4keUtE924XkQbdt^2Dx9|9%5mi-v?DPqXdVV56GbJEH3b}iewQnPI1CU|J zGl>RfNSM~FCGs(a`Hl3D3iv#88uDWc5HWbg;7fog9=)1ndiojH&9=@;T@~}a`NpA&o!h^ZgIVbjGjhGERufW>RhIwrZ~vOt{qWB(Rp>z9{`-IUW#9Dm zQ&Rw=!C?Ii{Pz=S`jE+ zX`kQLq}fao`DhD?z`8);fS3}t)SX~H<2pQgUIW`A#QT7XPu0eU2W)}>(aU=v&G&kp~TdhmcucHnj8#e-K4Q1*-9 zG>I}D>y)HTwu2L>^9B#}UiuhooNkuj6q%mW%0mZ6Y~fIBZnxA`NPvzA3_?I(OO&>m zhTy?!Dyn9xQLju8iQs7a9zuv{&`Y#3nOXGmgHjcV4M2lR`f5FBiRbHb_SSiWkYK{W z*_HGeX_{ed8>a4S==*khAhuT)eg$oesVj5~-Lm6#NE15}o*hphj1Rv08fsQSob64g zG(RygFh(*nK&ooVm&fOJ%2$5rvdG(=-W6BUyx$NZCb-Vdc{RSn0(?dkqAp7r$kewpXF0RWN$ zR^G~Tp1c0VPhWcHAHUyE4vDH<^!sy9-Tmc5GlmUBlt4EHrcRktxlcx@^GF7$A)RZ`6?{XAe<&go1LyQa+FhfN`VrDZzCPf5t z3gA`trjxl$MG=vMon3A&M-~y4x-a^gANkos-Al) z$5}>%DqhJ8i;@6?5-G7pt8Y*QHPpJEZ=I_)&eR(h%1e*yxLAN~?~q#7w*L61}udc+#gW4IYTk`e%tKyAMXk;X@`B5Sa3 zM>0SKG{X>qGyJvap_EMPvC)8Du`H7!0+J3PrVR`zKcw01NELt-l>mkm5_`40NdQt2 z6o`ppjU)~{R{OGhq1?Ox^&G()sh}XntXK#bET#h05}bw+R81ne98&Ej5(3c~vPMCV zEFbsRPH5Jj*TM{p5tvHMpw?{tQK^9e>Jny-RBbRk{KtQJ$4~z3uP(11uf3{5&W`7k zLB08l-}5bW>470)&bcBQvw%7drst9oG9Usd)Ysm4&9vOhDMw=_CU!<7UUC$f?+a6D zJoT_sm2<$Ef*J-z;B;^6hraupbpN7F_AWpCz(D5(8aYHF5;HZgC^?&!P50N)(K>_iAgYHVZ=1&f)Yzk&wS2Pr#qJpuOE5qJMOgJa!AuV zsbFT=yWjI6RaT-C*PT#R2r2ZNPCI1R*p6PK9Q2L(~AHK@4IR zqCT1S^1}N%1c}xtR)BfS92u%+CVf7B^DV{7v7#6h8G94)rMDTdO=dF}Qnx6gsa2i~ z98qREoz_dIuUon9T0nG4I}bfHIdcZengI~u)TvWW%07UfRuIjVTgV4VozXG{O>7u| zh*7Qrv!CGAMgIrxY#=T~9>fxITcn<^QWz{|0uFtgKw1aigl}8Zg2XaLsF^U(->~~0qz<&Md3Lh*!uAK4 zq^9OdYMZs4xcKE0zYd5ZaUwOp#4B#X#zz?vmmO8fi!wktU5bU+fvgYC8+uw8dm;LMS`q*8M zUw`fL>t6i>-|)|0kd@~%m?Nop6?G-@R_#9V$d(lSoj@4WM~pZ{zDVTS>Iq%8>%83Do>5Y#~dMm6g>aO9DThG1k2ghE{nQZRNz42U8(HW8{nMQbF zU}S(mKI>=8hcN2{Gbn-u5kSyDs*0fe%;!DZ&u2NnU@)9j{_^(j-h3`%&M^^Od-6mt zrx2Qki7=dSfB>K%{Q=*2{n1m$m##TFzV6ha8%`g7(y3!N9zS|)ZKc;^ph~GG4m2zp z7!V+ufGU{fU>h7QeBWXJ|Cgjy73gbaXfD8$OSx=dW5c>%@H`Xd{TV7SDiWge~Y(i)G~cxjcF*4=oWm)3c_?#72` ze2B(}NIXk~Z(KJO~h!FqjM( z216+_b$+hf7j5eT&!)MBs7qu>-UL)pm4mw!f`&>nNbnH?Fwjub5O6FUcmxClf+*~Y zmBVgn)r%5@1OP~pP!q$X)D6;2*rf?DbKtN>9E^^=`ZaI)nO}U}XysVxOHj#)u$qqK z;xByn*9^V-VNsiW)5J?dr3 zVb&APy+^Q|t6OimuCDj{IRP3V$3usBW-QCcmaf0GIC7fu6+fBJFJIbz=&^g>e`k^R z9y_=3{*OPZ`A`*ntzsyEhCHe8o_iiH@*EuHxnq#|Y`QzI<|gXs`kQWWWSJQw#M~Dl z-cpD-7PvVAZ=SNe@;DkDo=yDy_kJ4G&vCx*dY{^X-}%drotxy-3Yf`(&u!;lfBtPx zUPGB|WQ@jWMnu3wYN&uhSOV|YaQaEtx_ZJ=J$B*pBU|&0xt`yjPU_+>{_;J$TN3~p zA6n}#kGv{CqoNM7Vu)S^jEG=_z!qGDB?P54wB!UxG2ksGzr@6XnSl{0p&|mCsg8OB z@j^iCNYz-;5sG-n4#5d#xUx1rb;IhZQ`j4T%e}Gl?n8g`H#Fb3O1v+Fd6FU;lM+p9 z6Xza0fB6gl&6jUa_Z;UulXv~u+tvolD8QaZqfuFw)Gyqih=D><9I9}zsx2PVNpIi9 z8n?58ofcQ>VXbC#!h7yC8Ps%^}!b=aV7n*KkDxD@nhg#^`99(5?r702}R*=w86=rp{diuH>a`^Xt{l}kqdfBQS7B#8SD~HEt%OAb(LY4PLlbR-&bx;WX2}n-N3`qof z!@f%S{=faZtqYHWPAThQo&zD6GDZUlMKd%-P$WfF1Z|fgL?S5cIWY@qP!f3aDiwa@ z10QFlvaX7v*xA`TeDcIZp;i*KvQ`k)a#mG-kdNN}C%5O8S5w{F-UHIQ+|MQ#M%6Bd zvltMF%z%JI)eznC7{|G>x1b82_wpf=y1_*t17JIz=!(hP-2QpR3#HE=0V0oLSTFy__6gA><|uYYoJ>Uwwb zIy-#audYeIXL+vV1Q;W`^EhTaf*Lo52``j+=CE7bMW<>m@?xw$;NZ~kH4 z$6~XZFaRSc1}k z*w7iW0b39l0%rkW78RK7!i~NI1`uc#g>-5`ii8f0!vH|w*%1}N2!huEC5v#x6gHQU z%+yc}dd{0*C4H~|R*b!(uYroqzF3$Co4{^i%a(7YyK_v=WjQfNI@t_OGY1F?2({J4$Sto9rLJ7=0F5mKuc%koMzdKdK$U6* zHZj_-vv=hZ|E)#buY znQKsE5-`Q8H?*fe>&bJ!m%EGzfgHI45gnsCw&Bw7hMNc1-2h9=%6X59-Lt#z|C@JD zC*^xT`S2DGrl=NVU6+@d-F@Ggz1hqFEnhO1bB4&sxf8(BDs^`9^eJ$rA?Om4g(QDW z3SiOOo)Ag2CPwj^W&L_z9=hxP0(mC0IlD(@{5ya1p$!>KO5i-tyo_=0YyZjfZtO`m z+e35aTvYx5Ab^4(cmr|+$7bc$-uhtl#y9@i*_rJ025zH(*$-b>iGM;Lbdjy#1sMr6B39r z8juW^haTM0HKz{WbhBk6q(0XDd|%)EbFUt=Lj=r7+0e1qx<(HMZ+q_C z$~^0xx%d8e{n?){=Y`Fo+?|j^H(ueq2(^nxIZ>)<+nfeXSqFU}QW65%i&t0&E}YqB z-48943m-cVNWWTSIj=0dBLF1$6FapH5zs+A2@lCf;(X}CBr2j@l`^~lnaZEp9PhARmMp@e{3n~NRY zOS;+8|022tM-;min`deKh+%?6&fl72q!kmJiU-xQQJPZ*2FSbf+Dl{<8i65o4ldNK z>4&C2k_=#tULIQ|QuDF-2c2H(%Fl}&e>Bfc+JGSX;$pFw;(O>we+Kj`jtlG;pO7 z8WT7K^+IR&@q>?ErlqAigv1cFC@Ln2B_yyhBBml6eB}LiNV)&W*+;(cl`j{EfT$wD zMynN)8ndnx;G#)z8XU_kF1?_yFhoElhU|Us`UsY;E`>M~@w55l*y$6S`!jY#sySg@ zm-BMAyt@4EcfSA9*-ciryS2$U1wR?g_g`@=`*%-WUf8b_@gurBk#sDNr zphQNDOo&98%x&-S&5ytHju8)hH8%is44f;uuDFT_AYSIv9HcqiwoeJJ(G|V%9L0kKy5HUP2R1E zbdT`~g9%B{_tYC6|M8!C?Qj0> zpADARDqlM^hne|$J)i#KcYovLzK^cwoSPoI?nH?bV99cXx?=Mp za@}>Oed$Hm8_fmwYM6nW)lex^f+|Q}pM1m7o3B0POmwobd-jonBZ%|{#?Bis7Z=ZO z-}lftamBp$!Ks@dNNTKxs5qp=ChwrU40ci1THMe2PW>fZvV)JEln$N85U5DarV_O zdG57tx@6!2VuzSnG1}-Gdnt}xd;QL(OZC?7rH9V_!EgQ5Yk%QQ@4x*HE>(cs((=(8 zt`|^K+{`o~TjfA*~~US{s+QrN|wncI9grZ}uDG(~f9%T+-XF!R1vJ)B)mJOP!Z>x~mo-SaOJH~FoNP8C#hcVVZ4It8 zg^AxCti*wCg~cAava$N!s5b21dx#NXF-N)fqpAu zq+|%;>6ZFGAbCg=gW^4nAy5*QQsXE}|EXh>kq|Z;Me}ufR#VRItO5$2?nadIfVTRK z#m>e~hhmf@tdaW~ksuXeSIoEruPghz>7MTVPdXxKhAi56SPRsXhOb-C^lhV;f=0S% zp+xu16V%Kgf{&){Sc|S4Iq~bS{llOCjXyfHe&p7hSAX+=eE&!{(P{;(!~qt_NGO6l z&Bp)xV-M78$4c)RIml@NTR|Yu&;SL%LRj<3eE-8AxWl9WlCS(1G#GglHFZo7P5J}j z6UfWZF-A$A4%W@#ec%pbY!&l$Eo_7Lzx(dlp5olJk}S{nClk(c;T{x)Al2TN^?c^F zR6hI2`TIZiz=#Gr7cY`l`Fw9_^Ra*X!W)0EUOG^03lEl^IpAZ<;`nd)&?Yi6+zj{ z>Xo5CvP{>Va8J4}zu^XV{8WDAxLaPa;h^qkRYo;}FcOogA%=+NKnM^+$0)flNjz%p zwB~AG_BZRTGqVeyo<4S8dG0}f=^{>SMr1T5bj?|4F%k{}Fc?A{7P1%`D8wA+1a=7^$XO1-nK=MwK~4b{h>iiq z4zhxZzUvRO(Q0fb z+}AK#T6yH`<*ms)&m4GFMP|pQj?5W4M5(8%%lR{JeNtKO=e@!R%#r3!7(58|*$;9( zba?q`x8}#M_1w=W)4f@}x%I}^z4I!Khp<3`B0JdN|FiT zBU5_AJ3qV){mPu9ELT6q$ya^eXC1}qz}MzO2IgQ`XaI^J6V=at`O7E157bvBRN-`2FbpvW5QCOrIKo5656wZBPMy5w*-wMzO^g=zxv1rKK|}Me6#Fs?&kSzFMCOazME1! zs@)Pl987^)P~IH>&AA@0pe59Pl{30I@ekb4J+&<{WxovEQyrRTHQYZYzs1O!t{y5jscj*0T4LCt)64O8OVv&T zkInaHhI2{EsOHc~&5zY@x%O5POW#0egpHEfc{`(%zg+mJNg>eDCBi|A`1XJd+%San zt$USMWWeB#sff*lKNy}hNzQE(EQ%`&o!8YCU}v1tU|_0hBbh8drQHm>kM5k%Nf#Cu zASOtRo$bRK`3IY4BPLVOB)qgbqP8NoAPiW1WVk7bS0rMTjsNPeKlCfV`6t8CT0fuv z`cHp3?fE0+o3TR#&`r{AXw>?^&s)0%f?rvZfqq8GwaOgz^Qf6}5{r5dM zDgB}APOTh2ULz2?;PObF>5~FOQM8v1J9+4+XvTpytlC@lNqYX*12zb{tf@}bDsrw z-n0ARM_k?4Ix{sw7B2?o5m!!~kbXv)1ExF=AuSCYp>tbX+m)B4BZu?VWg7M8s2-Gn zdqsxmpK{|3T9-^_Don^|A*Q;51}Rca;tnQ&1|iU)7q0*c;!%M@x)~-QRAmJML8}>z zOc@kF6)hb06z#_~0JRXXmH@yT_`2WAdi??9`Oc(z^y1E=8#@>FXP2k*jq@81fBYU& z3}NFH$%A=9B{1}0HR=px3Q~C!ULMP#Lwe#g-|$qr?kRZudbf7M`b(a2FHn1_YY~xn zk}v{-nu-aKnMp8Ls7-;0h%!J|dz#Pu*5&Hrnd#XFrsqEGFF$I#7hSoZf#z9}50>0; z83s$z>nZ0(+|sK^6i|Q(#yv*E`DF+pY;i~>0WGsYN!UzGLb5js$)3YXY@`H8tBn8v zmCyi<0vnD&YZI~_AyPD4G(<%bB#$JHH7lSuz~M449p;r|Zsi0oAH~7C6=QY18dv}& zB%4zpg^+fRm7Eec(>=K-VOWGwLBM7dg%$)w6%1jLP}647awD;j7*$kELojBnX7$!3 z-Q6ayWWnWALdHI(pjisXg(!xNG)8mOD4R#v6*|cy&N0hZj^<12B1WdD!qEa#BmbLJ zN@fZOhUgrTLjgBhIr%N$@n7Hnu}55Q)ewjvqr9H(Kl}93tG?`cyAOVRlmn0gpn|AL z&_9qmMJT!MuMLgS&*oUwel}Y_zT6wii>O-W z@{E`Wk%-IAHBcf16GjHZezBz9 zefsW)ptefuT^iiA3BU99yEgq`UTIE{Lp9*(E1vh{6@Ph13`$}O28_Uls909j%CWsoN`bdYLc24S~$4?UzBSo1oE~Y~+ zg#v^m)B>0#KbnRyR8%yter+^1@z$(VizO=<_3`?fPXI}+xOD2;!_U0Y_cAmaVe!yA z-}i~X{k!$iu$CH`gh&BHG$$3BquVarE5GYoSDt+1h3ySuhH}2SxA&|s_(DFsCK%I| zL=9ep4?`@YMleW<{bplnC}e0rauRY{z_EZ6g4Jo~h9nQ9o=6DhD(vRLkKqn?#di%y z+QF;XxeKrSMf=OHd~!vpc;IuVVUgl!CdINR}3Hg!aK;Nhy(90XvIXCr)0((~GSR zTu*|p9aIhR6biz$A;5kmwGju2rX8Qu^fY>18MP(pI~;%W{-8v>X#Ld{{LgD7!sKm=?#}Y{n+;R z{pbHdwv^-EZ~ekgtn$QU?rSzG2q>o-%+M7$I&}NTAGv=@wB%IkM8gHo4go||1vPTu zRfx$;?GXCo(dT{X7oR+FO$m@?Bo<;>SVRN?wNT(O5h2)MNSH=yM#LIbO~{0`mQq4) zy}x_=2j}~i)owc5hm5hVtG$w)>kayscgss>FGImuuQ#1Ze|-1@@4hG7+M{~zcc;!* zs9Vn+;t#y^xm))>u(LJ2ICtCXy-h(u)D*4A+|1y_&DZY(8e-u%fFZ|(h@x`o^5x^l zjw>P(JI(=&k=S9a`?ub71Nf41^p$ty)C7UWJO*o%IEAA`%1EL@=)9^C377#evX@{# zYZ*u&;}FRl3jhJ3R%(VoaXv!e#K2S$omX)=sA$n+K=;7;i|03Yr)BNfq02Kz+{e}7 z=;QBw?~qY_6{tRErt=aYQ&v>3-ZOwJ`dH*emRqkcOtpY_Bwh$1`UW`;#xwy(D<}YJ za7?5y>CB6eA&X`P^>n8!r+&I`zD5%^a7bXmF_4Iy607TJF)+%3NFonyO{YcuAP@v= z?Ktl-vci^N1~yPW_~BB!NkP;N23{JPV;0lWNys^Ej1&t8>}*tN`G>cdW^~*P3<0BY zLRg#(NRF}`p&yc=pbA*6>QzL=gNmt=N;(~ZEXF-C!o}>5G z-i4Qc#?6;6ZolcncaKj!eMdBNCbcpF0s>*BiVg(e^hmFElxgeX?25oPG>n@?YJ|EC{AgK~G*t@kAu)SwF?cfrgw%iZwaPd)Us zTdpOo%*@a!AejdUabH3G162B3Mbf9>(5wbAyu zGu8RWvGM?jjH(_X@8_9FUG#cuM-TN@$50gB#36wifO)7m%gtggVljF0Q*V6ufiu%- zg;^#cDf zsTcPq6;}=#!8>wNmh_wn_jXoJI^4rq+EC9HZ3CKeP(#uWi+hQI8YqFKM387uFAe&e z+mj;i#msXE?AQ=Z{Y=ZJKI6&vKlE@}RY#t39o2I71MkmjS?#aC>$iXN*r_AS*WI`y zb7Lk%6%+D=1Vk0--1LjT;p@sTIe*tj?ljQrpZPRgTi>yo9a^kaOBZ(o4u*vfU9;ov z*&g>1T=*KU2KO2`5<17Mq3A>L*rJ64Fg)#F&BtU<;JVMWhFyr}2M6(D+TX6Y-hDM< z%>urTcm|`rcl0q>V4ovuY|*)O5a$zM^(&zNRljfQ-hs3YI&Vat15!!)c!hvu-Fsq> zL8M=yISRV9P7hjW3N{1ZDQ)q6_pe>;hSZJS>Md3}S@LuqbY*j+>=mwcEq^+-?OZaT zxfjc+?SNKe&^`h~g4tFs>D0ezQ%s(Iu#pK7N4tMBhylLB@nM=UZtJOn0cQjjF4PBc zCRi%;*dSW0+JY33lwGhetWDKAJ!uDezX8@=yQ2o*cV|^QQdiE?$P_ek{DCgArl92J zoBFvc%B0&`Z|?v*(vE=5-qaY`HDej(U}R~6TdQ+3&)@#NKe016nr-~@&;G!vmCToW zfKDh2892$r1I=i3#{(Dt?t$~YBZs9f9gr9xDiH-9Hq?^{MI<^r0hsBbV}}6NRK<}~ z^MD+|Tr)Eg8U~0~3#N_s#sDR9+MwlpmgR+3`gd=?!=S*D%lVAVK+pur>8$Va%jY)A z@yf=%_o;=PZaQn-BaajJa*zSy0=>We<#-}g|xH<)C{fA4Sq?r{Uj zz-nh;TsRNBcKXC%ZDqfv!WD$kM2Cq%ZF6I5w6yF7xgxkc2Sfrc9IKX3J$*WtnhDG+ z68R8URD}=>G~_F7wm~LV5hjPR-6W=Dh-i+P0A{sKYn@CcWnI^`MF^5J5R91dAneXpuIb#(B z%cCxuq8=mQ97S(zdC&5Jk;9OC3ef-vNn;j~xCWCS5k;r)X5R`SVkw9Om^egCsd@uM z4!SdiXi^`e?qg?DORxl+DH>K~t7mJu&In%G#oVMOff%_z9R;YtJ&DK+&^fT&0%;Eh zCP9m1YG$>G7hjR7Nrj-Kq02NV#iEE{!EP?tY6m!OK#lc;b`b(X$mc+eq^Jhq(Gwx- zO!lTa-_3_BRt!8UAef0EDF8x9RTeyO0@uZWDK;C1T}Ux(T7X(1k?ri!epL}q1 z>gM^p20#^H0#qn4^Cp6p7lU$lmvz2hPM-G6TU1REz{pf^I=t)KuGO}8A9%;^dQW*yfz-Lte!ZrbLR2M?sipIj#z|+@?tO^ z962;tKO(^7m^0E!Jc;?Zwx8qC<=d`*X<=A-HYF#Q1ih#|$D6(4 zAT9ww5HkW&Gc*N60W&ohp(-U=A~-vMsu1$}q4A~5n?>FiQ!-{IA7-0#b?t9@(sdud z^S)W>PCeu4+n3JHA3Rr=vbK8c&A;@^-||yGw`ZWN3_yfx0H|gtVwSm!HifmpE&uGL zgfy8~HI(ewd=O%zL=rX?OCTMR#dF#L(lLi=fwn-jgUt@S5)$m9tiT0e0!$68jNR5o zrfF7u2VAB12TXt>l?X|1(tg#pAOehbuS*~pu|c}fu)IwP21XPrXPCkXW7DvRQnclx zn{S^G{X=K2Jn{F7xGUN@Bq0RSEKB_pD-^IxS7z&o3JrFL?x+E_%u(}Q90odo@|(`< zN-uVx$07{I15fYJxgEp$D@qU2p|!v?eV2@aAkLZ&j$G_bTOnuKwru+yA){C6aicuXaSRBYWOqTmFH!%iwph;~Y0q%@ANb$S}(AhtqW z(vY?~!88e@eSafM7(inK6&{$TQwzQ!iDw-!(@Ka*C)S8kD4@Om>d*bs?>_MGWe4)A z?|9`4o^?|_-%~?x3<_u-!HlRXhWF3;4?pm!@zGOK8N}?OU|1Wde{ zhYWLPBaoiXK|RJ`n$aB)4alMwrUPUPyfQftK?HQ5h^VSnIiF?O=z;q--*Nk$WMi99 zUDX0o`-)8K+1zR|HJR2}`pNEmYjbk(!ZuIs+{f-6Rn`9HWhrN||M~sMS!CIK&PG}|| z0xBj7K0__M!1mVunTKYNJ?Jl{zSG~|>>OjdV^rOnTR4ZFpiBMK23H7SswLR|^Wlz`2U zh!x2DOlbTszUDtFEtQq1hyi3m<>uqx{K_x*>}!^A=TgQ*jxi&#=rk$-f^6p03t8D4 z@wKO~ky;T*%&Q6kt2Y7J6YmiK$biKoqw}?2TU(ybAuk4?=tA1xkl-3X5Njnu6p=x; za_-#bxpS9_tQT5iz(`rzUva(v;^%)>Ei+^!A_c@O^Qs7#QHDTDP&%rXmWMar zbmTKW^W=+OeB`rVaP5o!$??y8!I5X&CaZ@YIeTt$d24{oXf7vUAm)rY&oh-OcbI4F z6tfJKtCd6J>u%Gqu;+n(>&SQ9Y_A`%As)y{$4p$Ra+kLGejiPoOQk^X-oFx$BvkwT0b(lAHX z6wp8#RRwI~*;uO3!T&D^0O4X((|Hgs+=<^N)Qs@U7c@i&6?KAl}yKzYC9=r?>5D!D5H$PGU@=fjbvF{m|au!Fj2F zy0XCmtD8nXY2-J9jtFRrb!)CzXPH4lt8r!qO}M4gVWI2VXE&;>w(8hz1BZ^BP884c1}!7&uR`!1SXDVph<$l6hJyUN2Xw)t%$ZD!CE?T2@x0oRl~+zGjCND z1g|4ACT{dj0MN|F*oWBZa7c5%6~H<})wp?pb-wN*>@>QO-j70Hvmc~2l#p){@WN)1 zn%9|f2Nis=>(WI_ozUEzj0?L$V3ZGnWsMocu!0(M+-gyb-tl)I`Q11EMaKPGZ#wb~ z|LUL3b}tx`U>5dTL#RCLTmQ0Oe*Is)f9=}q%6SP20IXnQ8YvU-YIDR|eXSlyDR%`z zJ}3qQm-Q9$x*j=L9c8P-Y`K?>82X@v`NF)DnzbY?*($U-lLCln#TlADP&e0I`I>4de8U1^~?`{;PGGE@Sj>gxi~q?xvN> zyytkB=LEd9Gkxgs^ADW8w7FZU6huA5%z#wD*Pf6v!V^c2iKrpReNGSnETq9g6a~Qi z&b#idysnJKxmw?3NIE1Pfb_gE^I$NVZEQL39c00>0}L&M9Puc%w@FQQ&S<_&f9?kj@ zvn*p`r~x%jc1?Qr#Ck^wIQ$QT!G;C<_#lHKDFwM9rR+j5BuhjCq_Z0+A^hOu68E}* zVJsFL_rkPJgZAI7AzZLsnTA1D0YC~{fQAs$fjUU11b{)1lpzG%j5`VeG6vTMWMlvm zBw_NI^LelCjdgffN5^RCm=4yYw^VcH0nCgI94H6eZ$!Y+ImiHGP@|YjFOV=HuQP#x z0EHeh6tj$p%4xOvxSQ_vL{Y#%L?u#Mu>@;@1X?r`3U1ZG4I?lY#GYKfbesq4rMJvw zW{MPonZ_;AS|S$&fE|0#8b@a~^xIzbW8=f8Y9q9eoPf){^WXJvUU~{H^!?nCiPnG| zb3y=tvCA1ii1g5r!(P+?yb2%)P^F;AqFf7Bf>r5336VsUk%JT%Fk%JZhPJ8U8voOq? zxSo}|JYq0zh^c-I5D08E7;f+E0yy_t;DX38txxaZyvzwP$Jtzx9}kVO{R+6jXT^6FlPZ$jbmbAuJT&_8|KZFT2UdS~eb0YijZA((z*cR;D51G!4&8$q$f*#Y#& z7%zZ;sA@>DMy;Zzm2@#ZtTW!pHa^(J5-?gwTyI8hYgWTbP*M|`H1n&m;c1(FHCeMG zfPn=$ry0=Lo?wB{nE=qpS^!tf?{ouTcidXA-W9Z>+;*@x+h28tFFn1Ps)6B;i!t7w z7OTaxIc*(iAm9cY6Zucy|Kr3%M_WJtlRqw#%j&&l1tGE2V8oQygF)Fp^y=5Yt$*st zv${rAcHqGi5}=uhhzHc+AkP4^Vpz{~Z)4-q<;(l?YI|d|+}`$8WeUD3iKsW~tsh-m zJACNqwa15}zGbL{9=KNX0)S2d)TCh2x(-f+S=Qg&+`sRh2QHnvnB#zIp4GcXChEo4 zM92o!WY_AsnyTZh=qvc??%w$Ds+-In{lq=v`My+BQO^iWVv1*`lS}h@YJJHI?Bz9L z#@6c>EDkAq+HJRG%PSkz)D4C~;}l{%p>WWMwOtaUB>6B7VbZ#F}#d_KMZ&LVTZG5{h( zRZ}!0X7FeX^V)Asi?wl`QAH*Q-i&~pnW++>f+`pyiFyNL1QRO=oyc@!bGEm`UV<*f zz*1U{@JAapCL)1>rWJ|+p>QC8CRzYv$Z#BYVq2KlU>ITsXym;O0>F<_K~(pKg^%qf z3}_UhClN3J0tf_Ke*geY+*MMmK)YBYdl$h!w1PT@5jTqZ1wd#|0R#=^NNN_1`a{J+ z$&J4t#T;Q~Mnu7T1kDsAgisL~ew0SuLG~puo|B zK`CbTWd&eDFP@MJFxk1R^MM;5s-t9tY8r^-;0O(<8c)NNiA4c{G?;HAtAq@HoGmSr zbCd0jUPh|Q$j$BvL`Vi=W-*Sbb6i$ck*~k&y`TJ%|MKb|{l0J1{j=;y)v*B1&%Nqj zf58v@&p#U-y=BM1i!vB!kc0m}%Kkg-mh31G#owx0-M#nz^2ulBOwt5NGn!FG84(T0 zGKg$}jWNEqAKMoj94;7aW3Yc*{~WFXV`GrP7|YjK*b*QRStv_`(kM*O+fPt%KY-z*sI`+~u-x=TKA%OW6+0ETp*Sbn-A;w6={a>qkERna{rdRWFgijk^$m zS)A2dVi*y~DbRF!?)7hY`3FAqajpwtIM_*4Yj#pYkidv!03`Wt9aID|bLS8XI(q!r z#WSZvg=4qgShtg^EZ~-EWfFP1ULfM6SutWJs%%6OY--(tf@P>|ss41Y8rt00xN!db z@x#Z}Yc^$~_sD8 z1AH;968>H&O%C*lFRo18n8QI-n@2~9j;SsQgs?nP9klI9)6!JPmuGnBIZFOR77i|Y zGTD`=ztPg=muaYb$~jG`2rbB&x9i4yU@)fMp_C(vI+EP;z{Qr9Ke62ROADNqo_0xY zylC*j;XE+EXz_111YK_|aZ)Tk(<{+>xbGeF>{eWF6+L*v?#-pg%3%a)UFXHe#H^rD zuK(Td{lQv?RpCGOPyXhyHSyU@iYhwHGzfu;iDOnB`Pp}VDBO5ULuRUF5b_wv-K-J{ zgDM)&X7jU8oxAYZg{K}mKi?m-@9yuOpEi@}{`!LW~IJg!dS38M7ue zh=YSrRMY%(X>L!RzC5pMHz6tt43J>IMYfES0*khBIIQOL-51<(n|PfAVR}lJCsc~d z<+JB6PWPu85#!WjY$B{}npsoVv923eQ+S{Pr!NLA&`G$7I}0}4Rmq!n|8n$MwZ2gd z3Ks$hW|mUCI)ZR?bBY8Pr^2X&%(u7qE}v)Bl1Pw)L>aK`KJ1ul7D+Bdedz}$AT~DM ziL*Us1`~0zYiA=qC|MlIiHQXOC8N0rlF&47yq4}`i{+G0*nT-091F2f58?ACx)ti# z$dY%{-X1|q+S~;rSZwnBVV;yPS-OyAf$54_9!u#{sXl~xHa7$43SU8qz+I!*696P* zGXw}Al?>M08pNip_gUM3WCh4zES&<@$uLsvE;$iVLUryW#HP*^luX?NJK9-&=}fh; zfx)OnOfi>P9Muu66y==)J}8CqXA2LQ#bC~+E?#bwTg80;nM&B&R1JeI#n+~Yi0nW? zG?${NV_U79{Q3X(yLaDt>o>pYo_01XxH6-_c6`+Q!@u}dKk^H|wR*!#cMR|t$sD01 zj_tl#8=Lvz!|TzMn9L)S3Xw;3W(Rvq4WbtX;N;v+o8s`+$NuQPwT*RJTPasoqo=t_ zLBv#v*x+OuNC@We*z)S?u@C*xXTIzWuYgXouYinP7_M#r88H)0raNEu#+QHK_wNlf zY$COui(Tf5Xih|8mU$!*ftbw|CLzcQ9bdiWiANq=J#-|j@?7IE1YvG0mO^Sq?k++O zk0!!^t*uu#-f-;cXU+#HTa84duEOGJ8DtTiSi+4)E5-WRN1wjs&f8l|$5rqnH~i$U ze(Z<7?X_mRt4$n+(9U+h;?A2c&7Zt~cW=(6fr#BK$JJRmJFp_*EiQ6e)7rNp7%VrshSBhGihVl=;@TQQESxA_0`Ke zKVf{ zrWAq-Fx*mo`m~8#UXuNx-Q%SUSiO^b_6C099`W|zq6Y)C_+B=GF2jg}5cj|>GhFti zza04O04`WY<_Cj-mp7~2tZvskfJ{2B-*dGLL3+L80T{G&zg*L?w^rtB_y2YPJ#8C6 zFIevz)-^os>$v*0WDxCt?JPx|eUughwO|)LfV-l_J(*ctmX@&Al0CTV_hs~tC4kuD z#bqXNjYsG|`X{`z^p~r8V)?zEp(Yw|pgsL@n~typJdv)LE8U^!AhZSr=l6OHz4&Ko z_I65BECK7}F6a+M>0`q?V^De}>P*>7zz6&`-BTqb4=iwSmkE^JK_olVsnaN(D{jh5 zJ#Tr>$`6&z_Wg4o@Xq8eS+MGB4aw3suIRh&2g1@Nl1HJNpBa#oAHW=ahXPAo(}9@O z)!wzOcib(Jm43z&dZ`rpuMK@hmY)f@y%CCSo>kIv|q3MP4W zSfw?cJc2NfXgnqP$=0_lszc6p)2)NdeURx7ftUr%T$IcK5}1Q?PD0ZurjQbEcFQW| z0OG~^NrrmQZZtz@_FEj*d37yY3E)mkdsj-7$;luAGB+1!Dk#7})6~tBVna>@CMHNh zK_G#M2?Qo5R|ls^2V~blb|6#A3Lmn4gFU*F1P(<}49IG)XR)a{`xDH8ju$yY$jsT5 zIAwnA%mtQ{wR-}K2J?!jzI2IK>#)AjGMtPpwTDuRQjiYP_%7@hsp1-(*v-|QM3}3U zaD06E+<*lRgR-#pEknY@AQCu&P!n}!{rZ3SBR}!d7ya~g$Jf~#hO&pE)jJLizVnSQ z`T38X9v;7WI&GENnQQX_5m)7OUKhoHSj?4)-7Th)Sj@%@Q>LPcQ3|q_5XujI;=f0#h_64yh2btE~-JKYH&+-uSxL*3%gRgehgEAt(rB zR7fz_$@t<|efjHu>-RnsWZjT3CCof9%sJOScTeG`iAtqhV=z+nb_fFxjL^W z&pr9f^|#(?h%+A2=;*(H=ZC)k+g>MnY1CQ;iQ}EOyyW(CzyC+ugQNScw?amM8zZmP zE=xma)9;q%L4mAhZA_9>lpzIDr)taj$mQOggC%&-9q-w?%9+(ugoj)O4@QL7EWPf+aUx7LDM&=z3>vcED@bG8f@g9PD*J2#l#ujbK z4Ol{Yv~-)rU%Nr`gJXX6>!1n$s_C(G_5M1`*IfR{A9tT+FF^v2%SwsPvC=>5(qLZW zT36kfZ(E{}WpNzw?w=d~1n@0X-F28q@S{H%|S#SEK*sFCcI2?o22w zzU=7QAvD|xX?h<+HnMwndS-va!AD3`z_a~Zz1VM>n2cO-@6>D5xh6VTy*TIzKo<%~ z{q-Gz$sjxJtVwYLsMc-vm+!f5hzVQCZhfHnl}@B99(&>PSpe^j5?}qf{J{g8!GZ|% z9l7kYI=F-mbaFp|Ja@u1x$g3H{8~SB6Rvy1bGEe3@tS06QK><7VT?Du<-1#19dZ5M zcmB+Jn3+!-WpfS`ohv8s>d9aJ&;t+b)N3aW*Yl~cfk{I#Y37f8=8-e^Ki%wHnr~my z$)u$CvKQU<6<_%!Z}`%etyQByRtit1(?MCWYi#BKm;<3FB|0H;XJ#U`$kdf9BLL16Kn7E10eEj3&tKS{ zw<=u0S)Iv@Njz=KL;$5oNjDQP6=<5hyY9FhRR6eI<8MH4((`z8p_0!=Hu9o#iB5G{E6I&n39+p zfOzs!Wt_6$I7|eFfl1W84P0&<_Hw8R`+*o@P|gvB-0`DqI}|`nTd)h8$jaG@kV!||ymrIf_dF9L7b}S4qu~1Y4S&#w- zun5$m4^|F;@DD#pKA6R*CO{;2PT@aBsR&0(=?eg20=Pj$+_WsQzrXkV7vAAvN+iNX zU{Z@nxz~~c%OQc2FT4oVGtZvixwvP}YWav1PWh#h--Te#1emT32Tz}VV(Y}wlQ&*x zMOZDXV!rp%6XCCX<*jSY{u*=Rs6%OjPlO#ytpd1C9l6k;! z)!Ee@gB@z>EWX{^L2~LZrP6dudAW$vMiirN@60dnjz@v+c-~F*eBa?rf*{()vIq=I z0p<=kWICTu>be>YgE@hXR48b40~+<`o;Wi;zklO(*Kc2X=7INqaIKyPwA*F#t^eSk z)Efnc0pva2X|M1EZrmx1o7f;(GL$+^k1vKd|CSoe-Z>rWXUmaBJH}g3gK+I)TPrmD( z>y8wWlwmOwhHe8|YVW~CBeaqi^@UgR8%D?)tzxC(da8I0GfRlkW+CaQ11~gpz)U)HC z`M~FIe)-Ghv&+;>D`5M~-UAOl{nR6;?c&9#E*3?j zF*37I$GjYFS!s~Wy{77LXI2zkuC!93s6KoDqrdP=zj^NiPjh+n#Hrh=0kyGa5tOBo zITh}#ZELCe7{MCdKYwYqw@cQJkfgN24i81JIA2{YZ#sF@p@D0d z5(hIE5_e0*x!{@%+#mvqi{tjf&VD_&f=Z7}fRR~(p9x^}azXb-+rgk{+Zlqr@U~mq z`LrCcwULrN3z{?dnQ(_bXpIZ)RM=Jr?91l^7Oz zWwhb5`OcY(AAjEm&OY&MJ84R{rj7=M8=DhYP^3)z5rj|;HxA2@%{Z)T1Kedi$Ns+V z?-s-aL^Xl}V09-*Hijomt{`$UhHH8}5kiWNPF8PPc$2*oZl+2DNjK9Wf9i+>ElS~L zc#$wgGI({>22&`oIWeVc5s?IN2<3=Eflz>hqcakukup!FXmpaOjuLn;?_64lT@+B> zr#-tnJp~dIT$Eg4AQT#He^+J`h(KVTLV=NDX!B#bM>8u*$ep06H5>GcSj0ZBeK=D<^zN7TI)i>0IUW6g1-Q#GHqX0COTn zihEE1UP$xGmz{e1PyN7r|6CC&xRW<3ydSRrzMp>kc=OI()h5{Jnp${nSHW z|6PCnMPK^580W%HoVL8=wBuFAu+T#*t5vn~AAkD4eCQ(|R^P07aPqd>R!-esmsK=} z$CRhZ%&lPaB(!2;6St_%>dG*h&g$uSfA`R_t(U#{c8_f`Es~@Vjz|EcBq%eQMn}cr z_kG~w%o|PAb@AAQK!)iZciiMKD%p&U8Bod2F@igo z9nLJK7G(6~W6$pIx7JfqcY(MWF_4{I#twHa3xDqP6Q^!|-sW{Dne5QYdUNTCZ-4a- zU;CmHgSbE9FxPe(Mi<+`fBA!tO}1{k+<3{Fj&~x`UWMp=(Y-5=uw_89bhc;d7&=h2 zME|K{)G2K!Il+~-$MuEtyRoS^)&?(l-VKx4xYbBZ1ZJYL3^0egnkGhiVQ*i`qGCxF z1Of~cTP0?i(dR$?Fhg#?{nP^={`k2E?l0EMfOf4|A2=CF?$y5%|)*t~8Zi3vl^?2RTSzuK4~HZ+0K;O#VGZ z`_sIrd)~!8`zKv`-m6E-yUBkw&c4PI{IU1{lioq*n>aW?R}#3MJ}oWErI~V7d(u(r zoHrRQ3oA z81)1oe}qzOD^oFz?LJy30>YrJzwwSkH?N8q*eo5}eQ0cMLT`m!o{x)$c8|0es%5gZ z{HF!A!&PJ1FZ6{0;L{g`PaYn z&OaQMtFL+0Ex-5^|0wQ0qfY86?{y_;Co~w#=Fj}*`|XaG?j!DxcT26G_{5{ne(uS7 z`?O4UzxLI4ee*Yb)jcn~)$1wooTzql2$`8F9477zGS#l0Lz)*U2M#HiLYUWaGMO2H zD6X$>Duw;X|LuQ#=)e8y2Yj$~h?gSTG_loY zK7*;7x+}<-2t)&BBA&NU4#Ptmp&D5ztF`rNePwm)aJ4a#)zUmp8?D(3k%B@I*b*#< ztGT4j1vIsUJ5L1k?2n7^CR?877K*r@{);x1zcNRquL_y|i zmU6)-xkO6a0SYM>50MoE+M8Uu;kx5Tx3=nb9ttv5A#sWf$-uF*$HGAn7sH_Xo!@xh zs2x@-0}AmaFTI-!CxL_AwTmG%QVT_JYY7G1hJyhVaXzh^IIElS-tKf~cl+GMXCHp@ z*+(83G+3!tJyPRb9NMUk9h;RUSVE)m@{Vm^Vvs|LoLm_o>*@ujj5#bG0*Zo)l0!*F zMa<5DnTaXM08%l7eC}tepW_1Hn)3gc8o8M&%uJPBT@|oYN|$oLCM7V^RU#mF5*Xl; z5M@HzIfVx)h>D7fAk`3|AQoQ~Y9QpDlt4>bN?t6@#eVMa>_Weg!y;F5=$xa*a1(-) zE19F6#(E;&1R}U;M>q4Ho#;y5JNliR+>tXWI|-!GD68wTwq7$4i5SQOrNZB70Maf) zR>U|y^ITvQ>zf!2)uc=NKxSG%=ey^*nHA|MNMYQ}mi@;_-X9P&#)3m^F8z(~c>NE3 z|6iylmkJIFHl~)!XXfQUe%tTFW7qGR&n7Y$?>+m`4{bm7$Sc46bzk$=Z?5B%+`!L8HWKbrNEM#cM47=|7 zbhwSDPukn z6S+DBlo*VUp{;C1$Q1gew3wHA4+rniNF1pFL}xFcF;@)9%c|LhEI+0 zOCNry-ny=C8t)6~D>y-r&(6ZTGk4?^_NS%Svx=d%!Rh0 z*<|xiy(){qVDpegAO=XwNWX^)YVZGfn+>#_tAI%N3A z!1l$VPTf)N3k;1f{_*ao{$9(krB3eVIkJ$7&bW4;?c#~MKI$mQf?FmiPeeVzG@?d*+L}>FcTramNnTEr zgvbDloWV$^qjv;=kho+jPtP9aYL`%hnIVI=edEc&%T8`eY}s?x@T>Z{Tc!On@dXJu z7#Gm@%e4e!%e-LO!`1c1vY4k6|6L2+AABvw?4W3?=d=9;StfK#7a{^Vj49>mWN92y-}YzzkMH;vnl#htUI_D~kYrMGQnF|;5IMW5Mt8Hm2ORE(6s@gB zDI`H3Pxk8RG{iQLGdZHc zEVeDX#{`7jQ+^sQ7$V9jsxVyJ7#=%3*xH&gIhVtYO&JV|f>Ws=BM1UZ0UT9$V9vRg)Q(^Q0q!^<=_9Nz_Zd;ms(C ziX6;kDdk9t$^y5{o;K?gWswo{0_Gn$Ve<}>%!EtF3>z7NJYjBvbBsRTv8I+p0RRwb z(&VS0iA31RVJZSlw6^?xNkPddzNCtog4-xV^=hFJD-Rt zQy0Sr0^CwIq;zWJkUa;GqOKhdxEL7Hx@%d5%_Ank;o^lm&}CdR&0g666iu^t;S3AY zXjN8Lq7V_t$lVwy+-Ex%sF?}_szj8m)16&4qsl-Y8!bX;X3zbnpZZ5%`l6$SM3a(; zEJhoyzW;&kfB(B5)$3lky^rC}#i#E5@Z{MikDNOGxBux6Y>#(R(J{6tECPt20u9T- zum1MOe*4#c@7Qp4)=p+9p7-)M+Sa-k!PV8x$i$gpd|TI{qO(yAZ)bJ^U$aXk*8D! z?(ATeMTi%2!YFoAo^2gkzwX#pYla{MkSjP@$4J>Tyvs4Cq*mO2|HFY-G@28cTgZqz z(OOqa6&|S+-nsOQ!fw6$r5Fw*@M={Sm%s4O|MFKI=ZnL3#$HAe9d7>7m~Za+YD zwsXrZCk`K7olf>hf|`?usw#z4)y&j|i*n`J^Jhlope#z5F;fcAfq4mOTY2cgC-?Sd zr%qniTzc+vfA9x`dR7)XE9u++;XmD5<+;Tqb_tTw88GK4cd!wNl$>*}lEkU98>F+L zcW8l@pK}39v*@4;bTl{a!(x|J#@!c|f!Xq3mn_=-`v;`+3pANFt2e*nJy?zbxN68~ z@$rKY=vr2G%IO8Z2m!e2b+s|{z&lIO^lJLiU*iCNU2uQ{_c?&ydhE8eGxwhZl30Nb ze)o&C|DeEYVgA8l6Ld9a$XCFD$2#!30{t(@VmCXw_osUxL14yI54yF z{9CNao+e%O$et>-94YywYgCY>To8RmfMwjdd^=wrz@PiDI_ zi>?ZF2}J;@xtY*lSPVy-r?>0({N5*iA&t$;lHZPn|eCnT)06WN6Bc9CsmcShBb|NSNJx;ZA2ZivhB_zFAMF8r1+N zO9g0i)LzO(L)>}B;9w`qrMDPn&gN0o+(MvXH43f0?VtTiI=f#`SxZT4>l-IeOr#7_ zwP#PycXtCZ6(tW>P*zj~6A;*t2ojLe#CICmG*y{cyVXMk>Qn?sA%+gPImnPxH{~eU zE_Ej5EzDugdHp%e$jsW-+QzkUjc{dmf^%=&b~jpREs=Ber!|z(w-tc~>!GYXNT0w6 zBpo&eF{e_e?nuF=+2lbv*+p`GX8Q-Zb#@X0#2cH;FxzAIT(5)xIJ=u02`BRhfz^$f z$dZ|yjG#p+gHfnPMy%xSE-r95CzzGFLjv{=q|BY2(7=Mjo2k~*LL+zP0ZOjbRJ)D| zo>*;qZZsu&BttSlTsr5juSXF;QkS`- zgw6MNY`QmK)9f-zN07rg#Sy0(ks7rsLpwix@4Nr~MmaCaq#~6%Sh;%iKm4!v|L$3| zqhosJ*{47Cnf+&W z+pT+xcZ5)k zo4xB#9XfPq9TWj#uzJeQ z2IUhE-@krr>*QT`c`3rHo1wkVcYg4#uV2}DXssxn%0?K~;8#EW*eADFrc^l8JsJMZ zy#yh7?K1H7rSpo=hk7r7Z$7X(j-Sj`dEO^TV?C}#ryiL#@$qNI?F@y*X}xpLJ-4q6 zc|6&#igF%Rq$&fEyScR%2jyz5&817*t7~hVc0XbAW!4{=0wcQk=TQdEM4+1bg6tFbfs=G03}M#}4Y`^PZMP0oQ`e{fm}R z#Nvp*`d8{GL}m|NuVI-D^fvD9-7C=tr4>$B1Oekf8+ya}7i)9At6zgU{Hb8h@>lza ziUSY_OPBU9desB?o|f#a3nS}d#`QQH{aeee_s(~2$ZaTa5Xb3tSsl?bC>r{U)Vi=d2(TUXKy?oPurPB?^56~aUoKMqAKX<=GyV= z4sERrS62&f>dlRTX+59SfkuMDoz$qWxZ{M5%kasTOyyW@#k6JbVWB`c$9 zP!_{#Wo>O`V{;nYP?csnt7A(r2}C?=A`0fBkU&*Yq`5;1XBd%z0Cr1+6XuF+YEBkW zQj099n5VnX*H;EdwpIrL!CitR$#SNvonp=59IDoE?$X|P-fAln8Ez_M04%4Za>*&v zfrQ#jn2FkYwzGM7{rc;#kBt?fWkz)4tmHyA&sv6BOQK3*fti`AgaEj|icZauTx)Y^h`Zz+y+>4CS+-JnbNkEV50X%-J%NGQ_!CpLrwiSHa?k1fAeX;Xo;Z zH3>NcR7vV0Z8GY%-eztWHr%u0}i@ zx{$%UT!VQWGwDd<@8<3T1{6eUsbH_7p0)Luyk%mTA)(I41}EXrs?_t@&P8up9#!SmmP_Hxrb)X5b~O8!eY{-+LIjXY zB&01K=1fcisJjJ``Q4|gcfS2!#QJO%LahY>j=8QJ|G}UA%?rhiJG+-2{`7;B)6a}A zo&JG;_Cte>QH==+{LH(adHU?pt@W3@;Wb*ygHN1kstrO2Fu1{u zU93CE)ZE3}c6|Nj>Rq?rppwE|yx>5tt$OSB*ptsb^3cIkb}r0 z9AF_=CvF|nG2i#e2P#@qhq1X4!z4-Q;2{O!r}7xtu$;_eOpNHex7>35V94$Q77$EZ zqEyMFgG0jZ4&gxM*=Khyp1o{d8l1)Rg~6UD6$s339IZh6@FSnP>t!!rJ8`rbtW}Uv zJ%8i#2Y>U+Z?wyoi@{2(4QSS^9{bOK@W2^g-;JUi2+`dc0f|ZHMPOap@oeU2=j6Wg zPIloyW}V(mRtLFR2MTi`sZ8+!C#GoNXHL&|FV`N8+3R-y?t5+?RX(51okJb1ETl+< z?Er!nRe9mU9!n?(LP%MJJ^4dGY%TAcpFaA~V@Ho{ZIy$M{q}ET=khAI+wJ8y|LyNR z{?dDDpL0>DDPpun>pIR_2a8kzImamWQn^h{<4hM{#5*8xkU?B)T7}8*7If7b1k#?QUJ%nH?R0NAL1R_UPO^D zndZA29SpQR*uv%471VHn+84I}1I=3Sf$pw76S$HF9C&75zQ(~HeYp?Vl{plqUwXVO zy%h^Y*2MsL3P$v-r%B|uH#_CU&_h(uZ<~=!YHyc7ebRTOMW3EWVF?NZN~sZy^4a0E z(7<|NR^kh7Qv)TiLQ>T`-}Z{T4*70jokPCU6fF&0zXEbk&{DRj<<4Cal`WI&{^u*b z0ax|o61Z9#vF?Z7qJLmHE`R$Pe_AxMw>Na)%`yWcNVG;VSUY~|L-&6A@BQ5$zc^Ma z{M7Zwe(~S_)8oT7SgnYSCU8lflGRX{c=6Z%`Oj?^N6w!=a~zj`{CmIWl`p<)|MGJc z6NS*Y0c-}3OoD1*Vd z5yO?RTA-wO)Ad_NHdfbHhle%>aW>h$xXV%&MNylDFj5Xq zgOK$x2bnZEzzO3etLK5$mXeP%C7)x*{X5@gI@MCmT?aZtce;zGyppM8XJSBVO{?wP zW5e3AE7-{(a3sSkkuDtv!SlLOKtW!FFj$qcf|Qoz49H5HB;3g-c;~5Eh%m`P&X%_z zgPXV$f_f22=aY6m4jxldejuy)b1kIBiO8P3C~4q4mCs`t4rI7uENP69n@mY?lq{8w zoI@~CKI^;z;->RGZ)b%Yfpe_}2FwVY_F<>aHt!%}OIw8-v$W8#GLpeY%@T+lOgVcM zfmt2oRw8oK)H^$IK0_Hsn_FI1+U0jr_kzqOm+HNpAyV-Sm^(9f=z~Bm6jW7&Qwn}-hF{l?b}hviP&e)7R*j;_d+{bLXA6Uw`s&Q4puZKIxD`&JJr3BWDUb7bo|B z^3l;~qt>XFxHyn1syPd?P%p_sC=)w3_o6URee?6KLs2*rWqY?05wXBQIaQ4)ftd;_ zpM3b~{k_&%%)7NsfU~C38kR7-6~y!13m2Yy^zPTZnzs%Y!@-c&Z0D)J`PHYs^!5`} z?+t{sZR%pUO{@R;cRn#*ziBrbQ8Z_9Qp8lCqhHx+o}im}IWPk5o>KWH6rPQ2X{C@S zS4Cc02M%Xvfim;Xn4fz3qBdfxTh4ITsi2l@q zqNT6rnRg{VTKHfNzH=}tAocHooBGmqm&s12{8{)MI?B>}9+r`}cfkO(1ot~ozK~lj z_wfJ5YY7D|v7XMacC{a1nMj}~4BlCfdkN5jQlz_Z+KF0y-SKKojFkGs4@+|~HOaXH z65eTOC_C{zuZ?Wc;8}xORhfH4kUJ*{SBVWC-3TNQP8L}rq$G9Z{CC+%My@IJ^G4_sl%5BSIW1h4$! zRqy!Kf4}11F`11-V3^LE^}~l7D*w@s{KRkm{)dSMO7ZW0-(UHQ-~1-*oGWc+Zf)L% zA@EdE88V0#e&X%F{=|igU;4V2|HU_b<>dT%^?3mWIou=&5ERaQPU`KFi+Hp5|WaI(v1ofH&-FWQi%7BF<2+G6};_L(^PZ`Zg+@divfi0t7 z*908QDP{Q1D=8V2a;Cww88E@fa!UNpD3No}a0(wbLJDFq5D766)v8RQt(7db>!9$^ z&VTwJ|BFNQkWjUQVtD+>0p7U`J&~_Gfs=@Y9ONkhy}G$W zlgXUSJw*XKIdU`*5gUOy5HT@v2u{>#ADEC6UuKTs=58>D8^hhBwNYbju|eC4MNXFQ zOn*3)XJXIw4pQ!vbdV_#l>@0(P!^HkNf+!SkmL-?aiFf0OEbH%gCLsr67nvhIn^I# zIH~G*-{PF1?#^T&n2~_oV|My?N&0)wNva_b%}oMVBOVPR3v!B6g0rRU@@7oPbJaQ& z22J}dleyNIj?qRzCW=7fw>jS*WwSg$ZX|A*TL^P)Ee+RY?XZ#)2Ovv=QV_NSn&Pjdp6lVDm7qjAE8M6M*2cne6G_Zpq|sDXSIo36?00GqXi4gS0yjzWbMd@|Ncv zsW2BeLm9c`0w4I?*?<4u&rY#^--kbLvl;9BhyUph&f~6{h7g#X)Pk@$*0(l){Kwz6 zzppFD58wUOuQOEy*_q(!ho9bDU9Y1v8%*7tD5NB67G0R@c5ibdyyB&Ix6PD_pk^U* zA!0rwK*H(+kDY$>@yG9e$sI=zuM3DofS9(3=*q&$z@_HQa`E)|;fJ0oWYrALs^**v zG4zTLz_ap|S==;9vH_m_0Flk#auIyCuSyvGo`tQz(MEs&_hp~i$*dKabz$Q z#&D!$u;k|KSS`b&pZoaA+VIX-ygCdE8g30q?aZfs`2YC2Tgur8Z4qRq@W4-u%eQ~z ziTQA|Hgy(;d2%rI_QwtoP{tK-hC#W*Tnvt8Y8sgGshIX@P9+Q2&HC@BwM;N#v^sd~ zvGenJ(v7uJc+~xuz2r`7$La=_wuxmiVkT(KOd(XeQWvTD^SZYkCu|xcmbBAH3rg&A%E6Uh!rR zVz21MrRe0YgSw9`?sX7KF1dZK?s*4tCN;xL5Am@Ag-bfl(Up!_FkR%Q>%=r!3yX{c zsM7?vG1rl1F)E2WkgM#GBbB{`kptAa5=cDd$#5hp;z@aJ)MX21k$u(ewyC%nfLQA< zId$l@N6W%$^T2>x>=e+cuNM5|8f-DYy)3owc-yXI#2*s}_U+aahwj7sKJk@!$D_kNxOB`*)`=T-e&IzW(dJ^85bJzZ}fi zcMDh7*jgvHCNP;98DJ!Vf^2RUp|n}k&bMLOYP!FHB?!-2u7|7t@BjSW_kQxeVrBh~ z+iyH^Y~#eCwd)VB9jU6d;b^q7N-%~IvoWh`Q|slqo!Ol|{@mqfF6=*aW@m>3udEeS zXrnM=FsusVVIZ{7rXg3?xj2S{a&2`*LK5S88)GzWqpKrE)kt+4>$Xu#*j+rCBFwWr zGuc2np-*=5mXT9VC90VdkAMgaQmx@uh;OW|9o|?Yw8E73_jJCofFMTX#7%4SwjEDq z`}4MGogoA=O~%YG+v59Ww<{?^H_Z&n)<`&4}c(2{t z8D^2TCqI>$OOnqcaZ4G7cz87Z&0qTuQa`g=lyw|Hs$km~9sP-4{q*nO|MY`Too&YT zP>6g6t1=pY0(l}=cq-4=~C_$q|QwdKzbMDC}p1SA7cW!R1 z5g7$?xDZEEPq^HWDL2AnkDNa9)P7ZtqSfY1qy!@mo{u48O0=9)s+kl?E<_Dx$4?$Q zbYzsoY6OmIU>8pH2+;Xa7;Xg@({c0AgO7!LL88dM-WeIMU_9_u3^CHGa@B8>o zw>|Inm)F6x89M zC4jSxt*^kgJyuDQkB+5Y1!@-K&mA#XNSFG@T0B{YnwBy87Xi`N-~d?Myk`{G{6OcK z=)rexP=}GfNB}_31u}^4?CV{Fv!&voQGbaEERfs54=lfu-DH8ruh9Q|k#4xgYuPnH z-LDJey0ns($QwFLj%BCBf!k0nHAuIw+N~?4s3TSKgLhZs#rUUpdz`uyn&Jx>4I@Mk z`%PmUEXR>`9cyqRgMvAlk>|t^oR^0a5+<`;O^}%w4dlXXT8LC2cHFWiUw`Z2%IB(* zvJ-YsekJa|X16Z&!T}nv)X86T7_PX;H9GWv=d~blz`{7xFC+&R>5to8O zNuioW-qz}&9em`0XCJwId16Vh6o`nK*dQz-ATvaFQ)^p5lR((Ax{OTC+%)f1#Mv`R z?l9y6UYXi}K*mPwWT40ihf-2z)VmBF}skHqn#Fmu(ejLuZ#k#fQmw5bdo|{)wL*t zDFJX(0fQ+3T$B=mN8j1m8&AiVFYK%gS2nk{*0)B^*3^xYG6z-VKx7ak8+Ni4gTYL! z>``MesMOFljc`$*Dn!qoKl9wvr!PNucDB9Cj?Ke|ZhZdjr|x=TY-3xGLkP9IAWq#+ zj<(+Rga7w%qVPE3a_#zC=S13hFuT(zVOS@3*H|#aqHDCo1>45k*0p78Q!!&si4O_s zKOp~L4~JW^yo!K*U8+LIj-5^x}@L$QzL>V$`kc=2i>^h{_Z|1Gu}w zot>GfbS`}^}|dz;vP@CW{y#b&PRaA7tvb(-(Z z|Lafwm!jG@a?guSyy&)>X(>UNicmfLsfVT7s?oSXQu=r6GTpl>Pz~h5?&;UR`V}h$ zDCPGwkBov5%-X103?F;!*|X=*zvLBn4~tHU=$;JoDK3jRs6_y<>cP)GGudq%WbVwV zBtR#PPjfkyw}&VG0JU_<#>O|@a&&cL#o=ZkVuPjy6ga3y5EHYT2@`Q~=GlvqxCq6t*}lEl`}=?4jn(+{3QOd2 zV$y__x4-{Wr{m!nv9c*k%F&%hGX()B^D(;su43@C>N>%m(ReZ?rVv6|6hP9)d1gC{ zLvL~Jnwt}Al!qR?U|y)zZYEqBCTpvF>+^4ov%OSW5#$97>~3C$vR0cl(~=7*q-WLX z>f)Hs^)sJ+#6xjn>*$$J-goK#&joL$nB4K&SAXSqy>$}WWJ>2GCM0%BPCRFpx{-_f z`_*X0Q(z;B0c6RFkW`W6tZ|_STrwUmFh#G-SOC9;A_nA?=0?JwDXlh;+$wM)2vH%- zT_8U7u~j|12LM+mdh`GM4FYw7oh8B5m9S$0r@Id&Sf7ZFFSWk6{%6{fqmPKXK$9hP z#1it(2KXiBfYiU&FwE0(r!2j{`0_O&b8pk_!1_VcZI8|u1F^XJHPsqdGMx_2_F$3n z`Ew1eP5$YMW-b5uk8vO@u;i5t3e2$z{Q47zw0G8mvN6#kU3n_G+mO%T{)=z99a6x75blL z^uIKb7IS7f9(^(3e~OoPm+QKH$widz!bxJC^a`mD&6&wuqDFR+P=xi>2OmBClRxpx zANth2`{Vha{i-+o;NSVnr;cnk?LMO+kF5gUWrGG2fuQQv)d@--7(fa&17JqvM&{-& zWiV$H{DFHvcj|dJoVwvqP>u6_vZV1B3T0F`6wabXF{%N?(yFR!G}G8dZRgG0iNflU zGrRSLnO=%Gw>=xTn6x^r6K5dHbtQ?(Nhw9>rc@c8Bo>aSp3Xl2Zk)?Bps*&_U*%?l^S=!{LLfTpbK55fL#~caN%ow=p)ct(zF5Daf5YJ7d|+*phkA zoZ-eSoB~?X+07J~07PP#$8r!3jRwQAtO_SmA}CCxKo{;-6x24YgfJ+}K%t$@&ph+o z`KO*c_uSdbmoLnBC!W$6abeD_Yq2KR-*V#{-|)uOt@XY6IFzB)n1gpyQjj#JhJq!+ ziz{Pk-X~-~Ys??)7=i9>iTTq_&ARe0bwc-}KG*yyn#xXJb?itZnOp znWs;m`CmWrbDJ_~%hhoBR8v(3C9t@YC*QY|8>xDX+RWSetesCu8+Q#k?jWZk?Fywi zA&DT;Y$pdXlc&TxAR_Y=5eo)UauYg|sUDt+-9j8-Hg`+DAkL*j*d3fC?942}99T*c zCJB*xKPJo+bz}96G$oq?ObPI;=gCUmw1cpNjR_P9Dk3XuQVl??UGieLWJvC`os_jP zNYn^K?o1Y;PLgB^>`ppsX8YVu3INIm2(hUOr!9heV^(smD(5U*1Y+YzWFqCts#U{? zq<987lV{0zHumIQ){^PTh&Xa#Zo1#h_k-7rT$6yih!8dONAj_I>OOZ9~MDuBL@wtL*7Ta=tt615zP&lWIVOoKFGM;T;90s@>89Cq_QV|6L zh@k2vhuzDM{@O48(5qg2qr0<_o7cpRg(ok?zwvMW>rB?ppWdm*?YdXLa^t3>5zZt;7K);1_`drdUfVn}Z)$P}NhWNTLsbZ* zMcmsv`*mOTI*n~X09oV!je)?-wY#Hy?8#@hclPgj$?XNZa5hb3Nj%^T0=H^_2VeQb z$L=SqqPbI41xo-7n&N37EadD^^OU@m2yizk5Pf><9k+6&6qt-tN;E^uEKC8ZUIjB4 z=3esX3lBWrPNRaOdgzrZl+`T7(&sIkcwMAJ0ynXr`UU}WO zz5XWJJzs^P!c?1G*?QZ1J~v%EybCh~b~6TY&{0QWvW3MpRj@Pb0_`}e)$>*zs_m#M ztEzNUM_RQDx(j5ZxC>Ol1g7x#6MH-RwVRTYItrFLP7WVlzxCFmvwF%dL{N*#w8})x zMcvGy766$*X1|IOU7$IEU|<5w&z{?U=!x@N8^@~I?vo$+h;3gaZ)e>6`M>vfhPRy1 z0C8e7Hv_RJBL{o(_j)L{FOR7xxRh2sqYN;bZY$t#Z^Dq@|r2=L6=GC3rN2T;-$d-gja zlfdlcNIp$BxKWrkT7y!Rq9vf69f0QQB#x9P*(42j78*HuGO;A^;6}1DZ(6936jFrQ z&iB0H_D!F;0~P~IGL?9@s;(BHEi=9YxV|6uEBG6({psa*u4K5^7**t+10fmP7wrLZ z{D?D1J=I@Gnq*FAtGN*u<;r?ngpYmvfuH}yU%&S=55}l(dDEAC?_c}#$A=phr@{@H zsu?UgByXw;P#|)%=qykJNx~9Dhza%(MNo8@Qyn8on5mzeY@axFU9-QtwmO(h=0Tv~ zR>QpU?eTotGVoDXbf?!aUo5MjVJP3wl(xYJJ#BQz(c2;%s z#tyBn@0`E%nU8$m`H0bMR3-6+q9V7{ffI^^6FPK zu~9a2D+okk{D}|0=QrnP&y`k>e z-t&TQ`m2BAvQ0c7v=XD2mHdw%`!}PV*^E}gkyEs}W!{h}x6xwM`OM}sujdw9jgjF& zggGVR><=mek|95fcigEv3ebfHX4`*K{u{BeE2X61i3Bi%;K-MOEJT8l+tgjDM|>BJMBPC0gR3Wn^-O@vv=&8E9v*MZbsQ%yVTY9}OJmoqdu zSWMYjAm*l_EH(~#QMQTMr7&bChl#+91t!z|@x?QPVAHkXnJ_C{l0hqykmPnh*}spHWOJn`U~&*?9aUGeKXnIyR=>U z?st9Hx1Tt6xY4(yIyz)S!6*v@^XAd zKEjEd)L?V@)F&S-!b(%O#F7dycSc0caU`i~h=WN|x-tM%crnDy&pQ#JB49{VCvh?t z4ou{($%4jAZZ4=k^U2SLu->|wDS?AC5jWNngNR*S928rcji31J$2N{0e%V)l-Lx7& zXsaAF&))X~fAOnce4X%guK=sZI;?!*9De1K5AClVZJh%&ZSuX?AO-d(PM=)xl7elV zoVlsnrd4%^xmp|z2W1FmCQP2Ph~?OU%qN_Z+1i=p@}>5v=Po5j6(XQs6f&9b+;HRJ zqbCkotc8=I8mdtO2P)ic-qvY%@6YpO^&xmu+XD}uozMKpYSo-R{m8u^De9?Fy?*K#N`X+%N@yw z=e($z(?7TOJ!Hg9^og1yfYQd8eMZP?7x$ELFMGijmj^i`730nZIZ&8I8*5D@EL7C9 zZ+iaqw+x9XvQrmSl=gehUihU4?+5)_|1Oimt5($)eO-g>UF!>deUuKfQj-62&xy?- z1alXLLz=p_h%gAFwGFGvC!e|SKi~1*-+u3hAARo0jn%bpeAAcx)xY$uhX(Rc0J$*KDUhj)sX~MqQHE2LXZI%0?MzPZ?_ZwQR+ZBR<#4SUjNomd z^S1E_Hji~QcLq6!z{0eM^hl}f(z4}lk|aC5nzO?)-%F_vQyO%K6SYZUKX2+rlgi%= z%z-5k*ws8`Mz=0#)YLthLGnze1O`(P873zuE zoUgBK?3}y&`@i;EXC8U9;<73>2&MA?Mc_e&K@rLU7ZsPmK?Iua?J*mXvitV*@{M=j z@|Az)t0wgxKxj3PBs)l8B8FKki`Cigiu~|1ZHq58VvWhzQcT>0E?OJ%~*A&;OOTzWzsl=r1<=7lM}-$*gUO;^^e} z|KC6Vp(n=EX)F8N)u8;&@A!t}r%qj-&&pBp;AbBE;CtR%&YQuFx7_lE*JuDh3_@@Q zllwr14?ps3+mPi{iJch9$sEG2Q7aTP-9K_`nx2VkZv!zxq(t>&E3DK)644HF6lB=uuchesZHCYqRuX~rRC z5ytb&FL=Q%qamrcOp-z!2p));C^|)L3MrB?C}XeWpHdo6;%DxAY;&}+Q5FyV(I3p8 zeY!LoWB%3O{atsw?iDke15OFg6DK=+1_#73I!iHc{o?N4`r5jh8DdUh3pm(1<5Q~3 zku4FuNooNc7cW}C1!p%R4?=-hmf4%FgF9r{n zfaMb6U%uQIebEwAyyBY6ij&28de9GW)wdF!?xFvZRB4%s0^~3aEYi+ie&Wy()YJpK z?l|vxSl@Ar?#+$rF4aAR5n7{3V@5(Lfk<|5dry)3cH|+=7fr$rmo9Q7t;5#&ax(*o zh*uh4eR%UV*B=t>K|#ccuVX(zW)5aaHGZsViHNkN!itsMxu3qg|H$RNCwFHvW*St^ zB}m+o)QXZLn_*D6l*x?X4uMxtb&K zfyr#%wrz|aqguD6=GnpI37Z-E9U=|5BIlu_ey_Fk4$R$|)Xib8jsR0Di$V%2%TR`* z3{nsUPVfmr5O;zR2V&01*A>}bl#UlId8NDjT zmkkgEILu;HcMXAr*_-C@%ILPEqhq8SvvIMr>rL%Z_l$Ne?3nMuwmD2(8j_~+HVixn zxH5+$a4JKVj*0G21BirFbL#GFmdt6w7+|g{sY)*f*2!+;Wa_gzw2{f36z&X8^NJ`N z7le|Wj2UD~&dkGg8m%Z(%Pj%y!Sfe^1o}Z_ImnyP0SvIioSht{sm}L&x=Uur5xhVW z3z1MKc>~bpH(_^0w#y`Wl4z)8ZQVkE_tp|gA?4ZW;xX?;aPEBKOeESglWmT3Ax`F9 zWpXD;IwE6XC^RKZf>{dTnK`PBO&YGX$>HO|4tM0}7jO}k#+Rns=PRa0mCCij#+Fx= z5|N0z3(I_OhxWD$QHzm<9bM91CLz)`7DX|=^w2wg;m2R~vQyqn#khq4q49XJUi{#51_NTVS>jPu_Ih`Z_aU zB<6rdmbA-tilMY`lMZG0h5Mh~+pCqu4T06oK!w8{mOS)n(%5wG+~@CW>YeAm`b$sV z^`ia2LI~5HH{KGy|Lb3-yB7;$Gj=rNa_gsl`?I@)W39GElyZTZ!-?3%DW%vVBp(R6 zCnuiGT2)iakT7}P2E)NHgjA_-NuL2CQgV>M%pFYOsi)3g+=-xq%{3|q(zdOJ<)prF z&kJ5qmccl}oRC(8G2mRdtE)@sD*9!ln$qIXV_!IX;r#sQk*&D%^aFqR{&F@C66MI| zcmBhF5J%j=7|CjtV~zl5vhb&hs1yux?&9UaXf+5o+KP~;FrFTiIRmaahavTFW&v|L zERfvNY2pk52TIXCo^ui;PTs*TTU=tH>v8X*2r{lG1L!;6_3mt_U&8kNHhhJ7`2a%7 zXvmZAF&hQ)B&OC}-P>pYI|!V267EpIf}Qji??VTA)e(q#;UH1xI7@cI^gKEBp1U!W zGy0~KE*?Zc7Z}Yw(#%IPrF{+L9TE4%^IjXFT?zD;Z0((KmX<%=Yo(U2aPYc*)nBee z+<)@xnlvEOHtN>P!hx_r|I09c$^74eT3k6u)Pry*HwFcZFF3SvV`zj@#t&Q0Zwqul zr^o!s^U}LYmO3mAjDp6EDI^_-p43oX$8`4ogRjn!lK@BGjYLqA%k!x*6Wa)Uis>8f zd|v72*~PnpwcZW)0m&8?W7qk1t{f8YI_et3fu+G*^j_Xz4h(wd0Yk?@)4(O&S0X=3 z%TG|-P)j)^$X|se(U!>`kvqU&}SZdd^&EA9ocxeHmi*H#H#$sJEcP%_ zqsACb)uXz>U2|gQJYWtdQD}A)fnWwW2@`{viXwy%ibBew41q%koHPHpsk#|psSYZG zK$fJzMg(%nRhqb;?CAJ#3WQwN*Ck^Jr+p}SbzmWgHX5iL?{5F+pZb|ntCite9j#nh zTRVDmcxY3qG8&xCUF*6jrA!v`rfwYC%x5CLx;org8y!A*_|)ysYvygiF<}}-s-hQ6 z^}4O2KlkJR&(7n|trnr3&Vq=sL@rSdQH`qgwX&*0S;Aq>T<49>CiDGE(kf{TC5^4V z?u9RW>;L%|&WyKPm5ZNy=!3ubuCm%tVHv%TQ(>dh5y8WdY%Yc?<3F>m60(#)p28uwa1-{KiAWu&BP0+S|)=~-ixG(iru9E#O-Du->}q*DdhG)EH~?l;`-um!n! zaJPCt&L#!546;;LJVO)F6hdG*2s@ppOlY(jY#jI1RdaJlj_AsQAR)JbH_hHovwNu& ziLFvGDAv|^G&Bj$5)CDDyM587dx0Wg@L;|O$p##dQGt!};%~k4-wpl3fXl{9LU3){ zV(mkZT>J_6D($nK@7j<=0zSd>n_8mdOUI=uOkul?F-fU$F*X37Duh?ODiT$nud zU?k0S z{NlS`=rjf+g&>M< zrdPh@t0&%yM$4ho0bk%V!+AGtcB^y zU|2CiiV6deA~b-gs^*$u3*|3z7lRGT`(=(d&n_5X@u&w7eb-zpM!d(LiZTUs$x92Noz|uPhf`D;N z-gwnOJN#fz^gcUZoC)Nv$!{V;s!rlDM#o@fMOL>i&1UcUosYl!ckg}p$tUVbJ(T#8 zyKnoZH@)GtFTHznZP4uPI<-s$>#|L#6L(p`aw-c4ai7hm1$!tj)_CgDr{~Sg zt8%ac7K6DPkt7_>$c0aP`Pi~^2??z%vV~_7nHNmg%V`r>MEUf7lf?17Q^6(7oZnC3 zq}fH{?uKNg@1~O@86CTs2VyoP3h8DrGk1rhF(*PN;ASBbW@k@{BoeGt<`b&0BA|DKHI()%q~Z>bVP&zuh6O zM4Y1X;-O;wf4=SQ=N^1gT3A#Gbv8Q#zN?fh1`e4{_iVkK{0uqK+ z$_e_x${hwbCN|B+G;)JBNVH2`UCE>`2uW zoWKfW7FG?U&Hm1G=h6y$Y+EYIa(x}6RV5)Q-B1!HI~On;7i1n?ggfy&3&Ud4wC#NT z*WUea|Iv51voT2l)gYKEg|!p^_HDoZzdrWJrLoN}p7XXTOcA)L+tuq&yzwpHy5lVm z1n!iIV-Sd-E)odT7Cw05u?v%VbO#Zun}E$S^dTlwGqZAl$^L~ed+jS-OhOtrGBSoR z5hu1J)rFn&TU#3J5ZoKKXulhP&9a=G5v1ax1V?XxSzxFy@8n}37iwArjia>6+@XR}Zug6i7ZY9M#htOj=@?%*KEjhH+}eD=Y! zszL@%p+2U>!J?K0F*SGHd1GsubD$X;qB}`<7xHAo?8Ab<&;sQXPfwpbefrSGuu{MO z_dguZJ~!ZIwu-;{BR^#8D^7~eyG_a2oX z1Dzcd=s`rfCe)az5E4S5{y6L*NC!iEJkg)3T{W97n?lC`yW`eC^c}zYZbCMQEWl^4 z1L>~3gpIsAI`a*ayCZKG{W0E|0TU!M@Vxa#TcZ>oj|1B71(@z1CF3K`h4TnV@nRX` zvAb&YSg#I;qfoG$P$Wc8wRzjBfw&|VOVQ{~srn;w9BYqS7O-xC z(Yxz*rp)f=MGq|oFkK`8cVsWYQvAR&q3ApJz}>G2Ob@(#iR@iT1AM7f9jQ1V{<%`( z<2XQgmfpTb3tZfVcvI{Zhspwxaw5KGCFA1utLby(Yd(X)sVA3#I|uQ$fm1@*Tc%%O!s;97DVpAuFMJ{Gk zKD*a^?##t!8;ngj3{*$~m?8xRI+8|#ou#+#cSOUpOL<^=+U#9OZ{7y;l(Fp8%X=nw$w2`YbekZE-7Px?l0OifeU8ZCM?&JH zo>NXKF=^@xBl4V9xlL&hldLJz%4DQSdEyeNAS9y+k^q)cx!go0oK($ij%H`?mwx6y zkBW7#T{cG7-|>7|U6~WN7RkLJc8%7?XgZzEwoV-0JbFlqa&2|Ax>^y(Veq8pU{K0? z&B!UbNMO!|htK`~2k(8)AFfIj&441TZLFNQ!A8R<1&6{kf{?W1fKvpyQ>^2x_IiqX z-)0kdv^d-M`E4(Ii42P;KJm#l6{``XEQB#A+qThm-o~l7QJB_N21k!>ojiW{#PK61 zPaZvbcynWQG#ZubtHZ&dEJF5Q&+1t{Z}-O2y~+IY_TJ9k?BdS!%!S>Z%j50+`D8Zt z5UOGz0w}a?+vuoUoyT$>OXw!)Q7LX44sKo<9Ccl5n^Cmrb4N309lJc+@Hw46*7|di zcbO(dQOnSRIEg~YNhrEGBqY)sodSc1qA7@x!uY^cRXiL?5zGkfTxWA`BS^&^d7{9x zfh^@sh6>Y2Y3C(u89Ht<0 zwRE^9_o+$FF+xa%nLwOk+0B_GnsPOi(Yl60;lu*VTa%~xi4-yqVmHr{HZx*Z@w%DU zT<;5r)r>fOh{^j576c)3&4Fh!Q>-33X;q;DAd7*S$ka*LU4wfw-EDU+RP3-gSCm_a z%awIQfe_5CAe&r1C-YgzxfPRA1Iz@Ms4;|My#MU~`|rN*jjw*8#{FP!5Gu;~ybT*S ze$Nm8%oF=`>GGv|G7H}FX!Z6Nz3Av|H}BM~jDo95NBr})L;)Zp4IC(j2OfA_!br{B zBOws6YD{6}Mr4*eqD>XzOI~r8Vp4{}Q<8<~<|KhYP9$wqx3(&)ev_l#@R7%u6y`>g z?dHMzpB9k_cV$UNbYrD9opKDeuJnyr2C{+Gq&a@-*rBbGh|P!?3WIr&(Cw)PVTC!Y zq?N}WIz8E)wE~OAMv`lh5viAOo=;AH;-k~~-pQA|S)TVCh79Eg#Yus2O#X8^gIskU`hmYc(h%>o(2;6|PTs<1>QI%bj@ zDC{oon6&Mrb&}vLfC=2aw?!w6zKn(sfI3=29v#8)jPkvwJd4NZI34vIpo28tZIrpO zy(gguJ_n^bS@fB%V2cUYIW9U8Q-1^W(0hTx`$Rwo^*>!ZsO$7=BH3;-Iot)#&I4~= zcVeZ4vJqVS2Io19%upF*y@zW7q!$DV$Yj24c@m=rPI3O7OlRpU-Q?_MJ$ni+MM^r1 z9Bslv#I^b5*{m#35X{O~p4fWhab;Jxf?Sca;Q7*}mml~5kz4A7bqz+E={b zTmRgjx%s+7n9rJak0moabV}gtl;fnqWagZ=M9?bGkj#0w-O3}|(+4l^?zHAb*;>JX znJF#AT!tKPpHvOh$tSV_+!sU6)CrpN4Cq`ad24bIa`wi=(Rm^92bL!(%stm9%$ra` z(1gy5kgZ>RZsDalvMi;{_LYvqWIwoP1yQ%#2ff zlc&V;4tOL0Bm^vJ%K!)juyoLMmG2BrEm5u&rRD&K(%oyFZ`9%E{?$(hFY6XE8a?mj zFV{hcO07GwHO)N6XiZ$-TraC)Wp!<^Hc~ep7S(_&;k98X9OlZ*Fc+buQw1mxJDawc zp51@PKmXTAmVBa6$i{qP(7JwJ!>ZOicFg^SNJ>JGgX7=1X?#gIB8qlCp zY1|NU)ns;-4w|uP)`z5AnJP{a!eG^dm?Jhd=B>0*;O=IegfY3yX4>g2WhzT$W!<9@ z4Ti<~M#C_1a$-$63DTg_zR^bv4pDF_9vL#tUz7D%PB`GgFha@?Xk-IeGcCsI=g%ddW8bL(TSq&Yo z0J#S$+^OYI9y(l?1t6v8gUE6|2Nws!+WqZ%_i|+sgq8viMuUw_4TVb}2FH4Q;e6Fb zCUrB)GA9;tGBYm<(IdmlzxV5JgI}nC)+%OUYhp2cZnE}WKk%=Qzx37B<~qeDRHNyv zjwQShm`b|t6;mjOJb}!AIcf+os(^EGcy6ukR zv*~Ow7^r$+Qg<*pnII&Z#LP)=<_T~(h+*zoR0Y!529u|s-hKAjvyK5kLJ`gcaaW_9 z3oaFPW=|Cl&7%u}15xR>KJQp486479=7daghz!PsG;NC8Aa270pZ!8B!)P%H8VLku zP3aoQ*_n(BZF&2`qxXFTXzu)quMIcdu7zx_9+^G+sULpJi(hy9VVlh=;yTuKx$>DO zw}1U}kIy%6XhGz00cR+s&M|Nb7bi2HOy{Yr)e=a6dx|E9ds`O8U@*u*^JyNZG*?|g zA0yt~)yE!t4pb#SRpQiU${=!Xd~(B$hmRj!iBTyCEXjUSMebyoWKa(RQs}%#3cLI9 zzWcs#?D$EUOrHGkN9U)XEl6w8Z~gwiv3|#?2$$^J)@*omUnE;e0F>N8(L6{QBc_wt zRBI1Gq!8gH3oe$;VgzSKATC16tC(>8q8V35wzB(e0Rj?Gs{B@Msx zUB5x_oLuEfw70n1vP^|KZjb;5B}-qjJ1oRJOBk5YpV27;V2s{Gjb>@_dah801?J75 z*<-pwQb;3kaEMqqZ%)+>BW2zvT2|y<$N;>nNH>a7I4QFtqJdw^Rp*@HQt@B<} zgPqAu1~(4NZ@XnB*v!35q%o^g79G3j!3D5AIR6iJ@xk@hU#I5C(i!zyFT!a_q^}ij-5DhWNlR3aCqgL-~8G)e#whB z2cezr0&_Sqb98dm6d>$yCNd|=2O1H~9H7>SoqX)!seOF@{QgsuW=3TgtXNcMwUqw@ zY#k*dB6Ct#CnpFy2?(yqQV#S_?tph$jlJ)^<=KHJR6a<)XB<~ zL|>jv8a<%T^MEqFPPgodbdUU(+DPa;YIy}^$e&Id%I!}ZcgnGDFb2Dsgj9~n0CzQp zlc6ADHzsP~#+=O{T|8H6^ODmmQL?muvLvYMZluN(BaMo|@BQNcIP=gGkp}ZZUht~d zw5y{=O`{QFoYz!vH5#q1uRFW22$2wh5lusZqlY&RjRvIA*^~tC!hn;Ikqg0<;*hJK z`>~(eXt2NERvU-bPTs(4YYi1n1XZvTvAG90StAx{-n8TW+5Wz@H6k%I1T(034D8y* z)*7P%q=(B@uIF#~ihF+W2mb1HH>}xg9-yYtG?JyPQ+;qzo*zt0(ZKz7MBU0Z^G>$~ z0&@wL5Gt2Kijso}uzh*_&|}Zt`^g7C`RNB9fAZO#y{T{sDra@ny4HCdwe8{1y!g=S zOO9=xQV*ARit&`;ZlokSDyLG8xqNs`pPkGfosD;b*vcptqJTr(CD$v3IE+ZlEG3Id z^IMIn8q#n;A{rgD8Jb$i+#?*)83a23l)|LgVeG`t21N3~#=2!iJ~22Y2z92;5k)zF zR$gUhFrz?Du!c1HD$?Ys;VJ(o#KqmBP<8ZVLlVrL1jM;M zKq_bK&fa=G)!j?t@&9A&zr!udj`Cpqt*W*6KIz8JJv~{{XhtKAB$QDkOC%$}B!jU9 z#$cNd2P~XEu#Js>=Cd&d8)FQ{7?34`5J4a#goGjz(r7d}&vf^6?!NJ)y;oIzf2_6l zId>#~&+k6co!jT0d(PQwuT}NdTW?ia>d;hHz4bLM`Y!D5665sB#nK|Y0o<$rjKu|{ zMukY6Uiz!w^7n3pFM8o;-79>)L)mp$ZcaausNroTYBwcrS$Q@wq!+e9Lvmk2cLzxFEQ? zG3B-coc%RCWnJLj$|x4}U_y7MTFd7?_ec{5jhcw65_=*P64Zkz7r+B!F>riH3ykiQBS!mfe|6ni#5{C4$B|RW-CVuw8?fWci3% zB%kT_)a;u8jgq>tfGChG#_!EwExZyGx8OIZ_@8Bu>;-BT=i> zAv~)Fpxb6`0FVRJHuQqKjO#cjveXs41=+sHpR`JPxO?ubA^@`K0y!l03?p*q-FiMl zEQCp_UabH6oyS*bW**42%cm^R`r<+ltmaZUytE2S3z@e|JD(UxLV%?2%)vU5z*8qM zS7LTHCQ_#&^!vkE(DP?6-+T9iXU<%@aCv-ruf95qPhPmPH;MhxN;9vIR`Hv^;dS5e z<}X>Vq?zmxn&9dhli)a78r{p3i<}s3nXZ{TSp%}7IzQHju1+7>nOu$mJSYp-M$JK- za`My$yY4A{(Q$)M3w!)$cAf2awV z*hNqjrKx$;dNNTpV;PJ}1roQ)vWR_>bwaED&w;E%@)jaV72VNGpv z)#|IK&;8EN{?9d8;r{B{^|$C?U>pFBZYc%M8m*};{++uMeN$LPS%-d3!e z=YB`lno41IDj=0{8LBcmo<4oyLm&L~AAaaF4?cZqrpm9X==7>=o$j1tr{rQO+&p=7_G)2MkX$lDpKL*nyMAk zA!6@350Jr~oQ=!a#K|?P_lYuVVvuxVv*iJ2Ag+oWS7gi1?gdF>j^2odt4)&d=LUD3f44}9iERva@q{DNF?2?45Zm%&IN~vsAW~IA5kZl;O;EJT$5^w zQ_vl2-QTIlI~ALnl8ABHKYX}h0tI2A`D}dcQUzzPHBZEfOu}G`O;r`stw-PUj-R^i zmctTf?5-h%5X_oy%r|p;b-r; zuadQSYycvX#O=eCnbpnJ*ob*v`|cOL^hH$(Vqy_tjv6WCfz==aOw%lDBqOji4ca+r z$sHb>INj6x9(abiRBfWUBzvn4X7ff+5EA*tP6Uq$GYc_=`H5494sEV9W*mY+Nh1rx z$O+MvSrR}b1}pBr|CzdB%bb{{EQltVei~=!!b-Gz^~z`ete$NRPThLj8@^=H-{|#w zq1k!a@%kTp?JIe<6(FvrI=RMc|M3s*Zw?)Atd5CccNj6HA$$x|s~eryn$j9Mt#2uA z&7E=0j8bn}t=CpplYauagPn{CWQ;Uym+|zI7q484?&1a(vS`fgW+|6j6f|qD-g(Du zWdVn~2xZxvvJn$oE4_1=h?qGO*vtKW{mkbc?)TT$dc7w<`qA-Ij|^zO8+X3yd%ySA zSG}~hxf22Ga5v@D+9^Ap?5xsw=FEiW94NP~$8#Ed;RtgC1~YAO=mIXa@FTOxloHAv zs%%fC<$pR8>wytoZPGkdEPThi{{U^FkGC#%@qT!g@@Jv5Mds-;(Cb1JP)D*Y412cy zi`s#<8?3Vtsgr8%8l>(9sOD042gp@~sv?YvAPJOr*aB#^T#KM2lYF%Fz~Uo!A0{_Y zFbi|T&aB}wq!kIN(3H8AAmnKt0HwxjNrMIeuIxrukIG&Z7~ajHAtF-qXf|z7t3e7Q zGFWQj>*Q*ko~MJ8DPCfp zqTgqKC8+J9{+yBDGOE&<%GW{d@2QPT0W7uCS$fen7G1zHnbdKHL|o=-O^3BdQvet; zg90FR_TvVoQ)fLK*pYy#{uQ&5KDOgT3pN0iO6Sf z5g8H_nHe!B-Az{&OgSag9_ciK2}BaCF_t36SeqX@e(KWJm0$Sz-}tTf{@K|pI~$va z2+}ATU^bie%i_qP_2=Ju^37lR>MwuYT~#p)#8pvvqs?rF*tkW_f>3Tht1^oNa5FHV zCe^Ot>AmK2=dN9BXv}>NMMLC`5@OPGrJ&nW?|sUW{#0Vio(j&=F>A*WB$7U@Ls}NI zfHYIY-Hk;Y4kJxOW1A(TTmzBD!x2&tk-EXORD;7)FU1r$=hA2*OLTDhzj+Q<$T>Ge zOj8gOIhK=IUG^!-jk-)%y2UA9W$I1@1}UQFYTh)cK$*}mF%PR=0M~o73+FDLJALNj z>2o{Ru1&|2NItLi_)DMvbzl32cBWI}PmyR07&|FJa@!A>ldutydLE1*#L{?N5&7+( z|Fzvm&o)$5CvUj!#dpp?^BBn#?nSRCdld(11Dhn*$Y)9j1pyI7z{a7~!<)kZb20;) zGepG+2xZA1e$V^v|KO)b#mf4z8)f~lSCs?QI0qMKJsH>gyZcwSw4Qiuf=5vhX$T(c z{id14I2ESR>gxL1>TEjKsGEn@di~+`*B}4uZ++t{UjE!z&o)*oS4}fw76y4SvNn4e zGw;q^OE}~kv!I-^+3W1KQ#(u0a`==Ul-zxjN|wG1)^{fMnNL6PuJ`=Wr$6`LY_8nv z>x^a>w=j#Riv3rfSbO8~_0hHcYHx4o>a{j*V2>V~urd$jZXu6N^)tJ(2OHg58BKeA zwStT}CwO6M5*X%5*F$M+DVN1?201IdXqq9<$cFTv#Gaah*acee?ds08APyLDF>@LnI*g*%I2R@BbZ>g?N)JZS&7DFbo!Hfc zLSLHaT+i?Nm7mhRr+cAnP>HZutwnh$9R8QT`rG5tb-RsFoE4$uG<|_Y9gavuK?Jp~Ukd(GLW~=xl)0Wo0kA>$zMQ5eZ91`R2rJ)A zX=D~NbJlbzmS>R>h!iTI$ygtG=xL&%n;GUz1%oUP>`3BxC#$OHlP5m2^~8e~o10$s z>fwuCGOv1T!*xA(-`{`pi(h;DF-*35fNEWr!w)@j?fp+*t9xtF$U9SJzYPy2+KCS;)Xn1y^@}=Hb0bv9Y!>zV!I%kAI|` z>=8xV7`^SEzP+x@gCM6OG}AsymMc#p&rx^&T_&s?OsN&wB2At7%?^q$gD#}54z}Qa zTUL32sTL@(b3!mnjWqK=bHtGXfMxizc*(R3EreVa_9T$BpvAjSm)vb;MpF>u9d2zw zL#kwNwZh1i{Hfbonz5a>erkOHhaf33HBg#&kfiqT77s72(-#1$?SgcgrF2VD-9nm- z&eJHn^ErnA;oOETV}G)oyz}l-;IM>xtPbR>RTo3zs$dPR@IwtW&hgS+~(#~4G7pZ_`v3uGK)FML2fWXme=bXHbG>&kVJj69A!c&&X zuxN#pW6<>4k(^prW33n+AQ?At0tFe7l;Brx6kmL5gLF<#1Z{7@vo}ym{Vqk^?W(j$ zrBnKuBhBR{I0f-G$X}!rasq=}NGk%0an@g3zcBM({-r;7=WqS)JceSlS~nK!osB_w z#TVWAx-Wj^8(#gQp4Mw?y&~}5m96<~zPC5o+i9A(ee*5Xudc2&^BIUVO_@qcs5E`Z zt$~BX1l5(f-+y7}vAyxNC>#dnY;F!s`8tg*!inQaX)zYjsF{kQ&KhuP(bnF&gwyk~ zWt|I=t2x|S>ym%vPJme|c5_VyieO!;he=3aX?L*Y=GMs?cpHzUwdd>x+ahDi#wCxURha%Rr_2H*e#DK=~^ETym~X{brkMF|)}(<|G*{_lT& zC2~`YZg|Pd=Rg3_F ztPRTF`Gt2pb%;J1J>eEZV z=(ex=s@K2vRd=2^v|ja#D#&Di3~LDNE9*eO-Zd(f4V5TT_oajO4G!i!CfwaS!L^y^ zmY~)~mz<4Q-WuMyEl>B<%!O%@r%VY^A_d%qxlro4vGn?rX8yiE`0zV^_k;I6ez{m# zpJ*t?*W}`bQ}yI!Cyu`Q#LD6Qo&Ic(3D!iYn@J!mptTp%-l1n?^x?hcll$}YT+I4C z549R`y33Y>8I49vP9TQ5QPt<7WbV7p=abzc%f^^2sU&GB&&zE{U`!-Hbc$SrwM`9y zQt?C5^g9&pt+JFX0Rc}1B}s8A(S5$-v#VmQjV3aXcoz17U0J zq6lHM=4DS|NvVsl$x}IotYr@46e0 z7h^PaL;ucqrKV*5m*BZ++A1{L0Xx2~P}Bs{j1I|9oqB(^#W(bYe-@tcF7~t(@;KZ+Z>W5H(;*AVXs#O)l{~d@@fFHgN(?G?z{JFY*KJQ0J~X+vX&ZC zv7?dFpMU$UL1ut~0*Ja6UL7T2IekU}9L(!6KK{waSJpQMWpn<%&t87up`OiWK7Ym6 zzvX3L{pDk*Bw3L~3f$(+JLHgc&%WfX4$vFch7AeiWQKq{Jl3L5PR^tC#pEfqLDa&n z16VD2y#?rMKTa1QIC21BOEmyX@(*7C|NMez*?{gvma$Rtq3|vM$j~Z<3d!7?g3yj4 z${#mJ8RSc^oDF^ei9mM0UJ`0GB}AT^y|jX!jv#6Slf?&G#4Pzo>Y|^lZ(xv`Lm_j= z-mKslUF4)^^A)5g zwP`iadIE2$!8C0YATn)MEN9}0`$f+?k}np&B>3_*xFFes>5YFif72&kLdj8`@{X7&8P{o3#U;%~nH z+Qt3#mC9Y$*M{Hn4PX7$U-O!in=3k-tHW&^G!nZbFb671f;a^ty?EyQ*7nwOZ@qaw zn^ZyENeLVv-Z;5&x#iVk+q3(x?4BOa8y-**8nrxZ))-lO?Z|T$QY*j=qH{k4_cXpE z4d@M&#-!(iWacn8H*=^ek>o*R?gr=7Ma~`WOzrTc*0AKvUaBl!#I8Aun6y%!HN>sy zM0cY)gOM_Al)B($gPS>1Vo&9YVw8Ah=iD?pO{WsDiF4E_!muR0Bu#;vpdWhuP{ytC z<99#!*gc=yx_GG|a>8UfF)r4xJ97Ngsm;U3N2Afo%8FMUhdvmVOboE(R2C>#0~2wY z>zW-~GL^>gRPgB}CJ21~$)|tkKmFQqS@GWR`nz6S9NpY$qDAF`tI?35PS#kAZYj|y zV5CesNP?(?D`BXSl&l-W-gSpI`f!KU0)ms%#<2H?zw$dz-Tm0ck?U6v-8gsSX1aau zbTiqT*Ym<6nX>D!lsZo4vw1JjTfg=V-}zl%`-10P&oGA(rXK5bOo7v*5O)d` zgabo0H^L#NBns{Bzq_Y4a4EtgEQ}CZSLRq4rF`7lH0~llinK#%DY$|IZXn_4lB9P* z*u7V*u0DEt>lc6hy}$E;&+Lu2ODV%xZF_#Gx%RRXYhQY5xVn37G~Vy2nHESBpFw7# zEYrboYcRTZH-6~y)>DYhXf&59YMP!)$g;E4_|k~U4G?ze_j-LNo$ZgIwWPM~E@|mN zWMtIs07`f;qkzV}7_Ct?s);CxfecQflz0heU!u?wY$dp|c*Aj5$9utQ5W`qOsj(12 zj9jS@3Q|-}oS~iyCAlkmYnE9;<0$$=84jCNMMPrR_b$c$3m=m1GR(mixtTP3djVlD^-SyHtMw_Js zA_|!a${VEZ{@HHX?1CxPF~U4`h~=m?qR0LC*?Z5Bl%@(Wr$z=wPG*V2@tEpMs13G3 zPQu{k`ddzHtOh4C<3OTXqsvt$LY5_(Gkcuc1NWT;2ZfnaX!|69p@0#2l+uNGKkQz* z^obA8=QBBZ)AQc+<@M_N%5YfiUwQ3wR({}XUV`n5C6k)F&MwjLXWo0i9Xh&ib3;`+ zq8qH3+dQTQSk@W*loYg7y9P_Gjo^T~rS8rm7!8MTrxc*3Y%`0cQZbRopSZexZA_Y$ zRNM?m)iDtuGh&yBdN?d^d;T#)Ozx?rqLN;m6E#SwqqSK@)I;x{&z-$Gp7#2^Vm5#1 z!+#dGF9n~@`~02%`0e4y261CXA`-2U`_ZR3am;4ZD*W zxFQzIBT7>blx}EQ7Ol4{+Fo$0$U{~Lref!$H3zl3HoL@UU2=4H}U;?ZkN`7WW=PrIT-X!41b{%3ybD+hgGKzLtX+ zZ<7_&rb!4$yb};gH1i1U4SGhU3tzgtbM^A}#migGT*+x=*zc7xTwCe&`(aql8hyvR z{`Y&{`~I!nI!XwWo!7qf#<&0dzw_dk+&R5`IqH-}HM&WU7z|<-r;yGKNJA*+byJp= zk)D3~^mA^wac}E#zhAmF4Y3x*MZ<&V$M;^{zuG8=K1mU4Pa$M>YU=Q)N<^yad0c7M9T6C?#4~rHXgblJM5fs)wcJORbhqSU8)D@R>Iun{ zndQu^Cv({nCuy2xCR8YToDlz|#TQuD6#dhhwA-fwWOIGL+^j zZq7ENVzPGPfvNr3<*f%}wL4gw_M!o$JAqZxVSyQh;A9lY3{}6cELu0QnT6DX-3joR z$5@efZ5*>LbC?$r<}p$=;L&;vg{47XE~&TAB48lz{w!rn#EHz&?ECa8sk5b~K8Z}u zp%`E&MqKqg&f|O6CK)54B-fa?XIekrNS{qM7Ud zmZTX_nY$u$7qF#p9SjGv%(SW2kJw-UBBa4_%+W0+Qs7d#79PjjS9P{ul9_1;y_ur7 zu|~tn5JY`??MjFUR5-z2&-f`AxS#aZ*z1Lq&Uw=qBV;#VAg*(@-~-$5d*u9Vb(We57~%jVBGt8S?_J#Cf`` zk`YNVQNg|RFq_FoKKZ%c>Y;upcOHG@{M{cL>bRl#b6)+LH-7uK)*-r(0Rl3ui8Fth z3+cdUCBd9cVvE>1)Rp*9Y8j%;e|3C(0v?t;h-XGT+0R6~ry{)tDo01`E`VVB%T^>$ z-+nLyu!N|VVNl0wFFl$oS$zpSwJ7rdoNCQ@jvTrdZRJC4%#eISJ2VnG8t>8@Ep%vK zp@SI*zuMpgU5=$)h{eU{XXUCg&n?bajUw^Zbmri)C>$WSbWROOtRmdqB3m4Va!?YP zrmhX??K+`8bsPy`ASF21Otz=9+|@XPm=^572+HV*^>`E^3Z4Qx%~9$FmL*0FIqE?aV&nr3-5fzn_gS3 zt@ZewiD{nn?sODef^F_JV}r2d4M2&#ZYiOK1T^D>tSKgH?T9TIr|izUWaE-)>du*W zd{bwvpB0;Dq`G8am!CkLS?dxDt;ocg3WhV044sC5{Gt1P^5@?5=-J1I{T1v@;}x{Nu}e_loR~RuxcV$$Os7Nyw9g zgPGNg%U&o7HLaVe7+4{c29I?oMU6I_7H(|jXUo22)#+v!R9*pBMX77nO!(vnIdH(2~5Tet*s2w)R*4zU;o96?>G`% zk)k7QtYGS`eC+WH@4Wlsel>E74GJ(U0rPktoqUYLg7jc@w8wOekos(*Os z)z)J_{x`qr@ccrr*(ah2+y_T~`nNxLp?7i@!92oP5FPGTDN&(nh}LD8-7^~W;BIM9 zR|YzHwwkl73 zx<}0WmjX7h?xJ^@iuv^VSP?P!C)1;*Uo?D6Y;`XM$|HV(+~cw!7WFu z09mTMBO+?sSf@b0gL*DVZE{;e^*}Jtv6&qjSvG+kI3q`AJ{G32<7EMvKj=Wde9^pn01}r68PXChUdGXX@Z{&#H0Zk^`K+H;EdtA?>GYb=Pn^V#v$S?#Z6hbf)YRQ_! z&48oRq^>6hCrM_XQio+~k4zhQbx~kiS1clgHfORZ1@2M-`JT0pk-IIP)-ClxZ=5m! z0=U`@!~Pv352-Uc)VmQIk8lv5$QGk$?OXzx?3oOGQy$e{%grcir}qyY4)B?65$tUEO`?p{GChxd)%TaBfu;4GfDyTMtCK!p$>LcMuCFZ(>5 z*F{myboZzK+q=H|`+xZEPk-d@z4~JRNa*znQ!yoIQZb?ny*oQ&q?Gmg1Zoi;%w0A0 zS}_o!Me%@CFavAXKW~YI;9Gf~Il;ilh2L49MIa)9dn)73aXWE<8FQr%Y%Ay!=jUV{r15Z5o;MRpp zJdZsT1sBul-fo<3UVr@gFM08cU;COV;{J5X71=zB1yOzU?$7@DpMC(1pS&+eb!b4Q#`nxj(bUcfIhoTjO+A7W0BMKnyT7ZW|C& zP9C-N3!!cN+6H*tEo<$~=g~?3-(TK_a~cQ=k3upZf0)J$11fTvyI^_~P~p3Vp+ko41Aeq3O2F)tKjz4NN2q7pRao zk>;y6eYTe0y>R7mrs;5GiASK|se2-bK;{;N6i&`kl(De7o`>iJAx{&ZlA6Eu%H#l> zIWx?1%l5{Ys-cfIqYz+XNj-~%?-beD94%aT^2JSItY;LI?bFo!cmSw zukUJcHZEdAWTwXKsriqv7$}BbF{pYU68&F?Ct+ zl*_cPsKbc_rjTks>gusmwQv%!7fz`@#0k+1jG$hy?_NAzSR{v<7DaC!yreX_=L7 z4k!o_v#^;Gr__vh_>a@pbdZ}NbwwgaDvyC`Q%BprGJEvF^JUS8sk$)*bB8M+1OcnM z5d~KzB6g1&sUU)ueZKkD8&^t8lON%LH^`PK$%<1WMUxQDJa+!d

    36dWORu)!Nq`lY+SI?q;&p4@p`-4RcJFBVi^Sz3`=cye$*Jx|XW--z^Mf_Z zk+v5hA_qHpH4@jWuo@<0m7t{&)4MXMXSx35(fc3Yj7kzs-fbhmvST(Dk`|WFy7CZd zRNm3zip=*Dv&dS7BRbhbn379kWkqWAVs458Kq5roPGM@BNSL`A=xon6y=vF+0t6G& zlE#Kb)IlMDOEMlnRUEl|g-Whe@=z-SRh5tz4}h||#nXlWPBf79_3@s)M+|lZSOx4) zP3AA$zfYPSr^-@aJMz`6nfbmDYd#by+oxjnodgnMxDqks556j}&r@DvdMFv*YeyFl zvoExr5xaBeFWG&hO~Sc{jcC7g!@`ZTmRJ);w(97s_NyYxT~tAEo(k_;YLgP$qPi%m z8cAKR*AhYVaE7GjP1YyQCMLEf0)t~Bd5K-2NaB-F*RiRY(^*qMRI9R7i0Ofem;e#U z94M(k8NR4&xsnlJLZEs+V@e~X(>yOw3_0VG4jNl*XG9&Th(vZy)Wr744Mm)41Vcqg zB1x)kGegP5Q6;K4N9}kv+nx9KRn8YzqRD;y!%c^8e$HvfyDMC39dVPzX4j*H<)wrVD|!BDmt?FchNMTrS9G~->@ zUpJ)4uvocI=Em~DN);_j3EcD{n%*c`Knx*Cf^4GmiDm^>7!j2d&1}S_YF%YwgLb=s{J%e%gi+jt9mG_I0*&ou=G9e`s7%H6Uoh2y+S;R zi;Yt%3*I8#jZ`}~6+ds+ zDdC%W0EH`f+{AKp@XtPV|JS_a`OVIyo&$?j?})KnM9i^y-K$=7;@I)WPj9~IM}GR( z|ML(1@3;TtFaP%Meczk@+aLbfU;fem{DmW<^4t>-A3L(D;9hSynPN7dmum-qo25tDXbE@Xw8Tc960jIZ~eL#y!JKcHaE8} zpV2;`y%5zA5CovYyZNk^y1o6nC3Do{ia zGyAgDAS6s)W6Q*%%GSm~HA?VAq;QTxi1W~phPD3S`Xfi~`^YEGJ@QnqmQh(YvmNI7 z!21~HhgXOH=!Hl|pVVrJveZNX<@ z@z4Lx(odfC?+!;N9GF9aMMU&@=>H46=~YomzAx3K-^?KVM(AYz5Pny))Q z^aZN42L(+{8DRBT5^lWi2;@FSDWUZ?Y#yES?Uu#x1Hop#5UYwRH{3fr-@JZ6722N4 zF|UtlE!ww8LqxiyY_}3*P0up&gMtYW>dKzX#|DOg*ljR-plN*C#d&0f- z2x4S<)6}hb?wv*^%cM`I8bg(KHUP>QyTm@?MNp?q1DQ=MB(PGFIaWk?^J zB6%Ve3P8ECF56rADW-~)WGRdWjnT84T)DJ<@B}fUB+*Yk{bblAX-q^HC*Pi%fZ(hi zL-N_yAeuS~k%-|d%cw|D^w#$8TsT7>8a3?fKJ?L#-TWmlXi_6~!{qrOKfVbP#l-f#Aww2jZYu+t+7t3O*DNJvdqs)xXtX47EaqaFJoKiC&7Kv7GuL^R2 z0I?qR2C<%h`cMD*^e66%TYEjyg59`njy>n5Z+OGk`L)qb+mN>G9h8EI^DGjHm?ee6 zNYh?fp~75;c66H|?CUA*Xry~05{R=t#sGmYUfS|pMGY1& zs*;L=mB7&w3nC8CAROIzcNWTc-7VKdNCeoiLSs(SWfqWBiNTUnpPGZP2x_G*%R!Im zqwoByCqDU^xK}gCQ?H@e7T|ta4u-y8c`n;F*7Lfp+t@aq%MgSbTsd|2;;GY(w65?Q z2lgL3cFo$x`o05)`YWrh(4ru4bY82%g|-2E^&CY-l@(>ds$kN#nK|!b5Cy@Jh;_hB z5kx-S$=f;*fjn#BP=PDQJy&^^g2bU^4Xy(xWUiak1_G!QqNVdC(UlNe^1+px5}TPE z9~2vcvS}e8oB5}ah)Ki|r}JYDlUY>@XaQ&lrAp8F#&KBj(UnaQ5sIQwqKecZMpY%m zR-#zHd9Zg(4pgXj6ID?yB{~p0a?WvpDf1Lc&Hx^Z@ifK?03yncB}!2is)1tk>?hM$ zt{wUFkAL#3pLf@6?_yOHBudN@#S;Xr6X@=xUwz9Dyz;BQ`)}`i=(qmhkN)L1yzZM{ z|MEMoyY(M^_rHDF7k%}2{=z--tvKuKPVf=;{N01bvJy|*T3Pw$(#3TePsJe=?jV+q$MS2&;SP|jq}aPXs}XN z`qqE)iVniU&-HaTR3A@8mTCh>%nd&XmTUq|jm!f?&xgV*xA7<1GFCd4F`VJkR<=nrryb1xZW6#pk{L^WHb# zBRX#)8FB$?Qpx;aIvtIHOY=R6IVUFs5rT6hlDbV0sYX?h3ac7_MFvHf%^H|?6 zwqybsx5a8Sb@D&M}EEKjOt{QYg@?$_#ypKv8mK1;Z5;YYRQvc({Uvhz?or|Ot@ zH#ZOO->4;(Ad8|Z3r#geR_~X*HWNpQ3@C()!ot7Kjxea6P8YCVNmQ9BhBWrqUYVwT z=BSbk@h3Ye%A_D>5)FWj2^9@NCS$~qSoVb8COX6wj3adBZ@Y9Of&Hy5Xa1nm>&~}G+TjWAuO9hR`D47qxC%{ zpRjET*pS0WvjPmA?QFXk0}|}c`Z6qFuUTb=4U15qgPkf#L1orXBuWfSq!KkVFKL7t zL!+X%Had7@e*P&2O65Vkt@-;(bSs>$^FWNVXw&Z*|B zQo54;k7jGxy(;HKletc5hJ}mCW;NUY)GolvQLHvOPfv~%0ch#muq^AX>8JkUgHPRe zpX~0AsECZcc6RXk>t6Hv*B`s(nw{C+T*l;_3bB$Byd$z|R3*!TIme>P%o1By^!Fy? zXU?8Kbof|oT30XuDng8|lLCyI4TSglGwoz2c)e&WKZtwV_rE{8h*~ zD6>;v^$La60@w-dn5`}fwDcGgc@ROZq|1>qBHP^OPDo}8Z=*2G0VoM6m`SyexIyGf zM?w?jhKe1PdUx;oL2;z05E~~7r%|0Hx$O5-M=X{jb!GWl)$1i{04d3*&cfa$4r+@Hge(S4W z_38?I_pOKj>JNYJo4?~t|Mtgz`Zs^$?SJr&x8HH^b1yygP@~gfRW|Kp<4}L+sdGoK zzwX>)r!TtE(Dx!ygudo0zpM%I=!v7{`gM1|;NGXt{WZm~JKufs^4aRdkrTJx`skxi zxT=!M|HLo+W`Ez2n_vC)Yd76|>kIEaboB7)%NKSv)GiXZZ6hJJF?t8b@E+8*p5?@e z{f~Y2vw!lo|GpC9P&qU@R=)PdFJHg;#`E(DSG`glg{X)iAua;Mmn~(ZW;FwBw6gk3My3`}`Sh!g_zj4_2qsZI-$}av+dy{lVMcdheabLzomE673)c z%jUvm;7{4GL#@9>I@Sq~EvZhHG&WB(>)|Uw{(2_T> zIKP9y)VX;ml%1A{Jg;gjhqCmhJqXm7cvFH5?Q`t6N=d6u# zX*y^zatF$AqF^vctal!(GI>=%Bh--^i2zbLapG_*=Kdv(87EdCDG-dH*2TWCYqUsA z$eqz*hj;^UElv*naI(8ghofC65>97H1U{vB#`FRiln}^5t7<6qyesBR*foXA#KbW~ zDy@-_b+OT(Z5Dx7=bdj3mi_o?z!YN}UOWTYx1rIKW zJRwMmX>&?0?*W0WSi)TUo@FewBlB#Nl&hWn4r&ObvMNaFnR#V0>`|H+p;e@~~D zoH0nt#91!b#UBe#Vt49w@tq~}ox>N4!&97+#kAd#F~f;`0=nN^`ggJ%sgbcM$I@vw zJs8`bC)GjW`mVTg>g*>z@bL?eJSO9Lk4cngIzMpJHLrc`YYtp@auVWJyUQgLT#S)& zJ1$j%C_&kQl!7Q!m^ern3|F2yeRg*|K6vm*Y$AKM5Ip~yc_eFwra73;RtkALs1mD? z60t~>$X70H^{cf;11Q}T$P$_qV$1BJM8~deV!_-@w&s&dFM7$VY7zE6h_x+C^jFd# zrA4a?9!jLF$%$(xf2KVQ9ZMRs0cHQ3Oh^2t8KlU&=6kgGTX6e zys-RvTcrXAJMqcUg9s7}=n65IT`N1Pft^31tgOZOz&T9#pTzuqz z{MR2|zv;_|>&IU9`fq*u;rBgr-zN@i6z_V+uYKdUeg8v`oO;<;fBlQ@x$_(U-q(Ni z>%U~Qe`9xd^Vs@9-9Gn2|Kb~d?B{;%@_4+>Q;j3XbpEMR7q8oB=FMzx{EAn-;FrzF+TK3%$Y;x{0vE)N z)t5{Xg(XrH4ed%%4XWzgxl_OWw%0tFBb5qXrYa^Btp$6Z|B-&tf5#K|Pj8i>05Y&$Muhc#-ect3E9etRSltQV@G?5rur~ z2Gf=|ck5ZJL5Qg+N;h!m7t$}9lG=jA6M2j*F%N$Yl|x><+KSv{VIx{;{bMw2!Y zh^+~|(d?#HNzJ?zS?MT_i9`xdlr-za%y3@Bi8_ghzr6G4 z`q7^6hdt89K@_D4teGKV^A9Bntd)o~+D5T5KV~H`IR&q+uQNMGUL=YHSSN->dNr>( zb={n^c@+WkCGK5}axFYXU9Yef>T{6=p1A=jG3B_0QdTJ=QtQ8-0URj+R|z}PH0ZDk zF;!v4Qrp(_+h+V>PB=&HgD#2Q}%7~!Hz^ybr5Ondxw<$up~h)p#v!8UeGO$9Wy&DW#yHu+ll!f3zt;D z@C7(ejmVdkxd9DLqtYt-?(8No;e77O0?%%DYs=f4Fo}XxEW{}$r~^i2rA>S4zRx}Mp^t5!I$epY$VJFp<>2+#y!FCswzR9W?=xD5}W2GCC31i zc>@PlViv@8Kl;nJ|K8)Dd1zm++-t*gUiHemUjD-9F^Q8pY?D%qDvDWMw{19gacAGk z=(@uP`V1Fi;W4eJMB2{h_dod1tw;B-7oK8UK$@oQL65Dvqr+p*zvX&m7nmP=`uzJo z@TtG~*hhc=(;r(ua{Ohl{NlTw_gt06Je32;kt)Pe>tab==7gb?LFVq#pqrGH?2_El zwZWhaZf;N_2mg+ji~6k%k#O|SbLbEOGjHeQ7~u3sa_yKqmx)N zRaEo~C$SYF4|eHTsIuQ_K>hvi`s4#&^};)5TUUCeM;nU+QP%U)8pmwdl! z+o({GQ;3N^$aUSV(wSjW5<8&|Ystvf4lHTuU=_>g|8O90veSdrxTHTxH0 zr^{)+&wJYij6*&S9k|ay%rc#lkV_5&mcoOpKLl5afYN_-@kxtAxAdDG$~PC6gM=hW z>TuH{grFQJXjgNUuasbdSIzFgqA|`={|pY2(-5GEqSeZ|>HPkuPK`q>d|8$~C2Cq} zqO|iE+O}8rdcCq&`m!pNbl&PTHnY&oCB_gcPoBAlxPMT1LR3W6rVVWrRSj@~SeaD` zg^xChTZ}pu@=gh0bwnCnjH=eeOXnIQN8#A^J$i+!*pGVUV3p>Px90T>;h{@=r*?Ml zI(h82{YO`HTFSJD(Hb?A2*Y}wzy>cVfxslpq{)^D34AQe8JJf#ie90OK$UGvr;L*> zMXxT!SKXcgtcGY@49>KB&sVA-J!*~?&BLn7jua`8f{yAkkR#o`=-jtjB+8zu3eC($ zmr}PQ8LH}lpfw>o65Xj8k- zr4F06eNs^zE#=}>!OkJa@B|uf?>gr?zCZ=ed3*kxJFh^MO~r~-Op~sylV@iaIATC~=I@v9qgCnBE4+6)v_lopXVL+1Qjovqo)c zoqTGkij{*Kv!>mSQ}Rr?g94F~Lu%}a z?gms9QI#DN5{~)>nh|wT&2CcHM{%%d*>LCmWI5x+7}{Rg)nynlKuP6k=@a zcDy|u_Ev>k8056IVOak)2aX}Icd8)7dfx6$x9@%Vt7frP=gbobkh6rjtR$@&$6U|q zz+O;>;(?ET=81KjqcoUYL;t)1D~61tV%zxw4embbjXI#dBw$zU$^2 zj;*h?p>|Zp5PHM4D?6K?eC*8ihxQ#`U-i@!MNfid?+ERj83oZDhc<5b>c9IBzTvg+ z`{4cW_|w1o!*~4dM?UuPSG@eCx8HGdKrNcWRCO$>#KMkk`mHT4ixssY=P@GZ{t*fb z(QNn7-t-f%?GNv((sa%3%g z*?7Ioa9X-0HF#1r$16GdOC~@_NbLOE!?EHf^bia0QB{|xbu7zdwH2&N%BnW#A+uX) zhq0-Qm2}>;ZOJ|2l8F_p%uK2(t%xso$FaY5;$0v4^jE*+1=GtHMr9!qpso(F9QEdt z?K@B2@)fUm?q9tBbMvzOhyVBo-u7!hJAUekg4=)kPrl{$7ryAVU-Qq8Uw8B8o;>@D zzxMVQzVt=++zK-n(wT=IH&8Ki(_Ke&HT@^z6_7_y75&U;5Iw{QF;g z{PNzn{ktC?9y#WU{+aWawwv(O&b*wRm&i?B2QJFO&)S*iFm5K(NKqRmLfcMu_S(Ja zyxyB^?rdJZ*zE41jYGI~^gPRC))pJ9cf9b0qvO|ZN|cf~GTLCh3yQ+Ev1Qf}8WmSM z=Lm(&cQ2gZJbPw*{z9{}%j$YXu|gHOH2`o95IC>uoCo_xW|P^@#pmC3^ezAK=T~|X zch1vbFw=RObq-;MDn#rbOMxZjoD#AqMwgJPE{M+zR=ZbT#gV69N|Z;;Vqz$|G=uFM zbXrGC%2TTI>|o9pKo>r)so!-gxbL zj|a}$Ac%7iq9CpjzBr++xo*wl*0i06Ca9FmtG(eh!*c(yT4NbiZp9O%HbfI+P;e^< zQ6{y{qfF{JYh+Gt8p1q;Y1;-BVk(FYbUOmO;7i}Dipue*aI00ZT9w1nmC`ar?+T64 zK~a|5({Q<-pV_Lx14(+lE$RYy(x5!9F5RQYp~0p0uLl;H2@@sdl&ZRS|=eaI#MY z+6H}e@|Rp;k+)uwT$ou~e4kWFx#)*_&I$5pN;_DbWZ6`SaHhQ1jx)_$H&OZ^CGV+; z=1)zrWQg2mA`(1uaFfIfror_-?0=ktJ0&>6A}d#@0``A5)t{*3e1>5)KN_q;cIMLDwpyJ>3A8pNJ_%Q z^T`CM+SL$~vU9}9y=v^tbClrO1uGRG5P{g`s9yncL~RHu%E;q7*l}pveEN~%Tu}m| zL`RM~o6`lFoFXg|(OE6ysn?LeR~{Q|@8yW2v<_5H#u7z@sF|~OXZQ4X-~aJDj_iBv z?A8OPHpLGtq9`0o6p*uSDgi# zKiyXzdf!Nxqb)a9pYy_(J?F(Q9ITEe?RXr<>>ShqED}6ZuCE{>J50iGRvPb!nJ9+n z%ihjpa{qk~?mKk2EUFM2U$9TcD|g$qP(+o6PK? zeBQd!#Td~QkpL1S6GODLYWlt)Mswnpzm`ry*{E1J!_^vyT9$0Tf zESw+LZEtPgd_H@0b24k=iG3@5RYv3lfLw^mo{2+G8V>mK7vK8om)`xiAA9hZe(N2- z|F++}<+=BK@vB~b{dFhn*&YGVn25ZX$igm9vZOmmGuS$iogELQ+PCD#Vv-sl=Y-SA z01%9uXOSVRD_jwDwdy7uw#g>I_06iFrO0_5tQ5BMKDX&ORy0JP@>cexmD((+|^kSx8}U% zo}wrdF?$h(ql@EqWBrDK{P1Vjjvbja&4)kqkuSdYd9QfY7d`&e z>3ZPd+Le`(g7|_qcijJc&qE)(;%|A~x4rn5o6l@bpP9PJ&SjmC$GbaWYqtH&(>v!b zYdxFI=HtCFG$IH>1Lw?DF{|@bIuFExXhftj5<#VDshIbAN1peBgSXroieghm*=dX< z?42VB3!JB-EZg~X|7ZjC{L)iTU3~nJ@ujm=&kFAf<&r##K^t2eY2u513!rdi)ms@2 zn(<_|JGuGV!8x*tmyVe^4gRv~!^}=n zA^@_hLMoPeHc_WbzF`@;cND2+8X;i@qpg(F;Wkr4D$08G8z+;g9aX*vS2`q_5y_6>aA1$VH9^3S@TF1TBCHDOl+%ydB}ji8J|bHQbXj$Nk3a%n-t%Dq4! z)4kM{8J%Ch+ z?a)hLZDWWW?fjAeRYqxG-QOnybVSZq3MX3Cp=m>p9JBKbQV_8t;=*x^;+QnFtbsHF zGsMUelvRVbXDsvi0m6YwZ$8$W^Jo^1ZSKW0m$pB8`uw=1{RdVKjt1+!^6+}mr?#L- zB4uoI9i*#We@?~Oar^kiE2s9Rfy<^^+3@}TN?Gqrz=>xV#tsOu`w@nh`(6T#M z^StPlG$rWa9%y%tY5-d7=M)AcEJy}nY4L7Gy%GpiRA7fFSuU3`Lf%gr6>gC!%25V) z@HxRzS19J0U{eAyIWY}o+A~?eql&Ko9(%CY7^u?^k=qM8g^cVLgiDblULUktRO6c! z#AMB2HCg^{+o$u^aZ)*&(k>F{yniBy(^7+dA$1VZ&CMOqbwH$S3DVhs^b1xI_{3i; zK{N#+IjOj?KFABCs=jcJ$)*t5r%KF^2+H1vG{V)Bx9n>feXJtzgMl{1MTunAHmLb=~xdE(TW3!7Jt96cVRg4MGX z7K*uf+rH+j76O2)Vr%1~?Q^1GAQ55q7cXupdB z9q8=#J8vC_nu;=}m_E@TOa9di1cL;m3}PXTp~vONKKAjIsyA)MU;7WfVeGZF)K1Q~ zdS(Sk;hhsm6fIoAQ3w6i{teZ8KJ?L7yzE8C5A18&n!TGejqiCuadtl4IlFh=f&J@6 zS!rv$J4mAn1k51iHq2dYUUBcu&%fu*Z~y&2`P27)^mm^=eaGE*zw8w+T3;KqVJ-@G zE{Xum3??{G)Q|?_Dy+O$V2;=XKniQYk&=7_Rdz(mP;eTfASqa-R5@kS2_Ugz-6%^3 ze5Dw-_m%f9UOsjIr_Vn2C^mPUqVKp6@zDL`A`$gVasvXh zvk~kuN?;pFYBiPKw^57Ll@r(9aQyZ=_o{NtqzosXM4dHwRtn&v@Y*V5exO%8{P7Q+ zdGLN$PkQS6%0&Gb2qlZJ0+oKa!i;LPqGh?Uf8S{T+S=;cpv1*Tp1kipPZqZvzV6Vz z?aP-|2cv2GCdMc1y1I&a`CXK*{}r=&w7j?ICQuXft0CeN4BRu%-OovS$-TZ#w) zOXMmuT&Xb?)@!%($gI4m2GUBA@mAjbY0q^VkG&+pQaYg-hN`Ls4FXb8b!MauD}lfT z!W?N%aDY-ReyfcKi$a1p5vR>H{ldjau1rxWYd$6&<8*cClLB5^+S=WJbm_2B!aAB_ zn20Heu59fRS!|ZvheC-}Bo3=0F~b%QC4iB_`}_pE@Hb|W9h_t5IE3^{6E~Amgymt% zE^m?J6^kN?6tSthI^cY@nowCDcoyrnt!pk_%#S&ZB1)1xA$yomvSMIBAwozwd$Si& z6iy{35f^d_BE}dbt*esB+4GxQl^{ikh;`_)z(XtxL{N=lbqOYar6e3i>Pc!zdm=z$ zT~}aNa2o}V#rc}bs6;`SA+Z|;LMAXGB2r3lRA5O+5%GmfGZ0deDk=e*#G$Eqe%h+4 z(B5#U-fL(zDVGwMAkD!tz)+_WrxTPTGv>Jh(o}D1MXHPN&x##LRfWMKv2z4A136o0 z+o_%9hNyZ^f*8aVqm6o}ud}vk8(+CkzxVyGzW&BQZ6pvEDgs0@pp}C$yQz-x@v0=E z1UT<);FOAza^;=GXaYefTM<980kz~WUFuGdieD|}ixQx4jy+T9eC2&JuP;A+?$kq% zp8wp#(~FnUgnm)>0Ckv2TduC&{rnf-@x13&t1B&su}&zpkYN!(Qw50`7FFp!y~|HC zIRH_l^i?DH)cp@A^Wj5>V-u=Dr4UE13&D+`OApa8S(7e^p=#%>tG82)q$!nR=0p^A zJ->Wqd)VJ-+M0_kMpN<>}LwRhh6 zr+@Q-ulcf9ulEaz(GkZea3p>Nhx@PW9Ul&F7!62Tr^1ed3PgoCs*o=skajk7`metA zD_?T=oxk?>Kl;S`Kk~>Ur*C`SUC(>|t@}4tVpAJkK*H7mm#GjH6>+KEm2F+tT>G0m zwLvZd6SpyVN2!ilNtmGG%&HPOSe6D%4g!bPBlHPVN3$R^<=}ikvDxZwkdlL=P% zh_L)arxHo144$^?dQiEcE5IRyU@-s?#bLVvV(-I`J^iAaPqgFR!dbS6(KKt`&n`du zNALL6m%r*;H>3XCul)Kkn}=V$eUXHNU78m_DzLiykWpLy^DpR7+mP4n3hT1wOq9hlh%g*XrL zwL%2mkpvNmAQY|)5`{b}R}DvNM-Lsm=H&3e0dZ~zF)#}Cr0P^bDxo#0M^SKWW)+q7 z-p+^q_`R}sd4pmr4Tyqc<({inXi)Z7){5SUd%o;@6h(DljR!q;)hwzT(Dg68_0-c( ze&7Qi``6#|ga6}gKexGgkpe1LgjOV~AX*i7cH)_JN{%o&FCr2Rl+jPdGTJe63t@oy z*Tf7hkho!`%;YU+67uhL5F?|Gh26G^0hBcb3wND^iB3tM-=%v+eowke5wtMni;sU+ ztU&p-)G@Y;i+q-}sk?^cea-tUg$PPO<((?4x8Gt_iK42AF*VW?6^R1J%nm}Hsc=Nz z0|nB15`Yk*0Bw{QHApPHTOF+Qiwbd0+>!w7#XyxV&}!Ck+ruo-K{!T)z^WU&TgkDD zm@JXJ7;oad5J%;RB6??i9ZC&OT9QDqRf1#7Y&e6Y#zSh1NSGL)NRC0yd8ZNcCPV>& zz2|{f=nl8Cs&cqj$*_0R;gtu^&ra>N4_s1LD4yPJgM`XOA!c@NSSuK=ZRUmZ3X`H zf%8QWA)?Edw?Hm|WX++s0;2uOQJ#{zFf%EXrW6!FIv7tm@^_Ak!iCxbRlD-25F)3_ z>l@HLu?rUS$rdpuh;oTKsqwRR{oO7@_n3!6dYybI7MVQHoyC24{} z(;?#&tXuaI%giKRhD=!z0aGaVR}M|)Q>Ex4&OQ9O$@vR(s83}9$rC4(geax&$c|N) zkbo~7wGbkSK~lRhW)%&p>HuqI22m?fPns#QqlDyLh@lQ#IPZwco+HA1I@>&R>B%Ra zI`_z9J7>@7Y{tSKZa_uw+)%9cZ=AU8raNEo{C$THwLt^5bE*}@RHQtjSjz&yo^a~A z1_vh+)fyyGYR##DbAu-?T)cew;;0%`WxtKFKk!8A*#Tlh2uV$K2#bKNG(l3a3$-y` z+1(zLWxv;ts;2BwVi8pdRXKe8(bI!!rDXVzG=#aV3&NXQHAk>dBaysqh3ic8@;vXlU9P>F(#>J&i4~ihwx@8z`p} zpz4T4C6X`^dGA6fP}W+Xy!FOEec!wP-fO?S2lWuuBDR4XnjpTndbXKOH=7gtHuh^B zLgSoQXR0$LX`$>$NwnVCdfqM9{O6x~<1hdAJOB54KK8!9+rQQM<buJC8AC+V{v1Q05e62Oejc1As}WC32fY73dhasMi%u- ztIiEP1@C6+#u6tj<{qLvM-RXxL<-_m9JiigL8zQfA#f#GGDsRxmEat!L~GKL5qpYE zl99Fj=NaOlC`H*rxqoRgCEv4GiYh7C8VnjGY}A=Lt8uck(yI8h^nZ}qX$FS_w$J)b#NjY7dWlKHH8dh_hL3)|<%&4Kl6+Ylj}DEK*F@rHl+ z?f>Y&%D(w{w(pK>@BGr&pV^rY5AQ3Suhs8vZ94c_J(D($hJ)?RE1!MOhaUg*{n)yU zNd2eWJ)nd?ZMd4gA>@oX-JTX`OUQv{;ELIO}^jFq;YooH?Yn6lNT0 zb_n|pt@G+ooC|<2%SlvXefb-{^22}P|Mv$!^X=dDLvQ_0KN9!0MFKg*$mXpRXeC*K zN9O7}+EIBa1F%H$b>LWtxC8v0I+tAqn=|ujoLR^1bpXSdAW6*F5?D(AT%s2#3po}S zlj+>V6Xm~wMXfEmz%uX9jPdi{&Dpo^zB16ucf0uSA}*jMzBFCf;+MOZB|dEVDm??B zs`8rGCoQkF8c794+lRbuG&VA{_e?oL!VR4qKCl&m2D zh>|lXHySS(f#X1wbPo2zGF@)t8FQVO|(R* zqDyn-!!D^WT$fDi@`8Ca*c+U^vbnRAM^x*n1Oh=S$GZ490G4G=uNKQigPF*54YqVj z#6;dXqR7t0(1IN^MeB)4O3rHzx-xy6?t}>1w&}BsQ6RGBkCa+-2oao8Gnw_)*FciQ zPO8itlazq0?#&d@Q7keszMHMAgP>$zh^eI0{7Q0=7>&+O-2m0NbQ@tCnS5&J2@_eQ z4vZv9jzl%8sMRN^N(7M?jj4t%-Le4W+39#viU!Xb)gj}Egj;P-CL6_IK!vh_w(ZoJ zUN$mCIoUMWwB01LTUa}!EP`j>AL?|P#%U`ut!^77jn{U>^R3O{H8H9+5(J=}p0N2Q z>o=(os3}bH4zt~u?5En`JrH??4YXFHiVYUV*m~xGpe*I;{_*w&lCdgWl+S$lV=sQg z>vqvHkw#@w=^XpGUOXhEZx$V8PLJE$_) zF*}B1Dv3%(n9jD(U%YtwnG2_%-n?*jy0smf+9?;r6+xr62(_2t!GpIv=Q+3CecS5( z4f1Xl>#D zuYc_qz2&X%_}HgE^S-A}J^b(!x4rP5n{GS0Ht01WPy~elfSoJZSLB$2Pa$aT_D@i2 zISgVdqjke$IKWXLjjE)!)w32SX{c>Zgvs?(9Ek%;gf)*?a;s=WXCcf5t)LY|;s_@| z4c%)Gf?6YAkSIY30uT1Pp&fb0xe6$%qkzWqo?CxnwuvV%KmX>F7;k%) z7;$BLmwN}k`5%1W_SB75kB+0tVECn9_S#o})oa)G9Xh{rX?r%=o9^vQceYptCk_VU zd59Y4U@aW2t(MdCmp=7p?|%A$hvsL`56Y^HaL`6E*C@S#Utd3V`|Ss=Ilk}MksuhY z3>>*O231ASpf)Yqfv9O3AyU#=48+{T0CokDnp%sc?78jj?YTCCUg=S^)4Hc}|NB2U zJ@eR#1g%wxsaoOTdjH_zP*j0RDt)8u%Ys2s<-oDS!~H9fSiwZ1j9Fl`&Q<+;Uh|dr z7lYsV^AD{IfBt9w-M^SlF7?ZbSYs4+8QP{k2NvSf0t^@u$mzr{z@RE}e=uZ9QZs{@ zArTQ$Vfj*Wz%a)$%BK!OWK7?sytFGo%miW1&UVg8GnnfBCS)yBZsF2h=i(X@*h#O+ z{xD;d^d&9*d-0tPuXJ8CUDDz+(xsTOO0i70CgvdWr!Ur2l#y%QkP(%=O-#~>>;;oz zpv$3VOVO#h^4k;A_$nm9tbrg;u5F`0=S_@B@=JO47K!Stna`UzZfBEOLsV3~;b3KO z^ZsES;yhq`XLkC^c3JtgzCSSPk4A&Ca0F`RVLWfIjO*=r*q%4jMgsX3Mf5|*AP_T^4oWe&L<&mhb?xI40w*y?A}FrfCySUf?N?P$lH|jCDm>bN zE{&T$lmOBgS-bxB26nm2!P(t10bu6~743*MrmlriDt!SKv8{I7i#f@JQV&U0cIRhx z16P4r0MO83DDAGPE^^edbbbu)r|&J1&8vfl{_#Z9o74002ouK~xoSz-({ax2lp%-X^GPFH5(Zj-Dnai(s6H=GsLi z6%tW+O4bjtX%LGM&_!sx~}QaVoL3TZ<&L2QhqRb4ZjroKoSxhu-y zsNKBWxdV&1lbKAk53%Zevgag-<{qpD{xK8y^4UM_%yiSMW+D9N>#4L{idLQ;AKgLly!eREYim z{*S+L1C(WooUmQMXwr^3Xz~yznD!X z=bk>l;`sI#-mc!o$PsDQp|Q>hq>zmjQxKUbE5t~i92I3$)%N(I6AwK6={rvx+dmix zLlN1rh>$Z6%E9|5c6Lv!tgJdGsstw*N!2+5NJOEQtBcLv){&Ls=idBXpLyuiFaP!* zeC%@%Uc9__`oW{u-Ei`{+fMktQ$z?gwKfuc;S}mY#KamLaT=SNDy=E+d_|Okus-B{ zRoM$I5TR^l2zhV~ED>g$M8dt|V`7T|z)+0^MIzoe@Rz5xb5($>zD!Av> zQoz0!LR0oiiK0OY=ZM0zsV`o>;)-%K7^v2jI@Hbm@B6EI^ZXFhHqjRYUk&}*IJ|?T(ZzQC;Lwwrs(+01&Hsy zVF);3oeuP8{lG$9k(HVqQ14!p`Tmp#NH=j+zN2F+uZkdYjF2x#m+!w*7Uert?NR~x zdmSoTj)pRXOo9cZMr!$ERXYQo!9xy*(BX`A~TaxTm*g7q)hvdir7$ zQ5LRlTLI>6q@o0s%nk*sNTd)|K< zs9a8+UKYiwEun?>SB6m{lWW^hDo7z|*kOVly1eV?s(nXLu)ET7>&h5GQBD-BPjx4!U3DQb6OWQNlAmJuzW!W5J*Eyut_$CU6PhR$4&sif_gg3?ky#J5*w|H-IHN?UPTKd z^0PI}N`x2#P^RatsOK|l14)!)i?mg2yhpN{2CBRAsH;q4N=oE=&&I*nGfiPW$EG2% zS#QKf8c^yYmV!SJW6`OMlitE+k9N1FLc)$ES-+HK$h$rd?@kjZaOxtM_W;2;L($;8O4IxTYiDb)awHHbvQB|Tu z1-r7W2E7AEkDk2ghHG!RasR=C>Rm%^txXg5n0*k1r6Cm1=!i9HrZ&>CV(lU#+m-1k z!ckQ9t`xx&&s^Nu-gT~Y+>@y6)H^pCj_Cj8?7stcyN>cu{Fzy6@3(#ZRCUR=EXi__ zB{vMXH^6{#08@;CBm@&kfshcA&_nP|Zn)eK=aSG%FrgY_gRya!xn)&@PYwdS`M}nK*{R~In_m;iaUTfB@XJ($6Nt8ZiHJ5IV1e+j2l^h_Bi}7@} zyFX^~Oa(*xWg!GBqbe*evPN;vKk~@KgTY!Invz(E#EOEdNKj=ZL}(=EG}KTZL)h8d zy!^^zgB35Htul-=f0f0=qY{|OS(t1*9gnBu{%E-<3yG20d3HT2Z@uM{tHb`@?#{J0 z-cU&-=MV!~>WYP{D8(O{SS3{nux^Km8C7^dgY*uqU;N3>eD=++|Jq6>oHV$z!APXY z#SUoH(8w2rnqqX8f(M9-b0jJ%7L5f-472msU$y+7f9Cr?ck9Ey_^a=^_vTNY{PM#O zpLpi8Uih5#BO?tlB1pk=Rggn21ykXD&%1)i zaWoz(K^Y=Z2rcJI048Oqcqc0^`eAWyGWW%x&iD?Z1#y%>Kxfoa(u_3P)UwLV< z&3g%c80#0jP9?ZTv- zYG2F;8SLrN9lA@NQrSf!!Vu)nzX=}bA39V+)HPmJ&h=D361XuP$H72!VC2*=6ZYdFx zWWo5g?J0|FC!|fo#MT-u4lz*bhwS(*k(ObpgkX`EC=X;*0{#wA1|SRcou zMZ8~vxbo|oQ$~!Qb**pwY9Sa zs|tYCscM4&xKyS%^F8b&FA66j#6E3MwE(i&M(%=`Wrq7^f(7#+bX5jGxm6qhFw=Z8 zWjNKEY(26amKMk`G_ypbLbY3sEwGd((I$jQqdDb>9oJP&8UJTnJ!vpAHLUj*M38*l ziEG2HMWSi~DWb#>q*Tv5lg0|+YC5q}02WDV6|k6!XrovlRbdMprn*@Wi42zxWN2F- zC&eE$Id^hQCM6G0UW#%sR5s%(Un5(_(y}h#V4oo5t6)lvPdaFmL%?z>bMY`vcAAQzK zU(6$AS28(vj*yy?Q_34R9il|+M_!w1e`S4TJ{?yl_s=|j`V2XdL}M*Idny!&O;BxA zW0V*f7Qle_@Q(XsZ)s(;zJBP);Ukw^bo8R*8%GZhhkaEJ5<>{Ps3BsNq*Pt70!3|m z0ze?d)*vh$&_tGeYs5iP5HX30YV=%IB9A|QetUOEwdnCk>qwrcAac~}_fl4SiqhwP z!)OgzXi8Lf=XQ4I^Qz&Lyjxpc5$}VQ08(&3 zn9U!){VtiuXWVd|U+GWli9{;cAyZ^pJqI8nGCLN9C^LKKni!O!j+jesn&st<6L+6H zd1~|GV@rw{8J<{0lpH}2p{~DGRfo!Q=$us|GWJStKw||qgrTfX8ih1eH(zn>#eeY2 z|K>gKyZKlD{QY;_{DmhT-+I97> z6yTd-KSqQYRJ4xLXz(nKs7FMqzHmk1opp^SQk9@Wo>;x8I1Qz9el&byf8xu2fPzv_ zokE=gk;KZurLc$Dq6~>j>|=}gK%^{tad$%F`T5hE=Wf5hZsuT%@M&3;JrJ5O6e)b!#6X4Hk701+ z$d%8z{-t00+TA*CO=mk{UX&#fv04$R$aeNqO0*|c#{`0iHFR|jLCMDudPIbvgspSu z#(UcuFc_??4_BjbQ^`p9)Sb6Ka@(x~5mZsQhu*MQS?BeQ;D>=(2#&}Rv%(RkQeAo3 zRpruf76N&vDojP<@^CsNMWZixTF=)nI)3EpXPv9$xBvK-qnAGYN8bKTO||2kQ<2md zP-2o3BD5z07VrpNU6Amxwx4WSwhPZ>`$-_f_QfxnqvN``R6f}=u+C6u0Z25bn`aP~ zzMGxA9pVzGd!Ym9w;j{Lr~o<~k2H*|DeQHat&|xW=$II3mNY?(_HOC1QsCRp(AG=W zMlBYj?w}BKUZaD<&kiuO4{eUvR7f7F1OuV9(-L@HsPc}>C^?%GCEi|=`~fiM+*d~o zScyAfa)bg35-`;ot3F|4P{0w`0HHu$zXK&vBvmHI5Rs_lqN+oT0$DD?(SeZP9M>my z!`Z#*J_&QtWUZ8E!J>evwxFmea^9t*n0g6{5QvpU3b>7xB_?7;6oG|mlQ^|Yk|j3d ztyWS90P!CDlt`c)b;DDk71K}_;Am3?XF5eu8u?zqf@C5qD(qxzpHu~sbdY~(ZtKj;Hx=M z=;Gn>Zb;ixJJA22RJImXQUD7b(S{51zeGg)F1}DelT>>$!st}2eoLVBH zz%c_+H84BPxl2$joJ(Hl^j#K-1P21S)I)v&@!NV8q#A>z1}-8xwu>xP)SxynpN`wn z3dm=3(vCKRNg|P$B}(#_x6~D=LR1s`F2;z`QAP=M)fgqgsQgfM%t4}kmAbxnQ#{#2 zkqbPg4I4$QzF21=GKioEbinOi(6)ix!CIHm?* zP}Hh|0oOO+@LJj&AhV zR|f0L{pDeQX)s(_T3TKydgWj^DElSBkpmHe#;9S2IIs2rFu}1i``(D}nr8z!UX;%v zIOC--8%4wuB`&q9k`R%D3z1KrIlsHR4|OGtM5u|ebe8YM{a(+zLWLZAsCi+N79nV^ z{74KAO|!MLO~gIdiz1eB;@COQs=`S9ycpQs-PzmQ8!oNJ&=C0uX{yQ6pg$^l_3nIp zZuj(~XJaGN$uy{}92zbiULxo;V*l{!@k`gD=jm*$QGG!%M#n`I5slt)Q#W_tdw+jv zc+ufw%Ib&^72c8Rh>ANt|9RKMI>r~j@~bAzlq~~Gm0`W*O_Y-#f{;#fOGi;6kW*66 z5*0;RkaKH?F8pk!KlMml~;>4*Np8N9Gy|@_mLI`ZRHEaobR!f5j!scos zbrH-Yh{{|yS{8%HC-c&k>&z}2+L5fRq$06;Tg(Q6W+km4ii(VBG;srw-1$US2^bI& zm6S2YPMEkPfC)ZjJppX>tg>Ap8X$1&tk1C_A!cU50L{g#gU6?HSUoa3?I5J7lb9wN zTC2l^iA17v6jaOM%Dk!1?e47(N4|8VEEH7TGzbRk50A(5u=UK|k)7Cw>x(v*Ty@no zS3mQMpZ`pK`Y{moiOT|n=!Qj8&!C7ZGMkW{!OqR1&e_M_;Koe#i{^wyWZyt7Tj z?2Cf?h(Zvjoa(F@X%5WE*j5LIfLViTsON*S2T>}@z0K|O=g%}vLqvn6W#8`w)hY-H zQ;@qp^Qqa%hu32r>p-qVf2mwQPQzi%WmG1W0^}r=&XdZto*%#Rl45N*twOD_aE_dB zLLdvcz!L~01a3s&i%I0;H(dYdmmgkPzx3z-<1fGJrO$oN)knRn%uLh7&d(Hugg7-j z0v9Jc@{ejhffs)sfC~#J>*5P7=%nnqOa~by*Jc-JC1t<3lqMUv1;n&CsM7gzAu&l8 zA4K;jBXx8Kj0>>|iE3$;<24)9OEq|{$+pE+GLXL#p1Ob8|cCN?)(yB6k9j+$02p$KJTTT=|y zfrk?JMv@)MAhni{st7IukV{KGdaP`YEp5*9+UyG&;;2^Yp3RADP{V3%YnuC1 zrBPK#BZ)ZCK6um{syZgeV95*D+Kqg(1G@(RX6kL=Vo9ul|@gGalO$Gyz zC#`n3`=W5!9M9V|=~ZiOZO;7^KF#NaO)^W$9L~l?ZfHj4mF{^C)zlRpHb<-?fqcIh zu4}#D1T8$>{)vxY^`aYn$SP3kbm1-zy7=4`i-Bx`Ln4c%2c#Kb5W%rC|BNfRD2u_;>dDiOoP6ZO(c?#|P&sk|P%|tbL{dlHZ)mM> z60DZL#RN%Jh!91Lbtg&pMAaCTpfsQEtQ5U}`%k~^l`nqwzx@xt_0VTOHQ7A*HQ)NC z<+Z^yMD;~ujvi8gp{yJfR=bH9B$3E*69W-~sJh{!d;4yExU8`+jbo?kMbxns9cLvA z&t)885u)rD)PtHnYxRY{CP%o*h(St}2nNZGN(&DFl6GcTaesA`d1$HJkCY6S=8{qG z%($MD&kR1IWN_QTpLDU3B_x5Iiy=7YVvJ0sbFwv``Nk~``pn)z5LpG$4^CFoa&Jn$ zm~HR7X0EY*=1niS>^ax%Y(4hGLyw$&=)`pETr-^_hF-r%!ZAd!ih!J_emOdN^!n#L z`|2BSdVIXU=ZR2M0||$(A3>0#kY_LL?Hxz!!dbaQcZe=g*$o+uI%% zgTrfwF)VzqoCQ>|3PDRq+G~5?y7!FROs)}bv)&@z0*umm~Otm&F-uvFQFSzNxzxwM-FTd=c{P0hI_^*Fo zKc< zNV|hczW)U>I|$v=S^iXb8;e6fBfC6?gI}QRaYg&2IdssG`8=%l6P>3v&!ncx$oVN# zI%7KqKJcwBv;@$Z~O78P0JK(#2h}{gwy4z(0!A zaVlSIk^4Xd*B)5y%rngM0)jX|K`uSMaGdsle!o0)Y;X;&Y|q2EiTl$~1#Kb%Vi0Yj zh-yp@6(+!|7M>YgdMu{zd*ihGV93Nbk6MI*BCw9>U;o^&HB*^*)?fhsO{Wfs-3 z(4dgMHd#94;M}GK>Bu5=BqO`e3C$M z6s$%&1YjacwaK$nqGhx>0s{?rJ1E$J#OfigmFlIoHu5my`of0D+sa`7!p^kEZDTbp z<#m;q z5XJgcih@;`Ik~2?WVgAsIl9KUXHR*w@s92d@Zy>X2 zD?E9{S)$~Ar(mLLGNweP&3rpb3S4apQb;Fq-YLmQGR2UUoI*u~*pV73E=m-yiYU@d zeSgK3T!-kG0Ey&>YlkP}(^St`WU_hs@%tZGzy7*hRsj-}U34^5h_b zGK*(x<*U{~mom|ht^YC+ITr(}5ca2g^Lgcb;i(j*2q98vWH3=2lm%P&@RXQN4?Oy) zx*{?nlp9^^71i18+dlJ!IG%awk7z`NLgt~ad=QZuP|@h(lr;hlJ9}Sx|KHs4iH~1# z(~Zx2@$(03OYT90= z+_SSiSGw4w$|#l+A<21=&tD|Go?T;VF%ipQS8&lQ$YFJ~`iW0}>^r~xdz$^4p+v5c zKx~!2qA<+`^B6rtm60oQ5Fi4yJ(x2!!h8cw1MdorI^I0@k{hmi*RTBRfAX*Y^WFE{ z_h-NT```Y3Z|(J#rXjL7$ET9TD-_TGDu_6UC^H~TUNjPG6rfnTe{1^m^_3&+G|o#n zM{X_wj;z*_?HV=Leo~>SV@dWN>LOZt@JI6Aw(7X%VQG)7v>DZ$38o7LWNqM5idnK< z&5(z9roJ}ENBy(2sul>j1gMmp59F4YOynevrLcYB=ctU`IaEJJ3IEn-(kRLS-fR*nY6{;(>p$*p00b*Sl@<>e0E+guCT+yV{DPg2wMIuC zYwPUPcC2J4bw=6kxLda5?1-FzEx4QQ3(KaoMjzIa zQq5%}LLw?I7MG8>nJ|0O!aTDHKjvcf2c99XEn1`t)UMnLQ*jJ%NwUN>aw{C|E=LB) zxnZrL%q-WfzgfxoUOse@BVAc`V@h*|c~>+WOsxyV?m^_7R}CpfcK~%OREZ@4Aj*m; z1)sa7imFm{ezUGIFp*Y>4t*?i&e?crpCdo&BARvp{a+|^>7|a9o-Ks*8v$B1O;tBV zndecAADiaJwH8H=1SEHmDiofJ-RXFFt(O}3pgl>o@OHjf0MT4c!es3+S&he%%(W!1 z+>StE8o4>b+K@!6IiU4yX4h^fAa9{mxj26k8KigTNMUR-1EwMl*25<%X>4LL;y}b~ zg=@_qPcvx;tirPM^4>`%fX0|xVr9CHF3f`T3X+pgMO^lzkhUKng|z0eYD}zeOXy7z zSIHY1WSy-5O_2xE2#`h%iIA4k2Nq(ZAm8s-1WlcZ)8^CEaZ;24Wm1XNOzSxpeI~?& z6JTSr#Z;(sUMOlx9&Q)P9@;nyS@aYsrAaBtjN{leu@3AD#{`OrTIELNaH9!lLX3Uq zzx2_Me*LqawbRsaJ}svtb1rkM0D^azIW0&Ls^+STR(|g{fAJ6g=r4c$_x?=5;xL}> zY~DBd;DaZRTzmC1o`1vgMTd*QU|!WlStw){D(~3}?KDx!!u!HGVu?+R(J{eUUv5={ zdD%^yiGZBlGU?zK5tv~_T-SJPdvkMp2a!GZI65X#>m%z(l^iiUwPasqFuTyi7#nYl zAjeD~My#Zf*wi5gQ6cY!YCNE<+MqG2F0YJ;QbkIU0L7Wj&2u|DOQUrOy51}5o$Wh5 zdb_Ke<=#@E!w>=>+SC$fkeWnUo6yuzgJ`8i0qzAM4^QLjp<6!x5(dbdflJoiSp?+ZH3l%6Aif+tvOCu0;gSB5&L>dyt_TX|bToH24lF|+u=>Xx zMAWhnI>!(|R)(l^w9_IM)o#3$jbuli)$2%+D+Yt%x-^sxKM!&+JboQaJA; z5Sb*30}&*JLPmlUxqtkyCvri2p=GZS(5W+Lb{;$JT~YLkUg;dbLgdsF zE8tt`Dx^?Ld}mQ+a*pRAZtd@$J$rsKp7qQAV6e1yc+GoisxYagmRcQ2(>RGe^)lJL z_ltK_=T8rVpkjci*DDXN)6#nFN;4igm5^3q4bZ?^9A9_GHv$uYzJNuYCTmqgJAdcfzVW|?`7YFI@e&ac$ZGIm5pbkT zF>ft`1^#ZOV}bly=E^~^kYA+E2RaBm`}kWa>@WygYvdp&CL?=7zVn6mO-FK$Bs|&W zzxa2tFBWin@v!;Ngsrp%=oyM1{Cd~iI53|4eh!eM>!!0QXsJxPn6s?xFSIG1>PORq zE+%Dh*Y@stY8DUNs>l3(XIAq^DJjoPz@XM@TDU;F*I!sI3AIRmXr%8XKelHU)kGpv zgC(hT4q7qGF1Ur)|+LaNJGSIoDBuL-KNoDVXSl}^jU}23#;83i7kcf7fLfjDXaC#Kla?5 zA#xg?YA%7PYHp_atf{Mp${e(_q9M+9wsOulOoC4=BAf}~Ol~rn(8dPLHExbP0u;_W z1KE;ne-cG1htHf1jK%V$ubYE6MoKQ{Y@20!#pc3+nyR)Ko)mP|1rde1@}lfu15RcTFGgx%jF{L#>G3u1wH&u;RfI(}TWL3HFuGdGOfLcX{%8jB zDXM@pU4(37sJTK|G*&YjuG)b^1Tb4!#kNU|bIw*-EuxsI2NrEns48p9BNleHD{Ua` z*oUwmX8XRsE=laH#5@nykItu?EHekU{piW9M^E)HKQgn>6`(P&qb&bvYP^>~1SJRN zVP9u^C%^fPFMZS3z2e`$WOkuGmu)tYB3C0x+041?oH2c z?QZXnnaaWsBnp%iK@?0*6)MV(l_7w@8M7@mK?q6`0)bNPcvVQ^tg}l=8`0ohaz|Q~ zGe^T=kF{cO&>*7Y$>hO@9$gu&tri2_pFi}4+ooquEtgBq4RzkcFlAM4Kyeb9$$qup z8}=@`=;&3KU$Hdmv&xAlwjMfh_WZeXpnk7c6yAG3Jb&-0)AyYzmPh6CaM16EYHo-|N=j5KO`@)|WxKF74RL7880TB&6Tk#V zBUFW$iG5X7mmVAa{7-%V_rCpSH}8M+miPYU8{YEf?PeYo$_`!?;^EZlIxqkwAttXz zN`VuNj?gqDu6SrNN3nFQ==m^rN+1Lg=QxEttX_mIXREI}`T}i`WTE59PM22gDq448 zR$s_`s+3in@R?&?oFb~8y~Wo=)UhLl#`@xw!R9n<)iadCD8wwe#Bb6-#1IWxPYG*V zA&6Kh5-B5U3>sXm1Qv?BVS3F?&wBUozUz|FrQ7@Cfsd1ukG}6We*N&3SA6B`USF)P zpV`^vf!Bf>iR?sU2;-_OduvAz`NE~N=_r&6r3n**U5E{!(!|mgoxwW;o zy9)?AKkP4UtR7ZqfHon{svxA1qV*>9Br=(tdhp?$NA4d59#xHtWuzVrmy3-x8IFQ; zAm%9E6Du?dh!s8%4Uet&j;u!ZfH-9nR}zKOr~tDs%N}&8*Y}=76CkmIHtK|;a?@yW z^l48!dFvNS^dEfW+#?U4z4YP{v~HvR2{9jV_#JSEUx5B8MThmt5r7MD>OtJUz}5?p zz3|YPi=m||d!6p}Tfy%Bdr&vDERl5U1EvEyV_)p;gA;V& zX9?y+N@&Dhl#W5({zC^t7zdsO-APV(OVheh`vK%L+x|YV5be|>^AqyqXM}XYqIG_w z16D(KDGw?O9GI%b{gSQFjx3L!tjSJ7KMQ|9lJ6$7YPyp`oo6POl#4G1jG{;qqC!^1 zJL5v+r(Qf;2Y}niBKy7QqB^KL#WIViC>Oa4C}FWWHW`%8fb1FrQcQ|0is>AAj}X%l zqnd11O#sdg2uZ>~nZKTTtQwSK=15l7d10YJb4H0hU803_wiPXueA+?GyH!-`8E=t* zLc%huQD(BT1zP!UDMSQ)k`x^jls0iF&&|U0w2DMdLq-=+fEJMxCCaWSWc{<4Od zQ)rsl2pj`33j{&oT&@(uj9e&c!5%brb-Tb>Y!m3t<^OY3JkMJe5C+A%v7&ZHn@JW@ z>z**mK2rgnm3=xeXh8Up=wJZ?p7@H8CBPTHuJ2mMgQb{!#vx}cJ ziYES2dKL?PWC?9^WRn-0j3R}0o(X`t(y4{_MnlZ*fJ|gCKbHY_V&-JQYI0O$6=U&O zQ6tmk4I%_T>_=py3zACK=6+tV92F5ynCYcDv6&`HXsR5_GV=f6N!phWLeyk zXHu2L8X;R|GJ%vxl^uBs6!sjJg#i_)6QM}pa;fOAV;Uq#Pvy3cee9Lr^PO{UtaEd! z-IYu-3x$w(>=dLLJp-a;!7Nin_47aR!{6|AU;8uv$1ewH)sRkWs@3`4d^|l@Ki05< z9Lj=+{bDd2t*snAdhCkJF5Nh?v9z)zK|rb+>bh}6#10BV>PE(n0Ivq4NP{$`bA)2n zgcFaS+1c3*kqEuQjSwM00g4it9cwy+h!Hh1I5i7H^j2lx+Hxh)O>{Jqeo{+0HvXozz2LR4fBEH?9`~R@32iE^f`a;GxxKmjfscIdBRAjt;K}pet(2pcURmnA#$-N; z&E(Kxrud+c=*_%>t67@7k%YRgXeSeUGx#7f>;5^PL-kt%5wm)B7#LlnV76K zGStG_Dq_GrLZU>8+VA&ws#yA^Qzsw4@!3yfqEx9`z{I9|L@^hwl^n>WbG2==L2Wj$ zojD>xOcKTF`T(jbu0S=}yXw&D4}SMI{ik>S;g|2Y{ef$qdGT|vtu@3L;D{K}%HElu zPy;1yXkvCToJb@_jH=#0vbSGuEU%Mt(=e#yQWD1lS-G3dliQEveMCvuYkSlXkh+1V zZEdPGS3&{9!g=ZJLxyQN-2(X-%2aoR@SQVm}d3zpg(@(#Gn7_uO7el z+84d%RZY*&RpD4PF!u+}cDObnI(8s+1(Vov3qv);UO~NHpV^Ja(h(&_I_y%t81Y@jO<91 z73^6wny=fHFz|v47f(P3PVRbkDuJ$+?t#{JK3N3vVY{*;p5jm zb9B)advPvK6tZ#rFf)fR_uhT%lVAAGZ+ktYHZ@F(>Mwb*x{xugexiSL(0NkiUG)Ey zSo|PrUf^U+r>=HBdEj3)SlEdVU;z=H0>NMKqlY$}-)@`s z&rVbX8GO@0?)2iwPCF`_1$lcdJl@?&>fAU3qt0WuE72YA!LfFp+Kx%&o!(vCCz)mW z_k+)mCoST^OSIpnf09IOcCk>4sjUa!e{<^WCI1 zY?CL5Qjot5urOyK0SL?rD`?ZA{Diq}Zz#YE1>D+WgbY9xsr1WCGzDKFs_-JqW@IdE zqs|lBraNHX=>ed>_@FKpGp(7aD6``@HWHdRo6fORCNh_qAi22}AqUPEf=>z{%PT$Sj=8x9;q^Eq-tIv*JYiK=ScY)om&D()vqZ>30VzYLzx+(3FWIoA|Pfw ztL6||K7Tus1r>=+4OMV1w_qDT+gf>FP~Mx#j!1`ms%m8xB^gC0i$h|aS@byZdnw26 zR2A@LUzt-~#N^Ynh?Wv1>}9J_?~j*Mr3LOFLaG~()C8x4zlAXir(~k%C|h$eVrT$) z5haBur{vhXP>;24xL26{;heBS;D#GV$Fog};z=IA?~du2bMDBYhHFv+b5OX}m8+@> zZ_DP0taPRoNbPyo)LS<`_wwKT)nE7*|LW%-dU#XG&l{c1;xnHA{L7yEOevWLeb?(z zfwJruo@cXpL{O4>J$1~KI+r{1ADA{EI3kIn!T^Cm&bbIWy}5n%{PuKKJ1Pq5dx9t= zHVlR^F-fZOn*OICm#AhMr766n3yLsV!umpy#fTKL)D%fclve=|V_@iL*zflo6j6<{ z&K5> ze)ZFz@vN&yt4rc!66XPm0vc`Si8U%$AXO8~+KXUylgLinJjggs~pwYQ6@6E4X8Li5c zC5R|d?xL9WdFt`jvL2J}SU7yUyF3BA#VFbn!457gg2y0ahIAWOMGH~Vk<6{91PbSv zBy4!+2fZ`neeMq{5vZzg3ZuXYMS-asFeyPuDA$EBPX-f6l>rC|JhtlDvtRSlatRjoFhe} z@%-8CbLSqJ&1S?r7z}#7;b6E*-UT2=1f%f<6>Xe4ug)u|3NoGVojbkx*rWCKrVr95 z6yj9H6=efotZ!gtRmz?cI7*TBAgqU4;R|9e`rPX~*Mxd+5(lm<1_VW8r5~c-o$NmH z$f<`PttR_Dss;tt$%l$3yQgov|IQ=NyYU$>dEsWGjItaKhN~;pnN9EM=Fi^to!|NO z98-#Vf=U)KYhl>}XOmjtkp)tx?y|NY?x3OzU?e&(9zar^|33MPSm2QVjUPRD33}37 z`E?WN#o!ml#)Wtv8IW|Ys2#|ZzliSpMvJj~i21TuMM25+#pF_E4bXzBoEX4Q8hhsf zI(KZ>s0;b?a2M2+?w7lv0%|qFlQ6z^U|st|3#VZBKHX0&rlS4xf(d+zr%HJLLQ{m2 zL>`#s?zOU~lL$&g-m!NS8nvw*%z_3Y7)>w@soj&0Da`Fp0_{evUk|>DiL7 z852B)hO)t&QAXCx9m_QB?3nBHbXL)h(-ekkMKl`_s*+o^X}h{)`Pv#yv>2({B;bs5k032GKg zgsD>y08wS%3*;Cat2y_ES>=c*AVuNVxwit@Rf%ri-2RD=-}L6cH?~-uz^Cp9DNiy2 zo>HPis)UkSX@{otzN#myefOLH&pUqTU;NZ<_nmhr_s09@wl|-5(b4^;sSB#1P-&Ve zYAL*N{#{GBRVWchR#vBgkOEO51bE^)#=ZUdnXS$7{*0vXT=sRSNZs8T%*;tDqI&Oz zLR4#_$lfu7ymwV-dWBa+g|oyAF#|x9lR2dp)6~SZAYz0N!B7#2G8*=V!;%o$aT7ue z`p|ukUP+8C^4~!M#g@SzJq6LvMN4B-qgG=)^)?yQH01@^)4bcDho#lR0jpU z^(}wzmww}2yXV6lx8CvW7vH!&pTe`ZSTkA7%F=gCR|3jbGl2kt7f~W;h!e!e$JJms z^l@UP2VBc{N=FXzfx!#sh9PMis%dGH%+x|GZEs5Iqt%AV2axbndn~qUCOb6%wf|aU zFLDmT6se#nLaU_xmEno;jC@at)q~X7Tf(VMnWWgaTFWup$DB5&Jyq(5qP|~l%IuOC zT=UPK^Y1?QSATQsEuTlAzIXMs9ux)b?tk=;-~F<0e)H<;N)<&}iJV3-6N0pj9Ga%t z+n?_3kN5Y+b!>`$Ip~iz`lF=ER3(Zup;3__OzI?-!io^4`_25}K%#YJR^4sO}`Gq>M0+1|hIwXb%=qSCl}@!`i$pY9VLe)P18 zbp=(l1qL)J?$(i?&sANVj`^&lWISue4DAuCEkf=9&~(1GpY6c(MbMzdc%47df}g(w z*&oFB7yjG*aAz2uw-QC517j|@B@SMzV-zI0Ztb20?1r|zu@_`c0LFV!0v26ED4!<> zaX7j^ofle5y&Ga^(JkSiKN9p5Q_)s`$|&l|XuCU0oeN$F{pm?>@3y&>a=qXZEZv&Unm8@N*t;xLs)giQ!0`16e7OB!B74%^Cc;YtT#F`(6Td5!NGE}k(ddo5%?HeGQ$@764FEF$2K}r(k_|<4K>Ue}Al?-uS`3LY3C}R7<@+f* zQ+nVL4LXM=XvwhjHmm8g2$=&$NoTfF*9)1;8^|8UfySF#Bv;hU9PCAjh&5_5RFztD z-I&Q;@v;V{wp)qFT4JCr+t67LXsdNQ&JEGJuIwHXC3$&3t@AH!y~GSy7$4~oEP78F z05cOIrm`aWD~7JJ%LDD#733WkJ#8u`6@xyO#GlC#R@9Kdv92J|3eZ?8TGA7o@GX&& zchZDpwzWzn%`*roK43GEH9CnZIY;c2In1m6l0=tGLrwV;MQ{E1q#pZN^|*NG^Pj)r zRj<+Yek2D+h?1)Q+1>`cO72o-Og*6}Vl|Sya~?5-^S}PfKl>fu_pk1MU~9QQJbC}U zw|(}=H7|L=ys4=0#GV-p52zz1L{4cmDHcW%OhS%GA>e6^o$+*Yb89}YHNsO-^0KOs zq%I5q9D4#{5a(IddWK0$O0&S#7W!{~L z&a2vaQb^r|!JxOa+$RW;kD-Z?&p)xfdGf5E>DH+y`XFM8AuvR$ieq%W=FEKO2Y=?L zk6n56w#ObNb)FfG^YDl>uEWM)xYXY@N`YrV3C@3~01! z+zvdS?7!g+FZzxD^+$V=KlP!HzxZV@oC#H;fQu4{tyVsXsv`zCgy@-7l)TkFAb_F4 zLAlYrX0|EKv858RVY1d1hM}d^g4u3H3*1v)lo?JY9fWA`B^dy12lIB58l=*Nagc-B z8DS*DOf$#9db?OyEBj{1aqLrb*-~+OI-j9nSBMHTi9`aCvSOiMB0y~MH*uDr3hBeBo1n{n3H22RlWv>#22b7_W zhB%wmv)ODmnKpIfoO4CFva#w4FF+KH5CvkBEOZa)sW@q-dz10b?qqX&zP}eI`%=wa zP$$|`lGreL0B{b}lVaeOhvo80>=(*rVG)yYah-Z1V#jRNAsViy0he5N`O~jBe&*g2 z4}Shu9`6@!rq#UKpA;GgO#Q;wBD3kZ2`awf8E+g~_vEKlSfV(7^ub%-H-G7y-_+-& zl7}krWp8tP78>-)S>Ly|#r*~D_6wY_2M}RCR{u6cco0)A&|2%F>)HTVyoIiXU}q2= zxa?Ejt8?&lfJ_(H=)tcaz}FpCjU9OxUZQiYjF>bZ@SI{`oxzKw6eBSggrPhY$JRN> z3MZuQ>-q9b2l!J5AM{BOWdXkqK1Fv16o2c~Wt`LwK=WSJ)|z^%JKG6+fB>UUS_S0Q z?D!V&q@Y5cM(r9<$WzS09PkU_>tuPhUt07EXfH@ylbc5< zJ7^qv)$5N2Ghu-#C4=vFv#GXRhKwwkON-+gDc(fF&|iub_LKHL+$N5Q9`JB zpOl?*E_;-TB@^6{2LB{xQO5VS@(?slXp81&9Bt%^i>%Jx_u zX0ljvwzZ~V5kZ@#CX}RVf%NvFTNhgP-g0W`W!o-^yMjmr0G~hk_|-RDuT6xL*<_DJ z859;9BD){RWP`I^rY0i!y2(V6rtxN6B`Y`?#f$Z^t)G)R@XG!8-8Q8kNNA;F1+9BGza|u#&dsoZ0|0 zC7(hhBIm6C9|H&)xFFHkr*esVyN{nfb>F>P=bkuxfV~q3qzFY6c_G~(9N>K))G$iT#^L^~ic7N;_ ze!3d)W8)`Eb{eS)(abu6D~n=2uP~iCjwOS^{lc>{fz-KK2$gCRxdA{f!nz+@cNn#* zL@}{_1e_Q;$>vMD+C>#62NELY=#&T$r=*BBQI?D^3}R;KRYAtnxpVB9s@WVs)5JqZ z*Fp@o?A9$;j0~rtBxXV#c^;@oRIoZk5x^Bz02`zV%R?X`sW30#IJu%&i6ur+hVu+s z8~A5mea$EDd~|&7?Bn-5xN^ls4Iq%h`=HTkY5CNZ8GSCIG^|c%b9RXlFOF{r)SM>Q?c&{6>`*o*>a@>pi~bz?LiY_gJG!xglLR~ zFIjpFQBXq~2J-CJe&vlX|BAo-!~gZ*7w+9C%Kh`>L+dN=|J`@J>f67m7%uJ3rcfpc z5Yr3e$>$6cH3rM6r1^HSYaD zl!y!RrR$IU$}0N(=skHRZAiqiV?ddi37$N=UWC-KEW{6r-cYW1#-Y)uyz#4UxasOE z|KLCV*O8B*9`~W8HnZtuV}1E`uXz3&zV6k>jvgyYfA?Jv{KsGZmB+`E-f$z#rd}|4 z;;{!l`I%?E;D)A}(V#z%!k(BLl0;J{SlL#})?Yr@I>&tO6L;X}K%ihj=*Y)pK0aF4 zROi51#O^z>g~jzRG%OBqS}y!)G2;cGJ>%d7)a#fT1_WBCSBntySxlWVcJ7pq7Fx(W z5fsr%#W9#Dbz{t)om9%oIknD2sxirLZ0%@$@&VrdyZC1@$rkp<86^lN)7B= zN^4%7&c!;zXt9JX010>&1xzG5D%c@V+x4mYje}+nvYJ~!8uR1Zny^<1N&eGtI*i-y z+@?n}a;p8sAXc^v;B1_0_de}}EoN!~*IQpT5;$t0#-SutsEiyER_;7k`(U&{;R{}Q zyWf$dPcvKt4vLxSXtt*C?SdgiV-|N)ZQZE{rxTgtMNCvTp?yL@Lg3_xnKTuC!h%PI z1G3u%$L4xd6>W2cvnY4YD$NEaLWtgaQJaZiU*uFMLPT0_EGX{_i428`BZ?9Uj*0i4 zIP<_4zOZ`9WyNq4RaHbq=lo9B&W5;JQiYic=|+_HSDv8OGPL77Z`o`asj7jzzNScxksv4? z-`U@t9xH}8n{a<1Vk$JXvQ7quDm10SYYuV{Y?mpJOQV20p)dkqXxKSV@Qyr zqQ?4(|MA~`_N{OGQ8(w!oxP9!`TJk-mN!x1$XWAZFhfF97VOwL@0&=o5YC_9+uGfm zPUk^g!DWG73G>hg)lQpsWk(z(a*E4v3J+Nh0Yf29d1JIR+1$GGOP>x~+fIwMa&`aw zx$Vc#^e($ZF((lV#aU%n=h+ILkaMU*K`f!3?eEjDP+$787!C#nd&fkIx~g4+oB!%& znT4VjnbqXDi4BvDRvEH8-~9(a^nF^yrkOFhP=laEF0+nMsS+1pVxpnx*BD zibQpx5m8xNT|x{@Btp&-$fAOnm_yKly|CYHg75hPTC#YBwMUjzLSLbdi7Ks#RMitm zH6&$5^P5{cyW?8byFNQn@FN-zt&DEG^3ruuZl;b9M427PLfa6iBeGsFnj?-5=2Ky9 z^`j&h#Dun?JKEzkG4{AUlGEPE(M{yAX^I0RH;3`ooQPOMYbGe1LcKJ{2fpv(*~zr* z_ZtOLeNiPibE$$-J-FP&9MqP{AaYC+#V1fjOwKdaG@oJqb>I7~Hy{1PXaDd$8^c5O z_Pki?|IHu1`zycUjY}JA=Xb|-s3Mr1FPty5bmR)P9vh*lV>6jnyZh7K-D+=lva{XH zCa42qbbJ)cRq;%TeLt~#{$=!ssB`{HK1XaCP%_?KVzwXYtQj8HRa zT}_^G(G73;=HLC@KX~7d|J47rym5&eE@9FpR%r@Hn0cE6FXg@bTEqyGa=^3E+hEN+>Q09vD$1U92{?pZgcdw-EXcN`R6#ZOvt%-Fzh;PQB1Bf5 z4`dfy7&S@XP}UX3zDv~^4;*~D-JU#Qg1ajd2o z3_(`m#u2GVL~uoatws;1ATr(MZ|*iAoiKAmrg9Qk}e`@4egXv zqhl{I99kXx+)w`KKl#z0T`mrtd-##he&{1FdE@IF$ErlkMZu1BJe!X9=jXO}#>rriev9>$0!LzJbT9y6%r4RR;#_qUANq_cm9ci>lYXZ zxT-71{>xv!^VydjtCh2^SLc`<#VG6?sZyhBqvZ$hyswVawe<}@=m%(j&?^geE;9LM zJ|FtgU;gR)bs9Xhp3FQujSaI^W(FvVYO%Jw@$^g1&GxJmsl|*G#JM!Rs)8I8!JdLy zQNS8b%Oc9wI#Vy+uz*oFO6mzbJb7=0O1hA#`20U z^pOW2`@&s!pFMk4MXG?M{z@@i>Gg+8Jq-IL4c+N8XV08|>}Ah?&eKPuSWTHI#Kw7! zK?-)nh|&OT#87Jj9V8;9g8-WAL}*ei%$e&)EU8b9b;XUGdl05Yvz7(fnS&NFBxAy& zz+iSw4D6g*jFt#cFL9%Aex*FMw@1C9V^CBf7As4iBZvY?rSp)FLI8k}3Pq#-TA?8G z4ft}fJFULr^{>9<_@Vdy#vhN0LA^68=k)R4f6qnNU31a3*DtLugD6xnOsm;=ceXdF zc6VmGyR)6$W;%)0oFs4*uj-V0fCM`d6kyR{$>q)!00}$tC3-#fz8oz1L0`%u_+m~F zVnlI;bK*&z5{XK`S6EWjbXrM|Rxe)bFAbw$z6oEB;!LUMYQ_GzSwD8!X*ObEC2r6fBe=*CoAiRCzEFX>=XS$ zMgte8yDxj`3mt39PRYo!i@UOKRf$rx z^i@R%=q`k&^Jji2bH%pw_b58AV{FAFrAjV%FxIE`Nzc^EMH-3_&0{3;fEJ8`+C0&2 z=D;G+qBUsJ2$N4aB_<|QmAXk*9nfdTx=FKkE|?SoRK-KgH^lk z$q7KM3DlZ5`3Y1R973=_g4K?(_p=GgBFb=v)WA07X@3BiKxe<3!D+jHA)E?h>=?ps zJr_yy5RzI`gb)k!{HLePDu*a3{@j=tN&NEN%$J|i1He#@;Avfr$MsN`FWV5$nKw_1 zhlN->)@Z)QG@Gi(^e>edYO@Y3wSzcyipcr1SqoB@lNcZfO)Lw;)TCxyNV1=@;jmC_ zlKP^uXiQC_?KEY!Dafhu+Fpp6RdS;>1vw%?R202_CGB@eHMZxAqvY)X$N^zCDMXZ! zVnl|Dh*Da=3Og26m+Gk~tn3feq*yxW-9}JIZarB~@0Ui#AO|Izn; z^MCox_l$~_Q+MBg=Go7tmG%9)na}5Y(`hrGt8<0xIVv2No+F9bCPL~YEs-;hQxtJj zFl!^VbIj~P#Ed4!lEL0r6r;-8u-gsA924Otq}Sk*nHIao=+ zg#4X{blV(BC^6)Txb zC^0pDNhvk$;bQSclTi@Vs8iNPB|#n%5IBm|O+DG0yFs6c2-@%aD4-~_X*2ZVoofWl ztRh4Z)gTD=zz9L8(h{y;)lJbamozk?A{Os_0EnEq*i=-VX-*5;q<)vgDjMTF9^P0v zvOe0a8VT-?e&>(A3`#Sm`%&|A7yG>fT50-8gdWnrB}7f)~BSQ&TMW zG`i?}abDG%XSdF7?eFdndwzds_7@+#`SmY+-nExq)Xc`tIf>$Y(Zs+CM_#i7UsZz$ zvr9?G5QT7}h?rBwAa***P1_+U=5F*Y!L4*GQ3qt0`-E6DHKdCo&N)?KutF@fN{*n- zh{6?X%cu6IfrOk-roH8QLCoP`$rym0Eo5nxwm_D_VCBFGV6a3Kg`33jWzWCvo8SKT z|Kt~ctq12T!o1r4)Mqz8cdPF^VnU-KG>Rsw7+JG`DpWK$5r8tQb12G!XY~XcXy`UBy=1tu+IU6bnmVX( z-5{+gFu|H2!tIC;n2YwPO-2_bUnnR}wMzc8P zKne(O-i1o6oP555s%DZ*w!#3wI(BJSQUPMs)TklP73pG@5M#7j;cCr;B{IAaiAFMq ztSvtXDg-4BB*8plj!jz%frNwr3DL2O^Eqh{Dzb|bs@c!Rsmu)%r{q^yz=WcLi5S|< zD-F@)j9N-e#>9E)G`Sv$>Uj-S=U8LNIGL=;HKFZ8oy9nrD``5qUWi1nORX1@t;ZR} zt41PcBmx*41*)K;*Mnn7Y}Hwc$(q^5#zr8=+)Tzpv8g0mLe>LXo4w`5rDBX(uDiB5 z7%VDz!>Jho3?kte~i15VL~{IE6tRlf)WCr7KgyszV*Yg|Adq>eb~zFVtu5z30UJ50q70 zE|#KFEy^Suggn);=^fd4;p<T6L7(^9W=qy-^1vz5W}``-1JTq)`%RCCV&sl~6OC^G>p;=pA+kF5tIdAD*G38Z8l zg3`h#ltZ5>9M%SMto1`yT$DRK1WSh%BQmo!ewN(!E0Ne3kmRFID%Gi&lg5&Q097m1 z;kI^m>JSGY6%y6qau1GYQ@P{LFMs3L-7wx8JGKLfBGh?5nOEZC(36Blm11xe)H7|? zRTMYuF9{}13`|TYL_}2z@1jJPD*u2P#=j8}Vs;LLl78af{=mQa+5ZDH*gAFU&wu~- z-|$V}xVBU_62~!U6F&N$58w09mv6l3g>UbL5L1@6**}h*s=|5mJ%pxdRM6{}{eDsOmX}s%4fR)7YEddj zR5(i_j9f$|3d9V85G#~Ckz?|VsPmatqob=!ht~V6Llt#kWzr!1Ug_6{Ay^wfr5K@& zchQ&StQtS(IoHm1cZN%)R#WGhm}7`SAZLVr6r!=-`u9Kn_J8~jzvb6{{kK1I^XH4D z(W~G5s(<_szP-TMSxJtJTT(wGYBlNsq}CqmEqUX~fMbCypY#jzPDaZLOS?Vo_XWQ1 z;>Z?HcHcS(iMu1|d^NL@4j^~}7Fo*~b5J|}EV~_t97$X9&5FztC~E4($rQcUrfU4k z63XGPz3YR2_JL2I+N`)3`mzTpxjfYYu)R*r5;3vQE)9-laTfg~@Kk$9u zS`_nYx>J@8F{oHgkOXoP4m<$OOo5rbMj28s?5Xts_987_Y5lPW=ouNRUO0!H2*AQB z=on>-kr)8&05Y^(k_%Sn0Pa^Tc+=1WOPBX=Yi%W8U`OXHR?4E0AmRw!pG;#E2$SRX zKu+o&8Rp^LcA|Wa}(J8*_4|`%>OU zDk3=qW33g4$gq#L!m-dF?Gn=Bm$WHUz(^D^Dp8v;v{>~v#z?7pkMqSsAXOb(ie{n| zYnDt>jrEMw8s26nE-9zBamkl&vrW{BzKTXQbAn=SiIKCNseLl_ML8Go&c(Wd27;HY zm(1}f>bP8IH-t`3QKE*sBkh|DMrgZ+3kJk{kOd61y5TYl^jCB zP6W(w0fl#U9r~^pNkv5@x}YGEvV3CNVA>o#veKibh&41aGpSQiqr0R?s@fh9A{GHD zRr{MaTzB-3|K~6Lmv{dD`#y0L40&VM507z{V@`7d`q#>@3 zuWSKFkn;hO3edc#NyM9)AjeE3^`%SwCuVWGn)zNYM0J$gI1;gi9o3xhttpxLs}KfA zh$xYVoHC+#E@};K&40(g_<=8d{FYDr)kkJqTSGtKWLr`ywF>fuQ>CC#jm)TAke**U za(MN~(Tz)wUv%+hD@QhZtHaS~IB*`b>W_Z&kI$dkSsJa7qZlMIv4@H{r`Cp#NUbq5 zlSm8^_3EMJL&qerCk)C|lj&^7VjK9P1NcU+;&8-T;!WhUx+lCL*SJ1wvn)%-_?+nFh zrAx=IdhbU*^E3bXx3*_)_3%n>ZMZfpj%_SmdC}2JkE~sMd}Ddk8xFh!)s37zzjNE2 zkKTIE{lERLcmK(szyF{7qi=cZx4ahhZX-=eOyFn?4R%Jm5^Zs2hAH_t)h9n_hS=Sm z)tM7|iV4p61Kl}%D&Tiuk`qSCWh4^Mh!)D=z>+PB@MOG^UZKUVZ(m%Xe>^GKBdH04 z$C?813TmS4?v7)KN)8KNv4t5aFa6&kvsnd!>cqbR10I=y+`{gT9_yMzi&#zTV9u2T ziJW!flH4E+l#~lv3z*u!DA$E;r`(RL?z9}3l$O3lofj7Y@Xk7lqKT%((}%5jN~Tom zldj$R&hu3k4q?rRH4ik?qB4xk5Li`Jh*Pv+!Jb-3l`*C|BTZ|&Kmt)T1ksf4kWZkN zftDe;jVMv7R9iEQXn_Uu9rDoA{HCH%BC(xrwLU%3s!xlkvT`0OCF&NGQqhrQ(21x> z&KSr00mh&98pb_gv3-M_C*8~>X_@?a#ClqTr3Gw6NosNUCye?v>lu0y!w?#pZ<);$Gg3LA)%4jC>P#q zsARPq6w~H?zxA&9xpRZa+q=_izw(8{qesSQ9Kky!q1e=eqW7o2_ZNd$YAsEeJ7zFP zC?XS?TP($&DZ;_cDw&R}a-)=mM#wr42b_TI{#PTPWedAQJy?850U{<b7{Zo|!8;Q0z-b+19wbUHFxMhJ04(G*R8kI?zWl`52gZ9BA6mU=X|UwP z)iZ(?-jQ`^B&b9pPTiMNJ|;O=V7@nG_wRoAt>5)+ul=R}^1Gk8^Wjf#O}}vGsb@U* zS(iTJnwNalbM|J<%=N;M=k9&fbt)89WWTPb5iSxrFe^ktTB@vpd)X|1bJ)xA+Cu&X?>)8!kZn-QQa)B44pPn68uiDc))i3M{}%b`9omRp&N~ zn`Ab3izonJH^GfoD!26gKlF}I+1pv< z{%C6ncIBuW9;6%rS=_Mo-DJNV30zcdLY#@)o77R+IaXCLr!~t{VZNXRu1=Te+&vGq zPKm$jfReH+xobw{=i@dNu$}!ZX8A#KIFeaH3s5yl{(*^K%w=99YVVs5&&6_d!xu@g z7avtlz+oL0kFT)_g-NmkXo)JCOA$hqSk zAX1eWqgbVBmC(dg#XgObta^BEFlUn+yY)b`hnw;~<>YKj$XboKETWu3=*d)OLPEnt zYJET1tAHV4HgSfaMO*4s4y;n9*tFAWWG#CxRkaqgxx6Qd0VG4iDe)2sf)WznAxpER zS&O#vtsQ~S^4Wem?KVg3OVsmJ`V|CfGXV~628kLPSode`h@d$UZJpRUd6Q^_1&YKd zC<2QOLA50&aZ>6Eb%i%4umfpb(;#Pl2vSihl1MxltxmSQ*%$-XJ3scZul)9J8+!L8^Ir3M0?kAv zk&`S}$caRA97JQtkQ%;r-U%R1BB5|7J(r4lZ+`c!cZ?r@yr^mDm$WFFpwUGlb*d0{ zTm;nfzI)N@-so1BcIG?%zOU<8u=adWM>Mng$jZj)d%k?z2R^g}F6Rv_J)eB*TV6fedfXEtNEyAd zkXbcvnsVftDh9xdLWK$!wUWZ034H#1czAnq>B{iwtE+u994n~w8Bv5#M2W<3fb|9k zQH;@%BgA@o?vf4vtH1cK|NH~D{M`TjySmNyeC9K2$1ZMO^ejIdRZ2~mi^To${^s`n z3t#lor>}U8v*lqdqiEw)wN?=MK~HDfr+(=t-~JQ7^xN?zxwp+=3HoS>U#=y#Hv*!x#+UvZZx1$*=dkS#L5sTIXHm_&+5h({jwkBZx_&5+XTgiq|PrLrPGy z#OoZy?g9*Cz1$w+Ee=|MsD*+)h%5hhf4VEKi+|gDF3!*Hi+bS;oiQweOL-(MM(%z- zksj>DY@lkcD3Kl6lqV8uaRJMLB}ZD$n%T<6#hU$_0L@U zN8kS1*S+G!Doqn7B}E6s6cDyYVhBKsAO?YTL07UtX8=u$$<3BeYuz2dXMgv4b&QM7 zS{wxNT`4(eonav{l<5YPKi66j3mfD>e)$5^E(Va04VmL#AdVtvce+2;a%XP>uyIW~ zVTjI(cNl`H?quiOvCk_Zv!scvJVjR~7juE^FYnA>8u|kLBQ-50W|zIqi6_xIj7>MS zmeOKcyR)IKb&_pgcm6C@N7xq1o@A;6JF-Qac%qq?~u}!qRIIYX~xjMKcXNVo<7kt;N{6lkF} z6z$#97AM0%pM=Xd~1rP~!g+UTSRRLT#M?neXQo+-# z($y;A=XJG!c7_{^y5*$IzU;^O%sE%hC*{gIS&H+bhd>l!_+HUll4?&SmXS|>>9*!I zua#rV(L1jo;%KH?vY|~BxXrjSN`+Ym06`>zKn{*Vtag9wN522i5-l+`+uL{FaE^AN=s$ci*K@ z38DZoOHcwc`|aJ`+wQvCmtG{c1;zHqv+1}ZP^fF~NLhnQ9Rd%_r$7H%zf`QR9{JSG zU;M~NZ&}+|3mVG86-BSdy`J;4*(^XC$5W*_Tn#sih#G`-sx)@JT`b+V6>ffH^R~_D zSvRUjqnQTlAWaHU4(3=O5NkvbC(%Se;?}tnU;C9e{qcYQPv!2Zje0hJ^wE#L>(6_! zuJ-p_jPu!edvouqtFKx+x<2=q<}S``Bua1)0I|mypLygRKl1%=d(*2Px%007{@;Jw zudW|Cc5HoPZLqPlbZm9`qP5XQYs;5xj4oOm9$p)6tnr`^F6#h+kaHrcZN7`b`d=(I zbBcGW^;BqOxn0Jr>)P0k84d>_Sw14|$686aRALKET4-GH;fl54k_%xzc7S7wh{16~ z1WjqS3MW~uvu5{&U0;-lnJil$D)5n6nT3hD(l|z(IGy)sUeMg@l$w35CsfsFgrg7x z3@w2|*+or}sMyqTy#E)!_1nwj!?^Msn|d6>tO%huo$NnyB2MN4ElTPY5@o_mxa{i7 zdn+S9=(%2x)%U4akY{2yaG~Uxizu+V+V|Du)SY)eaLecK|J1EZJsmD#UR8c+w0`Lk z?w9wTd~A1r=KDj}84)BoGM{`%Yg@lP#Za^IIrv^0NOH+t_>trh z%4%QRlOV%10$EO%0=Dyn+}3z9Z6dtipG;FH6XH~(B>4=}G_+8$! zBGPK477p7blJ6|hu+wp)l>1jw_rtA7u{ml%ZR&!k=9X}LkP)b@VltO`)FtFXxUkv4jgy%$Q%s;a@L2(w{d zf9yxU@5g@TzpnU=+2+|3U;M(AH{A$dHh_SIB7q$f8MR22SbgCfxF`xl%yxFqojJGj z#JRY)$I1cnHhQspaRD0%1Vrh)S6 zVD;87-TBBPC&Ij*hfoyGm3-~9kB3Gi=dUukIs}Pw_uXGE20dHOAfl?w<<{0d0%;U3 zB10&80>y|XHpRd{?fPe)xc{+O;@$85=%81=;;WvwdG5@h9IXt?ooThbTg~cXSo%8iw)!lg*PwUC7YMLN1 zdhZ6ka%FvZ>1D^B@r)~;cEu$n>ufwGwos!)E0=0pZ?Oj>hz?M8b)f}J|5B?Ekq@?f zrddK|2BiRXTa_sT3P~$YaX|5+q3_jkb3TRd6I`@zA8I)?DHA>2N}-nQVnV12B~Gj* z7|Y&zG}(Tow27q!N|d^^B(+HZNC+nX-Ym@J!QgNH>^;Mp7)~jYh!bhV0>rKw%hHju z-z#D>Z<=O!X#LRTN5r#2K|z&#!5(l9C2MGE?|r}LPJHQ0r|-QtoZa!R@0Zs1egEdW zPhRq@r>$Lnap?JDmtFkWxifp)XaApH|AU|Wi61(D>cm=q(B^1B#S-6%n4H-`t$R=` zr>cd{?FpVq7mH~A!cY4YP!8x!QTHwC{Gw0snS8;{e_J`Z;8q7B08hGXQnm-K+YWxg znQp_=)cs&b+oY?hHNHrGh{S{gNt7T;>?CTOH|k{V;>-W(zk0`eKJ~~I&%LSH+kN93 zzT)+-deQFI=DZn?d_lhF{HRwjLjVy83|KC`)gd4%RMdm&@%C3e_tIZ~$B+Eghd%$o zkKKBHKR$fwvA6%zpLxYAZuo^C|7XWG)+p>a=YyyNfpQD(9Lj2!EYC#8Ir~&|^`s^G z|M=520&(H$Q^ygU3>V-@&iuSmd4vaEx1%8c)*h*u$dooJDf{hNwKb`n0|C2R`!R}h z!lZ1Tz>YOy{?RrJ{kK1v_5Dhi#op{gmBHEnrevMB?gQIwctj0mDa^}LbP)*xMikrDvXh9pP`l%nE{L_f<9 zMIewUTu~`QgK||((;%D$ zLyUc;s$wmny0)fKs@k9g5yZUyq@rx4FO&Rm8v+3V<_%7&u@XyXR;ph2 zny-5Qhd=i>x7>yqPab>hB-16&eja-LS_!3BsL|94Dtn$ehUxb1?&kLP`Lp%Tn1VQU zJ?fDzTj5kC1qE_R!CHgkXy++wAbRo3Uq0H{n8vE-T{CU^?1sJGZ1dD--~Tt~AA4*V zi$ldmm`4#Udc|I-Z+y)w)~>y3Un;3$Q|XbF(O>=H`*u#9J32f(->-|3B&t<8_3$7l z0+=jK8SK<3an4Z{BZ6w(A9;~3l2}M*Cv=#Pevx*&P%?!wqjIFw9KHC+Xk|5!h0lBt^+b-#TfgwdY93Y&uLtw32{E~y-RXG0 zLUf4AeHTQ`RJ7<=6!J^Mi>|p+PCm{Kzx{iE{>aHw-~ENIHU5K> zo;|&H(d8Eny+3~0l{BvZ?_c?Ym%i*pZ+OK^&OUx>wO>GEjN-iyQQ+WR5k=UsAUI}3 zb28Zuj7dca1#Cva~1(;z}UFJ=yP9s=F7ff4>2-`$#)~l?aUHc z0WYKgB&n*hGN9}jDx&JBm`u=51 zQq{Bh&e?N&o9E+r0?`8O$qjU%63LN5g(6Wzb_1}IRgQ%i)*=ywV;%JdM~;LbWv}Nd z?f1gjhfm%6`7c#xPp$ZJ152V>SG7Y^dh9~3`sx>4bknnUBoN@)`=a@?-}!?<8%cK{_H~!pZK+x zzx+kdea`h|&mCJ`Zzl8o5Jsy^F7z*~d1AR~);z9I@;Z zTqHoF9YLO*=_O@iLa3WzIh^dC|C(3b`1#Mh?A;%|cjeGU_kRAiuYJ~aJ2dZkTM-u3 zNyC14@m<^D-ZPJ0b$E33k&Weo20pMhil!)>)U)N~=3Bq%enU2T)+I z1qm~VC^m6_GM`j)VtDG^@!5O7^tn53c=2`L^Id<>mp+EMV~%2ubk1493uh5?n<%gd z?m+YTi1zG2i_ff$hNi}0?V)W%pvderh-Vg!%!s0nv_xESTCNVaCe662QIwLrtQHPb z*3^PA6`#w&Rx>6IL)j^kycU*CrP=w9oHhjovq0f8(@%up01%5r^trtKlb>|81`$sP zP3`(cRG!9o{OOlfdlQ*9JqegMb&QuCKj!*9mFP7x6O(X+^F^Q-o7m&ti7(xA|KEIg z-FwFaxKfJc@}f(7hc21K;5e)Pfw4QE|Qyjq?y2rJ~ngJG!xV=A7uHOwDDW#3{$Dd(?OFc|K04g*Ew2eJV@f zfA2>x{QUrKdD2JzmY=`PFt95UT8HM7&`mxj6zHa|8DesdMW|6if0=rt{dw5m8t?9o zwythj06yuYb$;zvE4B{lU-v$$ve5 zc!+9`%t0wY%8X)Fah#oFR6Wq$fm@T)sAl%(2bXlXTe@ICSMYkre>* zueP(5?5l)4sO!^et)T>klOrVmnHks_2r4M&!9h)9fpf{A1h_hY8=csxE&%@lv%1}( z=|NhlKCljIy_hnhOC#1!{#AN0t;Zr_lC}+DF$~QQi+pysjv#HB;CUp>>^b+*r3Gsr zL;^HXT4}P&##B{BMa8QViIhsvxNO=bTS&}b2CJ(RnMp_(sqnn!jJ7;V(`Hb>*cnI* zO{$O>sPo9gW&w&w43VHzS4}Q=!;&i#YI|7%D`E(3%q4AyHp>}+LR5>gY!oirq6$kt z%C$Y!^50BYIp%?@s)LSqcUb`yCeq|vP2M(5M4GJO^U5g4KS=CL;l5O(Bz3 zbkb5PR4wVoI#npaS}C{DjV#|t*e=bn8FHoXsvSjU4y3{}8id zM+nf?{SH~kT{^j2p--Uzo2p(}w!1*;+U3qgW)%|>F*pkM`zsBYDa6nW3xE5^Kk>Ym ze&wDvQo1IcgYCn;||WuwQC)$t?(qSpP=OTG6We)31Z`v-p9_m=l3HI277 z@A%^O!^`Y?O^EaTnIkQU2kblwA+LZi1n%~`f<|9*i~){Sgsj%C2pB?Y{!{PzB7uoCNNg&n4MKDH(vAL7ztY4_u+W$;Hbxse zv!!Z7gjR6dRFFc2nE;BhA?F-(qfJzzqW@PP{`h!jx;ENqDlkXS+-Pva@``6ZgS?AW zt1!Uc5#Uaqdg8HD=ZEE>uJ+eg*2F@O!gbWG?L8$DtF^>VGgUFA1UkehQ1PYfuPq%a zin6!7bNQRkHX~q z?vblDQu?qephDazMJ@)TjR&^(A3J|yZ9p3Xe{5xWbu{QRd|6H_{rWe)?05g@FNee8 zil<$6%~i*)xb)aXYs*Jhhy6Y?kqSc8o$>yC_dN2k&)k0dJ&#SQ;)|cX=Yf0Q@uNTX z&yOD&G$DXUMHuEmR=`4#xj$f9-nJ#UoxTZClEnu=X&>c)05V&HG^L8$_OV4!iR?Hx zdvT=NBXL^&|494qINP$STo``Fm~*Wis_Imo+$VJo&n-x%>3#KCyDuPHU|>#(4jjbFRIs@!s$KzOR08 zy29RTuQlhGV?57@#X`3;4r`N%xe^pR8iB~EnlrXk>>J$%XakyYZ>KT4D4tRAQHtJX z&oE&sxyhnMEgHQV9oUyYb$!P%E6{|p$6J#ycXa=^f6t2+_w9Yp8~>*3gEq}zxV7il zk>0{wa0XG18qDCB04vljl(c>OiQ7JO?V(-WNi`DBZ|~9l8+Fz1cAHuo39f*7 zKWyaI<7Y0|edzp$Jn~FY{m|>)@WGFM=70Y3Px>yZx;8XyWaeCdVI=g^|Mj=_?J8gY z`d1#>x76sk!>Wy`u_Kk{1Hq-VHnrG?EOy)_CbOU*Q&ZN^)Z5Fa9&+*F zr#<2EANtJa{_L&q{>9h7rUxSvkmKkM1!bVvn%kYvxATW@di?*>D%#9TTK;5H^Vxqsb&u{`t@MmDSJ=TH9F|x6rP+- z+=<`JQQRPcdHz=a!or}NY`sX5oSdxWBPpavxqI{huDtI%+NZA zagmn8)T}7Hb1e=BJC4d$ErI3PMU1iVd{<;J5smoF@?6ivx$;=bnI}(xL{;L58k#1> zOt&8q#K&({73QeDorIIsjM$l)NFZfL#dt7kcXk^5VyIX=nG7=#H)Va(*=_03iH(_k zF@tszpR_EsNbzV^WH~l-jzdrjwbf%s8S&3ZQtooqD(bYVn#C^NMr>V^bV!!5m;wY+ zv!<##oiZj_A(>u6O2M_JuFcd%Ky4QL9i?lgah#NnauzN%Vqbt65ui?e1c{khD}w}x zKo#r~NF>B2`!P?KrZLCJFq0OVp3wH78;ID!nMq>oV2}g5h&Lou9n(0}%aqu8Q6n~s zZCqWqzk6T3eGX)vbbICWsoQVsUG<l_Ty|S6q zpZ(ZJMrYUe&F!uSwRc8L5(F;x*m7xsnT$=zRMoSGh7z#4wx(hYY*L5GLmvJFgF~#e znRSwADm!ljrwLMl+Gw4anHj^U97jb_xJe^TU3bd4jjhoqK7Or3*`aPTQFE*+@Pv{M zTyS1@@4`eIc0@!DP6cOAoxT0`Cy391GgH%;NY+paSfoZhl;tPMQ2N(#H@I}5!I!@c?^e{f-G(UF@kfqK#< zQH<+~i^4Ne$Jvp+-HV=f^|PP*$aCxCKYi0bUiX=sM(F?YFaG!6|DB)NwR@MTAeCa1 z3fQH_rfTu*V`|P?os>2g+1MrSYS95hxfDLZimWgxxh{w(pE;O;jR9o_TeYv_=8Ep} zU@}oA@0Cf^N@6oHaGnorP-CVL!zw8am9oX6tW~mWBs+?ed!UW6#?Td5pdfPW&fI-s z>&)gNmlDS8sS#J6xA%Kq|6|K6YlH1cGu*|U#>^Zo9@t$JFl%y7zGGOd(RF0JHM!+e zpFFg*tJ&Icg-{JE!+2|W`ox*N=U*@wjy!vKFHlmopcUl!^4Wd8?tx35&^>tU1E2i* zwV(Q-7eDWbKk?dE@7_13YGs%2J9YL&-~02Y)^y*(!h4?evoC$|lYiwGehl@BcS`Ck zMyaL-JXwxtQZv!n@ihz4GWM|yssD2@|9|<@1Ax^|e)0c`8qB_E#u1h7b0++h|BxJZ zS<0p##S+jkac}oazVB!5Ix{|Ypnuts-B(<3`JVlY5MA9I-g;u~&a-RVgUR6obFcaC zmmFFuPuzQ7r?ab5`Z;gsUvPM#=d>0Hp(q^1_^3fsCtRT!tBg2F1Zo1LCgfyhqyU?Y zhEIRu!~Xf&&wTQ8H~ez>T51HQAg=}ohgq2Le_Gj@b^PXUX5KOl!Otwz^xqjb_x}OV zPq7uIi<(Je(goQizVlwDvy{Jy9wZdVGbWWNh4PembvRxfSLS+k9So+%3b%Z2jg5tf z9A{@^0-RF^`t04)|5YZF8#I;@0BFJUOy1M%o2Y%*j7Fv&&y2KaTB5v)PB4%0=oE4}fCNP!-8{XK}P>3>iyMG(ygYpdQ{Lv7Zt4l>K2u2C3@|#A8SJ zHuE8ZV^C3=bL}dbwRAduXmn1&Qop8%8VG8v){IBmG%lIW{HL^Y35(}lZ_jnB&8Ppd zZ1-AjgcKs+x}G@ayvrORW(yHig9%9!A~*sejy2%S5z|UenLP6C8T-O!Zfq)-xf^LK z;GwArEt|^rHhz=C3o{3hQo!DF##CGAlD5?l^L68LF~cze87V@85UB79HKcqELfkVI z_)dS%cx#hg6V&>y`25E{`rNCo>WCPE$L!LAG={4*veGzIRmc)vZ^b%3027llmEpr5 zeB@7m_m_VB7k;N-oru6RMZuoJrr;p9is-2F>5NpAP2bE{lFAz zo(L+4-6JH-IcMmB91|cgHi3XhL_w&bb?F}Z)c>;gqKh_1qrHoBcYOZluYdl=#j>-+ z^RlhZJA#^~$^-@zK~%wHv3Zx8XP0K?O`2GuZq~RCb#`?h`p8F2v}Rwb#$NMLp+!Fd z#a8`sc`{uzVv12cW*6_1oij3pHkDYxME?5EfBn9bXS-NHrHv!!8OrRrMzin0zP*PJ zR@OM;pz5HGXgsLyy6tX{LPbTed(UF9#uKZll3QEbFjch>6}*eVH~^H4cTC)I-kGTe zb45wy_Uu1zxU#X}iHgENbBp`0|H7>=c;@3wYtcXjt2q!M)Nm39dVm~6tfPyNR8zJWkqrwr!Qk`2JbxUy~bMteH@^8D?|AQLz2iUqqc{EH8-9UYDmx-G=b|4*k$YdXMOv0;-z0ZMGUz)D zKIc@71TNdEdL%BNtH!B~Zwde=s3W5S!Z4;#?&@yTx-qFMAzyY(#5l1`Q)MuSRMoSy z2>dA`vl(EIbRSb!f5ZUP2K*xgiG^lNhA#7$Z~jK1E(Bq3;<#E`c~p8D{k9+b{D zazV`>7(HR>o+)~HkY>WN;7JdA$fA>tt<}07_dswERVK>yo>86vk3ew0BYm4DaI}W$ z0k9o2YdQnok*&35Z2Z8l?8j~YYL;PCV(Z_`5dV|Q?0mt@*Q~RD#~&>B44~K{0BUMR zM!Y%FQ-cbwqd6;0lqNy9wzfgeK+YE-Mwt_o%#pnG%?=0k%m?oL_$kbpWykSvHcjTr z05T#VYm*rOB34LBrpSLyS=eBk@yJGZE~Y-y_-bVL#4ONkQ~xc)*yPD*(<*F-K+LRq zu2{IqM#CW5r*ai;Ch)EO`Z->Huew;4aov3@wdm+~HEWe+kF3074#cS>@O z@{L6LVALPM@JCIUf?TpAyiN+kR)-&xRVmEa0; zD<|$)zUz+eWf#;?29X*?me`6MwOy#pn4CeP1R#qFF##0YDf)uZY(4(bm%r<8|9Giv zoDSzp3!`nFj2S`*7J>uHf+dW}j9qlLvl^>GjTA~y2XzLg=7YEpxSH5_5QbazU_(X& z3zb>`DG#69=JfrWT`bDjf!UKMDHu?;VzGDd!Xx5LVPYo4 zRb?AngRkCni`Hb~p-v3*iwjB^s}6(Is)JDla}rEN&5V7a8e@ntM?5ONI5W|rZc;9& z*W+&2dDrXp_Ut=Q_U0Ft4t(YdH>1-th*=N`05M0;LInMB4WsIHFbkv`RhUR24FE9v z)Fy--$Th0trZHbIdx&{PttzlETKn0bdc|O4dFAxE)zfF@d|{2Ms6gwcF_4Ox5W!gh z6E~p-S#4UgxBk-D&y72~H+k29dtrX}sNAJpi6&n(Hi;j_L_4=72&8t=B2kDn(ek6}lL^|^DWZ@FW#xhmt~9Fw1nyNtp$ z1=j(SK{FgR%|yAk>&THyuDR$zPocR7pB*l4hV!=Sy(5`ZblESgtxf7?ZnG&r{i)A6 zM+D7g)3T021_IXFu<1^}W&3w;pSy3exh&(&$;RsTnKRq> z-M`4;JHGV^3msY8T<^{;DmRA@&0l@l1-_ZMr1{yAGqa$3d;R?+q{YX=#>|IX0%~cB6P%0vKukf~6FIrH zrM?S;hB~&HGw;_nhuecO%o+)<@JYu~i$jt;TbtWMGa{B3F#gFQ)ydnAg5c@vX__K5 zT^+Mb7^ZB-W*(QO9|Sf_4F>=-QvxUW6%#~^^F<6uo}IMvQ?buTb?42s-_uTon@_Zr zQ%7w2-|XbomIt)k-)>OUhH3Ysk(xex;sZG^IxCL2X$&#z_c{r}8Gtx4HeIF>3q~4u zYevc}rs2dvwqiu2XyIlQ5>hph{EXDzr5VgZLz!JqpO~@|CxXiph|Lg_Q6qx znF}JSq=IT(0nX9{g6y!gya1HOTv^i)kjfI$GFrO<%H%q|=oGM>3bsAXxeP6-G>R8e zW0kPI9W!GiqRi-tvIyrLoC-C7JPa3zU4QbQ+fbDO$bC*>pt=gN!!;C8Xpm}Bj|O9@ zqY5*$y^l0DQEw|%vT?}FA$`XT=1e5g5zNdbAJ(`pBBZfHcUIOGU4-pQ(XW>^~KO9{ayMnpuEnpc9DM9h1549-7NzW43F|Aa@LKi*!R>lP9w)o8OB zZ%r=1Z)mKl>h=cAD|V-jb;Ry^yX+~u<~u+`;xsE9TYDj=Gi5zL9G)ZvH(qI zHVS%7`&I)J9Ek>^U|JDNQ2z4Q@B7z}-Eh;_j(aR1c&%$LO&!!onc+DwAG+WIb-og9 zR3=qbFx8XE7eD*u@mB50%R~sM>+!Co`6d|;4ox!|j2(j^1R-slQ|}BGm}C7OU>YTm z*b%eB)LHP*Za4T2&(EuaS`~tf#<=(NW>NN3NsPu#K%@<%m}LMqGiERokpr2rno&{E#`5tWfAx1h z>uJ}R`j7s{r@r{5uk2b}FybI_3Z7-HoHR>vea$+V&|(z(Pc&cR@l)7lvzJT;HHl8z z7g*dxfY^wQN|JdO4)pxN`A&zFw4qQF)Ktu&h6Xt0jPhHnYfRbqGJ_&5Dm9{1y_pbB zYMia4R5)i%vwZ(qh_P|Qa`?fQ9lYcsv%(QGR3PVFcx(~_5RG{@I7g1jF}uP5cJM?U zSJsA(Tyz};wk);`wm>TlL$1weQ z=4%ET*v!_n&bzczv;Y2QKjHzG&j`biznLW=v+?3tyz|YBBV(-@{;&ge0fgL-M=f@s z28%i{kwY!EGO<7T%XjwXd#``(OXqD|%aGt1AW4O+Z9!MWAv?GdMJ+)I`x9DF z9Q|KRMsenPyj(tXWD&e7k&vYfTcVh5OQ4-QlUFc5;S5NE?YQUc@-QnX?^xE$$z6*a zGeP_Rc8h0^)$FEIMzKVeTj^&qkm|uyq8GT=ExmWsvpU0M>L5x}7N0{NDf&S~L2{qD zoJQLc35^^&o1K|`HEEiBlkIx6OGF@IcF25A(-^8IS|A39D1_QGF`Npd3FE;ybu!J! z)C^>BeG6nD-q^7Jyi#g z!oUVFJE+7vRuxB{jEp2QBO@|REo>aeW{HFZXA%i8W=3@2#i|o_B$|$0QFxTRYoTl2OX*=+mYth# zJ$}W7kEk{`h`gB7v?uC7q5>FG$p*E+kz0c9+1kEf{_q@z0(Io#)I(wi4GZ1g$>C=HEYg&Eu{)@95FZVGRv1s0xGQGK(3JQ?pcu zKt?b}AXPGTOlFnuV!qea5QM1ca+2A2hXhlBD>__E)=&TDFaPNAJAdWoJ6GQS{ts2K zE3dq=Kj*d5pbAo^7@o>ma7g)qSsCRReAXA!^W45@3hY|uoI!_WrjTtx?BS^fmwL~c zBaY=2-cf(97zEm`o2n558`#*Xs$+s0f!J6<%3_M?q@Hv$Q%ge`s8Djfz{Pef1a`D? zYFTTGUE>>B@;43cFdc(od%qFymVJFT& zyY6YrQe4Ke(V13KCM}!;H<;PjnIEUuoi6uOS;O#vkEgutt=raSZX~_I+JD=(B{yxl zc9fzS{Eg@qBV%Wnj3?!u!@uyl-`tqk8-DhOE;(`@WY|!r5fr4JePbZvt}hI=gfJRS zs%q_9uDJMEucOsAGf5-lWA>$b=R{+;sSs_?j*S_r4ulxSLdCNck(CdC~-`@G3{NW#b{G+cP4~CVEI}VOWEEd&Fo0-fkZ~O4m zotth_TsBIqd*-~&f?LEj%~+3Se!o*HfJDe?#{u5?N}K(FmaqIL;*hUqW{wF!5Cd@) z=)~G!gn|GIO`KFJVu28tZol;enIj@&XPm0k+Vp_D9y9!wW}hIbmG}#Xl=s$p4j=eH zapCgGiD!qVa+sepyZGaKa(u)RPGYA!B8>6%9G%=5{ULz|gM;qethVSPgG-_v3q0M4 z_KA%MrHe^BQyrWr`pjnKi?$y~JC#GeOJvt_7VOyn5XvB^AOy~RSz38%#a)SA*$K(5FH^vr zR4VcfN7pqh6$AicIv!g!=IP0{R^kjX*xoXsStCmnTXkDvEf!O_RX93#6OJ`gvtUp% zfil&TU?R+{LF0rn(O8(NF?HXNVwzcwlN#6T^oumlh>VE5+i~g*;3-DW6wYE*N1_l3 zdgkNSE+?nf)hWJXNmQ~Vr=u77Y!*^W^6Z@frsf$W0HdFY)V2D9UcLT~JI1CQ+k;Q-5>baV5=dXi)n6R0gi*jBQE2maQ z+k=9gYp5t01&3hdqzSfk-fmZx0a}T&P*n+;)4FE%4MM-u<={{|&nU}I4ZtLr0tUwl zph=^Pjp0h~`rY1quU0Z=Y>o>jD8F&Xi7PKVvb8>_nx-gx9nZOf5fg#}TFqo|%;(0s zCe(!@6-|M_s>+U}3FjR=@6O|Q`120UcMBgvQIM%2RF@yx^JCxl%s+eUzYGRqwLf&> z`Xvv#Oh|}~IG$C8aBBur)~T79I;e}K;znwr3ZbG-AnmeKk-`-W<<#-m*m0vq#DxVv zS^LX3{`w1F@#DvjpL)mt{@_CQ+I@R=KmG}ix$5c%k&~bj2~!N7A~6BA8EX`k!wg_a z$d3@k!X5xXTg@78~Z4w1o!3-tOzTDkEc+s)p zz2|s98~5G2=iyg10EOUy0-j;&mBdDC8`3n+Q(U=`N+}pe7B?ZPon zpZ@XJ{`9|o>F(ZviwQa!oc6ly%UzwhT}9aekp=58D^pzsZ6<6DTcE~D3Pcl6YCPUv zyZ;dnJM@mf{uP}JVzQ>S%DXiwJF#-ICYFQVGoagAL$&j--weE{?TL{r=9DvJ_>cy6 zPIq^vZA&)SnEn+hsWpCxCZm#SiBg7kY^gyp#e&q*AUQJx7~+g}gY%`RD;9UX<(=>Q z)Qw;No|k|3!ykG{v%TUSlREDmOva*ty?CMph1t2Y8{4Dt6CQNIqBE&Sj-f`Loy0lO z4x+-|TWm4r*wlzkAbAc_ECz@bu7+3;KupBaAbzwy{_K#6&TG^RK|JyCfjB<((XTQ=5a*jkw%xGU_dEZl;IYMp4y=xl-@#L6gVlYFY zv0*v`&fj<9bf@IecJ2FnLr#ropKb;Qwzsg8z|1I|GD8V7Y7%Onx$FGene^@`pb2VC z7c;#+J}IbWJ2|pwu_rwvaRZCOk@yE0r```S4v>%@8)U|%k{^Z`?c~IW3)^tV47_(p zGmH#Kj@*>%lwV2HeU8W4W}iAIQ_b#l+&`mOxd$ePPsZW<^NlN!uYANmAe)GW3&A!4&oPdwt? z8iQju?)f2DG&G-zSMC%xu}rfhWhQ z=V=sC0?ZscHHF2MZ0BE^iLsFdRbo|W?3xWq&C(2Hh@>tCVpNrp8^g4xp;geW`eBzj zUVd3@xD*97IU|@%HC1n?_eGO5br8{%DQ2(cl;J1Umw#&0%;NX40jnZ6@>j9Yz{k*p z5P8+)Pl;$%l)7{KtL?L5l>_F>;{KbzJUsJs|M`;}mmNBEL9x(pM&u~w%PW|eMI}|P zplNGKDVfJSx*`%jfsqhd5G~7Iqm!N=zwXt~d(98M@WUVd(m%fc+ArUHyDF8%oEfQS zG9vawsuGOIjLC!4d{Jtc5E_-hu-!}Z`}gkKyKiatu6|J#Vpv%ppFF*C>df+ZDC|4k z&YXnWnU>}XR~i%=9J3=0T7f}SAb=cL80?J6GZirg)dW_phU<{Z8Q21u76j_KZP|YE z^PY3f)1Is>!G*%uRAY}l#}sY6T3|3+OumK1VhL4aHFE$Q$XOvK%ziKlH{N_Zj96^2 zzFBa=1~aIUIVfUZDK#Z>9Tgg`)~m;l57*bdNym5kD4Hf1v#_!!uxm)iS}%GUH9<^w?6pzEKulO_)f6l1~!riA}}3 zf|_RELjCTy{?1$8{*NE}@TX3l7@RBS?)chm3;T9I{W(v5;!_^W(rD6aajaqVm8S}s z7LiakLaheV{K{#Bnv$tZ5YyWCC5s!47=d8QSs%w%i3IaRgy2m&B~J<()))k7lWm>Bn#pQua=>|ZEBCK3906=Lzc|-h=xuI~9Xm2&V>KHz z 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 z�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≪+mJBvK)sh~dJm_^G(S-}0eft%YHCUT!%ScTMx3`O&D?&hE zLrrZ2BA_~|5qkR$UDsPUe%IYt2iK??Q{nR7Qd0`LjEIO>B^YCt+-cU;O+7cf97htlvK|+_HI^%MFa63=2K)Ku55&iM79a`hWKi_Fw+mS6utz zYfqm$-bm=qcg~zUsp5X=cYfj1AO45WfBc__dLFZ;(aZstDub!Zq1r4o8uY-{P>Ujz(0KQ?)QJ_A4{fw z)~UGeEYZUceC9|0&G-J$_y4P-4?lwHI!wcH4G4jl0myqtt|lGVF_<4TVS8MkT3_EP zt1#2wJD|e(rMcd|rDZ!i=ymd5x0gBRRqDZxNi#Rsee-K?_=eZLFb4h7SHJ$5FFp3D zuRORuv~k^RoZsGm>48sw>>rO@fBBVHUOHFI1ycbC8i7^O*8(xtYv(t1hC}X97h>Mw zCIpNjj7MwFo*r*p=w_YqpzS=CjjT1GQ!q+_be#JG2M#=R?kVS4gEdv9 zLY<7Kqsk=IWhqTP+8MA~o)tY@z?=eu7$cbxsS>pFPjbj;C;;rC+x1(g&%FJ6-n+eB z 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%0AThHCX8=**a5OnQ)V$=m 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≫sf76OO)@zK%A;mP6SM^7F-J~=(6ThX$+yR);i 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 FV1kx;^HKl+ literal 0 HcmV?d00001 diff --git a/lvtext/vscode/leviator-lang/language-configuration.json b/lvtext/vscode/leviator-lang/language-configuration.json new file mode 100644 index 0000000..8f162a0 --- /dev/null +++ b/lvtext/vscode/leviator-lang/language-configuration.json @@ -0,0 +1,30 @@ +{ + "comments": { + // symbol used for single line comment. Remove this entry if your language does not support line comments + "lineComment": "//", + // symbols used for start and end a block comment. Remove this entry if your language does not support block comments + "blockComment": [ "/*", "*/" ] + }, + // symbols used as brackets + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + // symbols that are auto closed when typing + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + // symbols that can be used to surround a selection + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ] +} \ No newline at end of file diff --git a/lvtext/vscode/leviator-lang/package.json b/lvtext/vscode/leviator-lang/package.json new file mode 100644 index 0000000..c7c4d63 --- /dev/null +++ b/lvtext/vscode/leviator-lang/package.json @@ -0,0 +1,41 @@ +{ + "name": "leviator-lang", + "displayName": "Leviator Lang", + "version": "0.0.1", + "description": "Syntax highlighting for leviator lang", + "author": { + "name": "GTX", + "url": "https://github.com/X-R-G-B" + }, + "icon": "assets/icon.png", + "engines": { + "vscode": "^1.85.0" + }, + "publisher": "X-L-R-G-B", + "categories": [ + "Programming Languages" + ], + "pricing": "Free", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/X-R-G-B/Leviator" + }, + "bugs": { + "url": "https://github.com/X-R-G-B/Leviator/issues" + }, + "homepage": "https://github.com/X-R-G-B/Leviator/blob/main/README.md", + "contributes": { + "languages": [{ + "id": "leviator", + "aliases": ["Leviator", "leviator"], + "extensions": [".lvt"], + "configuration": "./language-configuration.json" + }], + "grammars": [{ + "language": "leviator", + "scopeName": "source.lvt", + "path": "./syntaxes/leviator.tmLanguage.json" + }] + } +} diff --git a/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json b/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json new file mode 100644 index 0000000..fdf512f --- /dev/null +++ b/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "Leviator", + "patterns": [ + { + "include": "#keywords" + }, + { + "include": "#string" + }, + { + "include": "#storage" + }, + { + "include": "#constant" + }, + { + "include": "#entity" + }, + { + "include": "#variable" + }, + { + "include": "#comment" + } + ], + "repository": { + "keywords": { + "patterns": [ + { + "name": "keyword.control.leviator", + "match": "\\b(if|else|while|foreach|break)\\b" + }, + { + "name": "keyword.other.leviator", + "match": "(<-|->)" + }, + { + "name": "keyword.operator.leviator", + "match": "(\\+|-|\\*|!=|==|<|>|<=|>=|=|/(?!/))" + } + ] + }, + "storage": { + "patterns": [ + { + "name": "storage.type.leviator", + "match": "\\b(struct|fn|Int|Char|Float|Bool|Void|StringView)\\b" + } + ] + }, + "entity": { + "patterns": [ + { + "name": "entity.name.tag.leviator", + "match": "\\b(start)\\b" + }, + { + "name": "entity.name.function", + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b\\(" + } + ] + }, + "constant": { + "patterns": [ + { + "name": "constant.language.leviator", + "match": "\\b(True|False)\\b" + }, + { + "name": "constant.numeric.leviator", + "match": "\\b([0-9]+)\\b" + } + ] + }, + "string": { + "patterns": [ + { + "name": "string.quoted.double.leviator", + "begin": "\"", + "end": "\"" + }, + { + "name": "string.quoted.single.leviator", + "begin": "'", + "end": "'" + } + ] + }, + "variable": { + "patterns": [ + { + "name": "variable.other.leviator", + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b" + }, + { + "name": "variable.parameter", + "match": "@" + } + ] + }, + "comment": { + "patterns": [ + { + "name": "comment.line.double-slash.leviator", + "match": "//.*" + } + ] + } + }, + "scopeName": "source.lvt" +} diff --git a/lvtext/vscode/leviator-lang/test.lvt b/lvtext/vscode/leviator-lang/test.lvt new file mode 100644 index 0000000..7bffda6 --- /dev/null +++ b/lvtext/vscode/leviator-lang/test.lvt @@ -0,0 +1,64 @@ +// Types +@Int a = 1; +@Char b = 'a'; +@Float c = 1.0; +@Bool d = true; +@StringView e = "Leviator"; + +// Data types +struct Point +{ + x: Float, + y: Float, +}; + +fn printPoint(p: Point) -> Void +{ + print(p:x); + print(p:y); +}; + +// Functions +fn add(a: Int, b: Int) -> Int +{ + <- a + b; +}; + +// Conditions + flow control +fn max(a: Int, b: Int) -> Int +{ + if (a > b) + { + <- a; + } + else + { + <- b; + }; +}; + +fn hundredPrinter() -> Void +{ + @Int i = 0; + + while (True) + { + // New line every 10 numbers + if (i % 10 == 0) + { + print("\n"); + }; + print(i); + if (i == 100) + { + break; + }; + i = i + 1; + }; +}; + +// this is the entry point of the program +fn start() +{ + print("Hello, world!\n"); +}; From 80a387b0e1009fd8991d9da1936333659e913e89 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 24 Dec 2023 19:05:36 +0100 Subject: [PATCH 09/99] add better readme for vscode extension --- lvtext/vscode/leviator-lang/.vscode/launch.json | 2 +- lvtext/vscode/leviator-lang/CHANGELOG.md | 1 - lvtext/vscode/leviator-lang/README.md | 8 ++++++++ lvtext/vscode/leviator-lang/language-configuration.json | 6 ++---- lvtext/vscode/leviator-lang/test.lvt | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) delete mode 100644 lvtext/vscode/leviator-lang/CHANGELOG.md diff --git a/lvtext/vscode/leviator-lang/.vscode/launch.json b/lvtext/vscode/leviator-lang/.vscode/launch.json index 0e191b5..e64ce7a 100644 --- a/lvtext/vscode/leviator-lang/.vscode/launch.json +++ b/lvtext/vscode/leviator-lang/.vscode/launch.json @@ -14,4 +14,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/lvtext/vscode/leviator-lang/CHANGELOG.md b/lvtext/vscode/leviator-lang/CHANGELOG.md deleted file mode 100644 index 420e6f2..0000000 --- a/lvtext/vscode/leviator-lang/CHANGELOG.md +++ /dev/null @@ -1 +0,0 @@ -# Change Log diff --git a/lvtext/vscode/leviator-lang/README.md b/lvtext/vscode/leviator-lang/README.md index cdcbd2a..226e7d9 100644 --- a/lvtext/vscode/leviator-lang/README.md +++ b/lvtext/vscode/leviator-lang/README.md @@ -3,3 +3,11 @@ Extension to enable syntax highlighting for [Leviator](https://github.com/X-R-G-B/Leviator) in [Visual Studio Code](https://code.visualstudio.com/). ## Installation + +1. Find your vscode extension directory (default: `~/.vscode/extensions`) +2. Copy or move the "./lvtext/vscode/leviator-lang" directory into the vscode extension directory +3. Reload vscode + +## Usage + +Open a Leviator file (`.lvt`) and enjoy the syntax highlighting. diff --git a/lvtext/vscode/leviator-lang/language-configuration.json b/lvtext/vscode/leviator-lang/language-configuration.json index 8f162a0..9da1356 100644 --- a/lvtext/vscode/leviator-lang/language-configuration.json +++ b/lvtext/vscode/leviator-lang/language-configuration.json @@ -1,9 +1,7 @@ { "comments": { // symbol used for single line comment. Remove this entry if your language does not support line comments - "lineComment": "//", - // symbols used for start and end a block comment. Remove this entry if your language does not support block comments - "blockComment": [ "/*", "*/" ] + "lineComment": "//" }, // symbols used as brackets "brackets": [ @@ -27,4 +25,4 @@ ["\"", "\""], ["'", "'"] ] -} \ No newline at end of file +} diff --git a/lvtext/vscode/leviator-lang/test.lvt b/lvtext/vscode/leviator-lang/test.lvt index 7bffda6..881031b 100644 --- a/lvtext/vscode/leviator-lang/test.lvt +++ b/lvtext/vscode/leviator-lang/test.lvt @@ -57,7 +57,7 @@ fn hundredPrinter() -> Void }; }; -// this is the entry point of the program +// Entry point of the program fn start() { print("Hello, world!\n"); From d115a37d8cab4d8e9d5dabbab5c14270925929b6 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 24 Dec 2023 19:09:23 +0100 Subject: [PATCH 10/99] add support for modulo operator --- lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json b/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json index fdf512f..b2200fa 100644 --- a/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json +++ b/lvtext/vscode/leviator-lang/syntaxes/leviator.tmLanguage.json @@ -37,7 +37,7 @@ }, { "name": "keyword.operator.leviator", - "match": "(\\+|-|\\*|!=|==|<|>|<=|>=|=|/(?!/))" + "match": "(\\+|-|%|\\*|!=|==|<|>|<=|>=|=|/(?!/))" } ] }, From 6aa321f7c4d744917c44006c3b5f789a2010dec4 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Wed, 3 Jan 2024 14:32:28 +0100 Subject: [PATCH 11/99] fix merge request --- docs/SUMMARY.md | 1 + docs/SyntaxHighlighting.md | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 docs/SyntaxHighlighting.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index d10ee06..e503371 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -6,3 +6,4 @@ made in Haskell. [README](README.md) [Byte Code Spec](ByteCodeSpec.md) [Byte Code Spec Ex](ByteCodeSpecEx.md) +[Syntax Highlighting Extension](SyntaxHighlighting.md) diff --git a/docs/SyntaxHighlighting.md b/docs/SyntaxHighlighting.md new file mode 100644 index 0000000..827c5a5 --- /dev/null +++ b/docs/SyntaxHighlighting.md @@ -0,0 +1,10 @@ +## Leviator Lang Extension for Visual Studio Code + +We are thrilled to introduce our Leviator lang extension, providing enhanced syntax highlighting for an optimized coding experience. While currently available exclusively for vscode, we have ambitious plans to extend support to JetBrains and Vim in the future. + +### Installation + +To install the Leviator Language extension for Visual Studio Code, follow the steps below: + +1. Navigate to the "lvtext" directory in our [Leviator GitHub repository](https://github.com/X-R-G-B/Leviator/lvtext). +2. Refer to the detailed installation instructions provided in the [README.md](https://github.com/X-R-G-B/Leviator/blob/lvtext/vscode/leviator-lang/README.md) file. From dca1a828a38a1660d251206cdd6288add18cf1c5 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Wed, 3 Jan 2024 14:35:16 +0100 Subject: [PATCH 12/99] update main readme.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index eb10a6f..e3dec68 100644 --- a/README.md +++ b/README.md @@ -181,12 +181,3 @@ struct Rect @Rect r = {{1, 2}, {3, 4}}; r:size:x ``` - -- **Generic Structs** - -```c -struct Rect[A] -{ - attribute: A, -}; -``` From 4e4f570878a0324e027027a0ce28cc3703486927 Mon Sep 17 00:00:00 2001 From: Tenshi <87119012+TTENSHII@users.noreply.github.com> Date: Wed, 3 Jan 2024 14:37:21 +0100 Subject: [PATCH 13/99] Update docs/SyntaxHighlighting.md Co-authored-by: Xavier Mitault --- docs/SyntaxHighlighting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/SyntaxHighlighting.md b/docs/SyntaxHighlighting.md index 827c5a5..547b400 100644 --- a/docs/SyntaxHighlighting.md +++ b/docs/SyntaxHighlighting.md @@ -4,7 +4,7 @@ We are thrilled to introduce our Leviator lang extension, providing enhanced syn ### Installation -To install the Leviator Language extension for Visual Studio Code, follow the steps below: +To install the Leviator Language extension for **Visual Studio Code**, follow the steps below: 1. Navigate to the "lvtext" directory in our [Leviator GitHub repository](https://github.com/X-R-G-B/Leviator/lvtext). 2. Refer to the detailed installation instructions provided in the [README.md](https://github.com/X-R-G-B/Leviator/blob/lvtext/vscode/leviator-lang/README.md) file. From 8958ed1957538df362d9de576dab13b1f6984216 Mon Sep 17 00:00:00 2001 From: tenshi Date: Fri, 5 Jan 2024 04:28:40 +0100 Subject: [PATCH 14/99] add work in progress --- lvtrun/README.md | 397 +++++++++++++++++++++++++++++++++ lvtrun/app/Main.hs | 15 +- lvtrun/app/WasmMod/Header.hs | 29 +++ lvtrun/app/WasmMod/Module.hs | 36 +++ lvtrun/app/WasmMod/Sections.hs | 33 +++ lvtrun/lvtrun.cabal | 8 +- lvtrun/package.yaml | 1 + lvtrun/scripts/build.ps1 | 1 + lvtrun/stack.yaml | 3 +- lvtrun/stack.yaml.lock | 20 ++ lvtrun/test/HexFile | Bin 0 -> 5008 bytes lvtrun/test/test.cpp | 22 ++ lvtrun/test/test.wasm | Bin 0 -> 830 bytes 13 files changed, 561 insertions(+), 4 deletions(-) create mode 100644 lvtrun/app/WasmMod/Header.hs create mode 100644 lvtrun/app/WasmMod/Module.hs create mode 100644 lvtrun/app/WasmMod/Sections.hs create mode 100644 lvtrun/scripts/build.ps1 create mode 100644 lvtrun/stack.yaml.lock create mode 100644 lvtrun/test/HexFile create mode 100644 lvtrun/test/test.cpp create mode 100644 lvtrun/test/test.wasm diff --git a/lvtrun/README.md b/lvtrun/README.md index 163ee90..eb356f5 100644 --- a/lvtrun/README.md +++ b/lvtrun/README.md @@ -1 +1,398 @@ # lvtrun + +# ----------------------- 0 ----------------------- + +00 61 73 6d # magic number, always 00 61 73 6d, otherwise the file is invalid +01 00 00 00 # version, always 01 00 00 00, otherwise the file is invalid + +# ----------------------- 1 ----------------------- + +# 01 is the id of the id for type section +01 11 04 +# 11 is the length of the section = 17 in decimal +# 04 is the number of types in the section + +60 00 01 7f +# 60 is the type "function" +# 00 number of parameters +# 01 number of results +# 0x7f is the type "i32" + +60 00 00 +# 0 parameter and 0 result +60 01 7f 00 +# 1 parameter i32 and 0 result +60 01 7f 01 7f +# 1 parameter i32 and 1 result i32 + +(type $t0 (func (result i32))) +(type $t1 (func)) +(type $t2 (func (param i32))) +(type $t3 (func (param i32) (result i32))) + +# ----------------------- 2 ----------------------- + +02 +# 02 is the id of the import section +24 01 16 77 +61 73 69 5f +73 6e 61 70 +73 68 6f 74 +5f 70 72 65 +76 69 65 77 +31 09 70 72 +6f 63 5f 65 +78 69 74 00 +02 + +# ----------------------- 3 ----------------------- + +# section 3 is the function section with 17 bytes of length +03 11 +10 01 00 01 +01 01 02 02 +00 01 00 00 +00 00 02 03 00 + +# ----------------------- 4 ----------------------- the table section + +04 +# 05 = length of the section +05 +# 01 = number of table (its a vector) +01 +# 70 = reftype {can be 70 = funcref or 6f = externref} +70 +# 01 is the indiacator to say "0x00 = min x, max empty or 0x01 = min x, max y" +01 +# 02 is the limit min and max of the table +02 02 + +# ----------------------- 5 ----------------------- the memory section + +05 +06 + +# 01 = number of memory (its a vector) +01 +01 c7 +02 c7 02 + +# ----------------------- 6 ----------------------- the global section + +06 +12 + +03 7f 01 +41 c7 c7 04 +0b 7f 01 41 +00 0b 7f 01 +41 00 0b + +# ----------------------- 7 ----------------------- + +# export type id +# 00 = function +# 01 = table +# 02 = memory +# 03 = global + + +07 +# 182 bytes of length +b6 +# 010c = 12 exports +01 0c + +# 06 is the length of the name +06 +# 5f 5f 69 6e 64 65 is the name "memory" +6d 65 6d 6f 72 79 +# 02 is export type "memory" +# 00 means export = first vector of memory +02 00 + + +# 19 hex = size in dec = 25 char for the name = __indirect_function +19 +# "_ _ i n d i r e c t _ f u n c t i o n _ t a b l e" +5f 5f 69 6e 64 69 72 65 63 74 5f 66 75 6e 63 74 69 6f 6e 5f 74 61 62 6c 65 +# 01 is export type "table" +01 00 + + +# size 6 +06 +# name "start" +5f 73 74 61 72 74 +# its a type function with id 03 +00 03 + + +# size = 16 name = __errno_location " +10 +5f 5f 65 72 72 6e 6f 5f 6c 6f 63 61 74 69 6f 6e +# export function of id 8 +00 08 + +# size = 21 name "emcrypten_stack_init" +15 +65 6d 73 63 72 69 70 74 65 6e 5f 73 74 61 63 6b 5f 69 6e 69 74 +# export function of id 9 +00 09 + +# size 25 name = "emscripten_stack_get_free" +19 +65 6d 73 63 72 69 70 74 65 6e 5f 73 74 61 63 6b 5f 67 65 74 5f 66 72 65 65 +# export function of id 10 +00 0a + +# size 25 name = "emcrypten_stack_get_base" +19 65 6d 73 63 72 69 70 74 65 6e 5f 73 74 61 63 6b 5f 67 65 74 5f 62 61 73 65 +# export function of id 11 +00 0b + +# size = "emcrypten_stack_get_end" +18 65 6d 73 63 72 69 70 74 65 6e 5f 73 74 61 63 6b 5f 67 65 74 5f 65 6e 64 +# export function of id 12 +00 0c + +# size = 9 name = "stackSave" +09 73 74 61 63 6b 53 61 76 65 +# export function of id 13 +00 0d + +# size = 12 name = "stackRestore" +0c 73 74 61 63 6b 52 65 73 74 6f 72 65 +# export function of id 14 +00 0e + +# size = 10 name = "stackAlloc" +0a 73 74 61 63 6b 41 6c 6c 6f 63 +# export function of id 15 +00 0f + +# size = 28 name = "emscripten_get_sbrk_ptr" +1c +65 6d 73 63 72 69 70 74 65 6e 5f 73 74 61 63 6b 5f 67 65 74 5f 63 75 72 72 65 6e 74 +# export function of id 16 +00 10 + +# ----------------------- 9 ----------------------- + +09 07 +01 00 41 01 +0b 01 01 + +# ----------------------- 10 ----------------------- + +# refer to: +https://webassembly.github.io/spec/core/binary/instructions.html + +0a +# size = cb = 203 +cb 01 + +# 16 func +10 + +# --- first func --------- + +# first function has a size of 4 +04 +# number of local +00 +# 10 = call +10 09 = call func id 9 +# 0b means end of expression +0b + +# --- second func --------- + +# 25 = length of 37 +25 +# number of local variable of type ( see below ) +01 +# 5 locals variable of type i32 (7f) (because 1 variable local of type x ^) +05 7f +# 23 = global.get = take the index u32 of a symbol in the global section +23 00 +# 21 = local.set = extract top stack value and store it in a local variable +21 00 +# +41 10 = i32.const of value 16 +21 01 = local.set localidx 1 = localvar +20 00 = local.get localidx 0 = localvar +20 01 = local.get localidx 1 = localvar +6b = i32.sub +21 02 = local.set localidx 2 = localvar +41 00 = i32.const of value 0 +21 03 = local.set localidx 3 = localvar +20 02 = local.get localidx 2 = localvar +20 03 = local.get localidx 3 = localvar +36 02 0c = i32.store align 02 offset 0c = 12 +41 00 = i32.const of value 0 +21 04 = local.set localidx 4 = localvar +20 04 = local.get localidx 4 = localvar +0f = return +0b + +# --- third func --------- + +11 +# 0 local variable +00 +# block + 02 + 40 = memory.grow ? + 41 01 = i32.const of value 1 + 45 = i32.eqz + 0d 00 = br_if label 0 + 10 01 = call func id 1 + 0b +10 02 = call func id 2 +10 06 = call func id 6 +00 = unreachable +0b + +# --- fourth func --------- + +02 +00 +0b + +# --- fifth func --------- + +2b = size 43 +# 1 local variable of type i32 (7f) +01 01 7f +41 00 = i32.const of value 0 +21 00 = local.set id 0 (the local variable) + 02 = begin block + 40 = memory.grow ? + 41 00 = i32.const of value 0 + 41 00 = i32.const of value 0 + 4d = i32.le_u + 0d 00 = br_if label 0 + 03 = loop + 40 = memory.grow ? + 20 00 = local.get 0 + 41 7c = i32.const of value -4 ? + 6a = i32.add + 22 00 = local.tee 0 + 28 02 00 = i32.load align 02 offset 00 + 11 01 00 = call_indirect index typeidx 01 typeidx 00 + 20 00 = local.get 0 + 41 00 = i32.const of value 0 + 4b = i32.gt_u + 0d 00 = br_if label 0 + 0b + 0b +10 04 = call func id 4 +0b + +# --- sixth func --------- + +0d +00 +10 04 = call func id 4 +10 05 = call func id 5 +10 04 = call func id 4 +20 00 = local.get 0 +10 07 = call func id 7 +00 = unreachable +0b 07 00 20 00 10 00 00 +0b + +# --- seventh func --------- + +06 +00 +41 = i32.const +c7 c7 04 = value (maybe 65536) +0b + +# --- eighth func --------- + +12 +00 +41 c7 c7 04 = i32.const value (maybe 65536) +24 02 = global.set 2 +41 00 = i32.const of value 0 +41 0f = i32.const of value 15 +6a = i32.add +41 70 = i32.const of value (maybe -16) +71 = i32.and +24 01 = global.set 1 +0b + +# --- ninth func --------- + +07 +# no local variable +00 +23 00 = global.get 0 +23 01 = global.get 1 +6b = i32.sub +0b + +# --- tenth func --------- + +04 +00 +23 02 = global.get 2 +0b + +# --- eleventh func --------- + +04 +00 +23 01 = global.get 1 +0b + +# --- twelfth func --------- + +04 +00 +23 00 = global.get 0 +0b + +# --- thirteenth func --------- + +06 +00 +20 00 = local.get 0 +24 00 = global.set 0 +0b + +# --- fourteenth func --------- + +12 +# number of local variable of type ( see below ) +01 +# 2 locals variable of type i32 (7f) (because 1 variable local of type x ^) +02 7f +23 00 = global.get 0 +20 00 = local.get 0 +6b = i32.sub +41 70 = i32.const of value +71 = i32.and +22 01 = local.tee 1 +24 00 = global.set 0 +20 01 = local.get 1 + + +# ----------------------- 11 ----------------------- + +# id 11 +0b +# size 4 +04 +# Bitfield. 0 = passive segment, 1 = active segment = presence of an explicit memory index +00 +# i32.const +23 +# principal memory +00 +# i32.store +0b diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 0726d58..6869bb3 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -7,7 +7,18 @@ module Main (main) where -import Lib +import qualified Data.ByteString as BS +import WasmMod.Module +import WasmMod.Header + +getFileContent :: String -> IO BS.ByteString +getFileContent path = BS.readFile path main :: IO () -main = someFunc +main = do + wasmFile <- getFileContent "./test/test.wasm" + let wasmMod = loadModule wasmFile + print wasmMod + if isHeaderValid $ header wasmMod + then putStrLn "Header is valid" + else putStrLn "Header is invalid" diff --git a/lvtrun/app/WasmMod/Header.hs b/lvtrun/app/WasmMod/Header.hs new file mode 100644 index 0000000..45606c1 --- /dev/null +++ b/lvtrun/app/WasmMod/Header.hs @@ -0,0 +1,29 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Header +-} + +module WasmMod.Header + ( + ModHeader(..), + getModuleHeader, + isHeaderValid + ) +where + +import qualified Data.ByteString as BS (ByteString, take, drop, pack) + +data ModHeader = ModHeader { + magicNumber :: BS.ByteString, + version :: BS.ByteString +} deriving (Show) + +getModuleHeader :: BS.ByteString -> ModHeader +getModuleHeader bytes = ModHeader (BS.take 4 bytes) (BS.take 4 $ BS.drop 4 bytes) + +isHeaderValid :: ModHeader -> Bool +isHeaderValid header = + magicNumber header == BS.pack [0x00, 0x61, 0x73, 0x6d] && + version header == BS.pack [0x01, 0x00, 0x00, 0x00] diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs new file mode 100644 index 0000000..1e14453 --- /dev/null +++ b/lvtrun/app/WasmMod/Module.hs @@ -0,0 +1,36 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Module +-} + +module WasmMod.Module + ( + WasmModule(..), + loadModule + ) +where + +import qualified Data.ByteString as BS (ByteString, unpack) +import Numeric (showHex) + +import WasmMod.Header +import WasmMod.Sections + +data WasmModule = WasmModule { + header :: ModHeader, + sections :: [Section] +} + +instance Show WasmModule where + show wasmMod = "Wasm Module Header:\n" ++ + " Magic Number: " ++ (concat $ map (\x -> showHex x " ") $ + BS.unpack $ magicNumber $ header wasmMod) ++ "\n" ++ + " Version: " ++ (concat $ map (\x -> showHex x " ") $ + BS.unpack $ version $ header wasmMod) ++ "\n" ++ + " Sections: " ++ (show $ sections wasmMod) ++ "\n" + + +loadModule :: BS.ByteString -> WasmModule +loadModule bytes = WasmModule (getModuleHeader bytes) [] diff --git a/lvtrun/app/WasmMod/Sections.hs b/lvtrun/app/WasmMod/Sections.hs new file mode 100644 index 0000000..8bcbe58 --- /dev/null +++ b/lvtrun/app/WasmMod/Sections.hs @@ -0,0 +1,33 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Sections +-} + +module WasmMod.Sections where + +import qualified Data.ByteString as BS (ByteString) + +data SectionID = + Custom + | Type + | Import + | Function + | Table + | Memory + | Global + | Export + | Start + | Element + | Code + | Data + | DataCount + | Invalid + deriving (Show, Eq) + +data Section = Section { + id :: SectionID, + size :: Int, + content :: BS.ByteString +} deriving (Show) diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 4e28df2..2239e9c 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -1,6 +1,6 @@ cabal-version: 2.2 --- This file has been generated from package.yaml by hpack version 0.35.2. +-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack @@ -35,11 +35,15 @@ library ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , bytestring default-language: Haskell2010 executable lvtrun-exe main-is: Main.hs other-modules: + WasmMod.Header + WasmMod.Module + WasmMod.Sections Paths_lvtrun autogen-modules: Paths_lvtrun @@ -48,6 +52,7 @@ executable lvtrun-exe ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , bytestring , lvtrun default-language: Haskell2010 @@ -63,5 +68,6 @@ test-suite lvtrun-test ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , bytestring , lvtrun default-language: Haskell2010 diff --git a/lvtrun/package.yaml b/lvtrun/package.yaml index e1a5e8f..b0d5b04 100644 --- a/lvtrun/package.yaml +++ b/lvtrun/package.yaml @@ -21,6 +21,7 @@ description: Please see the README on GitHub at = 4.7 && < 5 +- bytestring ghc-options: - -Wall diff --git a/lvtrun/scripts/build.ps1 b/lvtrun/scripts/build.ps1 new file mode 100644 index 0000000..176db1c --- /dev/null +++ b/lvtrun/scripts/build.ps1 @@ -0,0 +1 @@ +stack build --copy-bins --local-bin-path . diff --git a/lvtrun/stack.yaml b/lvtrun/stack.yaml index b2997b7..a37bfe6 100644 --- a/lvtrun/stack.yaml +++ b/lvtrun/stack.yaml @@ -40,7 +40,8 @@ packages: # - git: https://github.com/commercialhaskell/stack.git # commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a # -# extra-deps: [] +extra-deps: + - bytestring-0.12.0.2 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtrun/stack.yaml.lock b/lvtrun/stack.yaml.lock new file mode 100644 index 0000000..11e1cde --- /dev/null +++ b/lvtrun/stack.yaml.lock @@ -0,0 +1,20 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: +- completed: + hackage: bytestring-0.12.0.2@sha256:9fc077ff5b7ed2246773c3ac4370ef8822e4834d4587522b68ae551a5968fb86,7891 + pantry-tree: + sha256: 05b5b3ef529f137062c632c38d9c94482ee25bcc0438d51a4be5448dafe690c9 + size: 4355 + original: + hackage: bytestring-0.12.0.2 +snapshots: +- completed: + sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f + size: 712153 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/0.yaml + original: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/0.yaml diff --git a/lvtrun/test/HexFile b/lvtrun/test/HexFile new file mode 100644 index 0000000000000000000000000000000000000000..34e4b4f854e41a08a6c12539bdad3d5a7304fb29 GIT binary patch literal 5008 zcmc(jNsin&5JkB*;5+mYq^z`LAIDSO{{(IG@#%v>XBONWw>Jb4jN!+RL0R?V->q%! zpLVpppJ#g+_iyced)MX2e4i&T^L6hw=zJJ<+x3D+t&G#^Cj=1 zd>t=GkFmxfX7zUK@3(fpw0PNjrsN6gHRn%V@?oG23*UNyKeftvY&s zJk_t!y;J$rS}UVe|LVYedJ3JdqY7fE_igZIMrK#5e;+xjA1jf3={_GdlilxMw}I!& zh#s6@2WF5T?b|r*bno^6nVzG{mCt=htYfNaC)ihDwl`9JJyW&XSI59}UK6J6)Jb>Q zIlQJD^$*X-)m`LbM_(x>{BnO}1}uB}Ih1ZS<3KJgYjp9daw{vSN|LxR-Ad?#zf1W6JhtR{bP1! z>fWdov8&1VcYbC~SIxO|Rt}MGjm}*4-2kGZAKafu-@a7AbIzlk<8<%W>))-2(+Y-l zx6De_?UXMdv*|vsyUyGrfsNc@N%lTp-$dfZ+w26HQFCi}c)d2i9ys^0Py7u0RwR0hoQSvn9-Z80?V<^uyw*FmFTJYqu#K5|rU{Z&v-_(6{u2ZBtK$ zufKInT&&`aIf}eSVQ<76I=Lf1M?b^^n<1~Y7RX;3__NiWbiAc|#VLn1I+~BD(sgEy zj&YS&RQCTPD&@~mfn?QpbJkcO^w-@pY;y|K2{z;_w#m}ovxE(q0fWE2!w($3J&#}$ zNtmfjikvff@p_EePwnWUym}YU^t^6>nWOU+Tjc9h*1oC}G;?1)AYVN=J7(l`c&}4j z@grY7JjSZ??#$}5&bvOVrhe3{(_O8QTZQDMe$4_&n6EP~66=M$c8eQ3JlA~TWbI_C zkj}L3Vwh95_DP-V>KXabD(7_@c!!hphRBIhJ2~GVU-9pb3PP~m$8Y1hqr%}t9tqjy z4%^u(#>Ib?+(w^gj_~FjC3@xOEriIc{{7mebu-Ah-t;rA&g*xGOiqNi@pa1=3jJ_p z*3Z3}-Tlg|VvqsO@Z;uJJ~iuW?(}f(b+Sao>9@FYo8KqD;*1}yJjFni;3vno{tC|D z&e+QQqh|guVnLdvJA8*tV^k;eE3keZn|Cp_bmy*cI6RNdor(U%pvg=mJmd+7d%-1+F2Ru?CE2ma_(oup1+Yq02DHpk-a@0&jt)Q(s8@)C z%#W4;d`Q4qGUPvQUcxy+h9CmoC!mz}lx%w1*B*nOfC|LZ0Lq8s4>&uv1xZYLlkfHm il!-aaaid(A(^zmU;{wA1)C@_!0>egzU!oxXv;P1dp`N|~ literal 0 HcmV?d00001 From 6a6bafbb5027af7afaa2e2bc9e75b7493d038634 Mon Sep 17 00:00:00 2001 From: tenshi Date: Fri, 5 Jan 2024 04:40:37 +0100 Subject: [PATCH 15/99] move getFileContent in loadModule --- lvtrun/app/Main.hs | 10 +--------- lvtrun/app/WasmMod/Module.hs | 10 +++++++--- lvtrun/app/WasmMod/Sections.hs | 7 ++++++- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 6869bb3..023667b 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -7,18 +7,10 @@ module Main (main) where -import qualified Data.ByteString as BS import WasmMod.Module import WasmMod.Header -getFileContent :: String -> IO BS.ByteString -getFileContent path = BS.readFile path - main :: IO () main = do - wasmFile <- getFileContent "./test/test.wasm" - let wasmMod = loadModule wasmFile + wasmMod <- loadModule "./test/test.wasm" print wasmMod - if isHeaderValid $ header wasmMod - then putStrLn "Header is valid" - else putStrLn "Header is invalid" diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs index 1e14453..1728212 100644 --- a/lvtrun/app/WasmMod/Module.hs +++ b/lvtrun/app/WasmMod/Module.hs @@ -12,7 +12,7 @@ module WasmMod.Module ) where -import qualified Data.ByteString as BS (ByteString, unpack) +import qualified Data.ByteString as BS (ByteString, unpack, readFile) import Numeric (showHex) import WasmMod.Header @@ -31,6 +31,10 @@ instance Show WasmModule where BS.unpack $ version $ header wasmMod) ++ "\n" ++ " Sections: " ++ (show $ sections wasmMod) ++ "\n" +getFileContent :: String -> IO BS.ByteString +getFileContent path = BS.readFile path -loadModule :: BS.ByteString -> WasmModule -loadModule bytes = WasmModule (getModuleHeader bytes) [] +loadModule :: String -> IO WasmModule +loadModule filePath = do + bytes <- getFileContent filePath + return $ WasmModule (getModuleHeader bytes) [] diff --git a/lvtrun/app/WasmMod/Sections.hs b/lvtrun/app/WasmMod/Sections.hs index 8bcbe58..03db388 100644 --- a/lvtrun/app/WasmMod/Sections.hs +++ b/lvtrun/app/WasmMod/Sections.hs @@ -5,7 +5,12 @@ -- Sections -} -module WasmMod.Sections where +module WasmMod.Sections + ( + SectionID(..), + Section(..) + ) +where import qualified Data.ByteString as BS (ByteString) From 570e147c38eb4fba2eb6a87fa5dc57ee16389b6f Mon Sep 17 00:00:00 2001 From: tenshi Date: Fri, 5 Jan 2024 05:57:23 +0100 Subject: [PATCH 16/99] add better error control --- lvtrun/app/Errors.hs | 19 +++++++++++++++++++ lvtrun/app/Main.hs | 1 - lvtrun/app/WasmMod/Module.hs | 7 ++++++- lvtrun/lvtrun.cabal | 1 + 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 lvtrun/app/Errors.hs diff --git a/lvtrun/app/Errors.hs b/lvtrun/app/Errors.hs new file mode 100644 index 0000000..f2bca94 --- /dev/null +++ b/lvtrun/app/Errors.hs @@ -0,0 +1,19 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Errors +-} + +module Errors + ( + exitWithError + ) +where + +import System.Exit (exitWith, ExitCode(..)) + +exitWithError :: String -> IO a +exitWithError msg = do + putStrLn msg + exitWith $ ExitFailure 84 diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 023667b..c52cbd3 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -8,7 +8,6 @@ module Main (main) where import WasmMod.Module -import WasmMod.Header main :: IO () main = do diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs index 1728212..c102d50 100644 --- a/lvtrun/app/WasmMod/Module.hs +++ b/lvtrun/app/WasmMod/Module.hs @@ -13,10 +13,12 @@ module WasmMod.Module where import qualified Data.ByteString as BS (ByteString, unpack, readFile) +import Control.Monad (when) import Numeric (showHex) import WasmMod.Header import WasmMod.Sections +import Errors data WasmModule = WasmModule { header :: ModHeader, @@ -37,4 +39,7 @@ getFileContent path = BS.readFile path loadModule :: String -> IO WasmModule loadModule filePath = do bytes <- getFileContent filePath - return $ WasmModule (getModuleHeader bytes) [] + let modHeader = getModuleHeader bytes + when (not $ isHeaderValid modHeader) $ exitWithError "Invalid header" + let modSections = [] + return $ WasmModule modHeader modSections diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 2239e9c..f0f3dcb 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -41,6 +41,7 @@ library executable lvtrun-exe main-is: Main.hs other-modules: + Errors WasmMod.Header WasmMod.Module WasmMod.Sections From 30fc7b6fac3c92db8dd7cbfe0435abadb2d3f1a7 Mon Sep 17 00:00:00 2001 From: tenshi Date: Fri, 5 Jan 2024 07:57:31 +0100 Subject: [PATCH 17/99] add first version of getLEB128 --- lvtrun/app/WasmMod/Header.hs | 8 +-- lvtrun/app/WasmMod/Module.hs | 21 ++++---- lvtrun/app/WasmMod/Sections.hs | 93 ++++++++++++++++++++++++++++++++-- lvtrun/lvtrun.cabal | 3 ++ lvtrun/package.yaml | 1 + lvtrun/stack.yaml | 1 + lvtrun/stack.yaml.lock | 7 +++ 7 files changed, 116 insertions(+), 18 deletions(-) diff --git a/lvtrun/app/WasmMod/Header.hs b/lvtrun/app/WasmMod/Header.hs index 45606c1..22d18fc 100644 --- a/lvtrun/app/WasmMod/Header.hs +++ b/lvtrun/app/WasmMod/Header.hs @@ -8,20 +8,20 @@ module WasmMod.Header ( ModHeader(..), - getModuleHeader, + getModHeader, isHeaderValid ) where -import qualified Data.ByteString as BS (ByteString, take, drop, pack) +import qualified Data.ByteString.Lazy as BS (ByteString, take, drop, pack) data ModHeader = ModHeader { magicNumber :: BS.ByteString, version :: BS.ByteString } deriving (Show) -getModuleHeader :: BS.ByteString -> ModHeader -getModuleHeader bytes = ModHeader (BS.take 4 bytes) (BS.take 4 $ BS.drop 4 bytes) +getModHeader :: BS.ByteString -> ModHeader +getModHeader bytes = ModHeader (BS.take 4 bytes) (BS.take 4 $ BS.drop 4 bytes) isHeaderValid :: ModHeader -> Bool isHeaderValid header = diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs index c102d50..f9d905e 100644 --- a/lvtrun/app/WasmMod/Module.hs +++ b/lvtrun/app/WasmMod/Module.hs @@ -12,7 +12,7 @@ module WasmMod.Module ) where -import qualified Data.ByteString as BS (ByteString, unpack, readFile) +import qualified Data.ByteString.Lazy as BS (ByteString, unpack, readFile) import Control.Monad (when) import Numeric (showHex) @@ -26,20 +26,21 @@ data WasmModule = WasmModule { } instance Show WasmModule where - show wasmMod = "Wasm Module Header:\n" ++ - " Magic Number: " ++ (concat $ map (\x -> showHex x " ") $ + show wasmMod = "\n[ Wasm Module Header ]\n" ++ + "- Magic Number: " ++ (concat $ map (\x -> showHex x " ") $ BS.unpack $ magicNumber $ header wasmMod) ++ "\n" ++ - " Version: " ++ (concat $ map (\x -> showHex x " ") $ + "- Version: " ++ (concat $ map (\x -> showHex x " ") $ BS.unpack $ version $ header wasmMod) ++ "\n" ++ - " Sections: " ++ (show $ sections wasmMod) ++ "\n" + "- Sections: " ++ (show $ sections wasmMod) ++ "\n" getFileContent :: String -> IO BS.ByteString getFileContent path = BS.readFile path loadModule :: String -> IO WasmModule loadModule filePath = do - bytes <- getFileContent filePath - let modHeader = getModuleHeader bytes - when (not $ isHeaderValid modHeader) $ exitWithError "Invalid header" - let modSections = [] - return $ WasmModule modHeader modSections + bytes <- getFileContent filePath + let modHeader = getModHeader bytes + when (not $ isHeaderValid modHeader) $ exitWithError "Invalid header" + let modSections = getModSections bytes + when (not $ areSectionsValid modSections) $ exitWithError "Invalid sections" + return $ WasmModule modHeader modSections diff --git a/lvtrun/app/WasmMod/Sections.hs b/lvtrun/app/WasmMod/Sections.hs index 03db388..f75a438 100644 --- a/lvtrun/app/WasmMod/Sections.hs +++ b/lvtrun/app/WasmMod/Sections.hs @@ -8,11 +8,18 @@ module WasmMod.Sections ( SectionID(..), - Section(..) + Section(..), + areSectionsValid, + getModSections ) where -import qualified Data.ByteString as BS (ByteString) +import qualified Data.ByteString.Lazy as BS (ByteString, head, drop, take, null, unpack) +import Data.Binary.Get +import Data.Bits +import Data.Word (Word8, Word64) +import Data.Int (Int32, Int64) +import Numeric (showHex) data SectionID = Custom @@ -32,7 +39,85 @@ data SectionID = deriving (Show, Eq) data Section = Section { - id :: SectionID, + identifier :: SectionID, size :: Int, content :: BS.ByteString -} deriving (Show) +} + +instance Show Section where + show section = + "\nSection " ++ (show $ identifier section) ++ + " Size: " ++ (show $ size section) ++ + " Content: " ++ (concat $ map (\x -> showHex x " ") (BS.unpack $ content section)) + +areSectionsValid :: [Section] -> Bool +areSectionsValid sections = True + +getSectionID :: Word8 -> SectionID +getSectionID 1 = Type +getSectionID 2 = Import +getSectionID 3 = Function +getSectionID 4 = Table +getSectionID 5 = Memory +getSectionID 6 = Global +getSectionID 7 = Export +getSectionID 8 = Start +getSectionID 9 = Element +getSectionID 10 = Code +getSectionID 11 = Data +getSectionID 12 = DataCount +getSectionID _ = Invalid + +getLEB128 :: Get Int +getLEB128 = do + byte <- getWord8 + let value = fromIntegral (byte .&. 0x7F) + if byte `testBit` 7 + then do + next <- getLEB128 + return $ value .|. (next `shiftL` 7) + else + return value + +getSectionSize :: BS.ByteString -> Int +getSectionSize bytes = runGet getLEB128 bytes + +-- Returns the number of bytes used to encode the leb128 +getLEB128Size' :: Get Int64 +getLEB128Size' = do + byte <- getWord8 + let value = fromIntegral (byte .&. 0x7F) + if byte `testBit` 7 + then do + next <- getLEB128Size' + return (next + 1) + else + return 1 + +getLEB128Size :: BS.ByteString -> Int64 +getLEB128Size bytes = runGet getLEB128Size' bytes + +getSection :: BS.ByteString -> (Section, BS.ByteString) +getSection bytes = (Section id size content, rest) + where + id = getSectionID (BS.head bytes) + nbByteEncoded = getLEB128Size (BS.drop 1 bytes) + size = getSectionSize (BS.take (fromIntegral nbByteEncoded) (BS.drop 1 bytes)) + content = BS.take (fromIntegral size) (BS.drop (fromIntegral nbByteEncoded + 1) bytes) + rest = BS.drop (nbByteEncoded + 1 + fromIntegral size) bytes + +removeHeader :: BS.ByteString -> BS.ByteString +removeHeader bytes = BS.drop 8 bytes + +getModSections' :: BS.ByteString -> [Section] +getModSections' = do + let getModSections'' bytes = + if BS.null bytes + then [] + else + let (section, rest) = getSection bytes + in section : getModSections'' rest + getModSections'' + +getModSections :: BS.ByteString -> [Section] +getModSections bytes = getModSections' (removeHeader bytes) diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index f0f3dcb..c024715 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -35,6 +35,7 @@ library ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , binary , bytestring default-language: Haskell2010 @@ -53,6 +54,7 @@ executable lvtrun-exe ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , binary , bytestring , lvtrun default-language: Haskell2010 @@ -69,6 +71,7 @@ test-suite lvtrun-test ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , binary , bytestring , lvtrun default-language: Haskell2010 diff --git a/lvtrun/package.yaml b/lvtrun/package.yaml index b0d5b04..25995fc 100644 --- a/lvtrun/package.yaml +++ b/lvtrun/package.yaml @@ -22,6 +22,7 @@ description: Please see the README on GitHub at = 4.7 && < 5 - bytestring +- binary ghc-options: - -Wall diff --git a/lvtrun/stack.yaml b/lvtrun/stack.yaml index a37bfe6..c49e528 100644 --- a/lvtrun/stack.yaml +++ b/lvtrun/stack.yaml @@ -42,6 +42,7 @@ packages: # extra-deps: - bytestring-0.12.0.2 + - binary-0.8.9.1 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtrun/stack.yaml.lock b/lvtrun/stack.yaml.lock index 11e1cde..9f9dca0 100644 --- a/lvtrun/stack.yaml.lock +++ b/lvtrun/stack.yaml.lock @@ -11,6 +11,13 @@ packages: size: 4355 original: hackage: bytestring-0.12.0.2 +- completed: + hackage: binary-0.8.9.1@sha256:81f468c1c75fd6535152ab69b2d32ac6cfcc03e345267b069abe4da56ec95801,6523 + pantry-tree: + sha256: 956ecd662408f69615977b87a92e042abcdc447b7824b8aabf5788c4393c10c5 + size: 1976 + original: + hackage: binary-0.8.9.1 snapshots: - completed: sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f From 2a5ce2023a5cf37aef8fde44fae034f4e7234609 Mon Sep 17 00:00:00 2001 From: tenshi Date: Fri, 5 Jan 2024 23:39:06 +0100 Subject: [PATCH 18/99] add better leb128 --- lvtrun/app/WasmMod/Leb128.hs | 46 +++++++++++++++++++++++++++++++++ lvtrun/app/WasmMod/Sections.hs | 45 ++++++-------------------------- lvtrun/lvtrun.cabal | 1 + lvtrun/test/HexFile | Bin 5008 -> 5168 bytes 4 files changed, 55 insertions(+), 37 deletions(-) create mode 100644 lvtrun/app/WasmMod/Leb128.hs diff --git a/lvtrun/app/WasmMod/Leb128.hs b/lvtrun/app/WasmMod/Leb128.hs new file mode 100644 index 0000000..c16d011 --- /dev/null +++ b/lvtrun/app/WasmMod/Leb128.hs @@ -0,0 +1,46 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Leb128 +-} + +module WasmMod.Leb128 + ( + getLEB128, + extractLEB128 + ) +where + +import Data.Binary.Get +import Data.Bits +import Data.Int (Int32, Int64) +import qualified Data.ByteString.Lazy as BS (ByteString, drop) + +getLEB128 :: Get Int +getLEB128 = do + byte <- getWord8 + let value = fromIntegral (byte .&. 0x7F) + if byte `testBit` 7 + then do + next <- getLEB128 + return $ value .|. (next `shiftL` 7) + else + return value + +extractLEB128' :: Get (Int64, Int64) +extractLEB128' = do + byte <- getWord8 + let value = fromIntegral (byte .&. 0x7F) + if byte `testBit` 7 + then do + (next, size) <- extractLEB128' + return (value .|. (next `shiftL` 7), size + 1) + else + return (value, 1) + +--function that returns the value and the rest of the bytestring +extractLEB128 :: BS.ByteString -> (Int64, BS.ByteString) +extractLEB128 bytes = do + let (value, size) = runGet extractLEB128' bytes + (value, BS.drop size bytes) diff --git a/lvtrun/app/WasmMod/Sections.hs b/lvtrun/app/WasmMod/Sections.hs index f75a438..b13b0a1 100644 --- a/lvtrun/app/WasmMod/Sections.hs +++ b/lvtrun/app/WasmMod/Sections.hs @@ -17,9 +17,11 @@ where import qualified Data.ByteString.Lazy as BS (ByteString, head, drop, take, null, unpack) import Data.Binary.Get import Data.Bits -import Data.Word (Word8, Word64) import Data.Int (Int32, Int64) import Numeric (showHex) +import WasmMod.Leb128 +import Data.Word +import WasmMod.Leb128 data SectionID = Custom @@ -68,43 +70,12 @@ getSectionID 11 = Data getSectionID 12 = DataCount getSectionID _ = Invalid -getLEB128 :: Get Int -getLEB128 = do - byte <- getWord8 - let value = fromIntegral (byte .&. 0x7F) - if byte `testBit` 7 - then do - next <- getLEB128 - return $ value .|. (next `shiftL` 7) - else - return value - -getSectionSize :: BS.ByteString -> Int -getSectionSize bytes = runGet getLEB128 bytes - --- Returns the number of bytes used to encode the leb128 -getLEB128Size' :: Get Int64 -getLEB128Size' = do - byte <- getWord8 - let value = fromIntegral (byte .&. 0x7F) - if byte `testBit` 7 - then do - next <- getLEB128Size' - return (next + 1) - else - return 1 - -getLEB128Size :: BS.ByteString -> Int64 -getLEB128Size bytes = runGet getLEB128Size' bytes - getSection :: BS.ByteString -> (Section, BS.ByteString) -getSection bytes = (Section id size content, rest) - where - id = getSectionID (BS.head bytes) - nbByteEncoded = getLEB128Size (BS.drop 1 bytes) - size = getSectionSize (BS.take (fromIntegral nbByteEncoded) (BS.drop 1 bytes)) - content = BS.take (fromIntegral size) (BS.drop (fromIntegral nbByteEncoded + 1) bytes) - rest = BS.drop (nbByteEncoded + 1 + fromIntegral size) bytes +getSection bytes = do + let id = getSectionID (BS.head bytes) + let (size, rest) = extractLEB128 (BS.drop 1 bytes) + let content = BS.take (fromIntegral size) rest + (Section id (fromIntegral size) content, BS.drop (fromIntegral size) rest) removeHeader :: BS.ByteString -> BS.ByteString removeHeader bytes = BS.drop 8 bytes diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index c024715..25d062b 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -44,6 +44,7 @@ executable lvtrun-exe other-modules: Errors WasmMod.Header + WasmMod.Leb128 WasmMod.Module WasmMod.Sections Paths_lvtrun diff --git a/lvtrun/test/HexFile b/lvtrun/test/HexFile index 34e4b4f854e41a08a6c12539bdad3d5a7304fb29..c64d4d71a8c8cafc9442c88c4e282e8cab147832 100644 GIT binary patch literal 5168 zcmd6rS&q~|5Jdfr#2w}cxTmqZNjxjLa-g^ZVC_ZHH3pu*&Zh`f_U{(3$I90B;(a_Yt z+IaBEizt`ndc5O{WIg<-4ZL%m=(gqaA^kXzr1~E>zu1B>x=(i<*!Phq-q;ay9~id5 z%|3FQ#e6U(mgj+x{Cb%O{M*2@jc%YbLn4Bq5ygP-WyHarF7mk!Bhi9XY7m@9W4>d%eK$^%m#R z7L3@Vf7BsIukPvKJ=IXjx8nttZOKO11J8EJZWCu8vqUvST*nEy-AfPY_qKG#$Y(d_ zxxvr=&oj0iGHclf+s2vg^fQM$NG5ZO(R@_5-R6`k^-BlApG^8X|6*}3j7GJcz;Z`~ zbKS(Aeeeu^kfIAm@-F_&Y__p{$-l^{lAKh&4sMh?b#yNqoOody4=2_-X1{W$H@cYv zncwb{7yRwQj+-@;rgPnRCD59meYSxaDu5bVJ(vUH!YbTaL+N;=?RPc zGS2v128tjLifYKGhcZ0)7P&X0Q9z^?kDj#8(}rAZrj}SWKJ`D3=TZ^PmY4fZHwr%K zbYp6Hj)Em9iV;7t!&v27VPB-6tQGR>oo8dv*D#o>h(TYBohO1Pw+0LS$w2o(eH|

    wnd*c=b7riOsY}j1W z<7{g)&TF9$rlDbQI7+XYs0^9^}0RTIqOP|kbg^LC!`dIAyl?MY*Uq4m`pxjQP> zdCoGG;_k%Yt+m+_A#%3~)b2{~yPsm3(ID?Vapqa1?yXt!=u%sRuN-zTbZd)1{8SjOQZ1kI z!t_TPt7?egiOD_7n^AdY5=2B~x?iHxHuBgKJu>n8JH5ZwK_cp~q8;)_TmL@?ja>>) z^XBONWw>Jb4jN!+RL0R?V->q%! zpLVpppJ#g+_iyced)MX2e4i&T^L6hw=zJJ<+x3D+t&G#^Cj=1 zd>t=GkFmxfX7zUK@3(fpw0PNjrsN6gHRn%V@?oG23*UNyKeftvY&s zJk_t!y;J$rS}UVe|LVYedJ3JdqY7fE_igZIMrK#5e;+xjA1jf3={_GdlilxMw}I!& zh#s6@2WF5T?b|r*bno^6nVzG{mCt=htYfNaC)ihDwl`9JJyW&XSI59}UK6J6)Jb>Q zIlQJD^$*X-)m`LbM_(x>{BnO}1}uB}Ih1ZS<3KJgYjp9daw{vSN|LxR-Ad?#zf1W6JhtR{bP1! z>fWdov8&1VcYbC~SIxO|Rt}MGjm}*4-2kGZAKafu-@a7AbIzlk<8<%W>))-2(+Y-l zx6De_?UXMdv*|vsyUyGrfsNc@N%lTp-$dfZ+w26HQFCi}c)d2i9ys^0Py7u0RwR0hoQSvn9-Z80?V<^uyw*FmFTJYqu#K5|rU{Z&v-_(6{u2ZBtK$ zufKInT&&`aIf}eSVQ<76I=Lf1M?b^^n<1~Y7RX;3__NiWbiAc|#VLn1I+~BD(sgEy zj&YS&RQCTPD&@~mfn?QpbJkcO^w-@pY;y|K2{z;_w#m}ovxE(q0fWE2!w($3J&#}$ zNtmfjikvff@p_EePwnWUym}YU^t^6>nWOU+Tjc9h*1oC}G;?1)AYVN=J7(l`c&}4j z@grY7JjSZ??#$}5&bvOVrhe3{(_O8QTZQDMe$4_&n6EP~66=M$c8eQ3JlA~TWbI_C zkj}L3Vwh95_DP-V>KXabD(7_@c!!hphRBIhJ2~GVU-9pb3PP~m$8Y1hqr%}t9tqjy z4%^u(#>Ib?+(w^gj_~FjC3@xOEriIc{{7mebu-Ah-t;rA&g*xGOiqNi@pa1=3jJ_p z*3Z3}-Tlg|VvqsO@Z;uJJ~iuW?(}f(b+Sao>9@FYo8KqD;*1}yJjFni;3vno{tC|D z&e+QQqh|guVn Date: Sat, 6 Jan 2024 15:21:24 +0100 Subject: [PATCH 19/99] add better error handler --- lvtrun/app/Errors.hs | 21 ++++++---- lvtrun/app/Main.hs | 10 +++-- lvtrun/app/WasmMod/Module.hs | 10 +++-- lvtrun/app/WasmMod/Sections.hs | 60 +++++++++++++-------------- lvtrun/app/WasmMod/Sections/Types.hs | 43 +++++++++++++++++++ lvtrun/lvtrun.cabal | 1 + lvtrun/test/HexFile | Bin 5168 -> 5196 bytes 7 files changed, 101 insertions(+), 44 deletions(-) create mode 100644 lvtrun/app/WasmMod/Sections/Types.hs diff --git a/lvtrun/app/Errors.hs b/lvtrun/app/Errors.hs index f2bca94..4586488 100644 --- a/lvtrun/app/Errors.hs +++ b/lvtrun/app/Errors.hs @@ -4,16 +4,23 @@ -- File description: -- Errors -} - + module Errors ( - exitWithError + CustomException(..), + handleException ) where -import System.Exit (exitWith, ExitCode(..)) +import Control.Exception (Exception(..), SomeException, displayException) + +data CustomException = + ParseError String | + WasmError String | + RuntimeError String + deriving (Show, Eq) + +instance Exception CustomException -exitWithError :: String -> IO a -exitWithError msg = do - putStrLn msg - exitWith $ ExitFailure 84 +handleException :: SomeException -> IO () +handleException e = putStrLn $ "Error: " ++ displayException e diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index c52cbd3..c4e689a 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -5,11 +5,15 @@ -- Main -} + module Main (main) where +import Control.Exception (try) import WasmMod.Module +import Errors main :: IO () -main = do - wasmMod <- loadModule "./test/test.wasm" - print wasmMod +main = try (loadModule "./test/test.wasm") >>= \result -> + case result of + Left err -> handleException err + Right wasmMod -> print wasmMod diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs index f9d905e..ab54758 100644 --- a/lvtrun/app/WasmMod/Module.hs +++ b/lvtrun/app/WasmMod/Module.hs @@ -13,12 +13,14 @@ module WasmMod.Module where import qualified Data.ByteString.Lazy as BS (ByteString, unpack, readFile) +import Control.Exception (throwIO) import Control.Monad (when) import Numeric (showHex) +import Errors import WasmMod.Header import WasmMod.Sections -import Errors +import WasmMod.Sections.Types data WasmModule = WasmModule { header :: ModHeader, @@ -40,7 +42,9 @@ loadModule :: String -> IO WasmModule loadModule filePath = do bytes <- getFileContent filePath let modHeader = getModHeader bytes - when (not $ isHeaderValid modHeader) $ exitWithError "Invalid header" + when (not $ isHeaderValid modHeader) $ throwIO (WasmError "Invalid header") let modSections = getModSections bytes - when (not $ areSectionsValid modSections) $ exitWithError "Invalid sections" + when (not $ areSectionsValid modSections) $ throwIO (WasmError "Invalid sections") + let funcType = parseTypes $ head modSections + print funcType return $ WasmModule modHeader modSections diff --git a/lvtrun/app/WasmMod/Sections.hs b/lvtrun/app/WasmMod/Sections.hs index b13b0a1..5f66c3f 100644 --- a/lvtrun/app/WasmMod/Sections.hs +++ b/lvtrun/app/WasmMod/Sections.hs @@ -15,29 +15,26 @@ module WasmMod.Sections where import qualified Data.ByteString.Lazy as BS (ByteString, head, drop, take, null, unpack) -import Data.Binary.Get -import Data.Bits -import Data.Int (Int32, Int64) +import Data.Word (Word8) import Numeric (showHex) import WasmMod.Leb128 -import Data.Word -import WasmMod.Leb128 +import Data.Bits data SectionID = Custom - | Type - | Import - | Function - | Table - | Memory - | Global - | Export - | Start - | Element - | Code - | Data - | DataCount - | Invalid + | TypeID + | ImportID + | FunctionID + | TableID + | MemoryID + | GlobalID + | ExportID + | StartID + | ElementID + | CodeID + | DataID + | DataCountID + | InvalidID deriving (Show, Eq) data Section = Section { @@ -56,19 +53,19 @@ areSectionsValid :: [Section] -> Bool areSectionsValid sections = True getSectionID :: Word8 -> SectionID -getSectionID 1 = Type -getSectionID 2 = Import -getSectionID 3 = Function -getSectionID 4 = Table -getSectionID 5 = Memory -getSectionID 6 = Global -getSectionID 7 = Export -getSectionID 8 = Start -getSectionID 9 = Element -getSectionID 10 = Code -getSectionID 11 = Data -getSectionID 12 = DataCount -getSectionID _ = Invalid +getSectionID 1 = TypeID +getSectionID 2 = ImportID +getSectionID 3 = FunctionID +getSectionID 4 = TableID +getSectionID 5 = MemoryID +getSectionID 6 = GlobalID +getSectionID 7 = ExportID +getSectionID 8 = StartID +getSectionID 9 = ElementID +getSectionID 10 = CodeID +getSectionID 11 = DataID +getSectionID 12 = DataCountID +getSectionID _ = InvalidID getSection :: BS.ByteString -> (Section, BS.ByteString) getSection bytes = do @@ -90,5 +87,6 @@ getModSections' = do in section : getModSections'' rest getModSections'' +-- Todo: Check if sections are valid getModSections :: BS.ByteString -> [Section] getModSections bytes = getModSections' (removeHeader bytes) diff --git a/lvtrun/app/WasmMod/Sections/Types.hs b/lvtrun/app/WasmMod/Sections/Types.hs new file mode 100644 index 0000000..fa41c2a --- /dev/null +++ b/lvtrun/app/WasmMod/Sections/Types.hs @@ -0,0 +1,43 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Types +-} + +module WasmMod.Sections.Types + ( + parseTypes, + Type(..), + FuncType(..) + ) +where + +import WasmMod.Sections +import WasmMod.Leb128 +import Data.Int +import Errors +import Control.Exception +import qualified Data.ByteString.Lazy as Bs + +data Type = I32 | I64 | F32 | F64 deriving (Show, Eq) + +data FuncType = FuncType { + typeId :: Int, + params :: [Type], + results :: [Type] +} + +instance Show FuncType where + show funcType = "(type " ++ (show $ typeId funcType) ++ " (func " ++ + (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")" + +parseFuncTypes :: Int64 -> Bs.ByteString -> [FuncType] +parseFuncTypes 0 _ = [] +parseFuncTypes idx content = throw $ (WasmError "Not implemented") + +parseTypes :: Section -> [FuncType] +parseTypes (Section TypeID _ content) = do + let (vecSize, rest) = extractLEB128 content + parseFuncTypes vecSize rest +parseTypes _ = [] diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 25d062b..f72ef50 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -47,6 +47,7 @@ executable lvtrun-exe WasmMod.Leb128 WasmMod.Module WasmMod.Sections + WasmMod.Sections.Types Paths_lvtrun autogen-modules: Paths_lvtrun diff --git a/lvtrun/test/HexFile b/lvtrun/test/HexFile index c64d4d71a8c8cafc9442c88c4e282e8cab147832..70f2ff6aea7bd81a4a37767645ccc874f5334da5 100644 GIT binary patch delta 94 zcmdm>aYkc<5fi@xg9(EIg8>6C0~ZKSc4Sgzhq2R{wBhW@Orl5feWz0~Z4bn=mLa7%(VIc4SgzRG6I0qzxqJGnFzbY?fwjWdm}SbLs*) Ow>cYGfK)W!M^*sD^$#Ne From 37eccd8dc111052c98a36e940d89127e6ec38ffa Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sat, 6 Jan 2024 17:20:01 +0100 Subject: [PATCH 20/99] add work in progress --- lvtrun/app/WasmMod/Leb128.hs | 9 +++--- lvtrun/app/WasmMod/Sections/Types.hs | 43 ++++++++++++++++++++++++++- lvtrun/test/HexFile | Bin 5196 -> 5188 bytes 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/lvtrun/app/WasmMod/Leb128.hs b/lvtrun/app/WasmMod/Leb128.hs index c16d011..099cf99 100644 --- a/lvtrun/app/WasmMod/Leb128.hs +++ b/lvtrun/app/WasmMod/Leb128.hs @@ -14,7 +14,7 @@ where import Data.Binary.Get import Data.Bits -import Data.Int (Int32, Int64) +import Data.Int (Int64) import qualified Data.ByteString.Lazy as BS (ByteString, drop) getLEB128 :: Get Int @@ -32,12 +32,11 @@ extractLEB128' :: Get (Int64, Int64) extractLEB128' = do byte <- getWord8 let value = fromIntegral (byte .&. 0x7F) - if byte `testBit` 7 - then do + case byte `testBit` 7 of + True -> do (next, size) <- extractLEB128' return (value .|. (next `shiftL` 7), size + 1) - else - return (value, 1) + False -> return (value, 1) --function that returns the value and the rest of the bytestring extractLEB128 :: BS.ByteString -> (Int64, BS.ByteString) diff --git a/lvtrun/app/WasmMod/Sections/Types.hs b/lvtrun/app/WasmMod/Sections/Types.hs index fa41c2a..7ffb49a 100644 --- a/lvtrun/app/WasmMod/Sections/Types.hs +++ b/lvtrun/app/WasmMod/Sections/Types.hs @@ -19,6 +19,9 @@ import Data.Int import Errors import Control.Exception import qualified Data.ByteString.Lazy as Bs +import Data.Word + +import Debug.Trace data Type = I32 | I64 | F32 | F64 deriving (Show, Eq) @@ -32,9 +35,47 @@ instance Show FuncType where show funcType = "(type " ++ (show $ typeId funcType) ++ " (func " ++ (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")" +--60 0 0 +--60 1 7f 0 +--60 2 7f 7f 1 7f +-- 7f = i32 7e = i64 7d = f32 7c = f64 + +getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) +getVectorSize content = extractLEB128 content + +getTypeFromByte :: Word8 -> Type +getTypeFromByte 0x7f = I32 +getTypeFromByte 0x7e = I64 +getTypeFromByte 0x7d = F32 +getTypeFromByte 0x7c = F64 +getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" + +extractParams :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) +extractParams (0, content) = ([], content) +extractParams (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : params, rest) + where (params, rest) = extractParams (idx - 1, Bs.drop 1 content) + +extractResults :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) +extractResults (0, content) = ([], content) +extractResults (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : results, rest) + where (results, rest) = extractResults (idx - 1, Bs.drop 1 content) + +extractTypes :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) +extractTypes (0, content) = ([], content) + +parseFuncType :: Bs.ByteString -> (FuncType, Bs.ByteString) +parseFuncType content = do + let (params, rest) = extractParams $ getVectorSize content + let (results, rest2) = extractResults $ getVectorSize rest + ((FuncType 0 params results), rest2) + parseFuncTypes :: Int64 -> Bs.ByteString -> [FuncType] parseFuncTypes 0 _ = [] -parseFuncTypes idx content = throw $ (WasmError "Not implemented") +parseFuncTypes idx content + | head (Bs.unpack content) == 0x60 = do + let (funcType, rest) = parseFuncType content + funcType : parseFuncTypes (idx - 1) rest + | otherwise = throw $ WasmError "ParseFuncTypes: 0x60 expected for function" parseTypes :: Section -> [FuncType] parseTypes (Section TypeID _ content) = do diff --git a/lvtrun/test/HexFile b/lvtrun/test/HexFile index 70f2ff6aea7bd81a4a37767645ccc874f5334da5..ec8a11540639775745ae7a995ca335177fcafdf5 100644 GIT binary patch delta 91 zcmX@3aYSQ+gD)=w7Xt{JF&Ho?fUzNvHfKmf6E#5M!&HFOBlH?EC`_EFzwt Date: Sat, 6 Jan 2024 19:47:27 +0100 Subject: [PATCH 21/99] Step 3rd parser lvt (#10) * Rename lib file * Add parser for one lvt instruction * Add ;\n for all instruction * Add AST * Fix file location * Add header * Add exports * Fix TypeValue * Fix norm + returnValue * Fix * Fix type * Fix export * Merge remote-tracking branch 'origin/step4TypeCheck' into step-3rd-parser-lvt * Fix lvtrun files compil * Fix condition for parser * Fix norm * Fix func call for value * Add operation priority * Fix --------- Co-authored-by: guillaume abel --- lvtc/app/Main.hs | 33 +++- lvtc/lvtc.cabal | 5 + lvtc/src/AST.hs | 102 ++++++++++++ lvtc/src/Expression.hs | 20 ++- lvtc/src/ParseLvt.hs | 312 ++++++++++++++++++++++++++++++++++++ lvtc/src/ParseUtil.hs | 24 +++ lvtc/src/ShuntingYard.hs | 73 +++++++++ lvtc/test/Spec.hs | 5 + lvtc/test/UTParseLvt.hs | 89 ++++++++++ lvtc/test/UTShuntingYard.hs | 73 +++++++++ lvtrun/lvtrun.cabal | 2 +- lvtrun/src/Lib.hs | 2 +- 12 files changed, 729 insertions(+), 11 deletions(-) create mode 100644 lvtc/src/AST.hs create mode 100644 lvtc/src/ParseLvt.hs create mode 100644 lvtc/src/ShuntingYard.hs create mode 100644 lvtc/test/UTParseLvt.hs create mode 100644 lvtc/test/UTShuntingYard.hs diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 41f8713..13e878a 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -7,9 +7,31 @@ module Main (main) where -import Expression (parseAllExpression) +import Expression (parseExpresion, parseAllExpression) import Parser (runParser) import Alias (proceedAlias) +import ParseLvt (parseInstruction, parseInstructions) + +test1 :: String +test1 = "if (a)\n{\nb(0);\n};\n" + +test2 :: String +test2 = part1 ++ part2 + where + part1 = "@Int a = 0;\n @Int c = b(a);\n" + part2 = " if (c)\n {\n d(a);\n };\n" + +test3 :: String +test3 = "alias abc def;\n" + +test4 :: String +test4 = "// this is a comment\n" + +test5 :: String +test5 = "@Int a = 4 + 5;\n" + +test6 :: String +test6 = "@Int a = 3 + 4 * 2 / ( 1 - 5 );\n" text :: String text = aliasInt ++ aliasRetValue ++ funcMain @@ -19,4 +41,11 @@ text = aliasInt ++ aliasRetValue ++ funcMain funcMain = "fn main () -> int \n{\n <- retValue;\n};\n" main :: IO () -main = print $ runParser (proceedAlias <$> parseAllExpression) text +main = + print (runParser parseInstruction test1) + >> print (runParser parseInstructions test2) + >> print (runParser parseExpresion test3) + >> print (runParser parseExpresion test4) + >> print (runParser parseInstruction test5) + >> print (runParser parseInstruction test6) + >> print (runParser (proceedAlias <$> parseAllExpression) text) diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 76130c0..04ee4ee 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -26,10 +26,13 @@ source-repository head library exposed-modules: Alias + AST Expression Lib + ParseLvt Parser ParseUtil + ShuntingYard other-modules: Paths_lvtc autogen-modules: @@ -59,6 +62,8 @@ test-suite lvtc-test type: exitcode-stdio-1.0 main-is: Spec.hs other-modules: + UTParseLvt + UTShuntingYard Paths_lvtc autogen-modules: Paths_lvtc diff --git a/lvtc/src/AST.hs b/lvtc/src/AST.hs new file mode 100644 index 0000000..236bb4d --- /dev/null +++ b/lvtc/src/AST.hs @@ -0,0 +1,102 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- AST +-} + +module AST + ( Type + , Value (..) + , Var + , FuncCall + , FuncPrototype + , FuncDeclaration + , Instruction (..) + , VarDeclaration + , VarAssignation + , Condition + , Symbol + ) where + +import Data.Int (Int32) + +type Symbol = String + +type Type = String + +data Value = + Var String + | FuncValue FuncCall + | Boolean Bool + | Integer Int32 + | Character Char + | StringView String + | Void + +instance Show Value where + show (Var x) = "V< " ++ show x ++ " >" + show (FuncValue x) = "F< " ++ show x ++ " >" + show (Boolean x) = "B< " ++ show x ++ " >" + show (Integer x) = "I< " ++ show x ++ " >" + show (Character x) = "C< " ++ show x ++ " >" + show (StringView x) = "SV< " ++ show x ++ " >" + show Void = "Void" + +instance Eq Value where + (==) (Var x) (Var y) = x == y + (==) (FuncValue x) (FuncValue y) = x == y + (==) (Boolean x) (Boolean y) = x == y + (==) (Integer x) (Integer y) = x == y + (==) (Character x) (Character y) = x == y + (==) (StringView x) (StringView y) = x == y + (==) Void Void = True + (==) _ _ = False + +-- Function + +type Var = (Symbol, Type) + +type FuncPrototype = (Symbol, [Var], Type) + +type FuncDeclaration = (FuncPrototype, [Instruction]) + + +-- condition + +type Condition = (Value, [Instruction], [Instruction]) + +-- Instruction + +type FuncCall = (Symbol, [Value]) + +type VarDeclaration = (Var, Value) + +type VarAssignation = (Symbol, Value) + +data Instruction = + Function FuncCall + | Return Value + | Declaration VarDeclaration + | Assignation VarAssignation + | Cond Condition + +instance Show Instruction where + show (Function x) = + "Function[< " ++ show x ++ " >]" + show (Return x) = + "Return[< " ++ show x ++ " >]" + show (Declaration x) = + "Declaration[< " ++ show x ++ " >]" + show (Assignation x) = + "Assignation[< " ++ show x ++ " >]" + show (Cond x) = + "Cond[< " ++ show x ++ " >]" + +instance Eq Instruction where + (==) (Function x) (Function y) = x == y + (==) (Return x) (Return y) = x == y + (==) (Declaration x) (Declaration y) = x == y + (==) (Assignation x) (Assignation y) = x == y + (==) (Cond x) (Cond y) = x == y + (==) _ _ = False diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs index 370c4c4..b10e111 100644 --- a/lvtc/src/Expression.hs +++ b/lvtc/src/Expression.hs @@ -39,9 +39,11 @@ countBracketsForFunction n ('\\':_:xs) = countBracketsForFunction n xs countBracketsForFunction n (_:xs) = countBracketsForFunction n xs parseFunction' :: Parser Expression -parseFunction' = (\x -> Function (x ++ "\n};\n")) <$> ((++) <$> - (parseString "fn " <|> parseString "export fn") <*> - parseAllCharUntil "\n};\n") +parseFunction' = + (\x -> Function (x ++ "\n};\n")) + <$> ((++) + <$> (parseString "fn " <|> parseString "export fn") + <*> parseAllCharUntil "\n};\n") parseFunction :: Parser Expression parseFunction = Parser f @@ -55,13 +57,17 @@ parseFunction = Parser f parseAlias :: Parser Expression parseAlias = - (\x -> Alias (x ++ ";\n")) <$> - ((++) <$> parseString "alias " <*> parseAllCharUntil ";\n") + (\x -> Alias (x ++ ";\n")) + <$> ((++) + <$> parseString "alias " + <*> parseAllCharUntil ";\n") parseComment :: Parser Expression parseComment = - (\x -> Comment (x ++ "\n")) <$> - ((++) <$> parseString "//" <*> parseAllCharUntil "\n") + (\x -> Comment (x ++ "\n")) + <$> ((++) + <$> parseString "//" + <*> parseAllCharUntil "\n") parseExpresion :: Parser Expression parseExpresion = parseAlias <|> parseFunction <|> parseComment diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs new file mode 100644 index 0000000..6a8daaa --- /dev/null +++ b/lvtc/src/ParseLvt.hs @@ -0,0 +1,312 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ParseLvt +-} + +module ParseLvt +( + -- Value + parseValue, + parseVar, + parseFuncValue, + parseBoolean, + parseInteger, + parseCharacter, + parseStringView, + parseVoid, + -- Instruction + parseInstructions, + parseInstruction, + parseFunction, + parseReturn, + parseDeclaration, + parseAssignation, + parseCond, +) where + +import Control.Applicative + +import AST + +import Parser +import ParseUtil +import ShuntingYard + +lexeme :: String -> String +lexeme [] = [] +lexeme (',':' ':xs) = lexeme (',':xs) +lexeme ('\n':' ':xs) = lexeme ('\n':xs) +lexeme ('e':'l':'s':'e':' ':xs) = lexeme ("else" ++ xs) +lexeme ('i':'f':' ':xs) = lexeme ("if" ++ xs) +lexeme (' ':'(':xs) = lexeme ("(" ++ xs) +lexeme (' ':')':xs) = lexeme (")" ++ xs) +lexeme (' ':'+':xs) = lexeme ("+" ++ xs) +lexeme (' ':'-':xs) = lexeme ("-" ++ xs) +lexeme (' ':'*':xs) = lexeme ("*" ++ xs) +lexeme (' ':'/':xs) = lexeme ("/" ++ xs) +lexeme ('+':' ':xs) = lexeme ("+" ++ xs) +lexeme ('-':' ':xs) = lexeme ("-" ++ xs) +lexeme ('*':' ':xs) = lexeme ("*" ++ xs) +lexeme ('/':' ':xs) = lexeme ("/" ++ xs) +lexeme ('(':' ':xs) = lexeme ("(" ++ xs) +lexeme (')':' ':xs) = lexeme (")" ++ xs) +lexeme (x:xs) = x : lexeme xs + +parseBoolean :: Parser Value +parseBoolean = + ((\_ -> Boolean True) <$> parseString "True") + <|> ((\_ -> Boolean False) <$> parseString "False") + +parseInteger :: Parser Value +parseInteger = Integer <$> parseInt + +parseFuncValue :: Parser Value +parseFuncValue = Parser f + where + f str = case runParser parseCall str of + Nothing -> Nothing + Just (Function x, xs) -> Just (FuncValue x, xs) + _notAFunction -> Nothing + +parseCharacter :: Parser Value +parseCharacter = + Character <$> + ( + parseChar '\'' + *> parseAnyChar (alphabet ++ digit ++ special) + <* parseChar '\'' + ) + +parseStringView :: Parser Value +parseStringView = + StringView <$> + ( + parseChar '\"' + *> parseAllCharUntil "\"" + ) + +parseVar :: Parser Value +parseVar = Parser f + where + f str = case runParser (parseAnyChar alphabetLower) str of + Nothing -> Nothing + Just (x, xs) -> + case runParser + (many (parseAnyChar (alphabet ++ digit ++ "_"))) xs + of + Nothing -> Nothing + Just (y, ys) -> Just (Var (x:y), ys) + +parseVoid :: Parser Value +parseVoid = f <$> parseString "Void" + where + f _ = Void + +parseOperatorFstVal :: Parser Value +parseOperatorFstVal = Parser f + where + f str = case runParser parseValueWithoutOperator str of + Nothing -> Nothing + Just (fstVal, xs) -> Just (fstVal, xs) + +parseOperatorOp :: Parser Value +parseOperatorOp = + f + <$> (parseString "+" + <|> parseString "-" + <|> parseString "*" + <|> parseString "/" + <|> parseString "(" + <|> parseString ")") + where + f op = Var op + +parseOperator' :: ShuntingYardState -> Parser ShuntingYardState +parseOperator' sys = + (fOp <$> parseOperatorOp) + <|> (fVal <$> parseOperatorFstVal) + where + fVal val = shuntingYardValue val sys + fOp op = shuntingYardOp op sys + +parseOperatorTransform' :: [Value] -> Maybe [Value] +parseOperatorTransform' [] = Just [] +parseOperatorTransform' (_:(Var "+"):_) = Nothing +parseOperatorTransform' (_:(Var "-"):_) = Nothing +parseOperatorTransform' (_:(Var "*"):_) = Nothing +parseOperatorTransform' (_:(Var "/"):_) = Nothing +parseOperatorTransform' (x1:x2:(Var "+"):rest) = + Just ((FuncValue ("+", [x1, x2])) : rest) +parseOperatorTransform' (x1:x2:(Var "-"):rest) = + Just ((FuncValue ("-", [x1, x2])) : rest) +parseOperatorTransform' (x1:x2:(Var "*"):rest) = + Just ((FuncValue ("*", [x1, x2])) : rest) +parseOperatorTransform' (x1:x2:(Var "/"):rest) = + Just ((FuncValue ("/", [x1, x2])) : rest) +parseOperatorTransform' (x:xs) = + case parseOperatorTransform' xs of + Nothing -> Nothing + Just ys -> Just (x:ys) + +parseOperatorTransform :: [Value] -> Maybe Value +parseOperatorTransform [] = Nothing +parseOperatorTransform vals = + case parseOperatorTransform' vals of + Nothing -> Nothing + Just [] -> Nothing + Just (x:[]) -> Just x + Just (x:rest) -> parseOperatorTransform (x:rest) + +parseOperatorS :: ShuntingYardState -> Parser ShuntingYardState +parseOperatorS sys = Parser f + where + f str = case runParser (parseOperator' sys) str of + Nothing -> Just (sys, str) + Just (x, xs) -> case runParser (parseOperatorS x) xs of + Nothing -> Just (x, xs) + Just (y, ys) -> Just (y, ys) + +parseOperator :: Parser Value +parseOperator = Parser f + where + f str = case runParser (parseOperatorS (SYS [] [])) (lexeme str) of + Nothing -> Nothing + Just (x, xs) -> pat (shuntingYardEnd x) xs + pat (SYS _ vals) str = case parseOperatorTransform vals of + Nothing -> Nothing + Just x -> Just (x, str) + +parseValue :: Parser Value +parseValue = + parseOperator + <|> parseValueWithoutOperator + +parseValueWithoutOperator :: Parser Value +parseValueWithoutOperator = + parseFuncValue + <|> parseBoolean + <|> parseVoid + <|> parseInteger + <|> parseStringView + <|> parseCharacter + <|> parseVar + +parseCallName :: Parser Symbol +parseCallName = + f + <$> parseAnyChar alphabetLower + <*> many (parseAnyChar (alphabet ++ digit ++ "_")) + <* parseChar '(' + where + f fstChar restName = fstChar : restName + +parseCallArg :: Parser Value +parseCallArg = Parser f + where + f str = case runParser parseValue str of + Nothing -> Nothing + Just (x, ',':' ':xs) -> Just (x, xs) + Just (x, ',':xs) -> Just (x, xs) + Just (x, xs) -> Just (x, xs) + +parseCallArgs :: Parser [Value] +parseCallArgs = Parser f + where + f (')':xs) = Just ([], xs) + f str = case runParser parseCallArg str of + Nothing -> Nothing + Just (x, xs) -> + case runParser parseCallArgs xs of + Nothing -> Just ([x], xs) + Just (y, ys) -> Just (x:y, ys) + +parseCall :: Parser Instruction +parseCall = f <$> parseCallName <*> parseCallArgs + where + f name args = Function (name, args) + +parseFunction :: Parser Instruction +parseFunction = parseCall + +parseReturn :: Parser Instruction +parseReturn = Return <$> (parseString "<- " *> parseValue) + +parseType :: Parser String +parseType = + parseString "Bool" + <|> parseString "Int" + <|> parseString "Char" + <|> parseString "Void" + <|> parseString "StringView" + +parseDeclaration' :: String -> Parser Instruction +parseDeclaration' typ = Parser f + where + f str = case runParser parseAssignation str of + Nothing -> Nothing + Just (Assignation (name, val), xs) -> + Just (Declaration ((name, typ), val), xs) + _notAssignation -> Nothing + +parseDeclaration :: Parser Instruction +parseDeclaration = Parser f + where + f str = case + runParser (parseChar '@' *> parseType <* parseChar ' ') str + of + Nothing -> Nothing + Just (typ, xs) -> runParser (parseDeclaration' typ) xs + +parseAssignation :: Parser Instruction +parseAssignation = Parser f + where + f str = case runParser (parseVar <* parseString " = ") str of + Nothing -> Nothing + Just (Var x, xs) -> + case runParser parseValue xs of + Nothing -> Nothing + Just (y, ys) -> Just (Assignation (x, y), ys) + _notVar -> Nothing + +parseCondComp :: Parser Value +parseCondComp = parseString "if(" *> parseValue <* parseString ")\n" + +parseCondIf :: Parser [Instruction] +parseCondIf = parseString "{\n" *> parseInstructions <* parseString "}" + +parseCondElse :: Parser [Instruction] +parseCondElse = parseString "else\n{\n" *> parseInstructions <* parseString "}" + +parseCond' :: Value -> [Instruction] -> Parser Instruction +parseCond' val ifBlock = Parser f + where + f ('\n':xs) = case runParser parseCondElse xs of + Nothing -> Nothing + Just (elseBlock, ys) -> Just (Cond (val, ifBlock, elseBlock), ys) + f str = Just (Cond (val, ifBlock, []), str) + +parseCond :: Parser Instruction +parseCond = Parser f + where + f str = case runParser parseCondComp (lexeme str) of + Nothing -> Nothing + Just (val, xs) -> + case runParser parseCondIf xs of + Nothing -> Nothing + Just (ifBlock, ys) -> runParser (parseCond' val ifBlock) ys + +parseInstruction :: Parser Instruction +parseInstruction = + (parseCond + <|> parseReturn + <|> parseDeclaration + <|> parseAssignation + <|> parseFunction + ) <* parseString ";\n" + +parseInstructions :: Parser [Instruction] +parseInstructions = Parser f + where + f str = runParser (some parseInstruction) (lexeme str) diff --git a/lvtc/src/ParseUtil.hs b/lvtc/src/ParseUtil.hs index 20f020c..0649352 100644 --- a/lvtc/src/ParseUtil.hs +++ b/lvtc/src/ParseUtil.hs @@ -16,12 +16,36 @@ module ParseUtil ( parseAfter, parseBefore, parseAllCharUntil, + alphabet, + alphabetLower, + alphabetUpper, + digit, + special, ) where import Parser import Data.Int (Int32) import Control.Applicative +alphabetLower :: String +alphabetLower = ['a'..'z'] + +alphabetUpper :: String +alphabetUpper = ['A'..'Z'] + +alphabet :: String +alphabet = alphabetLower ++ alphabetUpper + +digit :: String +digit = ['0'..'9'] + +special :: String +special = + [ + '_', ' ', '(', ')', '{', '}', ';', ',', ':', '.', + '+', '-', '*', '/', '%', '^', '!', '?' + ] + parseChar :: Char -> Parser Char parseChar c = Parser f where diff --git a/lvtc/src/ShuntingYard.hs b/lvtc/src/ShuntingYard.hs new file mode 100644 index 0000000..9a308dd --- /dev/null +++ b/lvtc/src/ShuntingYard.hs @@ -0,0 +1,73 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ShuntingYard +-} + +module ShuntingYard +( + shuntingYardOp, + shuntingYardEnd, + shuntingYardValue, + ShuntingYardState (..) +) where + +import AST + +data ShuntingYardState = SYS [Value] [Value] + +instance Eq ShuntingYardState where + (==) (SYS y z) (SYS y' z') = y == y' && z == z' + +instance Show ShuntingYardState where + show (SYS y z) = "SYS[< " ++ show y ++ " >< " ++ show z ++ " >]" + +shuntingYardValue :: Value -> ShuntingYardState -> ShuntingYardState +shuntingYardValue val (SYS ops out) = SYS ops (out ++ [val]) + +opOnStack :: Value -> ShuntingYardState -> ShuntingYardState +opOnStack (Var "+") (SYS ((Var "*"):ops) out) = + opOnStack (Var "+") (SYS ops (out ++ [Var "*"])) +opOnStack (Var "+") (SYS ((Var "/"):ops) out) = + opOnStack (Var "+") (SYS ops (out ++ [Var "/"])) +opOnStack (Var "+") (SYS ((Var "-"):ops) out) = + opOnStack (Var "+") (SYS ops (out ++ [Var "-"])) +opOnStack (Var "+") (SYS ((Var "+"):ops) out) = + opOnStack (Var "+") (SYS ops (out ++ [Var "+"])) +opOnStack (Var "-") (SYS ((Var "*"):ops) out) = + opOnStack (Var "-") (SYS ops (out ++ [Var "*"])) +opOnStack (Var "-") (SYS ((Var "/"):ops) out) = + opOnStack (Var "-") (SYS ops (out ++ [Var "/"])) +opOnStack (Var "-") (SYS ((Var "+"):ops) out) = + opOnStack (Var "-") (SYS ops (out ++ [Var "+"])) +opOnStack (Var "-") (SYS ((Var "-"):ops) out) = + opOnStack (Var "-") (SYS ops (out ++ [Var "-"])) +opOnStack (Var "*") (SYS ((Var "/"):ops) out) = + opOnStack (Var "*") (SYS ops (out ++ [Var "/"])) +opOnStack (Var "*") (SYS ((Var "*"):ops) out) = + opOnStack (Var "*") (SYS ops (out ++ [Var "*"])) +opOnStack (Var "/") (SYS ((Var "*"):ops) out) = + opOnStack (Var "/") (SYS ops (out ++ [Var "*"])) +opOnStack (Var "/") (SYS ((Var "/"):ops) out) = + opOnStack (Var "/") (SYS ops (out ++ [Var "/"])) +opOnStack _ sys = sys + +shuntingYardOp :: Value -> ShuntingYardState -> ShuntingYardState +shuntingYardOp (Var "(") (SYS ops out) = + SYS ((Var "(") : ops) out +shuntingYardOp (Var ")") (SYS [] _) = + SYS [] [] +shuntingYardOp (Var ")") (SYS ((Var "("):ops) out) = + SYS ops out +shuntingYardOp (Var ")") (SYS (op:ops) out) = + shuntingYardOp (Var ")") (SYS ops (out ++ [op])) +shuntingYardOp (Var op) sys = + SYS ((Var op):ops') out' + where + (SYS ops' out') = opOnStack (Var op) sys +shuntingYardOp _ _ = SYS [] [] + +shuntingYardEnd :: ShuntingYardState -> ShuntingYardState +shuntingYardEnd (SYS [] out) = SYS [] out +shuntingYardEnd (SYS (op:ops) out) = shuntingYardEnd (SYS ops (out ++ [op])) diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 4c9879c..c0054a1 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -12,6 +12,9 @@ import Expression import Parser import Alias +import UTParseLvt +import UTShuntingYard + main :: IO () main = defaultMain tests @@ -20,6 +23,8 @@ tests = testGroup "Leviator Tests - Compiler" [ utParserExpression, utParserExpressions, + utParserLvt, + utShuntingYard, utAlias ] diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs new file mode 100644 index 0000000..d419fe2 --- /dev/null +++ b/lvtc/test/UTParseLvt.hs @@ -0,0 +1,89 @@ +module UTParseLvt ( + utParserLvt +) where + +import Test.Tasty +import Test.Tasty.HUnit + +import Parser +import ParseLvt +import AST + +testParserHelper :: String -> String -> Instruction -> IO () +testParserHelper str restExpected expressionExpected = + case runParser parseInstruction str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed + Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") + +testParserHelpers :: String -> String -> [Instruction] -> IO () +testParserHelpers str restExpected expressionExpected = + case runParser parseInstructions str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed + Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") + +utParserLvt :: TestTree +utParserLvt = testGroup "Parse Lvt" + [ + testCase "declare int" $ + testParserHelper "@Int a = 0;\n" + "" + (Declaration (("a", "Int"), Integer 0)) + , testCase "declare bool" $ + testParserHelper "@Bool a = True;\n" + "" + (Declaration (("a", "Bool"), Boolean True)) + , testCase "declare string view" $ + testParserHelper "@StringView a = \"abc\";\n" + "" + (Declaration (("a", "StringView"), StringView "abc")) + , testCase "declare character" $ + testParserHelper "@Char a = 'a';\n" + "" + (Declaration (("a", "Char"), Character 'a')) + , testCase "assign variable" $ + testParserHelper "a = 0;\n" + "" + (Assignation ("a", Integer 0)) + , testCase "call function" $ + testParserHelper "a(0);\n" + "" + (Function ("a", [Integer 0])) + , testCase "call function (no arguments)" $ + testParserHelper "a();\n" + "" + (Function ("a", [])) + , testCase "call function (3 arguments)" $ + testParserHelper "a(0, \"abc\", False);\n" + "" + (Function ("a", [Integer 0, StringView "abc", Boolean False])) + , testCase "return value" $ + testParserHelper "<- 0;\n" + "" + (Return (Integer 0)) + , testCase "condition if" $ + testParserHelper "if (a)\n{\nb(0);\n};\n" + "" + (Cond (Var "a", [Function ("b", [Integer 0])], [])) + , testCase "condition if else" $ + testParserHelper "if (a)\n{\nb(0);\n}\nelse\n{\nc(0);\n};\n" + "" + (Cond (Var "a", [Function ("b", [Integer 0])], [Function ("c", [Integer 0])])) + , testCase "condition if with indent" $ + testParserHelper "if (a)\n{\n b(0);\n};\n" + "" + (Cond (Var "a", [Function ("b", [Integer 0])], [])) + , testCase "condition if else with indent" $ + testParserHelper "if (a)\n{\n b(0);\n}\nelse\n{\n c(0);\n};\n" + "" + (Cond (Var "a", [Function ("b", [Integer 0])], [Function ("c", [Integer 0])])) + , testCase "test multiple instruction" $ + testParserHelpers "@Int a = 0;\n @Int c = b(a);\n if (c)\n {\n d(a);\n };\n" + "" + [ + Declaration (("a", "Int"), Integer 0), + Declaration (("c", "Int"), FuncValue ("b", [Var "a"])), + Cond (Var "c", [Function ("d", [Var "a"])], []) + ] + ] diff --git a/lvtc/test/UTShuntingYard.hs b/lvtc/test/UTShuntingYard.hs new file mode 100644 index 0000000..1a82f1a --- /dev/null +++ b/lvtc/test/UTShuntingYard.hs @@ -0,0 +1,73 @@ +module UTShuntingYard ( + utShuntingYard +) where + +import Test.Tasty +import Test.Tasty.HUnit + +import ShuntingYard +import AST + +utShuntingYard :: TestTree +utShuntingYard = testGroup "ShuntingYard" + [ + testCase "basic" $ + assertEqual "3+5" + (SYS [] [Integer 3, Integer 5, Var "+"]) + basic_end + , testCase "basic basic" $ + assertEqual "3+4+5" + (SYS [] [Integer 3, Integer 4, Var "+", Integer 5, Var "+"]) + basic_basic_end + , testCase "priority *" $ + assertEqual "3+4*5" + (SYS [] [Integer 3, Integer 4, Integer 5, Var "*", Var "+"]) + priority_mul_end + , testCase "priority /" $ + assertEqual "3-4/5" + (SYS [] [Integer 3, Integer 4, Integer 5, Var "/", Var "-"]) + priority_div_end + , testCase "3+4*2/(1-5)" $ + assertEqual "3+4*2/(1-5)" + (SYS [] [Integer 3, Integer 4, Integer 2, Var "*", Integer 1, Integer 5, Var "-", Var "/", Var "+"]) + priority_end + ] + where + basic_1 = shuntingYardValue (Integer 3) (SYS [] []) + basic_2 = shuntingYardOp (Var "+") basic_1 + basic_3 = shuntingYardValue (Integer 5) basic_2 + basic_end = shuntingYardEnd basic_3 + -- + basic_basic_1 = shuntingYardValue (Integer 3) (SYS [] []) + basic_basic_2 = shuntingYardOp (Var "+") basic_basic_1 + basic_basic_3 = shuntingYardValue (Integer 4) basic_basic_2 + basic_basic_4 = shuntingYardOp (Var "+") basic_basic_3 + basic_basic_5 = shuntingYardValue (Integer 5) basic_basic_4 + basic_basic_end = shuntingYardEnd basic_basic_5 + -- + priority_mul_1 = shuntingYardValue (Integer 3) (SYS [] []) + priority_mul_2 = shuntingYardOp (Var "+") priority_mul_1 + priority_mul_3 = shuntingYardValue (Integer 4) priority_mul_2 + priority_mul_4 = shuntingYardOp (Var "*") priority_mul_3 + priority_mul_5 = shuntingYardValue (Integer 5) priority_mul_4 + priority_mul_end = shuntingYardEnd priority_mul_5 + -- + priority_div_1 = shuntingYardValue (Integer 3) (SYS [] []) + priority_div_2 = shuntingYardOp (Var "-") priority_div_1 + priority_div_3 = shuntingYardValue (Integer 4) priority_div_2 + priority_div_4 = shuntingYardOp (Var "/") priority_div_3 + priority_div_5 = shuntingYardValue (Integer 5) priority_div_4 + priority_div_end = shuntingYardEnd priority_div_5 + -- + priority_1 = shuntingYardValue (Integer 3) (SYS [] []) + priority_2 = shuntingYardOp (Var "+") priority_1 + priority_3 = shuntingYardValue (Integer 4) priority_2 + priority_4 = shuntingYardOp (Var "*") priority_3 + priority_5 = shuntingYardValue (Integer 2) priority_4 + priority_6 = shuntingYardOp (Var "/") priority_5 + priority_7 = shuntingYardOp (Var "(") priority_6 + priority_8 = shuntingYardValue (Integer 1) priority_7 + priority_9 = shuntingYardOp (Var "-") priority_8 + priority_10 = shuntingYardValue (Integer 5) priority_9 + priority_11 = shuntingYardOp (Var ")") priority_10 + priority_end = shuntingYardEnd priority_11 diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 4e28df2..d31c93e 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -1,6 +1,6 @@ cabal-version: 2.2 --- This file has been generated from package.yaml by hpack version 0.35.2. +-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack diff --git a/lvtrun/src/Lib.hs b/lvtrun/src/Lib.hs index 3f12ee2..3af99b1 100644 --- a/lvtrun/src/Lib.hs +++ b/lvtrun/src/Lib.hs @@ -1,6 +1,6 @@ {- -- EPITECH PROJECT, 2023 --- Leviator Run +-- Leviator compiler -- File description: -- Lib -} From b5129cca0255e774fbf747635d8e1d69f1b968fc Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 6 Jan 2024 19:48:17 +0100 Subject: [PATCH 22/99] Remove generic mention --- README.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/README.md b/README.md index e3dec68..4f63a75 100644 --- a/README.md +++ b/README.md @@ -79,21 +79,6 @@ fn add(a: Int, b: Int, c: Int) -> Int }; ``` -- **Generic Functions** - -```rust -fn add[A](a: A, b: A) -> A -{ - <- a + b; -}; -``` - -- **Generic Functions Call** - -```rust -add[Int](1, 2); -``` - - **Conditions** ```c From 4f86d0b68cb2e1e509d6b22e9ab24fde2505a983 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 6 Jan 2024 22:37:26 +0100 Subject: [PATCH 23/99] Add start implementation --- lvtc/lvtc.cabal | 1 + lvtc/src/WatLike.hs | 114 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 lvtc/src/WatLike.hs diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 04ee4ee..2255193 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -33,6 +33,7 @@ library Parser ParseUtil ShuntingYard + WatLike other-modules: Paths_lvtc autogen-modules: diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs new file mode 100644 index 0000000..06317f1 --- /dev/null +++ b/lvtc/src/WatLike.hs @@ -0,0 +1,114 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- WatLike +-} + +module WatLike +( + +) where + +import AST + +data WatLikeState = WLS [(Int, String)] [(Int, String)] [Instruction] [Instruction] + +instance Eq WatLikeState where + (==) (WLS y z) (WLS y' z') = y == y' && z == z' + +instance Show WatLikeState where + show (WLS y z) = "WLS[< " ++ show y ++ " >< " ++ show z ++ " >]" + +getRegisterIndex' :: Int -> String -> [(Int, String)] -> [(Int, String), Int] +getRegisterIndex' maxInd var [] = ([(maxInd, var)], maxInd) +getRegisterIndex' maxInd var (x:xs) + | var == snd x = ((x:xs), fst x) + | maxInd > fst x = getRegisterIndex' (maxInd) var xs + | otherwise = getRegisterIndex' ((fst x) + 1) var xs + +getRegisterIndex :: String -> [(Int, String)] -> ([(Int, String)], Int) +getRegisterIndex var indexes = getRegisterIndex' 0 var indexes + +getIndex :: String -> [(Int, String)] -> Maybe Int +getIndex var [] = Nothing +getIndex var (x:xs) + | var == snd x = Just (fst x) + | otherwise = getIndex var xs + +registerAllFuncs :: [FuncDeclaration] -> [(Int, String)] -> [(Int, String)] +registerAllFuncs [] indexes = indexes +registerAllFuncs (((fName, _, _), _):xs) indexes = + registerAllFuncs xs indexes' + where + (indexes', _) = getRegisterIndex fName indexes + +registerAllVars :: [Instruction] -> [(Int, String)] -> [(Int, String)] +registerAllVars [] indexes = indexes +registerAllVars ((Declaration ((vName, _), _)):xs) indexes = + registerAllVars xs indexes' + where + (indexes', _) = getRegisterIndex vName indexes + +------------------------------------------------------------------------------ + +-- TODO: take a value, and split in multiple instruction to get the final value +-- return the final value under the form (Var ind) with the variable to where +-- the value will be +-- TODO: use the pattern matching of InstructionToWatLike +ValueToWatLike :: Value -> WatLikeState -> (WatLikeState, [Instruction], Value) +ValueToWatLike + +-- TODO: remove pattern matching for the value part and call ValueToWatLike +InstructionToWatLike :: Instruction -> WatLikeState -> (WatLikeState, [Instruction]) +InstructionToWatLike + (Declaration ((vName, vTyp), FuncValue x)) + (WLS varsIndex funcsIndex oldFunc newFunc) = +InstructionToWatLike + (Assignation (vName, FuncValue x)) + (WLS varsIndex funcsIndex oldFunc newFunc) = +InstructionToWatLike + (Function x) + (WLS varsIndex funcsIndex oldFunc newFunc) = +InstructionToWatLike + (Return (FuncValue x)) + (WLS varsIndex funcsIndex oldFunc newFunc) = +InstructionToWatLike + (Cond ()) + + +FuncToWatLike' :: FuncDeclaration -> WatLikeState -> (WatLikeState, FuncDeclaration) +FuncToWatLike' ((fName, fParams, fRet), []) wls = (wls, ((fName, fParams, fRet), [])) +FuncToWatLike' ((fName, fParams, fRet), (x:xs)) + (WLS varsIndex funcsIndex oldFunc newFunc) = + +FuncToWatLike :: FuncDeclaration -> WatLikeState -> WatLikeState +FuncToWatLike ((fName, fParams, fRet), fInss) + (WLS varsIndex funcsIndex oldFunc newFunc) = + WLS varsIndex funcsIndex oldFunc newFunc' + where + varsIndex' = registerAllVars fInss varsIndex + (WLS _ _ _ newFunc') = + FuncToWatLike' + ((fName, fParams, fRet), fInss) + (WLS varsIndex' funcsIndex oldFunc newFunc) + +------------------------------------------------------------------------------ + +ASTToWatLike' :: [FuncDeclaration] -> WatLikeState -> WatLikeState +ASTToWatLike' [] (WLS varsIndex funcsIndex oldFunc newFunc) = WLS varsIndex funcsIndex oldFunc newFunc +ASTToWatLike' (((fName, fParams, fRet), fInss):xs) + (WLS varsIndex funcsIndex oldFunc newFunc) = + ASTToWatLike' xs (WLS varsIndex funcsIndex'' oldFunc newFunc') + where + (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex + (WLS _ funcsIndex'' _ newFunc') = + FuncToWatLike + ((show indFunc, fParams, fRet), fInss) + (WLS varsIndex funcsIndex' oldFunc newFunc) + +ASTToWatLike :: [FuncDeclaration] -> [FuncDeclaration] +ASTToWatLike funcs = newFunc + where + funcsIndex = registerAllFuncs funcs [] + (WLS _ _ _ newFunc) = ASTToWatLike' funcs (WLS [] funcsIndex funcs []) From f848b1e925c646a6ea5f8443e5abe3fa12dbce8d Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 7 Jan 2024 01:28:16 +0100 Subject: [PATCH 24/99] add working typesFunc --- lvtrun/app/WasmMod/Sections/Types.hs | 52 ++++++++++------------------ 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/lvtrun/app/WasmMod/Sections/Types.hs b/lvtrun/app/WasmMod/Sections/Types.hs index 7ffb49a..d0cf597 100644 --- a/lvtrun/app/WasmMod/Sections/Types.hs +++ b/lvtrun/app/WasmMod/Sections/Types.hs @@ -13,15 +13,14 @@ module WasmMod.Sections.Types ) where +import qualified Data.ByteString.Lazy as Bs +import Control.Exception (throw) +import Data.Int (Int64) +import Data.Word (Word8) + import WasmMod.Sections import WasmMod.Leb128 -import Data.Int import Errors -import Control.Exception -import qualified Data.ByteString.Lazy as Bs -import Data.Word - -import Debug.Trace data Type = I32 | I64 | F32 | F64 deriving (Show, Eq) @@ -33,12 +32,7 @@ data FuncType = FuncType { instance Show FuncType where show funcType = "(type " ++ (show $ typeId funcType) ++ " (func " ++ - (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")" - ---60 0 0 ---60 1 7f 0 ---60 2 7f 7f 1 7f --- 7f = i32 7e = i64 7d = f32 7c = f64 + (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")\n" getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) getVectorSize content = extractLEB128 content @@ -50,35 +44,27 @@ getTypeFromByte 0x7d = F32 getTypeFromByte 0x7c = F64 getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" -extractParams :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) -extractParams (0, content) = ([], content) -extractParams (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : params, rest) - where (params, rest) = extractParams (idx - 1, Bs.drop 1 content) - -extractResults :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) -extractResults (0, content) = ([], content) -extractResults (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : results, rest) - where (results, rest) = extractResults (idx - 1, Bs.drop 1 content) - extractTypes :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) extractTypes (0, content) = ([], content) +extractTypes (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : types, rest) + where (types, rest) = extractTypes (idx - 1, Bs.drop 1 content) -parseFuncType :: Bs.ByteString -> (FuncType, Bs.ByteString) -parseFuncType content = do - let (params, rest) = extractParams $ getVectorSize content - let (results, rest2) = extractResults $ getVectorSize rest - ((FuncType 0 params results), rest2) +parseFuncType :: Int -> Bs.ByteString -> (FuncType, Bs.ByteString) +parseFuncType id content = do + let (params, rest) = extractTypes (getVectorSize content) + let (results, rest2) = extractTypes (getVectorSize rest) + ((FuncType id params results), rest2) -parseFuncTypes :: Int64 -> Bs.ByteString -> [FuncType] -parseFuncTypes 0 _ = [] -parseFuncTypes idx content +parseFuncTypes :: Int -> Int64 -> Bs.ByteString -> [FuncType] +parseFuncTypes idx maxIdx content + | idx >= (fromIntegral maxIdx) = [] | head (Bs.unpack content) == 0x60 = do - let (funcType, rest) = parseFuncType content - funcType : parseFuncTypes (idx - 1) rest + let (funcType, rest) = parseFuncType idx (Bs.drop 1 content) + funcType : parseFuncTypes (idx + 1) maxIdx rest | otherwise = throw $ WasmError "ParseFuncTypes: 0x60 expected for function" parseTypes :: Section -> [FuncType] parseTypes (Section TypeID _ content) = do let (vecSize, rest) = extractLEB128 content - parseFuncTypes vecSize rest + parseFuncTypes 0 vecSize rest parseTypes _ = [] From 7623136ccb8f6ebeadd45d53bddda8f23861f476 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 7 Jan 2024 02:45:30 +0100 Subject: [PATCH 25/99] add type parsing --- lvtrun/README.md | 22 ++++---- lvtrun/app/Types.hs | 27 ++++++++++ lvtrun/app/WasmMod/Module.hs | 12 ++++- lvtrun/app/WasmMod/Sections/Global.hs | 72 ++++++++++++++++++++++++++ lvtrun/app/WasmMod/Sections/Types.hs | 12 +---- lvtrun/lvtrun.cabal | 2 + lvtrun/test/HexFile | Bin 5188 -> 5184 bytes 7 files changed, 126 insertions(+), 21 deletions(-) create mode 100644 lvtrun/app/Types.hs create mode 100644 lvtrun/app/WasmMod/Sections/Global.hs diff --git a/lvtrun/README.md b/lvtrun/README.md index eb356f5..04bc844 100644 --- a/lvtrun/README.md +++ b/lvtrun/README.md @@ -48,8 +48,8 @@ # ----------------------- 3 ----------------------- # section 3 is the function section with 17 bytes of length -03 11 -10 01 00 01 +03 11 10 +01 00 01 01 01 02 02 00 01 00 00 00 00 02 03 00 @@ -80,14 +80,16 @@ # ----------------------- 6 ----------------------- the global section -06 -12 - -03 7f 01 -41 c7 c7 04 -0b 7f 01 41 -00 0b 7f 01 -41 00 0b +06 12 +# vector of 3 globals +03 +# i32 mut = i32.const 66560 +7f 01 41 c7 c7 04 0b +7f 01 41 00 0b +7f 01 41 00 0b +# (globalType, expr) +# globalType = (valtype, mut) with mut 0x00 = const, 0x01 = var +# expr = (instructions) 0xb # ----------------------- 7 ----------------------- diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs new file mode 100644 index 0000000..fe9cfba --- /dev/null +++ b/lvtrun/app/Types.hs @@ -0,0 +1,27 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Types +-} + +module Types + ( + Type(..), + getTypeFromByte + ) + where + +import Data.Word (Word8) +import Control.Exception (throw) + +import Errors + +data Type = I32 | I64 | F32 | F64 deriving (Show, Eq) + +getTypeFromByte :: Word8 -> Type +getTypeFromByte 0x7f = I32 +getTypeFromByte 0x7e = I64 +getTypeFromByte 0x7d = F32 +getTypeFromByte 0x7c = F64 +getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs index ab54758..8be0de2 100644 --- a/lvtrun/app/WasmMod/Module.hs +++ b/lvtrun/app/WasmMod/Module.hs @@ -13,7 +13,7 @@ module WasmMod.Module where import qualified Data.ByteString.Lazy as BS (ByteString, unpack, readFile) -import Control.Exception (throwIO) +import Control.Exception (throwIO, throw) import Control.Monad (when) import Numeric (showHex) @@ -21,6 +21,7 @@ import Errors import WasmMod.Header import WasmMod.Sections import WasmMod.Sections.Types +import WasmMod.Sections.Global data WasmModule = WasmModule { header :: ModHeader, @@ -38,6 +39,13 @@ instance Show WasmModule where getFileContent :: String -> IO BS.ByteString getFileContent path = BS.readFile path +--TEMP FUNC +getGlobalSection :: [Section] -> Section +getGlobalSection [] = throw (WasmError "No global section") +getGlobalSection (x:xs) + | identifier x == GlobalID = x + | otherwise = getGlobalSection xs + loadModule :: String -> IO WasmModule loadModule filePath = do bytes <- getFileContent filePath @@ -47,4 +55,6 @@ loadModule filePath = do when (not $ areSectionsValid modSections) $ throwIO (WasmError "Invalid sections") let funcType = parseTypes $ head modSections print funcType + let globals = parseGlobals $ getGlobalSection modSections + print globals return $ WasmModule modHeader modSections diff --git a/lvtrun/app/WasmMod/Sections/Global.hs b/lvtrun/app/WasmMod/Sections/Global.hs new file mode 100644 index 0000000..838cfb8 --- /dev/null +++ b/lvtrun/app/WasmMod/Sections/Global.hs @@ -0,0 +1,72 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Global +-} + +module WasmMod.Sections.Global + ( + parseGlobals, + Global(..) + ) +where + +import qualified Data.ByteString.Lazy as Bs +import Control.Exception (throw) +import Data.Word (Word8) +import Data.Int (Int64) + +import WasmMod.Leb128 +import WasmMod.Sections (Section(..), SectionID(..)) +import Types (Type(..), getTypeFromByte) +import Errors + +data Mutability = Const | Var deriving (Show) + +data Global = Global { + globalType :: Type, + mutability :: Mutability, + initExp :: [Word8] +} + +instance Show Global where + show global = "Global: " ++ (show $ globalType global) ++ " " ++ + (show $ mutability global) ++ " " ++ (show $ initExp global) ++ "\n" + +parseMutability :: Word8 -> Mutability +parseMutability 0x00 = Const +parseMutability 0x01 = Var +parseMutability _ = throw $ WasmError "ParseMutability: bad mutability" + +getHexaIndex :: Bs.ByteString -> Int64 -> Int64 +getHexaIndex content idx + | idx >= (fromIntegral $ Bs.length content) = throw $ WasmError "GetHexaIndex: no 0x0b found" + | (head $ Bs.unpack $ Bs.drop (fromIntegral idx) content) == 0x0b = idx + | otherwise = getHexaIndex content (idx + 1) + +extractExpression :: Bs.ByteString -> ([Word8], Bs.ByteString) +extractExpression content = do + let idx = getHexaIndex content 0 + let expression = Bs.take (fromIntegral (idx + 1)) content + (Bs.unpack expression, Bs.drop (fromIntegral (idx + 1)) content) + +parseGlobal :: Bs.ByteString -> (Global, Bs.ByteString) +parseGlobal content = do + let globalType = getTypeFromByte (head $ Bs.unpack content) + let mutability = parseMutability (head $ Bs.unpack $ Bs.drop 1 content) + let (expression, rest) = extractExpression (Bs.drop 2 content) + (Global globalType mutability expression, rest) + +parseGlobals' :: Int64 -> Int64 -> Bs.ByteString -> [Global] +parseGlobals' idx maxIdx content + | idx >= maxIdx = [] + | otherwise = do + let (global, rest) = parseGlobal content + global : parseGlobals' (idx + 1) maxIdx rest + +parseGlobals :: Section -> [Global] +parseGlobals (Section GlobalID _ content) = do + let (vecSize, rest) = extractLEB128 content + parseGlobals' 0 vecSize rest +parseGlobals _ = throw $ WasmError "ParseGlobals: bad section" diff --git a/lvtrun/app/WasmMod/Sections/Types.hs b/lvtrun/app/WasmMod/Sections/Types.hs index d0cf597..152964b 100644 --- a/lvtrun/app/WasmMod/Sections/Types.hs +++ b/lvtrun/app/WasmMod/Sections/Types.hs @@ -21,8 +21,7 @@ import Data.Word (Word8) import WasmMod.Sections import WasmMod.Leb128 import Errors - -data Type = I32 | I64 | F32 | F64 deriving (Show, Eq) +import Types (Type(..), getTypeFromByte) data FuncType = FuncType { typeId :: Int, @@ -37,13 +36,6 @@ instance Show FuncType where getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) getVectorSize content = extractLEB128 content -getTypeFromByte :: Word8 -> Type -getTypeFromByte 0x7f = I32 -getTypeFromByte 0x7e = I64 -getTypeFromByte 0x7d = F32 -getTypeFromByte 0x7c = F64 -getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" - extractTypes :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) extractTypes (0, content) = ([], content) extractTypes (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : types, rest) @@ -67,4 +59,4 @@ parseTypes :: Section -> [FuncType] parseTypes (Section TypeID _ content) = do let (vecSize, rest) = extractLEB128 content parseFuncTypes 0 vecSize rest -parseTypes _ = [] +parseTypes _ = throw $ WasmError "ParseTypes: bad section" diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index f72ef50..e0b6842 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -43,10 +43,12 @@ executable lvtrun-exe main-is: Main.hs other-modules: Errors + Types WasmMod.Header WasmMod.Leb128 WasmMod.Module WasmMod.Sections + WasmMod.Sections.Global WasmMod.Sections.Types Paths_lvtrun autogen-modules: diff --git a/lvtrun/test/HexFile b/lvtrun/test/HexFile index ec8a11540639775745ae7a995ca335177fcafdf5..0e10ef8a4de317f9e272879ed9afa45f7363568a 100644 GIT binary patch delta 10 RcmX@2aX@2&%SMks!T=hL1hD`B delta 9 QcmX@0aYSQ+%R&bc02HhPo&W#< From 9cc4bc6841fa1717431755c3946e6dff0a635ad9 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 7 Jan 2024 22:19:58 +0100 Subject: [PATCH 26/99] Add first part of watlike --- lvtc/app/Main.hs | 12 ++ lvtc/lvtc.cabal | 2 + lvtc/src/Builtins.hs | 22 +++ lvtc/src/WatLike.hs | 333 +++++++++++++++++++++++++++++++---------- lvtc/test/Spec.hs | 4 +- lvtc/test/UTWatLike.hs | 120 +++++++++++++++ 6 files changed, 411 insertions(+), 82 deletions(-) create mode 100644 lvtc/src/Builtins.hs create mode 100644 lvtc/test/UTWatLike.hs diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 13e878a..6f98a16 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -11,6 +11,8 @@ import Expression (parseExpresion, parseAllExpression) import Parser (runParser) import Alias (proceedAlias) import ParseLvt (parseInstruction, parseInstructions) +import WatLike (aSTToWatLike) +import AST test1 :: String test1 = "if (a)\n{\nb(0);\n};\n" @@ -40,6 +42,15 @@ text = aliasInt ++ aliasRetValue ++ funcMain aliasRetValue = "alias retValue 0;\n" funcMain = "fn main () -> int \n{\n <- retValue;\n};\n" +test7 :: [FuncDeclaration] +test7 = + [ + ( + ("add", [("a", "Int"), ("b", "Int")], "Int"), + [Return (FuncValue ("+", [Var "a", Var "b"]))] + ) + ] + main :: IO () main = print (runParser parseInstruction test1) @@ -49,3 +60,4 @@ main = >> print (runParser parseInstruction test5) >> print (runParser parseInstruction test6) >> print (runParser (proceedAlias <$> parseAllExpression) text) + >> print (aSTToWatLike test7) diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 2255193..c2f388d 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -27,6 +27,7 @@ library exposed-modules: Alias AST + Builtins Expression Lib ParseLvt @@ -65,6 +66,7 @@ test-suite lvtc-test other-modules: UTParseLvt UTShuntingYard + UTWatLike Paths_lvtc autogen-modules: Paths_lvtc diff --git a/lvtc/src/Builtins.hs b/lvtc/src/Builtins.hs new file mode 100644 index 0000000..3508b42 --- /dev/null +++ b/lvtc/src/Builtins.hs @@ -0,0 +1,22 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- WatLike +-} + +module Builtins +( + getBuiltinsFunc +) where + +import AST + +getBuiltinsFunc :: [FuncDeclaration] +getBuiltinsFunc = + [ + (("+", [("x", "Int"), ("y", "Int")], "Int"), []), + (("-", [("x", "Int"), ("y", "Int")], "Int"), []), + (("*", [("x", "Int"), ("y", "Int")], "Int"), []), + (("/", [("x", "Int"), ("y", "Int")], "Int"), []) + ] diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index 06317f1..8fe64ec 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -7,108 +7,279 @@ module WatLike ( - + FuncDeclare + , Index + , aSTToWatLike ) where import AST +import Builtins -data WatLikeState = WLS [(Int, String)] [(Int, String)] [Instruction] [Instruction] +import Data.Int (Int32) +import Data.Char (ord) -instance Eq WatLikeState where - (==) (WLS y z) (WLS y' z') = y == y' && z == z' +------------------------------------------------------------------------------ +-- Named Index Vars / Func -instance Show WatLikeState where - show (WLS y z) = "WLS[< " ++ show y ++ " >< " ++ show z ++ " >]" +type Index = (Int, String) +type FuncDeclare = (FuncDeclaration, [Index]) -getRegisterIndex' :: Int -> String -> [(Int, String)] -> [(Int, String), Int] +getRegisterIndex' :: Int -> String -> [Index] -> ([Index], Int) getRegisterIndex' maxInd var [] = ([(maxInd, var)], maxInd) getRegisterIndex' maxInd var (x:xs) - | var == snd x = ((x:xs), fst x) - | maxInd > fst x = getRegisterIndex' (maxInd) var xs - | otherwise = getRegisterIndex' ((fst x) + 1) var xs + | var == snd x = (x:xs, fst x) + | maxInd > fst x = (x : inds, ind) + | otherwise = (x : inds', ind') + where + (inds, ind) = getRegisterIndex' maxInd var xs + (inds', ind') = getRegisterIndex' (fst x + 1) var xs + +getRegisterIndex :: String -> [Index] -> ([Index], Int) +getRegisterIndex = getRegisterIndex' 0 -getRegisterIndex :: String -> [(Int, String)] -> ([(Int, String)], Int) -getRegisterIndex var indexes = getRegisterIndex' 0 var indexes +newIndex' :: Int -> [Index] -> ([Index], Int) +newIndex' maxInd [] = ([(maxInd, "_tmpValue")], maxInd) +newIndex' maxInd (x:xs) + | maxInd > fst x = (x : inds, ind) + | otherwise = (x : inds', ind') + where + (inds, ind) = newIndex' maxInd xs + (inds', ind') = newIndex' (fst x + 1) xs -getIndex :: String -> [(Int, String)] -> Maybe Int -getIndex var [] = Nothing -getIndex var (x:xs) - | var == snd x = Just (fst x) - | otherwise = getIndex var xs +newIndex :: [Index] -> ([Index], Int) +newIndex = newIndex' 0 -registerAllFuncs :: [FuncDeclaration] -> [(Int, String)] -> [(Int, String)] -registerAllFuncs [] indexes = indexes -registerAllFuncs (((fName, _, _), _):xs) indexes = - registerAllFuncs xs indexes' +modifyAllValue :: [Value] -> [Index] -> [Index] -> ([Value], [Index], [Index]) +modifyAllValue [] varsIndex funcsIndex = ([], varsIndex, funcsIndex) +modifyAllValue (x:xs) varsIndex funcsIndex = (val:vals, varsIndex'', funcsIndex'') where - (indexes', _) = getRegisterIndex fName indexes + (val, varsIndex', funcsIndex') = modifyAll' x varsIndex funcsIndex + (vals, varsIndex'', funcsIndex'') = modifyAllValue xs varsIndex' funcsIndex' -registerAllVars :: [Instruction] -> [(Int, String)] -> [(Int, String)] -registerAllVars [] indexes = indexes -registerAllVars ((Declaration ((vName, _), _)):xs) indexes = - registerAllVars xs indexes' +modifyAll' :: Value -> [Index] -> [Index] -> (Value, [Index], [Index]) +modifyAll' (FuncValue (fName, vals)) varsIndex funcsIndex = (newFunc, varsIndex'', funcsIndex'') where - (indexes', _) = getRegisterIndex vName indexes + (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex + (vals', varsIndex'', funcsIndex'') = modifyAllValue vals varsIndex funcsIndex' + newFunc = FuncValue (show indFunc, vals') +modifyAll' (Var vName) varsIndex funcsIndex = (newVar, varsIndex', funcsIndex) + where + (varsIndex', indVar) = getRegisterIndex vName varsIndex + newVar = Var (show indVar) +modifyAll' x varsIndex funcsIndex = (x, varsIndex, funcsIndex) + +modifyAll :: [Instruction] -> [Index] -> [Index] -> ([Instruction], [Index], [Index]) +modifyAll [] varsIndex funcsIndex = ([], varsIndex, funcsIndex) +modifyAll ((Function (fName, vals)):xs) varsIndex funcsIndex = + (newFunc:ins', varsIndex''', funcsIndex''') + where + (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex + (vals', varsIndex'', funcsIndex'') = modifyAllValue vals varsIndex funcsIndex' + newFunc = Function (show indFunc, vals') + (ins', varsIndex''', funcsIndex''') = modifyAll xs varsIndex'' funcsIndex'' +modifyAll ((Return vValue):xs) varsIndex funcsIndex = + (newReturn:ins', varsIndex'', funcsIndex'') + where + (vValue', varsIndex', funcsIndex') =modifyAll' vValue varsIndex funcsIndex + newReturn = Return vValue' + (ins', varsIndex'', funcsIndex'') = modifyAll xs varsIndex' funcsIndex' +modifyAll ((Declaration ((vName, vTyp), vValue)):xs) varsIndex funcsIndex = + (newDeclaration : ins', varsIndex'', funcsIndex'') + where + (varsIndex', ind) = getRegisterIndex vName varsIndex + newDeclaration = Declaration ((show ind, vTyp), vValue) + (ins', varsIndex'', funcsIndex'') = modifyAll xs varsIndex' funcsIndex +modifyAll ((Assignation (vName, vValue)):xs) varsIndex funcsIndex = + (newAssignation:ins', varsIndex''', funcsIndex''') + where + (varsIndex', ind) = getRegisterIndex vName varsIndex + (vValue', varsIndex'', funcsIndex'') = modifyAll' vValue varsIndex' funcsIndex + newAssignation = Assignation (show ind, vValue') + (ins', varsIndex''', funcsIndex''') = modifyAll xs varsIndex'' funcsIndex'' +modifyAll ((Cond (vValue, insIf, insElse)):xs) varsIndex funcsIndex = + (newCond:ins', varsIndex'''', funcsIndex'''') + where + (vValue', varsIndex', funcsIndex') = modifyAll' vValue varsIndex funcsIndex + (insIf', varsIndex'', funcsIndex'') = modifyAll insIf varsIndex' funcsIndex' + (insElse', varsIndex''', funcsIndex''') = modifyAll insElse varsIndex'' funcsIndex'' + newCond = Cond (vValue', insIf', insElse') + (ins', varsIndex'''', funcsIndex'''') = modifyAll xs varsIndex''' funcsIndex''' + +transformType :: Type -> Type +transformType "Void" = "Int" +transformType "Char" = "Int" +transformType "Bool" = "Int" +transformType x = x + +registerParams :: FuncDeclare -> FuncDeclare +registerParams (((fName, [], typ), ins), varsIndex) = + (((fName, [], transformType typ), ins), varsIndex) +registerParams (((fName, (pName, pTyp):vParams, typ), ins), varsIndex) = + (((fName', (show indVar, transformType pTyp):vParams', vTyp'), ins), varsIndex'') + where + (varsIndex', indVar) = getRegisterIndex pName varsIndex + (((fName', vParams', vTyp'), _), varsIndex'') = registerParams (((fName, vParams, typ), ins), varsIndex') + +registerAllFuncs :: [FuncDeclaration] -> [Index] -> [Index] +registerAllFuncs [] funcsIndex = funcsIndex +registerAllFuncs (((fName, _, _), _):xs) funcsIndex = funcsIndex'' + where + (funcsIndex', _) = getRegisterIndex fName funcsIndex + funcsIndex'' = registerAllFuncs xs funcsIndex' + +changeIndexes :: [FuncDeclaration] -> [Index] -> ([FuncDeclare], [Index]) +changeIndexes [] funcsIndex = ([], funcsIndex) +changeIndexes (((fName, vars, typ), ins):xs) funcsIndex = + (newFunc:funcs, funcsIndex''') + where + (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex + (((_, vars', typ'), ins'), varsIndex) = registerParams (((fName, vars, typ), ins), []) + (ins'', varsIndex'', funcsIndex'') = modifyAll ins' varsIndex funcsIndex' + newFunc = (((show indFunc, vars', typ'), ins''), varsIndex'') + (funcs, funcsIndex''') = changeIndexes xs funcsIndex'' ------------------------------------------------------------------------------ --- TODO: take a value, and split in multiple instruction to get the final value --- return the final value under the form (Var ind) with the variable to where --- the value will be --- TODO: use the pattern matching of InstructionToWatLike -ValueToWatLike :: Value -> WatLikeState -> (WatLikeState, [Instruction], Value) -ValueToWatLike - --- TODO: remove pattern matching for the value part and call ValueToWatLike -InstructionToWatLike :: Instruction -> WatLikeState -> (WatLikeState, [Instruction]) -InstructionToWatLike - (Declaration ((vName, vTyp), FuncValue x)) - (WLS varsIndex funcsIndex oldFunc newFunc) = -InstructionToWatLike - (Assignation (vName, FuncValue x)) - (WLS varsIndex funcsIndex oldFunc newFunc) = -InstructionToWatLike - (Function x) - (WLS varsIndex funcsIndex oldFunc newFunc) = -InstructionToWatLike - (Return (FuncValue x)) - (WLS varsIndex funcsIndex oldFunc newFunc) = -InstructionToWatLike - (Cond ()) - - -FuncToWatLike' :: FuncDeclaration -> WatLikeState -> (WatLikeState, FuncDeclaration) -FuncToWatLike' ((fName, fParams, fRet), []) wls = (wls, ((fName, fParams, fRet), [])) -FuncToWatLike' ((fName, fParams, fRet), (x:xs)) - (WLS varsIndex funcsIndex oldFunc newFunc) = - -FuncToWatLike :: FuncDeclaration -> WatLikeState -> WatLikeState -FuncToWatLike ((fName, fParams, fRet), fInss) - (WLS varsIndex funcsIndex oldFunc newFunc) = - WLS varsIndex funcsIndex oldFunc newFunc' - where - varsIndex' = registerAllVars fInss varsIndex - (WLS _ _ _ newFunc') = - FuncToWatLike' - ((fName, fParams, fRet), fInss) - (WLS varsIndex' funcsIndex oldFunc newFunc) +data WatLikeState = WLS [Index] [FuncDeclare] [FuncDeclare] + +instance Eq WatLikeState where + (==) (WLS x y z) (WLS x' y' z') = x == x' && y == y' && z == z' + +instance Show WatLikeState where + show (WLS x y z) = "WLS[[ " ++ show x ++ " ][ " ++ show y ++ " ][ " ++ show z ++ " ]]" ------------------------------------------------------------------------------ -ASTToWatLike' :: [FuncDeclaration] -> WatLikeState -> WatLikeState -ASTToWatLike' [] (WLS varsIndex funcsIndex oldFunc newFunc) = WLS varsIndex funcsIndex oldFunc newFunc -ASTToWatLike' (((fName, fParams, fRet), fInss):xs) - (WLS varsIndex funcsIndex oldFunc newFunc) = - ASTToWatLike' xs (WLS varsIndex funcsIndex'' oldFunc newFunc') +getPrototype :: String -> [FuncDeclare] -> FuncPrototype +getPrototype _ [] = undefined +getPrototype fName ((((fName', vars, typ), _), _):xs) + | fName == fName' = (fName', vars, typ) + | otherwise = getPrototype fName xs + +------------------------------------------------------------------------------ + +funcCallToWatLike :: FuncCall -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction], FuncCall) +funcCallToWatLike (fName, []) _ varsIndex = (varsIndex, [], (fName, [])) +funcCallToWatLike (fName, vVal:vVals) oldFuncs varsIndex = + (varsIndex'', ins ++ inss, (fName, vVal':vVals')) where - (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (WLS _ funcsIndex'' _ newFunc') = - FuncToWatLike - ((show indFunc, fParams, fRet), fInss) - (WLS varsIndex funcsIndex' oldFunc newFunc) + (varsIndex', ins, vVal') = valueToWatLike vVal oldFuncs varsIndex + (varsIndex'', inss, (_, vVals')) = funcCallToWatLike (fName, vVals) oldFuncs varsIndex' + +valueToWatLike :: Value -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction], Value) +valueToWatLike (FuncValue x) (oldFuncs, funcsIndex) varsIndex = + (varsIndex'', ins ++ [newDeclaration], Var (show indVar)) + where + (varsIndex', ins, (fName, vVals)) = funcCallToWatLike x (oldFuncs, funcsIndex) varsIndex + (varsIndex'', indVar) = newIndex varsIndex' + (_, _, typ) = getPrototype fName oldFuncs + newDeclaration = Declaration ((show indVar, typ), FuncValue (fName, vVals)) +valueToWatLike (Boolean True) _ varsIndex = + (varsIndex', [newDeclaration], Var (show indVar)) + where + (varsIndex', indVar) = newIndex varsIndex + newDeclaration = Declaration ((show indVar, "Int"), Integer 1) +valueToWatLike (Boolean False) _ varsIndex = + (varsIndex', [newDeclaration], Var (show indVar)) + where + (varsIndex', indVar) = newIndex varsIndex + newDeclaration = Declaration ((show indVar, "Int"), Integer 0) +valueToWatLike (Character x) _ varsIndex = + (varsIndex', [newDeclaration], Var (show indVar)) + where + (varsIndex', indVar) = newIndex varsIndex + newDeclaration = Declaration ((show indVar, "Int"), Integer (read (show (ord x)) :: Int32)) +valueToWatLike (StringView _) _ _ = undefined +valueToWatLike Void _ varsIndex = + (varsIndex', [newDeclaration], Var (show indVar)) + where + (varsIndex', indVar) = newIndex varsIndex + newDeclaration = Declaration ((show indVar, "Int"), Integer 0) +valueToWatLike (Integer x) _ varsIndex = + (varsIndex', [newDeclaration], Var (show indVar)) + where + (varsIndex', indVar) = newIndex varsIndex + newDeclaration = Declaration ((show indVar, "Int"), Integer x) +valueToWatLike (Var x) _ varsIndex = (varsIndex, [], Var x) + +instructionToWatLike :: Instruction -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction]) +instructionToWatLike + (Declaration ((vName, vTyp), vValue)) oldFuncs varsIndex = + (varsIndex', ins' ++ [newDeclaration]) + where + (varsIndex', ins', vValue') = valueToWatLike vValue oldFuncs varsIndex + newDeclaration = Declaration ((vName, vTyp), vValue') +instructionToWatLike + (Assignation (vName, vValue)) oldFuncs varsIndex = + (varsIndex', ins' ++ [newAssignation]) + where + (varsIndex', ins', vValue') = valueToWatLike vValue oldFuncs varsIndex + newAssignation = Assignation (vName, vValue') +instructionToWatLike + (Function (fName, fParams)) oldFuncs varsIndex = + (varsIndex', ins' ++ [newFunction]) + where + (varsIndex', ins', (_, fParams')) = funcCallToWatLike (fName, fParams) oldFuncs varsIndex + newFunction = Function (fName, fParams') +instructionToWatLike + (Return vValue) oldFuncs varsIndex = + (varsIndex', ins' ++ [newReturn]) + where + (varsIndex', ins', vValue') = valueToWatLike vValue oldFuncs varsIndex + newReturn = Return vValue' +instructionToWatLike + (Cond (vValCond, vInsTrue, vInsFalse)) oldFuncs varsIndex = + (varsIndex''', insCond ++ [newCond]) + where + (varsIndex', insCond, vValCond') = valueToWatLike vValCond oldFuncs varsIndex + (varsIndex'', vInsTrue') = instructionsToWatLike vInsTrue oldFuncs varsIndex' + (varsIndex''', vInsFalse') = instructionsToWatLike vInsFalse oldFuncs varsIndex'' + newCond = Cond (vValCond', vInsTrue', vInsFalse') + +instructionsToWatLike :: [Instruction] -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction]) +instructionsToWatLike [] _ varsIndex = (varsIndex, []) +instructionsToWatLike (x:xs) oldFuncs varsIndex = + (varsIndex'', ins ++ inss) + where + (varsIndex', ins) = instructionToWatLike x oldFuncs varsIndex + (varsIndex'', inss) = instructionsToWatLike xs oldFuncs varsIndex' + +------------------------------------------------------------------------------ + +funcToWatLike' :: FuncDeclare -> ([FuncDeclare], [Index]) -> FuncDeclare +funcToWatLike' (((fName, fParams, fRet), []), varsIndex) _ = (((fName, fParams, fRet), []), varsIndex) +funcToWatLike' (((fName, fParams, fRet), ins:inss), varsIndex) oldFuncs = + (((fName, fParams, fRet), ins' ++ inss'), varsIndex'') + where + (varsIndex', ins') = instructionToWatLike ins oldFuncs varsIndex + (((_, _, _), inss'), varsIndex'') = funcToWatLike' (((fName, fParams, fRet), inss), varsIndex') oldFuncs + +funcToWatLike :: FuncDeclare -> WatLikeState -> WatLikeState +funcToWatLike (((fName, fParams, fRet), fInss), varsIndex) + (WLS funcsIndex oldFuncs newFunc) = + WLS funcsIndex oldFuncs (newFunc ++ [fFunc]) + where + fFunc = funcToWatLike' + (((fName, fParams, fRet), fInss), varsIndex) + (oldFuncs, funcsIndex) + +------------------------------------------------------------------------------ + +aSTToWatLike' :: [FuncDeclare] -> WatLikeState -> WatLikeState +aSTToWatLike' [] (WLS funcsIndex oldFunc newFunc) = WLS funcsIndex oldFunc newFunc +aSTToWatLike' (func:xs) + (WLS funcsIndex oldFunc newFunc) = + aSTToWatLike' xs (WLS funcsIndex' oldFunc newFunc') + where + (WLS funcsIndex' _ newFunc') = + funcToWatLike + func + (WLS funcsIndex oldFunc newFunc) -ASTToWatLike :: [FuncDeclaration] -> [FuncDeclaration] -ASTToWatLike funcs = newFunc +aSTToWatLike :: [FuncDeclaration] -> [FuncDeclare] +aSTToWatLike funcs = newFunc where - funcsIndex = registerAllFuncs funcs [] - (WLS _ _ _ newFunc) = ASTToWatLike' funcs (WLS [] funcsIndex funcs []) + allFuncs = getBuiltinsFunc ++ funcs + funcsIndex = registerAllFuncs allFuncs [] + (funcs', funcsIndex') = changeIndexes allFuncs funcsIndex + (WLS _ _ newFunc) = aSTToWatLike' funcs' (WLS funcsIndex' funcs' []) diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index c0054a1..2693713 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -14,6 +14,7 @@ import Alias import UTParseLvt import UTShuntingYard +import UTWatLike main :: IO () main = defaultMain tests @@ -25,7 +26,8 @@ tests = testGroup "Leviator Tests - Compiler" utParserExpressions, utParserLvt, utShuntingYard, - utAlias + utAlias, + utWatLike ] testParserHelper :: String -> String -> Expression -> IO () diff --git a/lvtc/test/UTWatLike.hs b/lvtc/test/UTWatLike.hs new file mode 100644 index 0000000..aed5f57 --- /dev/null +++ b/lvtc/test/UTWatLike.hs @@ -0,0 +1,120 @@ +module UTWatLike ( + utWatLike +) where + +import Test.Tasty +import Test.Tasty.HUnit + +import WatLike +import AST + +builtinsWat :: [FuncDeclare] +builtinsWat = + [ + ( + (("0", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("1", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("2", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("3", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ) + ] + +utWatLike :: TestTree +utWatLike = testGroup "Wat Like" + [ + testCase "basic" $ + assertEqual "Basic" + basic1_rep + (aSTToWatLike [basic1]) + , testCase "basic basic" $ + assertEqual "Basic Basic" + basic2_rep + (aSTToWatLike basic2) + , testCase "basic basic basic" $ + assertEqual "Basic Basic Basic" + basic3_rep + (aSTToWatLike [basic3]) + ] + where + basic1 = + ( + ("add", [("a", "Int"), ("b", "Int")], "Int"), + [Return (FuncValue ("+", [Var "a", Var "b"]))] + ) + basic1_rep = + builtinsWat ++ [ + ( + ( + ("4", [("0", "Int"), ("1", "Int")], "Int"), + [ + Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), + Return (Var "2") + ] + ), + [(0, "a"), (1, "b"), (2, "_tmpValue")] + ) + ] + basic2 = + [ + ( + ("add", [("a", "Int"), ("b", "Int")], "Int"), + [Return (FuncValue ("+", [Var "a", Var "b"]))] + ), + ( + ("start", [], "Int"), + [Return (FuncValue ("add", [Integer 1, Integer 2]))] + ) + ] + basic2_rep = + builtinsWat ++ [ + ( + ( + ("4", [("0", "Int"), ("1", "Int")], "Int"), + [ + Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), + Return (Var "2") + ] + ), + [(0, "a"), (1, "b"), (2, "_tmpValue")] + ), + ( + ( + ("5", [], "Int"), + [ + Declaration (("0", "Int"), Integer 1), + Declaration (("1", "Int"), Integer 2), + Declaration (("2", "Int"), FuncValue ("4", [Var "0", Var "1"])), + Return (Var "2") + ] + ), + [(0, "_tmpValue"), (1, "_tmpValue"), (2, "_tmpValue")] + ) + ] + basic3 = + ( + ("getC", [], "Char"), + [Return (Character 'a')] + ) + basic3_rep = + builtinsWat ++ [ + ( + ( + ("4", [], "Int"), + [ + Declaration (("0", "Int"), Integer 97), + Return (Var "0") + ] + ), + [(0, "_tmpValue")] + ) + ] From 55cb491528cdab679a2272c14fb6cb6b4202e370 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 7 Jan 2024 22:31:13 +0100 Subject: [PATCH 27/99] Fix norm --- lvtc/src/WatLike.hs | 106 ++++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 38 deletions(-) diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index 8fe64ec..afd13ab 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -51,16 +51,20 @@ newIndex = newIndex' 0 modifyAllValue :: [Value] -> [Index] -> [Index] -> ([Value], [Index], [Index]) modifyAllValue [] varsIndex funcsIndex = ([], varsIndex, funcsIndex) -modifyAllValue (x:xs) varsIndex funcsIndex = (val:vals, varsIndex'', funcsIndex'') +modifyAllValue (x:xs) varsIndex funcsIndex = + (val:vals, varsIndex'', funcsIndex'') where (val, varsIndex', funcsIndex') = modifyAll' x varsIndex funcsIndex - (vals, varsIndex'', funcsIndex'') = modifyAllValue xs varsIndex' funcsIndex' + (vals, varsIndex'', funcsIndex'') = + modifyAllValue xs varsIndex' funcsIndex' modifyAll' :: Value -> [Index] -> [Index] -> (Value, [Index], [Index]) -modifyAll' (FuncValue (fName, vals)) varsIndex funcsIndex = (newFunc, varsIndex'', funcsIndex'') +modifyAll' (FuncValue (fName, vals)) varsIndex funcsIndex = + (newFunc, varsIndex'', funcsIndex'') where (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (vals', varsIndex'', funcsIndex'') = modifyAllValue vals varsIndex funcsIndex' + (vals', varsIndex'', funcsIndex'') = + modifyAllValue vals varsIndex funcsIndex' newFunc = FuncValue (show indFunc, vals') modifyAll' (Var vName) varsIndex funcsIndex = (newVar, varsIndex', funcsIndex) where @@ -68,19 +72,25 @@ modifyAll' (Var vName) varsIndex funcsIndex = (newVar, varsIndex', funcsIndex) newVar = Var (show indVar) modifyAll' x varsIndex funcsIndex = (x, varsIndex, funcsIndex) -modifyAll :: [Instruction] -> [Index] -> [Index] -> ([Instruction], [Index], [Index]) +--- + +modifyAll :: [Instruction] -> [Index] -> [Index] + -> ([Instruction], [Index], [Index]) modifyAll [] varsIndex funcsIndex = ([], varsIndex, funcsIndex) modifyAll ((Function (fName, vals)):xs) varsIndex funcsIndex = (newFunc:ins', varsIndex''', funcsIndex''') where (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (vals', varsIndex'', funcsIndex'') = modifyAllValue vals varsIndex funcsIndex' + (vals', varsIndex'', funcsIndex'') = + modifyAllValue vals varsIndex funcsIndex' newFunc = Function (show indFunc, vals') - (ins', varsIndex''', funcsIndex''') = modifyAll xs varsIndex'' funcsIndex'' + (ins', varsIndex''', funcsIndex''') = + modifyAll xs varsIndex'' funcsIndex'' modifyAll ((Return vValue):xs) varsIndex funcsIndex = (newReturn:ins', varsIndex'', funcsIndex'') where - (vValue', varsIndex', funcsIndex') =modifyAll' vValue varsIndex funcsIndex + (vValue', varsIndex', funcsIndex') = + modifyAll' vValue varsIndex funcsIndex newReturn = Return vValue' (ins', varsIndex'', funcsIndex'') = modifyAll xs varsIndex' funcsIndex' modifyAll ((Declaration ((vName, vTyp), vValue)):xs) varsIndex funcsIndex = @@ -93,17 +103,19 @@ modifyAll ((Assignation (vName, vValue)):xs) varsIndex funcsIndex = (newAssignation:ins', varsIndex''', funcsIndex''') where (varsIndex', ind) = getRegisterIndex vName varsIndex - (vValue', varsIndex'', funcsIndex'') = modifyAll' vValue varsIndex' funcsIndex + (vValue', varsIndex'', funcsIndex'') = + modifyAll' vValue varsIndex' funcsIndex newAssignation = Assignation (show ind, vValue') - (ins', varsIndex''', funcsIndex''') = modifyAll xs varsIndex'' funcsIndex'' -modifyAll ((Cond (vValue, insIf, insElse)):xs) varsIndex funcsIndex = - (newCond:ins', varsIndex'''', funcsIndex'''') + (ins', varsIndex''', funcsIndex''') = + modifyAll xs varsIndex'' funcsIndex'' +modifyAll ((Cond (vValue, insIf, insElse)):xs) vsInd fsInd = + (newCond:ins', vsInd'''', fsInd'''') where - (vValue', varsIndex', funcsIndex') = modifyAll' vValue varsIndex funcsIndex - (insIf', varsIndex'', funcsIndex'') = modifyAll insIf varsIndex' funcsIndex' - (insElse', varsIndex''', funcsIndex''') = modifyAll insElse varsIndex'' funcsIndex'' + (vValue', vsInd', fsInd') = modifyAll' vValue vsInd fsInd + (insIf', vsInd'', fsInd'') = modifyAll insIf vsInd' fsInd' + (insElse', vsInd''', fsInd''') = modifyAll insElse vsInd'' fsInd'' newCond = Cond (vValue', insIf', insElse') - (ins', varsIndex'''', funcsIndex'''') = modifyAll xs varsIndex''' funcsIndex''' + (ins', vsInd'''', fsInd'''') = modifyAll xs vsInd''' fsInd''' transformType :: Type -> Type transformType "Void" = "Int" @@ -115,10 +127,12 @@ registerParams :: FuncDeclare -> FuncDeclare registerParams (((fName, [], typ), ins), varsIndex) = (((fName, [], transformType typ), ins), varsIndex) registerParams (((fName, (pName, pTyp):vParams, typ), ins), varsIndex) = - (((fName', (show indVar, transformType pTyp):vParams', vTyp'), ins), varsIndex'') + (((fName', newParams:vParams', vTyp'), ins), varsIndex'') where (varsIndex', indVar) = getRegisterIndex pName varsIndex - (((fName', vParams', vTyp'), _), varsIndex'') = registerParams (((fName, vParams, typ), ins), varsIndex') + (((fName', vParams', vTyp'), _), varsIndex'') = + registerParams (((fName, vParams, typ), ins), varsIndex') + newParams = (show indVar, transformType pTyp) registerAllFuncs :: [FuncDeclaration] -> [Index] -> [Index] registerAllFuncs [] funcsIndex = funcsIndex @@ -133,8 +147,10 @@ changeIndexes (((fName, vars, typ), ins):xs) funcsIndex = (newFunc:funcs, funcsIndex''') where (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (((_, vars', typ'), ins'), varsIndex) = registerParams (((fName, vars, typ), ins), []) - (ins'', varsIndex'', funcsIndex'') = modifyAll ins' varsIndex funcsIndex' + (((_, vars', typ'), ins'), varsIndex) = + registerParams (((fName, vars, typ), ins), []) + (ins'', varsIndex'', funcsIndex'') = + modifyAll ins' varsIndex funcsIndex' newFunc = (((show indFunc, vars', typ'), ins''), varsIndex'') (funcs, funcsIndex''') = changeIndexes xs funcsIndex'' @@ -146,7 +162,8 @@ instance Eq WatLikeState where (==) (WLS x y z) (WLS x' y' z') = x == x' && y == y' && z == z' instance Show WatLikeState where - show (WLS x y z) = "WLS[[ " ++ show x ++ " ][ " ++ show y ++ " ][ " ++ show z ++ " ]]" + show (WLS x y z) = + "WLS[[ " ++ show x ++ " ][ " ++ show y ++ " ][ " ++ show z ++ " ]]" ------------------------------------------------------------------------------ @@ -158,22 +175,27 @@ getPrototype fName ((((fName', vars, typ), _), _):xs) ------------------------------------------------------------------------------ -funcCallToWatLike :: FuncCall -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction], FuncCall) +funcCallToWatLike :: FuncCall -> ([FuncDeclare], [Index]) -> [Index] + -> ([Index], [Instruction], FuncCall) funcCallToWatLike (fName, []) _ varsIndex = (varsIndex, [], (fName, [])) funcCallToWatLike (fName, vVal:vVals) oldFuncs varsIndex = (varsIndex'', ins ++ inss, (fName, vVal':vVals')) where (varsIndex', ins, vVal') = valueToWatLike vVal oldFuncs varsIndex - (varsIndex'', inss, (_, vVals')) = funcCallToWatLike (fName, vVals) oldFuncs varsIndex' + (varsIndex'', inss, (_, vVals')) = + funcCallToWatLike (fName, vVals) oldFuncs varsIndex' -valueToWatLike :: Value -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction], Value) +valueToWatLike :: Value -> ([FuncDeclare], [Index]) -> [Index] + -> ([Index], [Instruction], Value) valueToWatLike (FuncValue x) (oldFuncs, funcsIndex) varsIndex = (varsIndex'', ins ++ [newDeclaration], Var (show indVar)) where - (varsIndex', ins, (fName, vVals)) = funcCallToWatLike x (oldFuncs, funcsIndex) varsIndex + (varsIndex', ins, (fName, vVals)) = + funcCallToWatLike x (oldFuncs, funcsIndex) varsIndex (varsIndex'', indVar) = newIndex varsIndex' (_, _, typ) = getPrototype fName oldFuncs - newDeclaration = Declaration ((show indVar, typ), FuncValue (fName, vVals)) + newDeclaration = + Declaration ((show indVar, typ), FuncValue (fName, vVals)) valueToWatLike (Boolean True) _ varsIndex = (varsIndex', [newDeclaration], Var (show indVar)) where @@ -188,7 +210,8 @@ valueToWatLike (Character x) _ varsIndex = (varsIndex', [newDeclaration], Var (show indVar)) where (varsIndex', indVar) = newIndex varsIndex - newDeclaration = Declaration ((show indVar, "Int"), Integer (read (show (ord x)) :: Int32)) + ordChar = read (show (ord x)) :: Int32 + newDeclaration = Declaration ((show indVar, "Int"), Integer ordChar) valueToWatLike (StringView _) _ _ = undefined valueToWatLike Void _ varsIndex = (varsIndex', [newDeclaration], Var (show indVar)) @@ -202,7 +225,8 @@ valueToWatLike (Integer x) _ varsIndex = newDeclaration = Declaration ((show indVar, "Int"), Integer x) valueToWatLike (Var x) _ varsIndex = (varsIndex, [], Var x) -instructionToWatLike :: Instruction -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction]) +instructionToWatLike :: Instruction -> ([FuncDeclare], [Index]) -> [Index] + -> ([Index], [Instruction]) instructionToWatLike (Declaration ((vName, vTyp), vValue)) oldFuncs varsIndex = (varsIndex', ins' ++ [newDeclaration]) @@ -219,7 +243,8 @@ instructionToWatLike (Function (fName, fParams)) oldFuncs varsIndex = (varsIndex', ins' ++ [newFunction]) where - (varsIndex', ins', (_, fParams')) = funcCallToWatLike (fName, fParams) oldFuncs varsIndex + (varsIndex', ins', (_, fParams')) = + funcCallToWatLike (fName, fParams) oldFuncs varsIndex newFunction = Function (fName, fParams') instructionToWatLike (Return vValue) oldFuncs varsIndex = @@ -228,15 +253,17 @@ instructionToWatLike (varsIndex', ins', vValue') = valueToWatLike vValue oldFuncs varsIndex newReturn = Return vValue' instructionToWatLike - (Cond (vValCond, vInsTrue, vInsFalse)) oldFuncs varsIndex = - (varsIndex''', insCond ++ [newCond]) + (Cond (vValCond, vInsTrue, vInsFalse)) oldFuncs vsInd = + (vsInd''', insCond ++ [newCond]) where - (varsIndex', insCond, vValCond') = valueToWatLike vValCond oldFuncs varsIndex - (varsIndex'', vInsTrue') = instructionsToWatLike vInsTrue oldFuncs varsIndex' - (varsIndex''', vInsFalse') = instructionsToWatLike vInsFalse oldFuncs varsIndex'' + (vsInd', insCond, vValCond') = valueToWatLike vValCond oldFuncs vsInd + (vsInd'', vInsTrue') = instructionsToWatLike vInsTrue oldFuncs vsInd' + (vsInd''', vInsFalse') = + instructionsToWatLike vInsFalse oldFuncs vsInd'' newCond = Cond (vValCond', vInsTrue', vInsFalse') -instructionsToWatLike :: [Instruction] -> ([FuncDeclare], [Index]) -> [Index] -> ([Index], [Instruction]) +instructionsToWatLike :: [Instruction] -> ([FuncDeclare], [Index]) + -> [Index] -> ([Index], [Instruction]) instructionsToWatLike [] _ varsIndex = (varsIndex, []) instructionsToWatLike (x:xs) oldFuncs varsIndex = (varsIndex'', ins ++ inss) @@ -247,12 +274,14 @@ instructionsToWatLike (x:xs) oldFuncs varsIndex = ------------------------------------------------------------------------------ funcToWatLike' :: FuncDeclare -> ([FuncDeclare], [Index]) -> FuncDeclare -funcToWatLike' (((fName, fParams, fRet), []), varsIndex) _ = (((fName, fParams, fRet), []), varsIndex) +funcToWatLike' (((fName, fParams, fRet), []), varsIndex) _ = + (((fName, fParams, fRet), []), varsIndex) funcToWatLike' (((fName, fParams, fRet), ins:inss), varsIndex) oldFuncs = (((fName, fParams, fRet), ins' ++ inss'), varsIndex'') where (varsIndex', ins') = instructionToWatLike ins oldFuncs varsIndex - (((_, _, _), inss'), varsIndex'') = funcToWatLike' (((fName, fParams, fRet), inss), varsIndex') oldFuncs + thisFunc = (((fName, fParams, fRet), inss), varsIndex') + (((_, _, _), inss'), varsIndex'') = funcToWatLike' thisFunc oldFuncs funcToWatLike :: FuncDeclare -> WatLikeState -> WatLikeState funcToWatLike (((fName, fParams, fRet), fInss), varsIndex) @@ -266,7 +295,8 @@ funcToWatLike (((fName, fParams, fRet), fInss), varsIndex) ------------------------------------------------------------------------------ aSTToWatLike' :: [FuncDeclare] -> WatLikeState -> WatLikeState -aSTToWatLike' [] (WLS funcsIndex oldFunc newFunc) = WLS funcsIndex oldFunc newFunc +aSTToWatLike' [] (WLS funcsIndex oldFunc newFunc) = + WLS funcsIndex oldFunc newFunc aSTToWatLike' (func:xs) (WLS funcsIndex oldFunc newFunc) = aSTToWatLike' xs (WLS funcsIndex' oldFunc newFunc') From 84af1a617a74238ee4b737ea76abf16b32108440 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Mon, 8 Jan 2024 11:54:26 +0100 Subject: [PATCH 28/99] Add header --- lvtc/src/Builtins.hs | 2 +- lvtc/test/UTParseLvt.hs | 7 +++++++ lvtc/test/UTShuntingYard.hs | 7 +++++++ lvtc/test/UTWatLike.hs | 7 +++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lvtc/src/Builtins.hs b/lvtc/src/Builtins.hs index 3508b42..387c7fc 100644 --- a/lvtc/src/Builtins.hs +++ b/lvtc/src/Builtins.hs @@ -2,7 +2,7 @@ -- EPITECH PROJECT, 2023 -- Leviator compiler -- File description: --- WatLike +-- Builtins -} module Builtins diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index d419fe2..302fb0c 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -1,3 +1,10 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- UTParseLvt +-} + module UTParseLvt ( utParserLvt ) where diff --git a/lvtc/test/UTShuntingYard.hs b/lvtc/test/UTShuntingYard.hs index 1a82f1a..d8c15c3 100644 --- a/lvtc/test/UTShuntingYard.hs +++ b/lvtc/test/UTShuntingYard.hs @@ -1,3 +1,10 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- UTShuntingYard +-} + module UTShuntingYard ( utShuntingYard ) where diff --git a/lvtc/test/UTWatLike.hs b/lvtc/test/UTWatLike.hs index aed5f57..f0085d2 100644 --- a/lvtc/test/UTWatLike.hs +++ b/lvtc/test/UTWatLike.hs @@ -1,3 +1,10 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- UTWatLike +-} + module UTWatLike ( utWatLike ) where From d58c0f1ea892ae220ea591468b58b6209c9c8aea Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Mon, 8 Jan 2024 14:56:59 +0100 Subject: [PATCH 29/99] Add operators and add parse func declaration --- lvtc/app/Main.hs | 6 ++- lvtc/src/ParseLvt.hs | 107 +++++++++++++++++++++++++++++---------- lvtc/src/ShuntingYard.hs | 63 +++++++++++++---------- lvtc/test/UTParseLvt.hs | 16 ++++++ 4 files changed, 136 insertions(+), 56 deletions(-) diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 13e878a..821b444 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -10,7 +10,7 @@ module Main (main) where import Expression (parseExpresion, parseAllExpression) import Parser (runParser) import Alias (proceedAlias) -import ParseLvt (parseInstruction, parseInstructions) +import ParseLvt (parseInstruction, parseInstructions, parseFuncDeclaration) test1 :: String test1 = "if (a)\n{\nb(0);\n};\n" @@ -40,6 +40,9 @@ text = aliasInt ++ aliasRetValue ++ funcMain aliasRetValue = "alias retValue 0;\n" funcMain = "fn main () -> int \n{\n <- retValue;\n};\n" +test8 :: String +test8 = "fn abc(a: Int) -> Int\n{\n <- a;\n};\n" + main :: IO () main = print (runParser parseInstruction test1) @@ -49,3 +52,4 @@ main = >> print (runParser parseInstruction test5) >> print (runParser parseInstruction test6) >> print (runParser (proceedAlias <$> parseAllExpression) text) + >> print (runParser parseFuncDeclaration test8) diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 6a8daaa..8d4ea22 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -24,6 +24,8 @@ module ParseLvt parseDeclaration, parseAssignation, parseCond, + -- Function + parseFuncDeclaration ) where import Control.Applicative @@ -52,6 +54,8 @@ lexeme ('*':' ':xs) = lexeme ("*" ++ xs) lexeme ('/':' ':xs) = lexeme ("/" ++ xs) lexeme ('(':' ':xs) = lexeme ("(" ++ xs) lexeme (')':' ':xs) = lexeme (")" ++ xs) +lexeme (':':' ':xs) = lexeme (":" ++ xs) +lexeme (' ':':':xs) = lexeme (":" ++ xs) lexeme (x:xs) = x : lexeme xs parseBoolean :: Parser Value @@ -113,15 +117,11 @@ parseOperatorFstVal = Parser f parseOperatorOp :: Parser Value parseOperatorOp = - f - <$> (parseString "+" - <|> parseString "-" - <|> parseString "*" - <|> parseString "/" - <|> parseString "(" - <|> parseString ")") - where - f op = Var op + Var + <$> (parseString "+" <|> parseString "-" <|> parseString "*" + <|> parseString "/" <|> parseString "(" <|> parseString ")" + <|> parseString "==" <|> parseString "!=" <|> parseString "<" + <|> parseString ">" <|> parseString "<=" <|> parseString ">=") parseOperator' :: ShuntingYardState -> Parser ShuntingYardState parseOperator' sys = @@ -131,24 +131,26 @@ parseOperator' sys = fVal val = shuntingYardValue val sys fOp op = shuntingYardOp op sys +parseOperatorTransform'' :: [Value] -> Maybe [Value] +parseOperatorTransform'' (x1:x2:(Var op):rest) + | isOperator op = Just (FuncValue (op, [x1, x2]) : rest) + | otherwise = case parseOperatorTransform' rest of + Nothing -> Nothing + Just ys -> Just (x1:x2:ys) +parseOperatorTransform'' _ = Nothing + parseOperatorTransform' :: [Value] -> Maybe [Value] parseOperatorTransform' [] = Just [] -parseOperatorTransform' (_:(Var "+"):_) = Nothing -parseOperatorTransform' (_:(Var "-"):_) = Nothing -parseOperatorTransform' (_:(Var "*"):_) = Nothing -parseOperatorTransform' (_:(Var "/"):_) = Nothing -parseOperatorTransform' (x1:x2:(Var "+"):rest) = - Just ((FuncValue ("+", [x1, x2])) : rest) -parseOperatorTransform' (x1:x2:(Var "-"):rest) = - Just ((FuncValue ("-", [x1, x2])) : rest) -parseOperatorTransform' (x1:x2:(Var "*"):rest) = - Just ((FuncValue ("*", [x1, x2])) : rest) -parseOperatorTransform' (x1:x2:(Var "/"):rest) = - Just ((FuncValue ("/", [x1, x2])) : rest) -parseOperatorTransform' (x:xs) = - case parseOperatorTransform' xs of - Nothing -> Nothing - Just ys -> Just (x:ys) +parseOperatorTransform' [x] = Just [x] +parseOperatorTransform' [_, _] = Nothing +parseOperatorTransform' (x1:(Var op):rest) + | isOperator op = Nothing + | otherwise = parseOperatorTransform'' (x1 : Var op : rest) +parseOperatorTransform' (x1:x2:(Var op):rest) = + parseOperatorTransform'' (x1 : x2 : Var op : rest) +parseOperatorTransform' (x:xs) = case parseOperatorTransform' xs of + Nothing -> Nothing + Just ys -> Just (x:ys) parseOperatorTransform :: [Value] -> Maybe Value parseOperatorTransform [] = Nothing @@ -156,7 +158,7 @@ parseOperatorTransform vals = case parseOperatorTransform' vals of Nothing -> Nothing Just [] -> Nothing - Just (x:[]) -> Just x + Just [x] -> Just x Just (x:rest) -> parseOperatorTransform (x:rest) parseOperatorS :: ShuntingYardState -> Parser ShuntingYardState @@ -231,10 +233,10 @@ parseFunction :: Parser Instruction parseFunction = parseCall parseReturn :: Parser Instruction -parseReturn = Return <$> (parseString "<- " *> parseValue) +parseReturn = Return <$> ((parseString "<- " <|> parseString "<-") *> parseValue) parseType :: Parser String -parseType = +parseType = parseString "Bool" <|> parseString "Int" <|> parseString "Char" @@ -310,3 +312,52 @@ parseInstructions :: Parser [Instruction] parseInstructions = Parser f where f str = runParser (some parseInstruction) (lexeme str) + +parseFuncVar :: Parser Var +parseFuncVar = Parser f + where + f str = case runParser (parseVar <* parseString ":") (lexeme str) of + Nothing -> Nothing + Just (Var x, xs) -> runParser (lmbda x <$> parseType) xs + _notVar -> Nothing + lmbda var typ = (var, typ) + +parseFuncVars :: Parser [Var] +parseFuncVars = + parseChar '(' *> + some + (parseFuncVar + <* (parseString "," <|> parseString " ," <|> parseString ", ") + <|> parseFuncVar) + <* parseChar ')' + +parseFuncName :: Parser Symbol +parseFuncName = Parser f + where + f str = case runParser + ((parseString "export fn " <|> parseString "fn ") *> parseVar) + str + of + Nothing -> Nothing + Just (Var x, xs) -> Just (x, xs) + _notVar -> Nothing + +parseFuncType :: Parser Type +parseFuncType = + (parseString " -> " + <|> parseString "-> " + <|> parseString "->") *> parseType <* parseString "\n{\n" + +parseFuncPrototype :: Parser FuncPrototype +parseFuncPrototype = + (,,) + <$> parseFuncName + <*> parseFuncVars + <*> parseFuncType + +parseFuncDeclaration :: Parser FuncDeclaration +parseFuncDeclaration = + (,) + <$> parseFuncPrototype + <*> parseInstructions + <* parseString "};\n" diff --git a/lvtc/src/ShuntingYard.hs b/lvtc/src/ShuntingYard.hs index 9a308dd..d010d3e 100644 --- a/lvtc/src/ShuntingYard.hs +++ b/lvtc/src/ShuntingYard.hs @@ -10,7 +10,8 @@ module ShuntingYard shuntingYardOp, shuntingYardEnd, shuntingYardValue, - ShuntingYardState (..) + ShuntingYardState (..), + isOperator ) where import AST @@ -26,36 +27,44 @@ instance Show ShuntingYardState where shuntingYardValue :: Value -> ShuntingYardState -> ShuntingYardState shuntingYardValue val (SYS ops out) = SYS ops (out ++ [val]) +isOperator :: String -> Bool +isOperator "!=" = True +isOperator "==" = True +isOperator "<" = True +isOperator ">" = True +isOperator "<=" = True +isOperator ">=" = True +isOperator "+" = True +isOperator "-" = True +isOperator "*" = True +isOperator "/" = True +isOperator _ = False + +getPrecedence :: String -> Int +getPrecedence "!=" = 1 +getPrecedence "==" = 1 +getPrecedence "<" = 1 +getPrecedence ">" = 1 +getPrecedence "<=" = 1 +getPrecedence ">=" = 1 +getPrecedence "+" = 2 +getPrecedence "-" = 2 +getPrecedence "*" = 3 +getPrecedence "/" = 3 +getPrecedence _ = 0 + opOnStack :: Value -> ShuntingYardState -> ShuntingYardState -opOnStack (Var "+") (SYS ((Var "*"):ops) out) = - opOnStack (Var "+") (SYS ops (out ++ [Var "*"])) -opOnStack (Var "+") (SYS ((Var "/"):ops) out) = - opOnStack (Var "+") (SYS ops (out ++ [Var "/"])) -opOnStack (Var "+") (SYS ((Var "-"):ops) out) = - opOnStack (Var "+") (SYS ops (out ++ [Var "-"])) -opOnStack (Var "+") (SYS ((Var "+"):ops) out) = - opOnStack (Var "+") (SYS ops (out ++ [Var "+"])) -opOnStack (Var "-") (SYS ((Var "*"):ops) out) = - opOnStack (Var "-") (SYS ops (out ++ [Var "*"])) -opOnStack (Var "-") (SYS ((Var "/"):ops) out) = - opOnStack (Var "-") (SYS ops (out ++ [Var "/"])) -opOnStack (Var "-") (SYS ((Var "+"):ops) out) = - opOnStack (Var "-") (SYS ops (out ++ [Var "+"])) -opOnStack (Var "-") (SYS ((Var "-"):ops) out) = - opOnStack (Var "-") (SYS ops (out ++ [Var "-"])) -opOnStack (Var "*") (SYS ((Var "/"):ops) out) = - opOnStack (Var "*") (SYS ops (out ++ [Var "/"])) -opOnStack (Var "*") (SYS ((Var "*"):ops) out) = - opOnStack (Var "*") (SYS ops (out ++ [Var "*"])) -opOnStack (Var "/") (SYS ((Var "*"):ops) out) = - opOnStack (Var "/") (SYS ops (out ++ [Var "*"])) -opOnStack (Var "/") (SYS ((Var "/"):ops) out) = - opOnStack (Var "/") (SYS ops (out ++ [Var "/"])) +opOnStack (Var op1) (SYS ((Var op2):ops) out) + | prec2 >= prec1 = opOnStack (Var op1) (SYS ops (out ++ [Var op2])) + | otherwise = SYS (Var op2:ops) out + where + prec1 = getPrecedence op1 + prec2 = getPrecedence op2 opOnStack _ sys = sys shuntingYardOp :: Value -> ShuntingYardState -> ShuntingYardState shuntingYardOp (Var "(") (SYS ops out) = - SYS ((Var "(") : ops) out + SYS (Var "(" : ops) out shuntingYardOp (Var ")") (SYS [] _) = SYS [] [] shuntingYardOp (Var ")") (SYS ((Var "("):ops) out) = @@ -63,7 +72,7 @@ shuntingYardOp (Var ")") (SYS ((Var "("):ops) out) = shuntingYardOp (Var ")") (SYS (op:ops) out) = shuntingYardOp (Var ")") (SYS ops (out ++ [op])) shuntingYardOp (Var op) sys = - SYS ((Var op):ops') out' + SYS (Var op:ops') out' where (SYS ops' out') = opOnStack (Var op) sys shuntingYardOp _ _ = SYS [] [] diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index d419fe2..d72587c 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -16,6 +16,13 @@ testParserHelper str restExpected expressionExpected = assertEqual str expressionExpected parsed Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") +testParserFunc :: String -> String -> FuncDeclaration -> IO () +testParserFunc str restExpected expressionExpected = + case runParser parseFuncDeclaration str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed + Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") + testParserHelpers :: String -> String -> [Instruction] -> IO () testParserHelpers str restExpected expressionExpected = case runParser parseInstructions str of @@ -86,4 +93,13 @@ utParserLvt = testGroup "Parse Lvt" Declaration (("c", "Int"), FuncValue ("b", [Var "a"])), Cond (Var "c", [Function ("d", [Var "a"])], []) ] + , testCase "test func" $ + testParserFunc "fn abc(a: Int) -> Int\n{\n <- a;\n};\n" + "" + ( + ("abc", [("a", "Int")], "Int"), + [ + Return (Var "a") + ] + ) ] From 225d8289e1afa3983d9adb9f3b069749878326f2 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Mon, 8 Jan 2024 15:09:01 +0100 Subject: [PATCH 30/99] Fix lexeme wtf --- lvtc/app/Main.hs | 1 - lvtc/src/ParseLvt.hs | 2 +- lvtc/test/UTParseLvt.hs | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index f09d621..427c063 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -11,7 +11,6 @@ import Expression (parseExpresion, parseAllExpression) import Parser (runParser) import Alias (proceedAlias) import ParseLvt (parseInstruction, parseInstructions, parseFuncDeclaration) -import ParseLvt (parseInstruction, parseInstructions) import WatLike (aSTToWatLike) import AST diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 8d4ea22..259516d 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -233,7 +233,7 @@ parseFunction :: Parser Instruction parseFunction = parseCall parseReturn :: Parser Instruction -parseReturn = Return <$> ((parseString "<- " <|> parseString "<-") *> parseValue) +parseReturn = Return <$> ((parseString "<-") *> parseValue) parseType :: Parser String parseType = diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index 9ea0dfe..c632596 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -73,9 +73,9 @@ utParserLvt = testGroup "Parse Lvt" "" (Function ("a", [Integer 0, StringView "abc", Boolean False])) , testCase "return value" $ - testParserHelper "<- 0;\n" + testParserHelpers "<- 0;\n" "" - (Return (Integer 0)) + [(Return (Integer 0))] , testCase "condition if" $ testParserHelper "if (a)\n{\nb(0);\n};\n" "" From ccab3c8acfcbf822d5d7f017dd34e69fe216de3f Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Mon, 8 Jan 2024 15:12:29 +0100 Subject: [PATCH 31/99] Remove '' --- lvtc/src/ParseLvt.hs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 259516d..6671cd0 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -131,31 +131,31 @@ parseOperator' sys = fVal val = shuntingYardValue val sys fOp op = shuntingYardOp op sys -parseOperatorTransform'' :: [Value] -> Maybe [Value] -parseOperatorTransform'' (x1:x2:(Var op):rest) +parseOperatorTransformOne' :: [Value] -> Maybe [Value] +parseOperatorTransformOne' (x1:x2:(Var op):rest) | isOperator op = Just (FuncValue (op, [x1, x2]) : rest) - | otherwise = case parseOperatorTransform' rest of + | otherwise = case parseOperatorTransformOne rest of Nothing -> Nothing Just ys -> Just (x1:x2:ys) -parseOperatorTransform'' _ = Nothing +parseOperatorTransformOne' _ = Nothing -parseOperatorTransform' :: [Value] -> Maybe [Value] -parseOperatorTransform' [] = Just [] -parseOperatorTransform' [x] = Just [x] -parseOperatorTransform' [_, _] = Nothing -parseOperatorTransform' (x1:(Var op):rest) +parseOperatorTransformOne :: [Value] -> Maybe [Value] +parseOperatorTransformOne [] = Just [] +parseOperatorTransformOne [x] = Just [x] +parseOperatorTransformOne [_, _] = Nothing +parseOperatorTransformOne (x1:(Var op):rest) | isOperator op = Nothing - | otherwise = parseOperatorTransform'' (x1 : Var op : rest) -parseOperatorTransform' (x1:x2:(Var op):rest) = - parseOperatorTransform'' (x1 : x2 : Var op : rest) -parseOperatorTransform' (x:xs) = case parseOperatorTransform' xs of + | otherwise = parseOperatorTransformOne' (x1 : Var op : rest) +parseOperatorTransformOne (x1:x2:(Var op):rest) = + parseOperatorTransformOne' (x1 : x2 : Var op : rest) +parseOperatorTransformOne (x:xs) = case parseOperatorTransformOne xs of Nothing -> Nothing Just ys -> Just (x:ys) parseOperatorTransform :: [Value] -> Maybe Value parseOperatorTransform [] = Nothing parseOperatorTransform vals = - case parseOperatorTransform' vals of + case parseOperatorTransformOne vals of Nothing -> Nothing Just [] -> Nothing Just [x] -> Just x From e11565163c32b753704136faa4a78d5e93756b46 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Mon, 8 Jan 2024 21:45:11 +0100 Subject: [PATCH 32/99] Add cli for compilation --- lvtc/app/Args.hs | 78 ++++++++++++++++++++++++++++++++++++++ lvtc/app/Main.hs | 66 +++++++------------------------- lvtc/app/Run.hs | 80 +++++++++++++++++++++++++++++++++++++++ lvtc/app/Version.hs | 16 ++++++++ lvtc/lvtc.cabal | 7 ++++ lvtc/package.yaml | 3 ++ lvtc/src/LvtLibVersion.hs | 33 ++++++++++++++++ lvtc/src/ParseLvt.hs | 13 +++++-- lvtc/stack.yaml | 2 + lvtc/stack.yaml.lock | 14 +++++++ lvtc/test/UTParseLvt.hs | 9 +++++ lvtc/test/lvt/Test.lvt | 9 +++++ 12 files changed, 273 insertions(+), 57 deletions(-) create mode 100644 lvtc/app/Args.hs create mode 100644 lvtc/app/Run.hs create mode 100644 lvtc/app/Version.hs create mode 100644 lvtc/src/LvtLibVersion.hs create mode 100644 lvtc/test/lvt/Test.lvt diff --git a/lvtc/app/Args.hs b/lvtc/app/Args.hs new file mode 100644 index 0000000..9c05170 --- /dev/null +++ b/lvtc/app/Args.hs @@ -0,0 +1,78 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Args +-} + + +module Args + ( + Action(..), + Args(..), + parseArgs, + printHelp + ) where + +import System.Directory (getCurrentDirectory) + +data Action = ShowHelp | ShowVersion | Run + +data Args = Args { + action :: Action, + folderPath :: String, + outFile :: String +} + +parseArgs' :: [String] -> Args -> Either Args String +parseArgs' [] args = + Left args +parseArgs' ("--help":xs) args = + parseArgs' xs (args {action = ShowHelp}) +parseArgs' ("-h":xs) args = + parseArgs' xs (args {action = ShowHelp}) +parseArgs' ("--version":xs) args = + parseArgs' xs (args {action = ShowVersion}) +parseArgs' ("-v":xs) args = + parseArgs' xs (args {action = ShowVersion}) +parseArgs' ("-o":x:xs) args = + parseArgs' xs (args {outFile = x}) +parseArgs' ["-o"] _ = + Right "Missing argument for -o" +parseArgs' (('-':xs):_) _ = + Right ("Unknown option: " ++ xs) +parseArgs' (x:xs) args = + parseArgs' xs (args {action = Run, folderPath = x}) + +parseArgs :: [String] -> IO (Either Args String) +parseArgs args = + getCurrentDirectory >>= \path -> + return (parseArgs' args (Args {action = Run, folderPath = path, outFile = "out.wasm"})) + +hLine1 :: String +hLine1 = "Usage: lvtc [OPTION] [FOLDER]\n" +hLine2 :: String +hLine2 = "\n" +hLine3 :: String +hLine3 = "Compile Leviator source code to WebAssembly\n" +hLine4 :: String +hLine4 = "" +hLine5 :: String +hLine5 = "Options:\n" +hLine6 :: String +hLine6 = "\t-h, --help\n\t\tDisplay this help and exit\n" +hLine7 :: String +hLine7 = "\t-v, --version\n\t\tOutput version information and exit\n" +hLine8 :: String +hLine8 = "\t-o FILE\n\t\tWrite WebAssembly to FILE\n" +hLine9 :: String +hLine9 = part1 ++ part2 + where + part1 = "\tFOLDER\n\t\tTake all Leviator" + part2 = " source code recursively from FOLDER\n" + +printHelp :: IO () +printHelp = + putStr hLine1 >> putStr hLine2 >> putStr hLine3 >> putStr hLine4 + >> putStr hLine5 >> putStr hLine6 >> putStr hLine7 >> putStr hLine8 + >> putStr hLine9 diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 427c063..b42fe1a 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -7,61 +7,21 @@ module Main (main) where -import Expression (parseExpresion, parseAllExpression) -import Parser (runParser) -import Alias (proceedAlias) -import ParseLvt (parseInstruction, parseInstructions, parseFuncDeclaration) -import WatLike (aSTToWatLike) -import AST +import System.Environment (getArgs) -test1 :: String -test1 = "if (a)\n{\nb(0);\n};\n" +import Args (Args (..), parseArgs, Action (..), printHelp) +import Run (run) +import Version (printVersion) -test2 :: String -test2 = part1 ++ part2 - where - part1 = "@Int a = 0;\n @Int c = b(a);\n" - part2 = " if (c)\n {\n d(a);\n };\n" +dispatchArgs :: Args -> IO () +dispatchArgs (Args Run fPath oFile) = run (Args Run fPath oFile) +dispatchArgs (Args ShowHelp _ _) = printHelp +dispatchArgs (Args ShowVersion _ _) = printVersion +-- dispatchArgs (Args New _ _) = -test3 :: String -test3 = "alias abc def;\n" - -test4 :: String -test4 = "// this is a comment\n" - -test5 :: String -test5 = "@Int a = 4 + 5;\n" - -test6 :: String -test6 = "@Int a = 3 + 4 * 2 / ( 1 - 5 );\n" - -text :: String -text = aliasInt ++ aliasRetValue ++ funcMain - where - aliasInt = "alias int Int;\n" - aliasRetValue = "alias retValue 0;\n" - funcMain = "fn main () -> int \n{\n <- retValue;\n};\n" - -test8 :: String -test8 = "fn abc(a: Int) -> Int\n{\n <- a;\n};\n" - -test7 :: [FuncDeclaration] -test7 = - [ - ( - ("add", [("a", "Int"), ("b", "Int")], "Int"), - [Return (FuncValue ("+", [Var "a", Var "b"]))] - ) - ] +dispatchIfOk :: Either Args String -> IO () +dispatchIfOk (Left args) = dispatchArgs args +dispatchIfOk (Right str) = print str main :: IO () -main = - print (runParser parseInstruction test1) - >> print (runParser parseInstructions test2) - >> print (runParser parseExpresion test3) - >> print (runParser parseExpresion test4) - >> print (runParser parseInstruction test5) - >> print (runParser parseInstruction test6) - >> print (runParser (proceedAlias <$> parseAllExpression) text) - >> print (runParser parseFuncDeclaration test8) - >> print (aSTToWatLike test7) +main = getArgs >>= parseArgs >>= dispatchIfOk diff --git a/lvtc/app/Run.hs b/lvtc/app/Run.hs new file mode 100644 index 0000000..971281c --- /dev/null +++ b/lvtc/app/Run.hs @@ -0,0 +1,80 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Run +-} + +module Run +( + run +) where + +import Expression (parseAllExpression, Expression (..)) +import Alias (proceedAlias) +import ParseLvt (parseFuncDeclaration) +import WatLike (aSTToWatLike, FuncDeclare) +import Parser (runParser) +import AST (FuncDeclaration) +import Args + +import System.Directory (listDirectory) +import System.FilePath (joinPath) +import Data.List (isSuffixOf) + +getExpressionFromFile :: FilePath -> IO [Expression] +getExpressionFromFile path = + readFile path + >>= (\str -> + case runParser (proceedAlias <$> parseAllExpression) str of + Nothing -> fail "Invalid expression" + Just (expression, _) -> return expression) + +getFilesExpression :: [FilePath] -> IO [Expression] +getFilesExpression (file:files) = + getExpressionFromFile file + >>= (\expFile -> getFilesExpression files + >>= (\expFiles -> return (expFile ++ expFiles))) +getFilesExpression [] = return [] + +selectGoodFiles :: FilePath -> [FilePath] -> IO [FilePath] +selectGoodFiles folder [] = return [] +selectGoodFiles folder (file:files) + | ".lvt" `isSuffixOf` trueFile = putStrLn ("- " ++ trueFile) >> selectGoodFiles folder files >>= (\others -> return (trueFile : others)) + | otherwise = selectGoodFiles folder files + where + trueFile = joinPath [folder, file] + +listAllFiles :: FilePath -> IO [FilePath] +listAllFiles path = listDirectory path >>= selectGoodFiles path + +getAllFunc :: [Expression] -> IO [FuncDeclaration] +getAllFunc [] = return [] +getAllFunc ((Expression.Function str):expressions) = + case runParser parseFuncDeclaration str of + Nothing -> fail ("Parser Error: `" ++ str ++ "`") + Just (func, _) -> + getAllFunc expressions >>= \funcs -> return (func:funcs) +getAllFunc (_ : expressions) = getAllFunc expressions + +-- TODO: replace with the function of gui +checkAst :: IO [FuncDeclaration] -> IO [FuncDeclaration] +checkAst funcsIo = + funcsIo + >>= (\funcs -> case Just funcs of + Just f -> return f + Nothing -> fail "Invalid Code") + +transformToWatLike :: IO [FuncDeclaration] -> IO [FuncDeclare] +transformToWatLike funcsIo = + funcsIo + >>= (\funcs -> return (aSTToWatLike funcs)) + +run :: Args -> IO () +run (Args Run fPath oFile) = putStrLn ("Compiling from: " ++ fPath) >> + transformed >>= print + where + expressions = listAllFiles fPath >>= getFilesExpression + funcs = expressions >>= getAllFunc + transformed = transformToWatLike (checkAst funcs) +run _ = fail "Invalid option called" diff --git a/lvtc/app/Version.hs b/lvtc/app/Version.hs new file mode 100644 index 0000000..7845ee0 --- /dev/null +++ b/lvtc/app/Version.hs @@ -0,0 +1,16 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Run +-} + +module Version +( + printVersion +) where + +import LvtLibVersion + +printVersion :: IO () +printVersion = putStrLn lvtLibVersion diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index c2f388d..4fda318 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -30,6 +30,7 @@ library Builtins Expression Lib + LvtLibVersion ParseLvt Parser ParseUtil @@ -49,6 +50,9 @@ library executable lvtc-exe main-is: Main.hs other-modules: + Args + Run + Version Paths_lvtc autogen-modules: Paths_lvtc @@ -57,6 +61,8 @@ executable lvtc-exe ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , directory + , filepath , lvtc default-language: Haskell2010 @@ -76,6 +82,7 @@ test-suite lvtc-test build-depends: base >=4.7 && <5 , lvtc + , process , tasty , tasty-hunit default-language: Haskell2010 diff --git a/lvtc/package.yaml b/lvtc/package.yaml index 1476033..8ca771d 100644 --- a/lvtc/package.yaml +++ b/lvtc/package.yaml @@ -46,6 +46,8 @@ executables: - -with-rtsopts=-N dependencies: - lvtc + - directory + - filepath tests: lvtc-test: @@ -59,3 +61,4 @@ tests: - lvtc - tasty - tasty-hunit + - process diff --git a/lvtc/src/LvtLibVersion.hs b/lvtc/src/LvtLibVersion.hs new file mode 100644 index 0000000..4cc4899 --- /dev/null +++ b/lvtc/src/LvtLibVersion.hs @@ -0,0 +1,33 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- LvtLibVersion +-} + +module LvtLibVersion + ( + lvtLibVersionPatch, + lvtLibVersionMinor, + lvtLibVersionMajor, + lvtLibVersion + ) + where + +lvtLibVersionPatch :: Int +lvtLibVersionPatch = 0 + +lvtLibVersionMinor :: Int +lvtLibVersionMinor = 0 + +lvtLibVersionMajor :: Int +lvtLibVersionMajor = 0 + + +lvtLibVersion :: String +lvtLibVersion = fullVersion + where + fMaj = show lvtLibVersionMajor + fMin = show lvtLibVersionMinor + fPat = show lvtLibVersionPatch + fullVersion = fMaj ++ "." ++ fMin ++ "." ++ fPat diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 6671cd0..aad4531 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -325,7 +325,7 @@ parseFuncVar = Parser f parseFuncVars :: Parser [Var] parseFuncVars = parseChar '(' *> - some + many (parseFuncVar <* (parseString "," <|> parseString " ," <|> parseString ", ") <|> parseFuncVar) @@ -343,7 +343,7 @@ parseFuncName = Parser f _notVar -> Nothing parseFuncType :: Parser Type -parseFuncType = +parseFuncType = (parseString " -> " <|> parseString "-> " <|> parseString "->") *> parseType <* parseString "\n{\n" @@ -355,9 +355,14 @@ parseFuncPrototype = <*> parseFuncVars <*> parseFuncType -parseFuncDeclaration :: Parser FuncDeclaration -parseFuncDeclaration = +parseFuncDeclaration' :: Parser FuncDeclaration +parseFuncDeclaration' = (,) <$> parseFuncPrototype <*> parseInstructions <* parseString "};\n" + +parseFuncDeclaration :: Parser FuncDeclaration +parseFuncDeclaration = Parser f + where + f str = runParser parseFuncDeclaration' (lexeme str) diff --git a/lvtc/stack.yaml b/lvtc/stack.yaml index 03d26e7..e6e5d73 100644 --- a/lvtc/stack.yaml +++ b/lvtc/stack.yaml @@ -43,6 +43,8 @@ packages: extra-deps: - tasty-1.4.2.2 - tasty-hunit-0.10.1 +- directory-1.3.8.2 +- process-1.6.18.0 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtc/stack.yaml.lock b/lvtc/stack.yaml.lock index 246c84e..341424a 100644 --- a/lvtc/stack.yaml.lock +++ b/lvtc/stack.yaml.lock @@ -18,6 +18,20 @@ packages: size: 399 original: hackage: tasty-hunit-0.10.1 +- completed: + hackage: directory-1.3.8.2@sha256:aa62af76daa1ed082933561a98ae342d4c3ef24bcca7197376ef605fee7d0949,3150 + pantry-tree: + sha256: 80e22e8d8bccbc6a9b26bd4a153550c2c8e3739d5a77efe0633e3e1bd2f18a60 + size: 3519 + original: + hackage: directory-1.3.8.2 +- completed: + hackage: process-1.6.18.0@sha256:69fbbca4151e1a6d1a5da41a1e17c254871675a4f2aed5213bbdfb10b5e52742,3148 + pantry-tree: + sha256: cd0bf20226dad3e1a1cfee36d38c3f74e851c3d1418d41d8cd3fb656d4f16634 + size: 1675 + original: + hackage: process-1.6.18.0 snapshots: - completed: sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index c632596..d9620a2 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -109,4 +109,13 @@ utParserLvt = testGroup "Parse Lvt" Return (Var "a") ] ) + , testCase "test func start" $ + testParserFunc "fn start() -> Int\n{\n <- 0;\n};\n" + "" + ( + ("start", [], "Int"), + [ + Return (Integer 0) + ] + ) ] diff --git a/lvtc/test/lvt/Test.lvt b/lvtc/test/lvt/Test.lvt new file mode 100644 index 0000000..369dd3b --- /dev/null +++ b/lvtc/test/lvt/Test.lvt @@ -0,0 +1,9 @@ +fn abc(a: Int) -> Int +{ + <- a; +}; + +fn main() -> Int +{ + <- abc(1); +}; From c3fd7a18e9112b7d61a5548a2caf678a18e7e038 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Mon, 8 Jan 2024 22:01:07 +0100 Subject: [PATCH 33/99] Fix norm --- lvtc/app/Args.hs | 4 +++- lvtc/app/Run.hs | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lvtc/app/Args.hs b/lvtc/app/Args.hs index 9c05170..e8d974e 100644 --- a/lvtc/app/Args.hs +++ b/lvtc/app/Args.hs @@ -47,7 +47,9 @@ parseArgs' (x:xs) args = parseArgs :: [String] -> IO (Either Args String) parseArgs args = getCurrentDirectory >>= \path -> - return (parseArgs' args (Args {action = Run, folderPath = path, outFile = "out.wasm"})) + return (parseArgs' args (Args { + action = Run, folderPath = path, outFile = "out.wasm" + })) hLine1 :: String hLine1 = "Usage: lvtc [OPTION] [FOLDER]\n" diff --git a/lvtc/app/Run.hs b/lvtc/app/Run.hs index 971281c..f56049c 100644 --- a/lvtc/app/Run.hs +++ b/lvtc/app/Run.hs @@ -40,7 +40,10 @@ getFilesExpression [] = return [] selectGoodFiles :: FilePath -> [FilePath] -> IO [FilePath] selectGoodFiles folder [] = return [] selectGoodFiles folder (file:files) - | ".lvt" `isSuffixOf` trueFile = putStrLn ("- " ++ trueFile) >> selectGoodFiles folder files >>= (\others -> return (trueFile : others)) + | ".lvt" `isSuffixOf` trueFile = + putStrLn ("- " ++ trueFile) + >> selectGoodFiles folder files + >>= (\others -> return (trueFile : others)) | otherwise = selectGoodFiles folder files where trueFile = joinPath [folder, file] From 4ee064c1fdb4c46e84229d469f64df277f858c8d Mon Sep 17 00:00:00 2001 From: tenshi Date: Tue, 9 Jan 2024 15:25:00 +0100 Subject: [PATCH 34/99] add save --- lvtrun/README.md | 25 ++++++++++---- lvtrun/app/Main.hs | 1 - lvtrun/app/WasmMod/Module.hs | 9 +++++ lvtrun/app/WasmMod/Sections/Memory.hs | 47 +++++++++++++++++++++++++++ lvtrun/lvtrun.cabal | 1 + lvtrun/test/test.cpp | 11 +++++-- 6 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 lvtrun/app/WasmMod/Sections/Memory.hs diff --git a/lvtrun/README.md b/lvtrun/README.md index 04bc844..e641c57 100644 --- a/lvtrun/README.md +++ b/lvtrun/README.md @@ -48,11 +48,25 @@ # ----------------------- 3 ----------------------- # section 3 is the function section with 17 bytes of length +# index of the signature (type) of each internal function +# functionsec = section(vec(typeidx)) 03 11 10 -01 00 01 -01 01 02 02 -00 01 00 00 -00 00 02 03 00 +01 +00 +01 +01 +01 +02 +02 +00 +01 +00 +00 +00 +00 +02 +03 +00 # ----------------------- 4 ----------------------- the table section @@ -75,8 +89,7 @@ # 01 = number of memory (its a vector) 01 -01 c7 -02 c7 02 +01 c7 02 c7 02 # ----------------------- 6 ----------------------- the global section diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index c4e689a..7de385f 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -5,7 +5,6 @@ -- Main -} - module Main (main) where import Control.Exception (try) diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs index 8be0de2..3b01d24 100644 --- a/lvtrun/app/WasmMod/Module.hs +++ b/lvtrun/app/WasmMod/Module.hs @@ -22,6 +22,7 @@ import WasmMod.Header import WasmMod.Sections import WasmMod.Sections.Types import WasmMod.Sections.Global +import WasmMod.Sections.Memory data WasmModule = WasmModule { header :: ModHeader, @@ -46,6 +47,12 @@ getGlobalSection (x:xs) | identifier x == GlobalID = x | otherwise = getGlobalSection xs +getMemorySection :: [Section] -> Section +getMemorySection [] = throw (WasmError "No memory section") +getMemorySection (x:xs) + | identifier x == MemoryID = x + | otherwise = getMemorySection xs + loadModule :: String -> IO WasmModule loadModule filePath = do bytes <- getFileContent filePath @@ -57,4 +64,6 @@ loadModule filePath = do print funcType let globals = parseGlobals $ getGlobalSection modSections print globals + let memory = parseMemory $ getMemorySection modSections + print memory return $ WasmModule modHeader modSections diff --git a/lvtrun/app/WasmMod/Sections/Memory.hs b/lvtrun/app/WasmMod/Sections/Memory.hs new file mode 100644 index 0000000..92cbcaa --- /dev/null +++ b/lvtrun/app/WasmMod/Sections/Memory.hs @@ -0,0 +1,47 @@ + +module WasmMod.Sections.Memory + ( + Memory(..), + parseMemory + ) where + +import qualified Data.ByteString.Lazy as BS +import Control.Exception (throw) +import Control.Monad (when) + +import WasmMod.Leb128 +import WasmMod.Sections.Types +import WasmMod.Sections +import Errors + +data Memory = Memory { memMin :: Int, memMax :: Maybe Int } + deriving (Show, Eq) + +parseMinMax :: BS.ByteString -> Memory +parseMinMax content + | endBs /= BS.empty = throw $ WasmError "parseMinMax: bad memory section" + | otherwise = Memory {memMin = fromIntegral min, memMax = Just (fromIntegral max)} + where + (min, rest) = extractLEB128 content + (max, endBs) = extractLEB128 rest + +parseMin :: BS.ByteString -> Memory +parseMin content + | endBs /= BS.empty = throw $ WasmError "parseMin: bad memory section" + | otherwise = Memory {memMin = fromIntegral min, memMax = Nothing} + where + (min, endBs) = extractLEB128 content + +parseMemory' :: BS.ByteString -> Memory +parseMemory' content + | head (BS.unpack content) == 0x01 = parseMinMax (BS.drop 1 content) + | head (BS.unpack content) == 0x00 = parseMin (BS.drop 1 content) + | otherwise = throw $ WasmError "parseMemory': bad memory section" + +parseMemory :: Section -> Memory +parseMemory (Section MemoryID _ content) + | head (BS.unpack content) == 0x01 = parseMemory' (BS.drop 1 content) + | otherwise = throw $ WasmError "parseMemory: v1 allow 1 memory only" +parseMemory _ = throw $ WasmError "parseMemory: bad memory section" + +--https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index e0b6842..8edf32f 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -49,6 +49,7 @@ executable lvtrun-exe WasmMod.Module WasmMod.Sections WasmMod.Sections.Global + WasmMod.Sections.Memory WasmMod.Sections.Types Paths_lvtrun autogen-modules: diff --git a/lvtrun/test/test.cpp b/lvtrun/test/test.cpp index 7cc2cdb..6f20ba4 100644 --- a/lvtrun/test/test.cpp +++ b/lvtrun/test/test.cpp @@ -1,10 +1,14 @@ +#include + +int globa15 = 15; + int add(int a, int b) { return a + b; } int test() { - return 15; + return globa15; } bool compare(int a, int b) { @@ -15,8 +19,9 @@ bool compare(int a, int b) { } int main() { - int a = 5; - int b = 10; + int a = add(5, 10); + int b = add(10, 5); bool res = compare(a, b); + std::cout << "res: " << res << std::endl; return 0; } From 7b699d16c7a0648d789c47503473fb4f22c51fe9 Mon Sep 17 00:00:00 2001 From: tenshi Date: Wed, 10 Jan 2024 02:44:36 +0100 Subject: [PATCH 35/99] refactor + good global parsing --- lvtrun/app/IO.hs | 18 ++ lvtrun/app/{WasmMod => }/Leb128.hs | 23 +- lvtrun/app/Loader.hs | 20 ++ lvtrun/app/Main.hs | 4 +- .../Types.hs => Parsing/FuncTypes.hs} | 35 +-- lvtrun/app/Parsing/Global.hs | 151 ++++++++++++ lvtrun/app/Parsing/Header.hs | 25 ++ lvtrun/app/Parsing/Memory.hs | 48 ++++ lvtrun/app/Parsing/Parser.hs | 33 +++ lvtrun/app/Parsing/Sections.hs | 67 ++++++ lvtrun/app/Types.hs | 214 +++++++++++++++++- lvtrun/app/WasmMod/Header.hs | 29 --- lvtrun/app/WasmMod/Module.hs | 69 ------ lvtrun/app/WasmMod/Sections.hs | 92 -------- lvtrun/app/WasmMod/Sections/Global.hs | 72 ------ lvtrun/app/WasmMod/Sections/Memory.hs | 47 ---- lvtrun/lvtrun.cabal | 16 +- lvtrun/test/simple.wasm | Bin 0 -> 738 bytes lvtrun/test/test.cpp | 24 +- lvtrun/test/test.wasm | Bin 830 -> 170592 bytes 20 files changed, 616 insertions(+), 371 deletions(-) create mode 100644 lvtrun/app/IO.hs rename lvtrun/app/{WasmMod => }/Leb128.hs (63%) create mode 100644 lvtrun/app/Loader.hs rename lvtrun/app/{WasmMod/Sections/Types.hs => Parsing/FuncTypes.hs} (58%) create mode 100644 lvtrun/app/Parsing/Global.hs create mode 100644 lvtrun/app/Parsing/Header.hs create mode 100644 lvtrun/app/Parsing/Memory.hs create mode 100644 lvtrun/app/Parsing/Parser.hs create mode 100644 lvtrun/app/Parsing/Sections.hs delete mode 100644 lvtrun/app/WasmMod/Header.hs delete mode 100644 lvtrun/app/WasmMod/Module.hs delete mode 100644 lvtrun/app/WasmMod/Sections.hs delete mode 100644 lvtrun/app/WasmMod/Sections/Global.hs delete mode 100644 lvtrun/app/WasmMod/Sections/Memory.hs create mode 100644 lvtrun/test/simple.wasm diff --git a/lvtrun/app/IO.hs b/lvtrun/app/IO.hs new file mode 100644 index 0000000..be57a5c --- /dev/null +++ b/lvtrun/app/IO.hs @@ -0,0 +1,18 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- IO +-} + +module IO +( + getFileContent +) +where + +import qualified Data.ByteString.Lazy as BSL (readFile) +import Types + +getFileContent :: String -> IO FileContent +getFileContent path = BSL.readFile path diff --git a/lvtrun/app/WasmMod/Leb128.hs b/lvtrun/app/Leb128.hs similarity index 63% rename from lvtrun/app/WasmMod/Leb128.hs rename to lvtrun/app/Leb128.hs index 099cf99..da83419 100644 --- a/lvtrun/app/WasmMod/Leb128.hs +++ b/lvtrun/app/Leb128.hs @@ -5,16 +5,17 @@ -- Leb128 -} -module WasmMod.Leb128 +module Leb128 ( getLEB128, - extractLEB128 + extractLEB128, + extractLEB1282, ) where import Data.Binary.Get import Data.Bits -import Data.Int (Int64) +import Data.Int (Int64, Int32) import qualified Data.ByteString.Lazy as BS (ByteString, drop) getLEB128 :: Get Int @@ -43,3 +44,19 @@ extractLEB128 :: BS.ByteString -> (Int64, BS.ByteString) extractLEB128 bytes = do let (value, size) = runGet extractLEB128' bytes (value, BS.drop size bytes) + + +extractLEB1282' :: Get (Int32, Int64) +extractLEB1282' = do + byte <- getWord8 + let value = fromIntegral (byte .&. 0x7F) + case byte `testBit` 7 of + True -> do + (next, size) <- extractLEB1282' + return (value .|. (next `shiftL` 7), size + 1) + False -> return (value, 1) + +extractLEB1282 :: BS.ByteString -> (Int32, BS.ByteString) +extractLEB1282 bytes = do + let (value, size) = runGet extractLEB1282' bytes + (value, BS.drop size bytes) diff --git a/lvtrun/app/Loader.hs b/lvtrun/app/Loader.hs new file mode 100644 index 0000000..cff277a --- /dev/null +++ b/lvtrun/app/Loader.hs @@ -0,0 +1,20 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Loader +-} + +module Loader +( + loadModule +) +where + +import Parsing.Parser +import Types +import IO + +loadModule :: String -> IO WasmModule +loadModule path = getFileContent path >>= \bytes -> + return $ parseModule bytes diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 7de385f..0409807 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -8,11 +8,11 @@ module Main (main) where import Control.Exception (try) -import WasmMod.Module import Errors +import Loader main :: IO () -main = try (loadModule "./test/test.wasm") >>= \result -> +main = try (loadModule "./test/simple.wasm") >>= \result -> case result of Left err -> handleException err Right wasmMod -> print wasmMod diff --git a/lvtrun/app/WasmMod/Sections/Types.hs b/lvtrun/app/Parsing/FuncTypes.hs similarity index 58% rename from lvtrun/app/WasmMod/Sections/Types.hs rename to lvtrun/app/Parsing/FuncTypes.hs index 152964b..a50b1e3 100644 --- a/lvtrun/app/WasmMod/Sections/Types.hs +++ b/lvtrun/app/Parsing/FuncTypes.hs @@ -5,49 +5,36 @@ -- Types -} -module WasmMod.Sections.Types +module Parsing.FuncTypes ( - parseTypes, - Type(..), - FuncType(..) + getFuncTypes ) where import qualified Data.ByteString.Lazy as Bs import Control.Exception (throw) -import Data.Int (Int64) +import Data.Int (Int64, Int32) import Data.Word (Word8) -import WasmMod.Sections -import WasmMod.Leb128 +import Leb128 import Errors -import Types (Type(..), getTypeFromByte) - -data FuncType = FuncType { - typeId :: Int, - params :: [Type], - results :: [Type] -} - -instance Show FuncType where - show funcType = "(type " ++ (show $ typeId funcType) ++ " (func " ++ - (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")\n" +import Types getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) getVectorSize content = extractLEB128 content -extractTypes :: (Int64, Bs.ByteString) -> ([Type], Bs.ByteString) +extractTypes :: (Int64, Bs.ByteString) -> ([TypeName], Bs.ByteString) extractTypes (0, content) = ([], content) extractTypes (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : types, rest) where (types, rest) = extractTypes (idx - 1, Bs.drop 1 content) -parseFuncType :: Int -> Bs.ByteString -> (FuncType, Bs.ByteString) +parseFuncType :: Int32 -> Bs.ByteString -> (FuncType, Bs.ByteString) parseFuncType id content = do let (params, rest) = extractTypes (getVectorSize content) let (results, rest2) = extractTypes (getVectorSize rest) ((FuncType id params results), rest2) -parseFuncTypes :: Int -> Int64 -> Bs.ByteString -> [FuncType] +parseFuncTypes :: Int32 -> Int64 -> Bs.ByteString -> [FuncType] parseFuncTypes idx maxIdx content | idx >= (fromIntegral maxIdx) = [] | head (Bs.unpack content) == 0x60 = do @@ -55,8 +42,8 @@ parseFuncTypes idx maxIdx content funcType : parseFuncTypes (idx + 1) maxIdx rest | otherwise = throw $ WasmError "ParseFuncTypes: 0x60 expected for function" -parseTypes :: Section -> [FuncType] -parseTypes (Section TypeID _ content) = do +getFuncTypes :: Section -> [FuncType] +getFuncTypes (Section TypeID _ content) = do let (vecSize, rest) = extractLEB128 content parseFuncTypes 0 vecSize rest -parseTypes _ = throw $ WasmError "ParseTypes: bad section" +getFuncTypes _ = throw $ WasmError "getFuncTypes: bad section" diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/app/Parsing/Global.hs new file mode 100644 index 0000000..6dc6db2 --- /dev/null +++ b/lvtrun/app/Parsing/Global.hs @@ -0,0 +1,151 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Global +-} + +module Parsing.Global + ( + getGlobals, + ) +where + +import qualified Data.ByteString.Lazy as BSL +import Control.Exception (throw) +import Control.Monad (when) +import Data.Word (Word8) +import Data.Int (Int64) + +import Leb128 +import Types +import Errors + +extractOpCode :: BSL.ByteString -> ([Word8], Int64, BSL.ByteString) +extractOpCode bytes + | (head $ BSL.unpack bytes) == 0x00 = ([0x00], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x01 = ([0x01], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0f = ([0x0f], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x10 = ([0x10], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x41 = ([0x41], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x42 = ([0x42], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x43 = ([0x43], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x44 = ([0x44], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x28 = ([0x28], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x29 = ([0x29], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x36 = ([0x36], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x20 = ([0x20], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x21 = ([0x21], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x23 = ([0x23], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x24 = ([0x24], 1, BSL.drop 1 bytes) + | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) + | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) + | otherwise = throw $ WasmError "ExtractOpCode: bad opcode" + +createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) +createInstruction [0x01] bytes = (Unreachable, bytes) +createInstruction [0x01] bytes = (Nop, bytes) +createInstruction [0x0f] bytes = (Return, bytes) +createInstruction [0x10] bytes = do + let (value, rest) = extractLEB1282 bytes + (Call value, rest) +createInstruction [0x41] bytes = do + let (value, rest) = extractLEB1282 bytes + (I32Const value, rest) +createInstruction [0x42] bytes = do + let (value, rest) = extractLEB128 bytes + (I64Const value, rest) +createInstruction [0x43] bytes = do + let (value, rest) = extractLEB128 bytes + (F32Const (fromIntegral value), rest) +createInstruction [0x44] bytes = do + let (value, rest) = extractLEB128 bytes + (F64Const (fromIntegral value), rest) +createInstruction [0x28] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I32Load (MemArg align offset), rest2) +createInstruction [0x29] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I64Load (MemArg align offset), rest2) +createInstruction [0x36] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I32Store (MemArg align offset), rest2) +createInstruction [0x37] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I64Store (MemArg align offset), rest2) +createInstruction [0x20] bytes = do + let (value, rest) = extractLEB1282 bytes + (GetLocal value, rest) +createInstruction [0x24] bytes = do + let (value, rest) = extractLEB1282 bytes + (SetLocal value, rest) +createInstruction [0x23] bytes = do + let (value, rest) = extractLEB1282 bytes + (GetGlobal value, rest) +createInstruction [0x21] bytes = do + let (value, rest) = extractLEB1282 bytes + (SetGlobal value, rest) +createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) +createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) +createInstruction _ _ = throw $ WasmError "CreateInstruction: bad instruction" + +parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) +parseInstruction bytes + | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" + | otherwise = do + let (opCode, nbParams, rest) = extractOpCode bytes + let (instruction, rest2) = createInstruction opCode rest + (instruction, rest2) + +parseInstructions :: BSL.ByteString -> [Instruction] +parseInstructions bytes + | BSL.length bytes == 0 = [] + | head (BSL.unpack bytes) == 0x0b = [] + | otherwise = do + let (instruction, rest) = parseInstruction bytes + instruction : parseInstructions rest + +parseMutability :: Word8 -> Mutability +parseMutability 0x00 = Const +parseMutability 0x01 = Var +parseMutability _ = throw $ WasmError "ParseMutability: bad mutability" + +getHexaIndex :: BSL.ByteString -> Int64 -> Int64 +getHexaIndex content idx + | idx >= (fromIntegral $ BSL.length content) = throw $ WasmError "GetHexaIndex: no 0x0b found" + | (head $ BSL.unpack $ BSL.drop (fromIntegral idx) content) == 0x0b = idx + | otherwise = getHexaIndex content (idx + 1) + +extractExpression :: BSL.ByteString -> (BSL.ByteString, BSL.ByteString) +extractExpression content = do + let idx = getHexaIndex content 0 + let expression = BSL.take (fromIntegral (idx + 1)) content + let rest = BSL.drop (fromIntegral (idx + 1)) content + (expression, rest) + +parseGlobal :: BSL.ByteString -> (Global, BSL.ByteString) +parseGlobal content = do + let globalType = getTypeFromByte (head $ BSL.unpack content) + let mutability = parseMutability (head $ BSL.unpack $ BSL.drop 1 content) + let (expression, rest) = extractExpression (BSL.drop 2 content) + let instructions = parseInstructions expression + (Global globalType mutability instructions, rest) + +parseGlobals :: Int64 -> Int64 -> BSL.ByteString -> [Global] +parseGlobals idx maxIdx content + | idx >= maxIdx = [] + | otherwise = do + let (global, rest) = parseGlobal content + global : parseGlobals (idx + 1) maxIdx rest + +getGlobals :: Section -> [Global] +getGlobals (Section GlobalID _ content) = do + let (vecSize, rest) = extractLEB128 content + parseGlobals 0 vecSize rest +getGlobals _ = throw $ WasmError "getGlobals: bad section" diff --git a/lvtrun/app/Parsing/Header.hs b/lvtrun/app/Parsing/Header.hs new file mode 100644 index 0000000..d6aeecc --- /dev/null +++ b/lvtrun/app/Parsing/Header.hs @@ -0,0 +1,25 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Header +-} + +module Parsing.Header + ( + getModHeader, + isHeaderValid + ) +where + +import qualified Data.ByteString.Lazy as BSL (ByteString, take, drop, pack) + +import Types + +getModHeader :: Section -> ModHeader +getModHeader bytes = ModHeader (BSL.take 4 $ content bytes) (BSL.take 4 $ BSL.drop 4 $ content bytes) + +isHeaderValid :: ModHeader -> Bool +isHeaderValid header = + magicNumber header == BSL.pack [0x00, 0x61, 0x73, 0x6d] && + version header == BSL.pack [0x01, 0x00, 0x00, 0x00] diff --git a/lvtrun/app/Parsing/Memory.hs b/lvtrun/app/Parsing/Memory.hs new file mode 100644 index 0000000..e567f10 --- /dev/null +++ b/lvtrun/app/Parsing/Memory.hs @@ -0,0 +1,48 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Memory +-} + +module Parsing.Memory + ( + getMemories + ) where + +import qualified Data.ByteString.Lazy as BS +import Control.Exception (throw) +import Control.Monad (when) + +import Leb128 +import Types +import Errors + +parseMinMax :: BS.ByteString -> Memory +parseMinMax content + | endBs /= BS.empty = throw $ WasmError "parseMinMax: bad memory section" + | otherwise = Limit {lMin = fromIntegral min, lMax = Just (fromIntegral max)} + where + (min, rest) = extractLEB128 content + (max, endBs) = extractLEB128 rest + +parseMin :: BS.ByteString -> Memory +parseMin content + | endBs /= BS.empty = throw $ WasmError "parseMin: bad memory section" + | otherwise = Limit {lMin = fromIntegral min, lMax = Nothing} + where + (min, endBs) = extractLEB128 content + +parseMemory :: BS.ByteString -> Memory +parseMemory content + | head (BS.unpack content) == 0x01 = parseMinMax (BS.drop 1 content) + | head (BS.unpack content) == 0x00 = parseMin (BS.drop 1 content) + | otherwise = throw $ WasmError "parseMemory: bad memory section" + +getMemories :: Section -> Memory +getMemories (Section MemoryID _ content) + | head (BS.unpack content) == 0x01 = parseMemory (BS.drop 1 content) + | otherwise = throw $ WasmError "getMemories: v1 allow 1 memory only" +getMemories _ = throw $ WasmError "getMemories: bad memory section" + +--https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs new file mode 100644 index 0000000..e330b5b --- /dev/null +++ b/lvtrun/app/Parsing/Parser.hs @@ -0,0 +1,33 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Parser +-} + +module Parsing.Parser +( + parseModule, +) +where + +import Types +import Parsing.Sections +import Parsing.Header +import Parsing.Memory +import Parsing.FuncTypes +import Parsing.Global + +import Debug.Trace + +parseModule :: FileContent -> WasmModule +parseModule bytes = do + let sections = getSections bytes + WasmModule (getModHeader (getSectionWithId sections CustomID)) + (getFuncTypes (getSectionWithId sections TypeID)) + [] + [] + [] + (getMemories (getSectionWithId sections MemoryID)) + (getGlobals (getSectionWithId sections GlobalID)) + [] diff --git a/lvtrun/app/Parsing/Sections.hs b/lvtrun/app/Parsing/Sections.hs new file mode 100644 index 0000000..d4ed7bc --- /dev/null +++ b/lvtrun/app/Parsing/Sections.hs @@ -0,0 +1,67 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Parser +-} + +module Parsing.Sections +( + getSections, + getSectionWithId +) +where + +import qualified Data.ByteString.Lazy as BSL +import Control.Exception (throw) + +import Types +import Errors +import Leb128 + +extractHeader :: BSL.ByteString -> (Section, BSL.ByteString) +extractHeader bytes + | (BSL.length bytes) < 8 = throw (WasmError "Invalid header") + | otherwise = (Section CustomID 8 (BSL.take 8 bytes), BSL.drop 8 bytes) + +getSectionId :: BSL.ByteString -> SectionID +getSectionId bytes = case head (BSL.unpack $ BSL.take 1 bytes) of + 0 -> CustomID + 1 -> TypeID + 2 -> ImportID + 3 -> FunctionID + 4 -> TableID + 5 -> MemoryID + 6 -> GlobalID + 7 -> ExportID + 8 -> StartID + 9 -> ElementID + 10 -> CodeID + 11 -> DataID + _ -> throw (WasmError "Invalid section id") + +extractSection :: BSL.ByteString -> (Section, BSL.ByteString) +extractSection bytes = do + let sectionId = getSectionId bytes + let (size, rest) = extractLEB128 (BSL.drop 1 bytes) + let (content, rest2) = BSL.splitAt (fromIntegral size) rest + (Section sectionId (fromIntegral size) content, rest2) + +extractSections :: BSL.ByteString -> [Section] +extractSections bytes + | BSL.null bytes = [] + | otherwise = do + let (section, rest) = extractSection bytes + section : extractSections rest + +getSections :: FileContent -> [Section] +getSections bytes = do + let (header, rest) = extractHeader bytes + let sections = extractSections rest + header : sections + +getSectionWithId :: [Section] -> SectionID -> Section +getSectionWithId [] _ = throw (WasmError "No section with this id") +getSectionWithId (x:xs) id + | identifier x == id = x + | otherwise = getSectionWithId xs id diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index fe9cfba..52e1997 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -6,22 +6,222 @@ -} module Types - ( - Type(..), - getTypeFromByte - ) - where +( + TypeName(..), + Limit(..), + MemArg(..), + Instruction(..), + TypeIdx, + FuncIdx, + TableIdx, + MemIdx, + GlobalIdx, + ElemIdx, + DataIdx, + LocalIdx, + LabelIdx, + FuncType(..), + Import(..), + ImportDesc(..), + Function(..), + Mutability(..), + Global(..), + ExportDesc(..), + Export(..), + Table(..), + WasmModule(..), + getTypeFromByte, + ModHeader(..), + FileContent, + SectionID(..), + Section(..), + Memory(..), + OpCode +) where +import Data.Int (Int32, Int64) import Data.Word (Word8) +import Numeric (showHex) import Control.Exception (throw) +import qualified Data.ByteString.Lazy as BSL import Errors -data Type = I32 | I64 | F32 | F64 deriving (Show, Eq) +-- Indices +type TypeIdx = Int32 +type FuncIdx = Int32 +type TableIdx = Int32 +type MemIdx = Int32 +type GlobalIdx = Int32 +type ElemIdx = Int32 +type DataIdx = Int32 +type LocalIdx = Int32 +type LabelIdx = Int32 -getTypeFromByte :: Word8 -> Type +-- Common + +type FileContent = BSL.ByteString + +data TypeName = + I32 | + I64 | + F32 | + F64 + deriving (Show, Eq, Enum) + +getTypeFromByte :: Word8 -> TypeName getTypeFromByte 0x7f = I32 getTypeFromByte 0x7e = I64 getTypeFromByte 0x7d = F32 getTypeFromByte 0x7c = F64 getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" + +data Limit = Limit { + lMin :: Int32, + lMax :: Maybe Int32 +} + +instance Show Limit where + show limit = "[\n\tmin: " ++ (show $ lMin limit) ++ "\n\tmax: " ++ (show $ lMax limit) ++ "\n]" + +----------------------- + +data MemArg = MemArg { + offset :: Int32, + align :: Int32 +} + +instance Show MemArg where + show memArg = "[\n\toffset: " ++ (show $ offset memArg) ++ "\n\talign: " ++ (show $ align memArg) ++ "\n]" + +type OpCode = [Word8] + +data Instruction = + Unreachable + | Nop + | Return + | Call FuncIdx + | I32Const Int32 + | I64Const Int64 + | F32Const Float + | F64Const Double + | I32Load MemArg + | I64Load MemArg + | I32Store MemArg + | I64Store MemArg + | GetLocal LocalIdx + | SetLocal LocalIdx + | GetGlobal GlobalIdx + | SetGlobal GlobalIdx + | MemorySize + | MemoryGrow + deriving (Show) + +-- Module section + +data FuncType = FuncType { + typeId :: TypeIdx, + params :: [TypeName], + results :: [TypeName] +} + +instance Show FuncType where + show funcType = "\n\t(type " ++ (show $ typeId funcType) ++ " (func " ++ + (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")" + +data Import = Import { + mod :: String, + name :: String, + desc :: ImportDesc +} deriving (Show) + +data ImportDesc = + ImportFunc TypeIdx | + ImportMemory Limit + deriving (Show) + +data Function = Function { + funcType :: TypeIdx, + body :: [Instruction] +} deriving (Show) + +type Memory = Limit + +data Mutability = Const | Var deriving (Show) + +data Global = Global { + globalType :: TypeName, + mutability :: Mutability, + initExpr :: [Instruction] +} + +instance Show Global where + show global = "\n\t(global " ++ (show $ globalType global) ++ " " ++ + (show $ mutability global) ++ " " ++ (show $ initExpr global) ++ ")" + +data ExportDesc = ExportFunc FuncIdx deriving (Show) + +data Export = Export { + modName :: String + -- desc +} deriving (Show) + +data Table = Table { + notImpl :: String +} deriving (Show) + +data ModHeader = ModHeader { + magicNumber :: BSL.ByteString, + version :: BSL.ByteString +} deriving (Show) + +data SectionID = + CustomID + | TypeID + | ImportID + | FunctionID + | TableID + | MemoryID + | GlobalID + | ExportID + | StartID + | ElementID + | CodeID + | DataID + | DataCountID + | InvalidID + deriving (Show, Eq) + +data Section = Section { + identifier :: SectionID, + size :: Int, + content :: BSL.ByteString +} + +instance Show Section where + show section = + "\nSection " ++ (show $ identifier section) ++ + " Size: " ++ (show $ size section) ++ + " Content: " ++ (concat $ map (\x -> showHex x " ") (BSL.unpack $ content section)) + +data WasmModule = WasmModule { + header :: ModHeader, + types :: [FuncType], + imports :: [Import], + functions :: [Function], + tables :: [Table], + memory :: Memory, + globals :: [Global], + exports :: [Export] +} + +instance Show WasmModule where + show wasmMod = "\n[ Wasm Module Header ]\n" ++ + "- Header: " ++ (show $ header wasmMod) ++ "\n" ++ + "- Types: " ++ (show $ types wasmMod) ++ "\n" ++ + "- Imports: " ++ (show $ imports wasmMod) ++ "\n" ++ + "- Functions: " ++ (show $ functions wasmMod) ++ "\n" ++ + "- Tables: " ++ (show $ tables wasmMod) ++ "\n" ++ + "- Memory: " ++ (show $ memory wasmMod) ++ "\n" ++ + "- Globals: " ++ (show $ globals wasmMod) ++ "\n" ++ + "- Exports: " ++ (show $ exports wasmMod) ++ "\n" diff --git a/lvtrun/app/WasmMod/Header.hs b/lvtrun/app/WasmMod/Header.hs deleted file mode 100644 index 22d18fc..0000000 --- a/lvtrun/app/WasmMod/Header.hs +++ /dev/null @@ -1,29 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Header --} - -module WasmMod.Header - ( - ModHeader(..), - getModHeader, - isHeaderValid - ) -where - -import qualified Data.ByteString.Lazy as BS (ByteString, take, drop, pack) - -data ModHeader = ModHeader { - magicNumber :: BS.ByteString, - version :: BS.ByteString -} deriving (Show) - -getModHeader :: BS.ByteString -> ModHeader -getModHeader bytes = ModHeader (BS.take 4 bytes) (BS.take 4 $ BS.drop 4 bytes) - -isHeaderValid :: ModHeader -> Bool -isHeaderValid header = - magicNumber header == BS.pack [0x00, 0x61, 0x73, 0x6d] && - version header == BS.pack [0x01, 0x00, 0x00, 0x00] diff --git a/lvtrun/app/WasmMod/Module.hs b/lvtrun/app/WasmMod/Module.hs deleted file mode 100644 index 3b01d24..0000000 --- a/lvtrun/app/WasmMod/Module.hs +++ /dev/null @@ -1,69 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Module --} - -module WasmMod.Module - ( - WasmModule(..), - loadModule - ) -where - -import qualified Data.ByteString.Lazy as BS (ByteString, unpack, readFile) -import Control.Exception (throwIO, throw) -import Control.Monad (when) -import Numeric (showHex) - -import Errors -import WasmMod.Header -import WasmMod.Sections -import WasmMod.Sections.Types -import WasmMod.Sections.Global -import WasmMod.Sections.Memory - -data WasmModule = WasmModule { - header :: ModHeader, - sections :: [Section] -} - -instance Show WasmModule where - show wasmMod = "\n[ Wasm Module Header ]\n" ++ - "- Magic Number: " ++ (concat $ map (\x -> showHex x " ") $ - BS.unpack $ magicNumber $ header wasmMod) ++ "\n" ++ - "- Version: " ++ (concat $ map (\x -> showHex x " ") $ - BS.unpack $ version $ header wasmMod) ++ "\n" ++ - "- Sections: " ++ (show $ sections wasmMod) ++ "\n" - -getFileContent :: String -> IO BS.ByteString -getFileContent path = BS.readFile path - ---TEMP FUNC -getGlobalSection :: [Section] -> Section -getGlobalSection [] = throw (WasmError "No global section") -getGlobalSection (x:xs) - | identifier x == GlobalID = x - | otherwise = getGlobalSection xs - -getMemorySection :: [Section] -> Section -getMemorySection [] = throw (WasmError "No memory section") -getMemorySection (x:xs) - | identifier x == MemoryID = x - | otherwise = getMemorySection xs - -loadModule :: String -> IO WasmModule -loadModule filePath = do - bytes <- getFileContent filePath - let modHeader = getModHeader bytes - when (not $ isHeaderValid modHeader) $ throwIO (WasmError "Invalid header") - let modSections = getModSections bytes - when (not $ areSectionsValid modSections) $ throwIO (WasmError "Invalid sections") - let funcType = parseTypes $ head modSections - print funcType - let globals = parseGlobals $ getGlobalSection modSections - print globals - let memory = parseMemory $ getMemorySection modSections - print memory - return $ WasmModule modHeader modSections diff --git a/lvtrun/app/WasmMod/Sections.hs b/lvtrun/app/WasmMod/Sections.hs deleted file mode 100644 index 5f66c3f..0000000 --- a/lvtrun/app/WasmMod/Sections.hs +++ /dev/null @@ -1,92 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Sections --} - -module WasmMod.Sections - ( - SectionID(..), - Section(..), - areSectionsValid, - getModSections - ) -where - -import qualified Data.ByteString.Lazy as BS (ByteString, head, drop, take, null, unpack) -import Data.Word (Word8) -import Numeric (showHex) -import WasmMod.Leb128 -import Data.Bits - -data SectionID = - Custom - | TypeID - | ImportID - | FunctionID - | TableID - | MemoryID - | GlobalID - | ExportID - | StartID - | ElementID - | CodeID - | DataID - | DataCountID - | InvalidID - deriving (Show, Eq) - -data Section = Section { - identifier :: SectionID, - size :: Int, - content :: BS.ByteString -} - -instance Show Section where - show section = - "\nSection " ++ (show $ identifier section) ++ - " Size: " ++ (show $ size section) ++ - " Content: " ++ (concat $ map (\x -> showHex x " ") (BS.unpack $ content section)) - -areSectionsValid :: [Section] -> Bool -areSectionsValid sections = True - -getSectionID :: Word8 -> SectionID -getSectionID 1 = TypeID -getSectionID 2 = ImportID -getSectionID 3 = FunctionID -getSectionID 4 = TableID -getSectionID 5 = MemoryID -getSectionID 6 = GlobalID -getSectionID 7 = ExportID -getSectionID 8 = StartID -getSectionID 9 = ElementID -getSectionID 10 = CodeID -getSectionID 11 = DataID -getSectionID 12 = DataCountID -getSectionID _ = InvalidID - -getSection :: BS.ByteString -> (Section, BS.ByteString) -getSection bytes = do - let id = getSectionID (BS.head bytes) - let (size, rest) = extractLEB128 (BS.drop 1 bytes) - let content = BS.take (fromIntegral size) rest - (Section id (fromIntegral size) content, BS.drop (fromIntegral size) rest) - -removeHeader :: BS.ByteString -> BS.ByteString -removeHeader bytes = BS.drop 8 bytes - -getModSections' :: BS.ByteString -> [Section] -getModSections' = do - let getModSections'' bytes = - if BS.null bytes - then [] - else - let (section, rest) = getSection bytes - in section : getModSections'' rest - getModSections'' - --- Todo: Check if sections are valid -getModSections :: BS.ByteString -> [Section] -getModSections bytes = getModSections' (removeHeader bytes) diff --git a/lvtrun/app/WasmMod/Sections/Global.hs b/lvtrun/app/WasmMod/Sections/Global.hs deleted file mode 100644 index 838cfb8..0000000 --- a/lvtrun/app/WasmMod/Sections/Global.hs +++ /dev/null @@ -1,72 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Global --} - -module WasmMod.Sections.Global - ( - parseGlobals, - Global(..) - ) -where - -import qualified Data.ByteString.Lazy as Bs -import Control.Exception (throw) -import Data.Word (Word8) -import Data.Int (Int64) - -import WasmMod.Leb128 -import WasmMod.Sections (Section(..), SectionID(..)) -import Types (Type(..), getTypeFromByte) -import Errors - -data Mutability = Const | Var deriving (Show) - -data Global = Global { - globalType :: Type, - mutability :: Mutability, - initExp :: [Word8] -} - -instance Show Global where - show global = "Global: " ++ (show $ globalType global) ++ " " ++ - (show $ mutability global) ++ " " ++ (show $ initExp global) ++ "\n" - -parseMutability :: Word8 -> Mutability -parseMutability 0x00 = Const -parseMutability 0x01 = Var -parseMutability _ = throw $ WasmError "ParseMutability: bad mutability" - -getHexaIndex :: Bs.ByteString -> Int64 -> Int64 -getHexaIndex content idx - | idx >= (fromIntegral $ Bs.length content) = throw $ WasmError "GetHexaIndex: no 0x0b found" - | (head $ Bs.unpack $ Bs.drop (fromIntegral idx) content) == 0x0b = idx - | otherwise = getHexaIndex content (idx + 1) - -extractExpression :: Bs.ByteString -> ([Word8], Bs.ByteString) -extractExpression content = do - let idx = getHexaIndex content 0 - let expression = Bs.take (fromIntegral (idx + 1)) content - (Bs.unpack expression, Bs.drop (fromIntegral (idx + 1)) content) - -parseGlobal :: Bs.ByteString -> (Global, Bs.ByteString) -parseGlobal content = do - let globalType = getTypeFromByte (head $ Bs.unpack content) - let mutability = parseMutability (head $ Bs.unpack $ Bs.drop 1 content) - let (expression, rest) = extractExpression (Bs.drop 2 content) - (Global globalType mutability expression, rest) - -parseGlobals' :: Int64 -> Int64 -> Bs.ByteString -> [Global] -parseGlobals' idx maxIdx content - | idx >= maxIdx = [] - | otherwise = do - let (global, rest) = parseGlobal content - global : parseGlobals' (idx + 1) maxIdx rest - -parseGlobals :: Section -> [Global] -parseGlobals (Section GlobalID _ content) = do - let (vecSize, rest) = extractLEB128 content - parseGlobals' 0 vecSize rest -parseGlobals _ = throw $ WasmError "ParseGlobals: bad section" diff --git a/lvtrun/app/WasmMod/Sections/Memory.hs b/lvtrun/app/WasmMod/Sections/Memory.hs deleted file mode 100644 index 92cbcaa..0000000 --- a/lvtrun/app/WasmMod/Sections/Memory.hs +++ /dev/null @@ -1,47 +0,0 @@ - -module WasmMod.Sections.Memory - ( - Memory(..), - parseMemory - ) where - -import qualified Data.ByteString.Lazy as BS -import Control.Exception (throw) -import Control.Monad (when) - -import WasmMod.Leb128 -import WasmMod.Sections.Types -import WasmMod.Sections -import Errors - -data Memory = Memory { memMin :: Int, memMax :: Maybe Int } - deriving (Show, Eq) - -parseMinMax :: BS.ByteString -> Memory -parseMinMax content - | endBs /= BS.empty = throw $ WasmError "parseMinMax: bad memory section" - | otherwise = Memory {memMin = fromIntegral min, memMax = Just (fromIntegral max)} - where - (min, rest) = extractLEB128 content - (max, endBs) = extractLEB128 rest - -parseMin :: BS.ByteString -> Memory -parseMin content - | endBs /= BS.empty = throw $ WasmError "parseMin: bad memory section" - | otherwise = Memory {memMin = fromIntegral min, memMax = Nothing} - where - (min, endBs) = extractLEB128 content - -parseMemory' :: BS.ByteString -> Memory -parseMemory' content - | head (BS.unpack content) == 0x01 = parseMinMax (BS.drop 1 content) - | head (BS.unpack content) == 0x00 = parseMin (BS.drop 1 content) - | otherwise = throw $ WasmError "parseMemory': bad memory section" - -parseMemory :: Section -> Memory -parseMemory (Section MemoryID _ content) - | head (BS.unpack content) == 0x01 = parseMemory' (BS.drop 1 content) - | otherwise = throw $ WasmError "parseMemory: v1 allow 1 memory only" -parseMemory _ = throw $ WasmError "parseMemory: bad memory section" - ---https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 8edf32f..a70c8c9 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -43,14 +43,16 @@ executable lvtrun-exe main-is: Main.hs other-modules: Errors + IO + Leb128 + Loader + Parsing.FuncTypes + Parsing.Global + Parsing.Header + Parsing.Memory + Parsing.Parser + Parsing.Sections Types - WasmMod.Header - WasmMod.Leb128 - WasmMod.Module - WasmMod.Sections - WasmMod.Sections.Global - WasmMod.Sections.Memory - WasmMod.Sections.Types Paths_lvtrun autogen-modules: Paths_lvtrun diff --git a/lvtrun/test/simple.wasm b/lvtrun/test/simple.wasm new file mode 100644 index 0000000000000000000000000000000000000000..8c85cc089000a9c84fad85b86afe1e339b3a6393 GIT binary patch literal 738 zcmZvay^hmR5QWc-{}Nw^+(i7XL~*@I5os%$)awFKAR2f8$Lqa-LoeJ_S&@RD9WWo?nRRd#5<)m?gM>|wvy@9n;Belo7o zw5aZj#^zo6<)O;EqOQ^|yW3fUpSE4rbZ~W=+NP=MbXVuu(7^bG-M4vD96DPKt-KVB z+!S8@_x`IDa$_yj3o6x%nG%4-q0E(e*hO@V$29) z@L>X_w5Md#)4ui$^av`DOasct=_i?=WXXb=Zj;0JB}rp}1(nLhf`>uF7#0kcP;+AW Obc0gL*CZ$Yi~j;RqLdW? literal 0 HcmV?d00001 diff --git a/lvtrun/test/test.cpp b/lvtrun/test/test.cpp index 6f20ba4..e03428a 100644 --- a/lvtrun/test/test.cpp +++ b/lvtrun/test/test.cpp @@ -1,27 +1,13 @@ -#include - int globa15 = 15; int add(int a, int b) { - return a + b; -} - -int test() -{ - return globa15; -} - -bool compare(int a, int b) { - if (a != b) { - return false; - } - return true; + int c = a + b; + return c; } int main() { - int a = add(5, 10); - int b = add(10, 5); - bool res = compare(a, b); - std::cout << "res: " << res << std::endl; + int a = 10; + int b = 20; + int res = add(a, b); return 0; } diff --git a/lvtrun/test/test.wasm b/lvtrun/test/test.wasm index e36427c28f0d2484bba49d7d89589d8cab7c22d6..30ee53f9366761bfe51ce0b10de69dd2de9b12a0 100644 GIT binary patch literal 170592 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

    nEzt=oklm`!wG|c~*AZiKVid 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 B?5qF) literal 830 zcmZva&2H0B5QS&Pf3dF}U#I1#5{tPci%N(En=ZPF7l;L70}tT1?gi2`c4E6NNJ!3G z@HD&?55PFEqYKa6bI;7tXUkA_TLb`n=B)sS6~GDySkW+uKq<7qrw?VfF1othbzhsl z*tPb4Z6Dr*ySAwc`)%C=IkOBMKtv)KLdvJA8*tV^k;eE3keZn|Cp_bmy*cI6RNdor(U%pvg=mJmd+7d%-1+F2Ru?CE2ma_(oup1+Yq02DHpk-a@0&jt)Q(s8@)C z%#W4;d`Q4qGUPvQUcxy+h9CmoC!mz}lx%w1*B*nOfC|LZ0Lq8s4>&uv1xZYLlkfHm il!-aaaid(A(^zmU;{wA1)C@_!0>egzU!oxXv;P1dp`N|~ From 1e7a2d779e20d4d6d73aa766ee68bd0a359a2fcd Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 13:31:38 +0100 Subject: [PATCH 36/99] Add wat --- lvtc/lvtc.cabal | 3 + lvtc/src/Builtins.hs | 65 ++++++++++++++++++- lvtc/src/WatAST.hs | 59 +++++++++++++++++ lvtc/src/WatLikeToWat.hs | 134 +++++++++++++++++++++++++++++++++++++++ lvtc/test/Spec.hs | 4 +- lvtc/test/UTWat.hs | 50 +++++++++++++++ lvtc/test/UTWatLike.hs | 45 ++++++++++--- 7 files changed, 347 insertions(+), 13 deletions(-) create mode 100644 lvtc/src/WatAST.hs create mode 100644 lvtc/src/WatLikeToWat.hs create mode 100644 lvtc/test/UTWat.hs diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index c2f388d..a3ec115 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -34,7 +34,9 @@ library Parser ParseUtil ShuntingYard + WatAST WatLike + WatLikeToWat other-modules: Paths_lvtc autogen-modules: @@ -66,6 +68,7 @@ test-suite lvtc-test other-modules: UTParseLvt UTShuntingYard + UTWat UTWatLike Paths_lvtc autogen-modules: diff --git a/lvtc/src/Builtins.hs b/lvtc/src/Builtins.hs index 387c7fc..cb7984e 100644 --- a/lvtc/src/Builtins.hs +++ b/lvtc/src/Builtins.hs @@ -8,15 +8,76 @@ module Builtins ( getBuiltinsFunc + , isBuiltinsFunc + , getBuiltinsWat + , getBuiltinWat ) where +import Text.Read (readMaybe) + import AST +import WatAST -getBuiltinsFunc :: [FuncDeclaration] -getBuiltinsFunc = +getBuiltinsFuncOperator :: [FuncDeclaration] +getBuiltinsFuncOperator = [ (("+", [("x", "Int"), ("y", "Int")], "Int"), []), (("-", [("x", "Int"), ("y", "Int")], "Int"), []), (("*", [("x", "Int"), ("y", "Int")], "Int"), []), (("/", [("x", "Int"), ("y", "Int")], "Int"), []) ] + +getBuiltinsFuncComp :: [FuncDeclaration] +getBuiltinsFuncComp = + [ + (("==", [("x", "Int"), ("y", "Int")], "Int"), []), + (("<", [("x", "Int"), ("y", "Int")], "Int"), []), + ((">", [("x", "Int"), ("y", "Int")], "Int"), []), + (("<=", [("x", "Int"), ("y", "Int")], "Int"), []), + ((">=", [("x", "Int"), ("y", "Int")], "Int"), []), + (("!=", [("x", "Int"), ("y", "Int")], "Int"), []) + ] + +getBuiltinsFunc :: [FuncDeclaration] +getBuiltinsFunc = getBuiltinsFuncOperator ++ getBuiltinsFuncComp + +getStackRet :: [OpCode] -> [OpCode] +getStackRet op = [LocalGet 0, LocalGet 1] ++ op ++ [WatAST.Return] + +getBuiltinsWatOperator :: [FuncDef] +getBuiltinsWatOperator = + [ + FuncDef 0 [I32, I32] I32 (getStackRet [I32Add]) [], + FuncDef 1 [I32, I32] I32 (getStackRet [I32Sub]) [], + FuncDef 2 [I32, I32] I32 (getStackRet [I32Mul]) [], + FuncDef 3 [I32, I32] I32 (getStackRet [I32Div]) [] + ] + +getBuiltinsWatComp :: [FuncDef] +getBuiltinsWatComp = [ + FuncDef 4 [I32, I32] I32 (getStackRet [I32EQ]) [], + FuncDef 5 [I32, I32] I32 (getStackRet [I32LT_S]) [], + FuncDef 6 [I32, I32] I32 (getStackRet [I32GT_S]) [], + FuncDef 7 [I32, I32] I32 (getStackRet [I32LE_S]) [], + FuncDef 8 [I32, I32] I32 (getStackRet [I32GE_S]) [], + FuncDef 9 [I32, I32] I32 (getStackRet [I32NE]) [] + ] + +getBuiltinsWat :: [FuncDef] +getBuiltinsWat = getBuiltinsWatOperator ++ getBuiltinsWatComp + +isBuiltinsFuncString :: String -> [FuncDeclaration] -> Bool +isBuiltinsFuncString _ [] = False +isBuiltinsFuncString name (((name', _, _), _):xs) + | name == name' = True + | otherwise = isBuiltinsFuncString name xs + +isBuiltinsFunc :: String -> Bool +isBuiltinsFunc indexName = case readMaybe indexName :: Maybe Int of + Nothing -> isBuiltinsFuncString indexName getBuiltinsFunc + Just x -> x < (length getBuiltinsFunc) + +getBuiltinWat :: String -> FuncDef +getBuiltinWat indexName = case readMaybe indexName :: Maybe Int of + Nothing -> error "builtins not found" + Just x -> getBuiltinsWat !! x diff --git a/lvtc/src/WatAST.hs b/lvtc/src/WatAST.hs new file mode 100644 index 0000000..6f7e11e --- /dev/null +++ b/lvtc/src/WatAST.hs @@ -0,0 +1,59 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ShuntingYard +-} + +module WatAST +( + OpCode (..) + , Type (..) + , FuncDef (..) +) where + +import Data.Int (Int32) + +data OpCode = + LocalGet Int32 + | LocalSet Int32 + | I32Const Int32 + | I32Store + | I32Load + | I32GT_S + | I32GE_S + | I32LT_S + | I32LE_S + | I32EQ + | I32NE + | I32Add + | I32Sub + | I32Mul + | I32Div + | Return + | Call Int32 + | If + | Else + | End + deriving (Show, Eq) + +data Type = + I32 + +instance Show Type where + show I32 = "i32" + +instance Eq Type where + (==) I32 I32 = True + +data FuncDef = + FuncDef Int32 [Type] Type [OpCode] [(Type, Int32)] + +instance Show FuncDef where + show (FuncDef indexName paramsType returnType bodyCode vars) = + show indexName ++ "(" ++ show paramsType ++ ") -> " ++ show returnType + ++ " {\n" ++ show bodyCode ++ "\n}\n" ++ show vars + +instance Eq FuncDef where + (==) (FuncDef a b c d e) (FuncDef a' b' c' d' e') = + a == a' && b == b' && c == c' && d == d' && e == e' diff --git a/lvtc/src/WatLikeToWat.hs b/lvtc/src/WatLikeToWat.hs new file mode 100644 index 0000000..1272d84 --- /dev/null +++ b/lvtc/src/WatLikeToWat.hs @@ -0,0 +1,134 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ShuntingYard +-} + +module WatLikeToWat +( + watLikeToWat + , watsLikeToWat +) where + +import Data.Int (Int32) + +import WatAST +import WatLike +import AST +import Builtins + +typeStringToType :: Symbol -> WatAST.Type +typeStringToType "Int" = I32 +typeStringToType _ = error "Unknown type" + +paramsToTypes :: [Var] -> [WatAST.Type] +paramsToTypes [] = [] +paramsToTypes ((_, t):vars) = typeStringToType t : paramsToTypes vars + +nameIsInParams :: String -> [Var] -> Bool +nameIsInParams _ [] = False +nameIsInParams name ((_, name'):xs) + | name == name' = True + | otherwise = nameIsInParams name xs + +findTypeFromInstructions :: String -> [Instruction] -> WatAST.Type +findTypeFromInstructions _ [] = error "Type not found" +findTypeFromInstructions name ((Declaration ((name', typ), _)):xs) + | name == name' = typeStringToType typ + | otherwise = findTypeFromInstructions name xs +findTypeFromInstructions name (_:xs) = findTypeFromInstructions name xs + +varsToDecl :: [Index] -> [Instruction] -> [Var] -> [(WatAST.Type, Int32)] +varsToDecl [] _ _ = [] +varsToDecl ((nameIndex, _):xs) ins params + | nameIsInParams ind params = varsToDecl xs ins params + | otherwise = + (findTypeFromInstructions ind ins, 1) : varsToDecl xs ins params + where + ind = show nameIndex + +groupVarsToDecl :: [(WatAST.Type, Int32)] -> [(WatAST.Type, Int32)] +groupVarsToDecl [] = [] +groupVarsToDecl [x] = [x] +groupVarsToDecl ((t, nb):(t', nb'):vars) + | t == t' = groupVarsToDecl ((t, nb + nb'):vars) + | otherwise = (t, nb) : groupVarsToDecl ((t', nb'):vars) + +valueToWat :: Value -> [OpCode] +valueToWat (Var name) = + [ + LocalGet (read name :: Int32) + ] +valueToWat (Integer value) = + [ + I32Const value + ] +valueToWat (FuncValue (indexName, values)) = + valuesToWat values + ++ [ + Call (read indexName :: Int32) + ] +valueToWat _ = error "value not supported" + +valuesToWat :: [Value] -> [OpCode] +valuesToWat = concatMap valueToWat + +instructionToWat :: Instruction -> [OpCode] +instructionToWat (AST.Return (Var indexName)) = + [ + LocalGet (read indexName :: Int32) + , WatAST.Return + ] +instructionToWat (AST.Return _) = error "Return need a var" +instructionToWat (Declaration ((indexName, _), val)) = + valueToWat val + ++ [ + LocalSet (read indexName :: Int32) + ] +instructionToWat (Assignation (indexName, val)) = + valueToWat val + ++ [ + LocalSet (read indexName :: Int32) + ] +instructionToWat (Function (indexName, values)) = + valuesToWat values + ++ [ + Call (read indexName :: Int32) + ] +instructionToWat (Cond (value, ifTrue, [])) = + valueToWat value + ++ [ If ] + ++ instructionsToWat ifTrue + ++ [ End ] +instructionToWat (Cond (value, ifTrue, ifFalse)) = + valueToWat value + ++ [ If ] + ++ instructionsToWat ifTrue + ++ [ Else ] + ++ instructionsToWat ifFalse + ++ [ End ] + +instructionsToWat :: [Instruction] -> [OpCode] +instructionsToWat = concatMap instructionToWat +-- +-- instructionsToWat = foldr ((++) . instructionToWat) [] +-- +-- instructionsToWat xs = foldr ((++) . instructionToWat) [] xs +-- +-- instructionsToWat [] = [] +-- instructionsToWat (x:xs) = instructionToWat x ++ instructionsToWat xs + +watLikeToWat :: FuncDeclare -> FuncDef +watLikeToWat (((fName, params, returnType), ins), vars) + | isBuiltinsFunc fName = getBuiltinWat fName + | otherwise = FuncDef indexName paramType retType opcodes varsDecl + where + indexName = read fName :: Int32 + paramType = paramsToTypes params + retType = typeStringToType returnType + varsDecl = groupVarsToDecl $ varsToDecl vars ins params + opcodes = instructionsToWat ins + +watsLikeToWat :: [FuncDeclare] -> [FuncDef] +watsLikeToWat = map watLikeToWat diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 2693713..b57160c 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -15,6 +15,7 @@ import Alias import UTParseLvt import UTShuntingYard import UTWatLike +import UTWat main :: IO () main = defaultMain tests @@ -27,7 +28,8 @@ tests = testGroup "Leviator Tests - Compiler" utParserLvt, utShuntingYard, utAlias, - utWatLike + utWatLike, + utWat ] testParserHelper :: String -> String -> Expression -> IO () diff --git a/lvtc/test/UTWat.hs b/lvtc/test/UTWat.hs new file mode 100644 index 0000000..a871306 --- /dev/null +++ b/lvtc/test/UTWat.hs @@ -0,0 +1,50 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- UTWatLike +-} + +module UTWat +( + utWat +) where + +import Test.Tasty +import Test.Tasty.HUnit + +import WatAST +import AST +import WatLikeToWat +import Builtins +import UTWatLike + +utWat :: TestTree +utWat = testGroup "Wat" + [ + testCase "basic" $ + assertEqual "Basic" + basic1_rep + (watsLikeToWat basic1) + ] + where + basic1 = builtinsWatLike ++ [ + ( + ( + ("10", [], "Int"), + [ + Declaration (("0", "Int"), Integer 97), + AST.Return (Var "0") + ] + ), + [(0, "_tmpValue")] + ) + ] + basic1_rep = getBuiltinsWat ++ [ + FuncDef 10 [] I32 [ + I32Const 97, + LocalSet 0, + LocalGet 0, + WatAST.Return + ] [(I32, 1)] + ] diff --git a/lvtc/test/UTWatLike.hs b/lvtc/test/UTWatLike.hs index f0085d2..91d9739 100644 --- a/lvtc/test/UTWatLike.hs +++ b/lvtc/test/UTWatLike.hs @@ -7,6 +7,7 @@ module UTWatLike ( utWatLike + , builtinsWatLike ) where import Test.Tasty @@ -15,8 +16,8 @@ import Test.Tasty.HUnit import WatLike import AST -builtinsWat :: [FuncDeclare] -builtinsWat = +builtinsWatLike :: [FuncDeclare] +builtinsWatLike = [ ( (("0", [("0", "Int"), ("1", "Int")], "Int"), []), @@ -33,6 +34,30 @@ builtinsWat = ( (("3", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] + ), + ( + (("4", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("5", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("6", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("7", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("8", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] + ), + ( + (("9", [("0", "Int"), ("1", "Int")], "Int"), []), + [(0, "x"), (1, "y")] ) ] @@ -59,10 +84,10 @@ utWatLike = testGroup "Wat Like" [Return (FuncValue ("+", [Var "a", Var "b"]))] ) basic1_rep = - builtinsWat ++ [ + builtinsWatLike ++ [ ( ( - ("4", [("0", "Int"), ("1", "Int")], "Int"), + ("10", [("0", "Int"), ("1", "Int")], "Int"), [ Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), Return (Var "2") @@ -83,10 +108,10 @@ utWatLike = testGroup "Wat Like" ) ] basic2_rep = - builtinsWat ++ [ + builtinsWatLike ++ [ ( ( - ("4", [("0", "Int"), ("1", "Int")], "Int"), + ("10", [("0", "Int"), ("1", "Int")], "Int"), [ Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), Return (Var "2") @@ -96,11 +121,11 @@ utWatLike = testGroup "Wat Like" ), ( ( - ("5", [], "Int"), + ("11", [], "Int"), [ Declaration (("0", "Int"), Integer 1), Declaration (("1", "Int"), Integer 2), - Declaration (("2", "Int"), FuncValue ("4", [Var "0", Var "1"])), + Declaration (("2", "Int"), FuncValue ("10", [Var "0", Var "1"])), Return (Var "2") ] ), @@ -113,10 +138,10 @@ utWatLike = testGroup "Wat Like" [Return (Character 'a')] ) basic3_rep = - builtinsWat ++ [ + builtinsWatLike ++ [ ( ( - ("4", [], "Int"), + ("10", [], "Int"), [ Declaration (("0", "Int"), Integer 97), Return (Var "0") From 323b37c1b817573046c7da2f88851a45c62845d1 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 13:52:49 +0100 Subject: [PATCH 37/99] Fix params index --- lvtc/src/WatLikeToWat.hs | 4 +-- lvtc/test/UTWat.hs | 62 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/lvtc/src/WatLikeToWat.hs b/lvtc/src/WatLikeToWat.hs index 1272d84..598cdec 100644 --- a/lvtc/src/WatLikeToWat.hs +++ b/lvtc/src/WatLikeToWat.hs @@ -28,12 +28,12 @@ paramsToTypes ((_, t):vars) = typeStringToType t : paramsToTypes vars nameIsInParams :: String -> [Var] -> Bool nameIsInParams _ [] = False -nameIsInParams name ((_, name'):xs) +nameIsInParams name ((name', _):xs) | name == name' = True | otherwise = nameIsInParams name xs findTypeFromInstructions :: String -> [Instruction] -> WatAST.Type -findTypeFromInstructions _ [] = error "Type not found" +findTypeFromInstructions name [] = error ("Type not found for: " ++ name) findTypeFromInstructions name ((Declaration ((name', typ), _)):xs) | name == name' = typeStringToType typ | otherwise = findTypeFromInstructions name xs diff --git a/lvtc/test/UTWat.hs b/lvtc/test/UTWat.hs index a871306..8382d72 100644 --- a/lvtc/test/UTWat.hs +++ b/lvtc/test/UTWat.hs @@ -26,9 +26,15 @@ utWat = testGroup "Wat" assertEqual "Basic" basic1_rep (watsLikeToWat basic1) + , testCase "basic2" $ + assertEqual "Basic2" + basic2_rep + (watsLikeToWat basic2) ] where - basic1 = builtinsWatLike ++ [ + basic1 = + builtinsWatLike ++ + [ ( ( ("10", [], "Int"), @@ -40,7 +46,9 @@ utWat = testGroup "Wat" [(0, "_tmpValue")] ) ] - basic1_rep = getBuiltinsWat ++ [ + basic1_rep = + getBuiltinsWat ++ + [ FuncDef 10 [] I32 [ I32Const 97, LocalSet 0, @@ -48,3 +56,53 @@ utWat = testGroup "Wat" WatAST.Return ] [(I32, 1)] ] + basic2 = + builtinsWatLike ++ + [ + ( + ( + ("10", [("0", "Int"), ("1", "Int")], "Int"), + [ + Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), + AST.Return (Var "2") + ] + ), + [(0, "a"), (1, "b"), (2, "_tmpValue")] + ), + ( + ( + ("11", [], "Int"), + [ + Declaration (("0", "Int"), Integer 1), + Declaration (("1", "Int"), Integer 2), + Declaration (("2", "Int"), FuncValue ("10", [Var "0", Var "1"])), + AST.Return (Var "2") + ] + ), + [(0, "_tmpValue"), (1, "_tmpValue"), (2, "_tmpValue")] + ) + ] + basic2_rep = + getBuiltinsWat ++ + [ + FuncDef 10 [I32, I32] I32 [ + LocalGet 0, + LocalGet 1, + Call 0, + LocalSet 2, + LocalGet 2, + WatAST.Return + ] [(I32, 1)], + FuncDef 11 [] I32 [ + I32Const 1, + LocalSet 0, + I32Const 2, + LocalSet 1, + LocalGet 0, + LocalGet 1, + Call 10, + LocalSet 2, + LocalGet 2, + WatAST.Return + ] [(I32, 3)] + ] From 8802916534382936e504db2f5d0a5c362cc922f1 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 13:55:34 +0100 Subject: [PATCH 38/99] Add error (undefined is bad) --- lvtc/src/WatLike.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index afd13ab..d183364 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -212,7 +212,7 @@ valueToWatLike (Character x) _ varsIndex = (varsIndex', indVar) = newIndex varsIndex ordChar = read (show (ord x)) :: Int32 newDeclaration = Declaration ((show indVar, "Int"), Integer ordChar) -valueToWatLike (StringView _) _ _ = undefined +valueToWatLike (StringView _) _ _ = error "StringView not implemented for now" valueToWatLike Void _ varsIndex = (varsIndex', [newDeclaration], Var (show indVar)) where From ebc432f5e58afc65771a4799382acc2382c1f3de Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 18:06:10 +0100 Subject: [PATCH 39/99] Add isExport in FuncPrototype; Add some wasm data --- lvtc/app/Main.hs | 2 +- lvtc/lvtc.cabal | 2 + lvtc/src/AST.hs | 5 +- lvtc/src/Builtins.hs | 42 +++++----- lvtc/src/ParseLvt.hs | 39 ++++----- lvtc/src/Wasm.hs | 105 ++++++++++++++++++++++++ lvtc/src/WasmUtils.hs | 171 +++++++++++++++++++++++++++++++++++++++ lvtc/src/WatAST.hs | 16 ++-- lvtc/src/WatLike.hs | 44 +++++----- lvtc/src/WatLikeToWat.hs | 4 +- lvtc/test/UTParseLvt.hs | 11 ++- lvtc/test/UTWat.hs | 12 +-- lvtc/test/UTWatLike.hs | 36 ++++----- 13 files changed, 389 insertions(+), 100 deletions(-) create mode 100644 lvtc/src/Wasm.hs create mode 100644 lvtc/src/WasmUtils.hs diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 427c063..2872eba 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -49,7 +49,7 @@ test7 :: [FuncDeclaration] test7 = [ ( - ("add", [("a", "Int"), ("b", "Int")], "Int"), + (False, "add", [("a", "Int"), ("b", "Int")], "Int"), [Return (FuncValue ("+", [Var "a", Var "b"]))] ) ] diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index a3ec115..25aaba3 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -34,6 +34,8 @@ library Parser ParseUtil ShuntingYard + Wasm + WasmUtils WatAST WatLike WatLikeToWat diff --git a/lvtc/src/AST.hs b/lvtc/src/AST.hs index 236bb4d..16a6e80 100644 --- a/lvtc/src/AST.hs +++ b/lvtc/src/AST.hs @@ -17,6 +17,7 @@ module AST , VarAssignation , Condition , Symbol + , IsFuncExport ) where import Data.Int (Int32) @@ -57,7 +58,9 @@ instance Eq Value where type Var = (Symbol, Type) -type FuncPrototype = (Symbol, [Var], Type) +type IsFuncExport = Bool + +type FuncPrototype = (IsFuncExport, Symbol, [Var], Type) type FuncDeclaration = (FuncPrototype, [Instruction]) diff --git a/lvtc/src/Builtins.hs b/lvtc/src/Builtins.hs index cb7984e..cb90b4c 100644 --- a/lvtc/src/Builtins.hs +++ b/lvtc/src/Builtins.hs @@ -21,21 +21,21 @@ import WatAST getBuiltinsFuncOperator :: [FuncDeclaration] getBuiltinsFuncOperator = [ - (("+", [("x", "Int"), ("y", "Int")], "Int"), []), - (("-", [("x", "Int"), ("y", "Int")], "Int"), []), - (("*", [("x", "Int"), ("y", "Int")], "Int"), []), - (("/", [("x", "Int"), ("y", "Int")], "Int"), []) + ((False, "+", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, "-", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, "*", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, "/", [("x", "Int"), ("y", "Int")], "Int"), []) ] getBuiltinsFuncComp :: [FuncDeclaration] getBuiltinsFuncComp = [ - (("==", [("x", "Int"), ("y", "Int")], "Int"), []), - (("<", [("x", "Int"), ("y", "Int")], "Int"), []), - ((">", [("x", "Int"), ("y", "Int")], "Int"), []), - (("<=", [("x", "Int"), ("y", "Int")], "Int"), []), - ((">=", [("x", "Int"), ("y", "Int")], "Int"), []), - (("!=", [("x", "Int"), ("y", "Int")], "Int"), []) + ((False, "==", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, "<", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, ">", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, "<=", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, ">=", [("x", "Int"), ("y", "Int")], "Int"), []), + ((False, "!=", [("x", "Int"), ("y", "Int")], "Int"), []) ] getBuiltinsFunc :: [FuncDeclaration] @@ -47,20 +47,20 @@ getStackRet op = [LocalGet 0, LocalGet 1] ++ op ++ [WatAST.Return] getBuiltinsWatOperator :: [FuncDef] getBuiltinsWatOperator = [ - FuncDef 0 [I32, I32] I32 (getStackRet [I32Add]) [], - FuncDef 1 [I32, I32] I32 (getStackRet [I32Sub]) [], - FuncDef 2 [I32, I32] I32 (getStackRet [I32Mul]) [], - FuncDef 3 [I32, I32] I32 (getStackRet [I32Div]) [] + FuncDef False 0 [I32, I32] I32 (getStackRet [I32Add]) [], + FuncDef False 1 [I32, I32] I32 (getStackRet [I32Sub]) [], + FuncDef False 2 [I32, I32] I32 (getStackRet [I32Mul]) [], + FuncDef False 3 [I32, I32] I32 (getStackRet [I32Div]) [] ] getBuiltinsWatComp :: [FuncDef] getBuiltinsWatComp = [ - FuncDef 4 [I32, I32] I32 (getStackRet [I32EQ]) [], - FuncDef 5 [I32, I32] I32 (getStackRet [I32LT_S]) [], - FuncDef 6 [I32, I32] I32 (getStackRet [I32GT_S]) [], - FuncDef 7 [I32, I32] I32 (getStackRet [I32LE_S]) [], - FuncDef 8 [I32, I32] I32 (getStackRet [I32GE_S]) [], - FuncDef 9 [I32, I32] I32 (getStackRet [I32NE]) [] + FuncDef False 4 [I32, I32] I32 (getStackRet [I32EQ]) [], + FuncDef False 5 [I32, I32] I32 (getStackRet [I32LT_S]) [], + FuncDef False 6 [I32, I32] I32 (getStackRet [I32GT_S]) [], + FuncDef False 7 [I32, I32] I32 (getStackRet [I32LE_S]) [], + FuncDef False 8 [I32, I32] I32 (getStackRet [I32GE_S]) [], + FuncDef False 9 [I32, I32] I32 (getStackRet [I32NE]) [] ] getBuiltinsWat :: [FuncDef] @@ -68,7 +68,7 @@ getBuiltinsWat = getBuiltinsWatOperator ++ getBuiltinsWatComp isBuiltinsFuncString :: String -> [FuncDeclaration] -> Bool isBuiltinsFuncString _ [] = False -isBuiltinsFuncString name (((name', _, _), _):xs) +isBuiltinsFuncString name (((_, name', _, _), _):xs) | name == name' = True | otherwise = isBuiltinsFuncString name xs diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 6671cd0..285999e 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -91,17 +91,16 @@ parseStringView = *> parseAllCharUntil "\"" ) -parseVar :: Parser Value -parseVar = Parser f +parseVarName :: Parser Symbol +parseVarName = + f + <$> parseAnyChar alphabetLower + <*> many (parseAnyChar (alphabet ++ digit ++ "_")) where - f str = case runParser (parseAnyChar alphabetLower) str of - Nothing -> Nothing - Just (x, xs) -> - case runParser - (many (parseAnyChar (alphabet ++ digit ++ "_"))) xs - of - Nothing -> Nothing - Just (y, ys) -> Just (Var (x:y), ys) + f fstChar restName = fstChar : restName + +parseVar :: Parser Value +parseVar = Var <$> parseVarName parseVoid :: Parser Value parseVoid = f <$> parseString "Void" @@ -233,7 +232,7 @@ parseFunction :: Parser Instruction parseFunction = parseCall parseReturn :: Parser Instruction -parseReturn = Return <$> ((parseString "<-") *> parseValue) +parseReturn = Return <$> (parseString "<-" *> parseValue) parseType :: Parser String parseType = @@ -331,16 +330,10 @@ parseFuncVars = <|> parseFuncVar) <* parseChar ')' -parseFuncName :: Parser Symbol -parseFuncName = Parser f - where - f str = case runParser - ((parseString "export fn " <|> parseString "fn ") *> parseVar) - str - of - Nothing -> Nothing - Just (Var x, xs) -> Just (x, xs) - _notVar -> Nothing +parseFuncName :: Parser (IsFuncExport, Symbol) +parseFuncName = + ((\x -> (True, x)) <$> (parseString "export fn " *> parseVarName)) + <|> ((\x -> (False, x)) <$> (parseString "fn " *> parseVarName)) parseFuncType :: Parser Type parseFuncType = @@ -350,10 +343,12 @@ parseFuncType = parseFuncPrototype :: Parser FuncPrototype parseFuncPrototype = - (,,) + f <$> parseFuncName <*> parseFuncVars <*> parseFuncType + where + f (isExport, name) vars funcType = (isExport, name, vars, funcType) parseFuncDeclaration :: Parser FuncDeclaration parseFuncDeclaration = diff --git a/lvtc/src/Wasm.hs b/lvtc/src/Wasm.hs new file mode 100644 index 0000000..3bb84a2 --- /dev/null +++ b/lvtc/src/Wasm.hs @@ -0,0 +1,105 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ShuntingYard +-} + +module Wasm +( + VariableType (..) + , TypeSectionType (..) + , TypeSection (..) + , FunctionSection (..) + , MemorySection (..) + , ExportSectionExportType (..) + , ExportSectionExport (..) + , ExportSection (..) + , CodeSectionCodeLocals + , CodeSectionCode (..) + , CodeSection (..) + , Wasm (..) +) where + +import WatAST (OpCode (..)) + +data VariableType = + I32 + +data TypeSectionType = + Func { + headerFunc :: Int, + nbParams :: Int, + params :: [VariableType], + nbResults :: Int, + results :: [VariableType] + } + +data TypeSection = TS { + headerTS :: Int, + sizeTS :: Int, + nbTypes :: Int, + types :: [TypeSectionType] +} + +data FunctionSection = FS { + headerFS :: Int, + sizeFS :: Int, + nbFuncs :: Int, + funcs :: [Int] +} + +data MemorySection = MS { + headerMS :: Int, + sizeMS :: Int, + hasMax :: Int, + minMS :: Int, + maxMS :: Int +} + +data ExportSectionExportType = + FuncExport + | TableExport + | MemoryExport + | GlobalExport + +data ExportSectionExport = ESE { + nameLength :: Int, + name :: String, + typeESE :: ExportSectionExportType, + indexESE :: Int +} + +data ExportSection = ES { + headerES :: Int, + sizeES :: Int, + nbExports :: Int, + exports :: [ExportSectionExport] +} + +type CodeSectionCodeLocals = (Int, VariableType) + +data CodeSectionCode = CSC { + sizeCSC :: Int, + nbLocals :: Int, + locals :: [CodeSectionCodeLocals], + bodyCSC :: [OpCode], + endCSC :: Int +} + +data CodeSection = CS { + headerCS :: Int, + sizeCS :: Int, + nbCodes :: Int, + codes :: [CodeSectionCode] +} + +data Wasm = Wasm { + headerWasm :: (Int, Int, Int, Int), + versionWasm :: (Int, Int, Int, Int), + typeSection :: TypeSection, + functionSection :: FunctionSection, + memorySection :: MemorySection, + exportSection :: ExportSection, + codeSection :: CodeSection +} diff --git a/lvtc/src/WasmUtils.hs b/lvtc/src/WasmUtils.hs new file mode 100644 index 0000000..999568c --- /dev/null +++ b/lvtc/src/WasmUtils.hs @@ -0,0 +1,171 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ShuntingYard +-} + +module WasmUtils +( + getDefaultTypeSectionType, + getDefaultTypeSection, + getDefaultFunctionSection, + getDefaultMemorySection, + getDefaultExportSection, + getDefaultCodeSectionCode, + getDefaultCodeSection, + -- + fillBlankTypeSectionType, + fillBlankTypeSection, + fillBlankFunctionSection, + fillBlankExportSection, + fillBlankCodeSectionCode, + fillBlankCodeSection, +) where + +import Wasm +import WatAST (OpCode (..)) + +getDefaultTypeSectionType :: TypeSectionType +getDefaultTypeSectionType = Func { + headerFunc = 0x60, + nbParams = 0x0, + params = [], + nbResults = 0, + results = [] +} + +fillBlankTypeSectionType :: TypeSectionType -> TypeSectionType +fillBlankTypeSectionType (Func hF _ p _ r) = + Func { + headerFunc = hF, + nbParams = length p, + params = p, + nbResults = length r, + results = r + } + +getSizeTypeSectionType :: TypeSectionType -> Int +getSizeTypeSectionType (Func _ _ p _ r) = + 1 + 1 + ((length p) * 1) + 1 + ((length r) * 1) + +getDefaultTypeSection :: TypeSection +getDefaultTypeSection = TS { + headerTS = 0x01, + sizeTS = 0x0, + nbTypes = 0, + types = [] +} + +fillBlankTypeSection :: TypeSection -> TypeSection +fillBlankTypeSection (TS hT _ _ t) = + TS { + headerTS = hT, + sizeTS = size, + nbTypes = length t, + types = t + } + where + size = 1 + sum (map getSizeTypeSectionType t) + +getDefaultFunctionSection :: FunctionSection +getDefaultFunctionSection = FS { + headerFS = 0x03, + sizeFS = 0x0, + nbFuncs = 0, + funcs = [] +} + +fillBlankFunctionSection :: FunctionSection -> FunctionSection +fillBlankFunctionSection (FS hF _ _ f) = + FS { + headerFS = hF, + sizeFS = size, + nbFuncs = length f, + funcs = f + } + where + size = 1 + ((length f) * 1) + +getDefaultMemorySection :: MemorySection +getDefaultMemorySection = MS { + headerMS = 0x05, + sizeMS = 0x0, + hasMax = 0x0, + minMS = 0x0, + maxMS = 0x0 +} + +getSizeExportSectionExport :: ExportSectionExport -> Int +getSizeExportSectionExport (ESE _ n _ _) = + 1 + ((length n) * 1) + 1 + 1 + +getDefaultExportSection :: ExportSection +getDefaultExportSection = ES { + headerES = 0x07, + sizeES = 0x0, + nbExports = 0, + exports = [] +} + +fillBlankExportSection :: ExportSection -> ExportSection +fillBlankExportSection (ES hE _ _ e) = + ES { + headerES = hE, + sizeES = size, + nbExports = length e, + exports = e + } + where + size = 1 + sum (map getSizeExportSectionExport e) + +getDefaultCodeSectionCode :: CodeSectionCode +getDefaultCodeSectionCode = CSC { + sizeCSC = 0x0, + nbLocals = 0, + locals = [], + bodyCSC = [], + endCSC = 0x0b +} + +getSizeOpCode :: OpCode -> Int +getSizeOpCode (LocalGet _) = 2 +getSizeOpCode (LocalSet _) = 2 +getSizeOpCode (I32Const _) = 2 +getSizeOpCode (Call _) = 2 +getSizeOpCode _ = 1 + +fillBlankCodeSectionCode :: CodeSectionCode -> CodeSectionCode +fillBlankCodeSectionCode (CSC _ _ l b e) = + CSC { + sizeCSC = size, + nbLocals = length l, + locals = l, + bodyCSC = b, + endCSC = e + } + where + size = 1 + ((length l) * 2) + (sum (map getSizeOpCode b)) + 1 + +getDefaultCodeSection :: CodeSection +getDefaultCodeSection = CS { + headerCS = 0x0a, + sizeCS = 0x0, + nbCodes = 0, + codes = [] +} + +getSizeCodeSectionCode :: CodeSectionCode -> Int +getSizeCodeSectionCode (CSC s _ _ _ _) = + 1 + s + +fillBlankCodeSection :: CodeSection -> CodeSection +fillBlankCodeSection (CS hC _ _ c) = + CS { + headerCS = hC, + sizeCS = size, + nbCodes = length c, + codes = c + } + where + size = 1 + sum (map getSizeCodeSectionCode c) diff --git a/lvtc/src/WatAST.hs b/lvtc/src/WatAST.hs index 6f7e11e..580fe28 100644 --- a/lvtc/src/WatAST.hs +++ b/lvtc/src/WatAST.hs @@ -14,6 +14,7 @@ module WatAST import Data.Int (Int32) +-- if opcode added, dont miss to add the right size in ./WasmUtils.hs data OpCode = LocalGet Int32 | LocalSet Int32 @@ -47,13 +48,16 @@ instance Eq Type where (==) I32 I32 = True data FuncDef = - FuncDef Int32 [Type] Type [OpCode] [(Type, Int32)] + FuncDef Bool Int32 [Type] Type [OpCode] [(Type, Int32)] instance Show FuncDef where - show (FuncDef indexName paramsType returnType bodyCode vars) = - show indexName ++ "(" ++ show paramsType ++ ") -> " ++ show returnType - ++ " {\n" ++ show bodyCode ++ "\n}\n" ++ show vars + show (FuncDef True indexName paramsType returnType bodyCode vars) = + "export fn " ++ show indexName ++ "(" ++ show paramsType ++ ") -> " + ++ show returnType ++ " {\n" ++ show bodyCode ++ "\n}\n" ++ show vars + show (FuncDef False indexName paramsType returnType bodyCode vars) = + "fn " ++ show indexName ++ "(" ++ show paramsType ++ ") -> " + ++ show returnType ++ " {\n" ++ show bodyCode ++ "\n}\n" ++ show vars instance Eq FuncDef where - (==) (FuncDef a b c d e) (FuncDef a' b' c' d' e') = - a == a' && b == b' && c == c' && d == d' && e == e' + (==) (FuncDef aa a b c d e) (FuncDef aa' a' b' c' d' e') = + aa == aa' && a == a' && b == b' && c == c' && d == d' && e == e' diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index d183364..498e7d6 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -124,34 +124,34 @@ transformType "Bool" = "Int" transformType x = x registerParams :: FuncDeclare -> FuncDeclare -registerParams (((fName, [], typ), ins), varsIndex) = - (((fName, [], transformType typ), ins), varsIndex) -registerParams (((fName, (pName, pTyp):vParams, typ), ins), varsIndex) = - (((fName', newParams:vParams', vTyp'), ins), varsIndex'') +registerParams (((isExp, fName, [], typ), ins), varsIndex) = + (((isExp, fName, [], transformType typ), ins), varsIndex) +registerParams (((isExp, fName, (pName, pTyp):vParams, typ), ins), varsIndex) = + (((isExp, fName', newParams:vParams', vTyp'), ins), varsIndex'') where (varsIndex', indVar) = getRegisterIndex pName varsIndex - (((fName', vParams', vTyp'), _), varsIndex'') = - registerParams (((fName, vParams, typ), ins), varsIndex') + (((_, fName', vParams', vTyp'), _), varsIndex'') = + registerParams (((isExp, fName, vParams, typ), ins), varsIndex') newParams = (show indVar, transformType pTyp) registerAllFuncs :: [FuncDeclaration] -> [Index] -> [Index] registerAllFuncs [] funcsIndex = funcsIndex -registerAllFuncs (((fName, _, _), _):xs) funcsIndex = funcsIndex'' +registerAllFuncs (((_, fName, _, _), _):xs) funcsIndex = funcsIndex'' where (funcsIndex', _) = getRegisterIndex fName funcsIndex funcsIndex'' = registerAllFuncs xs funcsIndex' changeIndexes :: [FuncDeclaration] -> [Index] -> ([FuncDeclare], [Index]) changeIndexes [] funcsIndex = ([], funcsIndex) -changeIndexes (((fName, vars, typ), ins):xs) funcsIndex = +changeIndexes (((isExp, fName, vars, typ), ins):xs) funcsIndex = (newFunc:funcs, funcsIndex''') where (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (((_, vars', typ'), ins'), varsIndex) = - registerParams (((fName, vars, typ), ins), []) + (((_, _, vars', typ'), ins'), varsIndex) = + registerParams (((isExp, fName, vars, typ), ins), []) (ins'', varsIndex'', funcsIndex'') = modifyAll ins' varsIndex funcsIndex' - newFunc = (((show indFunc, vars', typ'), ins''), varsIndex'') + newFunc = (((isExp, show indFunc, vars', typ'), ins''), varsIndex'') (funcs, funcsIndex''') = changeIndexes xs funcsIndex'' ------------------------------------------------------------------------------ @@ -169,8 +169,8 @@ instance Show WatLikeState where getPrototype :: String -> [FuncDeclare] -> FuncPrototype getPrototype _ [] = undefined -getPrototype fName ((((fName', vars, typ), _), _):xs) - | fName == fName' = (fName', vars, typ) +getPrototype fName ((((isExp, fName', vars, typ), _), _):xs) + | fName == fName' = (isExp, fName', vars, typ) | otherwise = getPrototype fName xs ------------------------------------------------------------------------------ @@ -193,7 +193,7 @@ valueToWatLike (FuncValue x) (oldFuncs, funcsIndex) varsIndex = (varsIndex', ins, (fName, vVals)) = funcCallToWatLike x (oldFuncs, funcsIndex) varsIndex (varsIndex'', indVar) = newIndex varsIndex' - (_, _, typ) = getPrototype fName oldFuncs + (_, _, _, typ) = getPrototype fName oldFuncs newDeclaration = Declaration ((show indVar, typ), FuncValue (fName, vVals)) valueToWatLike (Boolean True) _ varsIndex = @@ -274,22 +274,22 @@ instructionsToWatLike (x:xs) oldFuncs varsIndex = ------------------------------------------------------------------------------ funcToWatLike' :: FuncDeclare -> ([FuncDeclare], [Index]) -> FuncDeclare -funcToWatLike' (((fName, fParams, fRet), []), varsIndex) _ = - (((fName, fParams, fRet), []), varsIndex) -funcToWatLike' (((fName, fParams, fRet), ins:inss), varsIndex) oldFuncs = - (((fName, fParams, fRet), ins' ++ inss'), varsIndex'') +funcToWatLike' (((isExp, fName, fParams, fRet), []), varsIndex) _ = + (((isExp, fName, fParams, fRet), []), varsIndex) +funcToWatLike' (((isExp, fName, fParams, fRet), ins:inss), varsIndex) oldFuncs = + (((isExp, fName, fParams, fRet), ins' ++ inss'), varsIndex'') where (varsIndex', ins') = instructionToWatLike ins oldFuncs varsIndex - thisFunc = (((fName, fParams, fRet), inss), varsIndex') - (((_, _, _), inss'), varsIndex'') = funcToWatLike' thisFunc oldFuncs + thisFunc = (((isExp, fName, fParams, fRet), inss), varsIndex') + (((_, _, _, _), inss'), varsIndex'') = funcToWatLike' thisFunc oldFuncs funcToWatLike :: FuncDeclare -> WatLikeState -> WatLikeState -funcToWatLike (((fName, fParams, fRet), fInss), varsIndex) +funcToWatLike (((isExp, fName, fParams, fRet), fInss), varsIndex) (WLS funcsIndex oldFuncs newFunc) = WLS funcsIndex oldFuncs (newFunc ++ [fFunc]) where fFunc = funcToWatLike' - (((fName, fParams, fRet), fInss), varsIndex) + (((isExp, fName, fParams, fRet), fInss), varsIndex) (oldFuncs, funcsIndex) ------------------------------------------------------------------------------ diff --git a/lvtc/src/WatLikeToWat.hs b/lvtc/src/WatLikeToWat.hs index 598cdec..403d8ee 100644 --- a/lvtc/src/WatLikeToWat.hs +++ b/lvtc/src/WatLikeToWat.hs @@ -120,9 +120,9 @@ instructionsToWat = concatMap instructionToWat -- instructionsToWat (x:xs) = instructionToWat x ++ instructionsToWat xs watLikeToWat :: FuncDeclare -> FuncDef -watLikeToWat (((fName, params, returnType), ins), vars) +watLikeToWat (((isExp, fName, params, returnType), ins), vars) | isBuiltinsFunc fName = getBuiltinWat fName - | otherwise = FuncDef indexName paramType retType opcodes varsDecl + | otherwise = FuncDef isExp indexName paramType retType opcodes varsDecl where indexName = read fName :: Int32 paramType = paramsToTypes params diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index c632596..a56f5e2 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -104,7 +104,16 @@ utParserLvt = testGroup "Parse Lvt" testParserFunc "fn abc(a: Int) -> Int\n{\n <- a;\n};\n" "" ( - ("abc", [("a", "Int")], "Int"), + (False, "abc", [("a", "Int")], "Int"), + [ + Return (Var "a") + ] + ) + , testCase "test func export" $ + testParserFunc "export fn abc(a: Int) -> Int\n{\n <- a;\n};\n" + "" + ( + (True, "abc", [("a", "Int")], "Int"), [ Return (Var "a") ] diff --git a/lvtc/test/UTWat.hs b/lvtc/test/UTWat.hs index 8382d72..9cda686 100644 --- a/lvtc/test/UTWat.hs +++ b/lvtc/test/UTWat.hs @@ -37,7 +37,7 @@ utWat = testGroup "Wat" [ ( ( - ("10", [], "Int"), + (False, "10", [], "Int"), [ Declaration (("0", "Int"), Integer 97), AST.Return (Var "0") @@ -49,7 +49,7 @@ utWat = testGroup "Wat" basic1_rep = getBuiltinsWat ++ [ - FuncDef 10 [] I32 [ + FuncDef False 10 [] I32 [ I32Const 97, LocalSet 0, LocalGet 0, @@ -61,7 +61,7 @@ utWat = testGroup "Wat" [ ( ( - ("10", [("0", "Int"), ("1", "Int")], "Int"), + (False, "10", [("0", "Int"), ("1", "Int")], "Int"), [ Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), AST.Return (Var "2") @@ -71,7 +71,7 @@ utWat = testGroup "Wat" ), ( ( - ("11", [], "Int"), + (False, "11", [], "Int"), [ Declaration (("0", "Int"), Integer 1), Declaration (("1", "Int"), Integer 2), @@ -85,7 +85,7 @@ utWat = testGroup "Wat" basic2_rep = getBuiltinsWat ++ [ - FuncDef 10 [I32, I32] I32 [ + FuncDef False 10 [I32, I32] I32 [ LocalGet 0, LocalGet 1, Call 0, @@ -93,7 +93,7 @@ utWat = testGroup "Wat" LocalGet 2, WatAST.Return ] [(I32, 1)], - FuncDef 11 [] I32 [ + FuncDef False 11 [] I32 [ I32Const 1, LocalSet 0, I32Const 2, diff --git a/lvtc/test/UTWatLike.hs b/lvtc/test/UTWatLike.hs index 91d9739..82b241a 100644 --- a/lvtc/test/UTWatLike.hs +++ b/lvtc/test/UTWatLike.hs @@ -20,43 +20,43 @@ builtinsWatLike :: [FuncDeclare] builtinsWatLike = [ ( - (("0", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "0", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("1", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "1", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("2", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "2", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("3", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "3", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("4", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "4", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("5", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "5", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("6", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "6", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("7", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "7", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("8", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "8", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ), ( - (("9", [("0", "Int"), ("1", "Int")], "Int"), []), + ((False, "9", [("0", "Int"), ("1", "Int")], "Int"), []), [(0, "x"), (1, "y")] ) ] @@ -80,14 +80,14 @@ utWatLike = testGroup "Wat Like" where basic1 = ( - ("add", [("a", "Int"), ("b", "Int")], "Int"), + (False, "add", [("a", "Int"), ("b", "Int")], "Int"), [Return (FuncValue ("+", [Var "a", Var "b"]))] ) basic1_rep = builtinsWatLike ++ [ ( ( - ("10", [("0", "Int"), ("1", "Int")], "Int"), + (False, "10", [("0", "Int"), ("1", "Int")], "Int"), [ Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), Return (Var "2") @@ -99,11 +99,11 @@ utWatLike = testGroup "Wat Like" basic2 = [ ( - ("add", [("a", "Int"), ("b", "Int")], "Int"), + (False, "add", [("a", "Int"), ("b", "Int")], "Int"), [Return (FuncValue ("+", [Var "a", Var "b"]))] ), ( - ("start", [], "Int"), + (False, "start", [], "Int"), [Return (FuncValue ("add", [Integer 1, Integer 2]))] ) ] @@ -111,7 +111,7 @@ utWatLike = testGroup "Wat Like" builtinsWatLike ++ [ ( ( - ("10", [("0", "Int"), ("1", "Int")], "Int"), + (False, "10", [("0", "Int"), ("1", "Int")], "Int"), [ Declaration (("2", "Int"), FuncValue ("0", [Var "0", Var "1"])), Return (Var "2") @@ -121,7 +121,7 @@ utWatLike = testGroup "Wat Like" ), ( ( - ("11", [], "Int"), + (False, "11", [], "Int"), [ Declaration (("0", "Int"), Integer 1), Declaration (("1", "Int"), Integer 2), @@ -134,14 +134,14 @@ utWatLike = testGroup "Wat Like" ] basic3 = ( - ("getC", [], "Char"), + (False, "getC", [], "Char"), [Return (Character 'a')] ) basic3_rep = builtinsWatLike ++ [ ( ( - ("10", [], "Int"), + (False, "10", [], "Int"), [ Declaration (("0", "Int"), Integer 97), Return (Var "0") From 6d2a27bdcd1e5c5c11bf74e931586f5bddaee4b4 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 18:23:48 +0100 Subject: [PATCH 40/99] Add original name of func --- lvtc/lvtc.cabal | 1 + lvtc/src/Builtins.hs | 20 ++++++++++---------- lvtc/src/WatAST.hs | 21 ++++++++++++--------- lvtc/src/WatLike.hs | 38 +++++++++++++++++++------------------- lvtc/src/WatLikeToWat.hs | 4 ++-- lvtc/src/WatToWasm.hs | 18 ++++++++++++++++++ lvtc/test/UTWat.hs | 15 +++++++++------ lvtc/test/UTWatLike.hs | 28 ++++++++++++++-------------- 8 files changed, 85 insertions(+), 60 deletions(-) create mode 100644 lvtc/src/WatToWasm.hs diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 25aaba3..c17dd1a 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -39,6 +39,7 @@ library WatAST WatLike WatLikeToWat + WatToWasm other-modules: Paths_lvtc autogen-modules: diff --git a/lvtc/src/Builtins.hs b/lvtc/src/Builtins.hs index cb90b4c..680cc4c 100644 --- a/lvtc/src/Builtins.hs +++ b/lvtc/src/Builtins.hs @@ -47,20 +47,20 @@ getStackRet op = [LocalGet 0, LocalGet 1] ++ op ++ [WatAST.Return] getBuiltinsWatOperator :: [FuncDef] getBuiltinsWatOperator = [ - FuncDef False 0 [I32, I32] I32 (getStackRet [I32Add]) [], - FuncDef False 1 [I32, I32] I32 (getStackRet [I32Sub]) [], - FuncDef False 2 [I32, I32] I32 (getStackRet [I32Mul]) [], - FuncDef False 3 [I32, I32] I32 (getStackRet [I32Div]) [] + FuncDef False "+" 0 [I32, I32] I32 (getStackRet [I32Add]) [], + FuncDef False "-" 1 [I32, I32] I32 (getStackRet [I32Sub]) [], + FuncDef False "*" 2 [I32, I32] I32 (getStackRet [I32Mul]) [], + FuncDef False "/" 3 [I32, I32] I32 (getStackRet [I32Div]) [] ] getBuiltinsWatComp :: [FuncDef] getBuiltinsWatComp = [ - FuncDef False 4 [I32, I32] I32 (getStackRet [I32EQ]) [], - FuncDef False 5 [I32, I32] I32 (getStackRet [I32LT_S]) [], - FuncDef False 6 [I32, I32] I32 (getStackRet [I32GT_S]) [], - FuncDef False 7 [I32, I32] I32 (getStackRet [I32LE_S]) [], - FuncDef False 8 [I32, I32] I32 (getStackRet [I32GE_S]) [], - FuncDef False 9 [I32, I32] I32 (getStackRet [I32NE]) [] + FuncDef False "==" 4 [I32, I32] I32 (getStackRet [I32EQ]) [], + FuncDef False "<" 5 [I32, I32] I32 (getStackRet [I32LT_S]) [], + FuncDef False ">" 6 [I32, I32] I32 (getStackRet [I32GT_S]) [], + FuncDef False "<=" 7 [I32, I32] I32 (getStackRet [I32LE_S]) [], + FuncDef False ">=" 8 [I32, I32] I32 (getStackRet [I32GE_S]) [], + FuncDef False "!=" 9 [I32, I32] I32 (getStackRet [I32NE]) [] ] getBuiltinsWat :: [FuncDef] diff --git a/lvtc/src/WatAST.hs b/lvtc/src/WatAST.hs index 580fe28..9d3fccc 100644 --- a/lvtc/src/WatAST.hs +++ b/lvtc/src/WatAST.hs @@ -48,16 +48,19 @@ instance Eq Type where (==) I32 I32 = True data FuncDef = - FuncDef Bool Int32 [Type] Type [OpCode] [(Type, Int32)] + FuncDef Bool String Int32 [Type] Type [OpCode] [(Type, Int32)] instance Show FuncDef where - show (FuncDef True indexName paramsType returnType bodyCode vars) = - "export fn " ++ show indexName ++ "(" ++ show paramsType ++ ") -> " - ++ show returnType ++ " {\n" ++ show bodyCode ++ "\n}\n" ++ show vars - show (FuncDef False indexName paramsType returnType bodyCode vars) = - "fn " ++ show indexName ++ "(" ++ show paramsType ++ ") -> " - ++ show returnType ++ " {\n" ++ show bodyCode ++ "\n}\n" ++ show vars + show (FuncDef True name indexName paramsType returnType bodyCode vars) = + "export fn " ++ show name ++ "{" ++ show indexName ++ "}(" + ++ show paramsType ++ ") -> " ++ show returnType ++ " {\n" + ++ show bodyCode ++ "\n}\n" ++ show vars + show (FuncDef False name indexName paramsType returnType bodyCode vars) = + "fn " ++ show name ++ "{" ++ show indexName ++ "}(" + ++ show paramsType ++ ") -> " ++ show returnType ++ " {\n" + ++ show bodyCode ++ "\n}\n" ++ show vars instance Eq FuncDef where - (==) (FuncDef aa a b c d e) (FuncDef aa' a' b' c' d' e') = - aa == aa' && a == a' && b == b' && c == c' && d == d' && e == e' + (==) (FuncDef aa aaa a b c d e) (FuncDef aa' aaa' a' b' c' d' e') = + aa == aa' && aaa == aaa' && a == a' + && b == b' && c == c' && d == d' && e == e' diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index 498e7d6..ebd463e 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -22,7 +22,7 @@ import Data.Char (ord) -- Named Index Vars / Func type Index = (Int, String) -type FuncDeclare = (FuncDeclaration, [Index]) +type FuncDeclare = (FuncDeclaration, [Index], String) getRegisterIndex' :: Int -> String -> [Index] -> ([Index], Int) getRegisterIndex' maxInd var [] = ([(maxInd, var)], maxInd) @@ -124,14 +124,14 @@ transformType "Bool" = "Int" transformType x = x registerParams :: FuncDeclare -> FuncDeclare -registerParams (((isExp, fName, [], typ), ins), varsIndex) = - (((isExp, fName, [], transformType typ), ins), varsIndex) -registerParams (((isExp, fName, (pName, pTyp):vParams, typ), ins), varsIndex) = - (((isExp, fName', newParams:vParams', vTyp'), ins), varsIndex'') +registerParams (((isExp, fName, [], typ), ins), varsIndex, oName) = + (((isExp, fName, [], transformType typ), ins), varsIndex, oName) +registerParams (((isExp, fName, (pName, pTyp):vParams, typ), ins), varsIndex, oName) = + (((isExp, fName', newParams:vParams', vTyp'), ins), varsIndex'', oName) where (varsIndex', indVar) = getRegisterIndex pName varsIndex - (((_, fName', vParams', vTyp'), _), varsIndex'') = - registerParams (((isExp, fName, vParams, typ), ins), varsIndex') + (((_, fName', vParams', vTyp'), _), varsIndex'', _) = + registerParams (((isExp, fName, vParams, typ), ins), varsIndex', oName) newParams = (show indVar, transformType pTyp) registerAllFuncs :: [FuncDeclaration] -> [Index] -> [Index] @@ -147,11 +147,11 @@ changeIndexes (((isExp, fName, vars, typ), ins):xs) funcsIndex = (newFunc:funcs, funcsIndex''') where (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (((_, _, vars', typ'), ins'), varsIndex) = - registerParams (((isExp, fName, vars, typ), ins), []) + (((_, _, vars', typ'), ins'), varsIndex, _) = + registerParams (((isExp, fName, vars, typ), ins), [], fName) (ins'', varsIndex'', funcsIndex'') = modifyAll ins' varsIndex funcsIndex' - newFunc = (((isExp, show indFunc, vars', typ'), ins''), varsIndex'') + newFunc = (((isExp, show indFunc, vars', typ'), ins''), varsIndex'', fName) (funcs, funcsIndex''') = changeIndexes xs funcsIndex'' ------------------------------------------------------------------------------ @@ -169,7 +169,7 @@ instance Show WatLikeState where getPrototype :: String -> [FuncDeclare] -> FuncPrototype getPrototype _ [] = undefined -getPrototype fName ((((isExp, fName', vars, typ), _), _):xs) +getPrototype fName ((((isExp, fName', vars, typ), _), _, _):xs) | fName == fName' = (isExp, fName', vars, typ) | otherwise = getPrototype fName xs @@ -274,22 +274,22 @@ instructionsToWatLike (x:xs) oldFuncs varsIndex = ------------------------------------------------------------------------------ funcToWatLike' :: FuncDeclare -> ([FuncDeclare], [Index]) -> FuncDeclare -funcToWatLike' (((isExp, fName, fParams, fRet), []), varsIndex) _ = - (((isExp, fName, fParams, fRet), []), varsIndex) -funcToWatLike' (((isExp, fName, fParams, fRet), ins:inss), varsIndex) oldFuncs = - (((isExp, fName, fParams, fRet), ins' ++ inss'), varsIndex'') +funcToWatLike' (((isExp, fName, fParams, fRet), []), varsIndex, oName) _ = + (((isExp, fName, fParams, fRet), []), varsIndex, oName) +funcToWatLike' (((isExp, fName, fParams, fRet), ins:inss), varsIndex, oName) oldFuncs = + (((isExp, fName, fParams, fRet), ins' ++ inss'), varsIndex'', oName) where (varsIndex', ins') = instructionToWatLike ins oldFuncs varsIndex - thisFunc = (((isExp, fName, fParams, fRet), inss), varsIndex') - (((_, _, _, _), inss'), varsIndex'') = funcToWatLike' thisFunc oldFuncs + thisFunc = (((isExp, fName, fParams, fRet), inss), varsIndex', oName) + (((_, _, _, _), inss'), varsIndex'', _) = funcToWatLike' thisFunc oldFuncs funcToWatLike :: FuncDeclare -> WatLikeState -> WatLikeState -funcToWatLike (((isExp, fName, fParams, fRet), fInss), varsIndex) +funcToWatLike (((isExp, fName, fParams, fRet), fInss), varsIndex, originName) (WLS funcsIndex oldFuncs newFunc) = WLS funcsIndex oldFuncs (newFunc ++ [fFunc]) where fFunc = funcToWatLike' - (((isExp, fName, fParams, fRet), fInss), varsIndex) + (((isExp, fName, fParams, fRet), fInss), varsIndex, originName) (oldFuncs, funcsIndex) ------------------------------------------------------------------------------ diff --git a/lvtc/src/WatLikeToWat.hs b/lvtc/src/WatLikeToWat.hs index 403d8ee..1cfeee3 100644 --- a/lvtc/src/WatLikeToWat.hs +++ b/lvtc/src/WatLikeToWat.hs @@ -120,9 +120,9 @@ instructionsToWat = concatMap instructionToWat -- instructionsToWat (x:xs) = instructionToWat x ++ instructionsToWat xs watLikeToWat :: FuncDeclare -> FuncDef -watLikeToWat (((isExp, fName, params, returnType), ins), vars) +watLikeToWat (((isExp, fName, params, returnType), ins), vars, originName) | isBuiltinsFunc fName = getBuiltinWat fName - | otherwise = FuncDef isExp indexName paramType retType opcodes varsDecl + | otherwise = FuncDef isExp originName indexName paramType retType opcodes varsDecl where indexName = read fName :: Int32 paramType = paramsToTypes params diff --git a/lvtc/src/WatToWasm.hs b/lvtc/src/WatToWasm.hs new file mode 100644 index 0000000..26b0d40 --- /dev/null +++ b/lvtc/src/WatToWasm.hs @@ -0,0 +1,18 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- WatToWasm +-} + +module WatToWasm +( + +) where + +import Wasm +import WasmUtils +import WatAST + +watToWasm :: [FuncDef] -> Wasm +watToWasm = undefined diff --git a/lvtc/test/UTWat.hs b/lvtc/test/UTWat.hs index 9cda686..865267e 100644 --- a/lvtc/test/UTWat.hs +++ b/lvtc/test/UTWat.hs @@ -43,13 +43,14 @@ utWat = testGroup "Wat" AST.Return (Var "0") ] ), - [(0, "_tmpValue")] + [(0, "_tmpValue")], + "add" ) ] basic1_rep = getBuiltinsWat ++ [ - FuncDef False 10 [] I32 [ + FuncDef False "add" 10 [] I32 [ I32Const 97, LocalSet 0, LocalGet 0, @@ -67,7 +68,8 @@ utWat = testGroup "Wat" AST.Return (Var "2") ] ), - [(0, "a"), (1, "b"), (2, "_tmpValue")] + [(0, "a"), (1, "b"), (2, "_tmpValue")], + "add" ), ( ( @@ -79,13 +81,14 @@ utWat = testGroup "Wat" AST.Return (Var "2") ] ), - [(0, "_tmpValue"), (1, "_tmpValue"), (2, "_tmpValue")] + [(0, "_tmpValue"), (1, "_tmpValue"), (2, "_tmpValue")], + "start" ) ] basic2_rep = getBuiltinsWat ++ [ - FuncDef False 10 [I32, I32] I32 [ + FuncDef False "add" 10 [I32, I32] I32 [ LocalGet 0, LocalGet 1, Call 0, @@ -93,7 +96,7 @@ utWat = testGroup "Wat" LocalGet 2, WatAST.Return ] [(I32, 1)], - FuncDef False 11 [] I32 [ + FuncDef False "start" 11 [] I32 [ I32Const 1, LocalSet 0, I32Const 2, diff --git a/lvtc/test/UTWatLike.hs b/lvtc/test/UTWatLike.hs index 82b241a..0211800 100644 --- a/lvtc/test/UTWatLike.hs +++ b/lvtc/test/UTWatLike.hs @@ -21,43 +21,43 @@ builtinsWatLike = [ ( ((False, "0", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "+" ), ( ((False, "1", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "-" ), ( ((False, "2", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "*" ), ( ((False, "3", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "/" ), ( ((False, "4", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "==" ), ( ((False, "5", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "<" ), ( ((False, "6", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], ">" ), ( ((False, "7", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "<=" ), ( ((False, "8", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], ">=" ), ( ((False, "9", [("0", "Int"), ("1", "Int")], "Int"), []), - [(0, "x"), (1, "y")] + [(0, "x"), (1, "y")], "!=" ) ] @@ -93,7 +93,7 @@ utWatLike = testGroup "Wat Like" Return (Var "2") ] ), - [(0, "a"), (1, "b"), (2, "_tmpValue")] + [(0, "a"), (1, "b"), (2, "_tmpValue")], "add" ) ] basic2 = @@ -117,7 +117,7 @@ utWatLike = testGroup "Wat Like" Return (Var "2") ] ), - [(0, "a"), (1, "b"), (2, "_tmpValue")] + [(0, "a"), (1, "b"), (2, "_tmpValue")], "add" ), ( ( @@ -129,7 +129,7 @@ utWatLike = testGroup "Wat Like" Return (Var "2") ] ), - [(0, "_tmpValue"), (1, "_tmpValue"), (2, "_tmpValue")] + [(0, "_tmpValue"), (1, "_tmpValue"), (2, "_tmpValue")], "start" ) ] basic3 = @@ -147,6 +147,6 @@ utWatLike = testGroup "Wat Like" Return (Var "0") ] ), - [(0, "_tmpValue")] + [(0, "_tmpValue")], "getC" ) ] From 841fce512fb75eb864c52e1a338956babd15fd25 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 20:13:40 +0100 Subject: [PATCH 41/99] Add wat to wasm --- lvtc/app/Main.hs | 18 +++- lvtc/lvtc.cabal | 1 + lvtc/src/Wasm.hs | 128 ++++++++++++++++------------ lvtc/src/WasmUtils.hs | 45 ++++++++++ lvtc/src/WatAST.hs | 4 + lvtc/src/WatToWasm.hs | 115 ++++++++++++++++++++++++- lvtc/test/Spec.hs | 4 +- lvtc/test/UTWasm.hs | 193 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 450 insertions(+), 58 deletions(-) create mode 100644 lvtc/test/UTWasm.hs diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index 2872eba..f07d3bd 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -13,6 +13,9 @@ import Alias (proceedAlias) import ParseLvt (parseInstruction, parseInstructions, parseFuncDeclaration) import WatLike (aSTToWatLike) import AST +import WatAST +import Builtins (getBuiltinsWat) +import WatToWasm (watToWasm) test1 :: String test1 = "if (a)\n{\nb(0);\n};\n" @@ -50,10 +53,22 @@ test7 = [ ( (False, "add", [("a", "Int"), ("b", "Int")], "Int"), - [Return (FuncValue ("+", [Var "a", Var "b"]))] + [AST.Return (FuncValue ("+", [Var "a", Var "b"]))] ) ] +test9 :: [FuncDef] +test9 = + getBuiltinsWat ++ + [ + FuncDef False "add" 10 [] WatAST.I32 [ + I32Const 97, + LocalSet 0, + LocalGet 0, + WatAST.Return + ] [(WatAST.I32, 1)] + ] + main :: IO () main = print (runParser parseInstruction test1) @@ -65,3 +80,4 @@ main = >> print (runParser (proceedAlias <$> parseAllExpression) text) >> print (runParser parseFuncDeclaration test8) >> print (aSTToWatLike test7) + >> print (watToWasm test9) diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index c17dd1a..7c78fc8 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -71,6 +71,7 @@ test-suite lvtc-test other-modules: UTParseLvt UTShuntingYard + UTWasm UTWat UTWatLike Paths_lvtc diff --git a/lvtc/src/Wasm.hs b/lvtc/src/Wasm.hs index 3bb84a2..7719a37 100644 --- a/lvtc/src/Wasm.hs +++ b/lvtc/src/Wasm.hs @@ -22,9 +22,11 @@ module Wasm ) where import WatAST (OpCode (..)) +import Data.Int (Int32) data VariableType = I32 + deriving (Show, Eq) data TypeSectionType = Func { @@ -34,72 +36,90 @@ data TypeSectionType = nbResults :: Int, results :: [VariableType] } + deriving (Show, Eq) -data TypeSection = TS { - headerTS :: Int, - sizeTS :: Int, - nbTypes :: Int, - types :: [TypeSectionType] -} +data TypeSection = + TS { + headerTS :: Int, + sizeTS :: Int, + nbTypes :: Int, + types :: [TypeSectionType] + } + deriving (Show, Eq) -data FunctionSection = FS { - headerFS :: Int, - sizeFS :: Int, - nbFuncs :: Int, - funcs :: [Int] -} +data FunctionSection = + FS { + headerFS :: Int, + sizeFS :: Int, + nbFuncs :: Int, + funcs :: [Int] + } + deriving (Show, Eq) -data MemorySection = MS { - headerMS :: Int, - sizeMS :: Int, - hasMax :: Int, - minMS :: Int, - maxMS :: Int -} +data MemorySection = + MS { + headerMS :: Int, + sizeMS :: Int, + hasMax :: Int, + minMS :: Int, + maxMS :: Int + } + deriving (Show, Eq) data ExportSectionExportType = FuncExport | TableExport | MemoryExport | GlobalExport + deriving (Show, Eq) -data ExportSectionExport = ESE { - nameLength :: Int, - name :: String, - typeESE :: ExportSectionExportType, - indexESE :: Int -} +data ExportSectionExport = + ESE { + nameLength :: Int, + name :: String, + typeESE :: ExportSectionExportType, + indexESE :: Int + } + deriving (Show, Eq) -data ExportSection = ES { - headerES :: Int, - sizeES :: Int, - nbExports :: Int, - exports :: [ExportSectionExport] -} +data ExportSection = + ES { + headerES :: Int, + sizeES :: Int, + nbExports :: Int, + exports :: [ExportSectionExport] + } + deriving (Show, Eq) -type CodeSectionCodeLocals = (Int, VariableType) +type CodeSectionCodeLocals = (Int32, VariableType) -data CodeSectionCode = CSC { - sizeCSC :: Int, - nbLocals :: Int, - locals :: [CodeSectionCodeLocals], - bodyCSC :: [OpCode], - endCSC :: Int -} +data CodeSectionCode = + CSC { + sizeCSC :: Int, + nbLocals :: Int, + locals :: [CodeSectionCodeLocals], + bodyCSC :: [OpCode], + endCSC :: Int + } + deriving (Show, Eq) -data CodeSection = CS { - headerCS :: Int, - sizeCS :: Int, - nbCodes :: Int, - codes :: [CodeSectionCode] -} +data CodeSection = + CS { + headerCS :: Int, + sizeCS :: Int, + nbCodes :: Int, + codes :: [CodeSectionCode] + } + deriving (Show, Eq) -data Wasm = Wasm { - headerWasm :: (Int, Int, Int, Int), - versionWasm :: (Int, Int, Int, Int), - typeSection :: TypeSection, - functionSection :: FunctionSection, - memorySection :: MemorySection, - exportSection :: ExportSection, - codeSection :: CodeSection -} +data Wasm = + Wasm { + headerWasm :: (Int, Int, Int, Int), + versionWasm :: (Int, Int, Int, Int), + typeSection :: TypeSection, + functionSection :: FunctionSection, + memorySection :: MemorySection, + exportSection :: ExportSection, + codeSection :: CodeSection + } + deriving (Show, Eq) diff --git a/lvtc/src/WasmUtils.hs b/lvtc/src/WasmUtils.hs index 999568c..1cf6b58 100644 --- a/lvtc/src/WasmUtils.hs +++ b/lvtc/src/WasmUtils.hs @@ -14,10 +14,13 @@ module WasmUtils getDefaultExportSection, getDefaultCodeSectionCode, getDefaultCodeSection, + getDefaultWasm, -- fillBlankTypeSectionType, fillBlankTypeSection, fillBlankFunctionSection, + fillBlankMemorySection, + fillBlankExportSectionExport, fillBlankExportSection, fillBlankCodeSectionCode, fillBlankCodeSection, @@ -96,6 +99,37 @@ getDefaultMemorySection = MS { maxMS = 0x0 } +fillBlankMemorySection :: MemorySection -> MemorySection +fillBlankMemorySection (MS hM _ 0 miMS maMS) = + MS { + headerMS = hM, + sizeMS = size, + hasMax = 0, + minMS = miMS, + maxMS = maMS + } + where + size = 2 +fillBlankMemorySection (MS hM _ _ miMS maMS) = + MS { + headerMS = hM, + sizeMS = size, + hasMax = 1, + minMS = miMS, + maxMS = maMS + } + where + size = 3 + +fillBlankExportSectionExport :: ExportSectionExport -> ExportSectionExport +fillBlankExportSectionExport (ESE _ n t i) = + ESE { + nameLength = length n, + name = n, + typeESE = t, + indexESE = i + } + getSizeExportSectionExport :: ExportSectionExport -> Int getSizeExportSectionExport (ESE _ n _ _) = 1 + ((length n) * 1) + 1 + 1 @@ -169,3 +203,14 @@ fillBlankCodeSection (CS hC _ _ c) = } where size = 1 + sum (map getSizeCodeSectionCode c) + +getDefaultWasm :: Wasm +getDefaultWasm = Wasm { + headerWasm = (0x00, 0x61, 0x73, 0x6d), + versionWasm = (0x01, 0x00, 0x00, 0x00), + typeSection = getDefaultTypeSection, + functionSection = getDefaultFunctionSection, + memorySection = getDefaultMemorySection, + exportSection = getDefaultExportSection, + codeSection = getDefaultCodeSection +} diff --git a/lvtc/src/WatAST.hs b/lvtc/src/WatAST.hs index 9d3fccc..056f2a4 100644 --- a/lvtc/src/WatAST.hs +++ b/lvtc/src/WatAST.hs @@ -64,3 +64,7 @@ instance Eq FuncDef where (==) (FuncDef aa aaa a b c d e) (FuncDef aa' aaa' a' b' c' d' e') = aa == aa' && aaa == aaa' && a == a' && b == b' && c == c' && d == d' && e == e' + +instance Ord FuncDef where + compare (FuncDef _ _ ind _ _ _ _) (FuncDef _ _ ind' _ _ _ _) = + compare ind ind' diff --git a/lvtc/src/WatToWasm.hs b/lvtc/src/WatToWasm.hs index 26b0d40..f708026 100644 --- a/lvtc/src/WatToWasm.hs +++ b/lvtc/src/WatToWasm.hs @@ -7,12 +7,123 @@ module WatToWasm ( - + watToWasm ) where import Wasm import WasmUtils import WatAST +import Data.List (sort) + +watASTTypeToWasm :: Type -> VariableType +watASTTypeToWasm WatAST.I32 = Wasm.I32 + +-- Type Section + +addFuncToType :: FuncDef -> [([Type], Type)] -> [([Type], Type)] +addFuncToType (FuncDef _ _ _ p r _ _) [] = [(p, r)] +addFuncToType (FuncDef i o n p r b l) ((p', r'):xs) + | p == p' && r == r' = (p', r') : xs + | otherwise = (p', r') : addFuncToType (FuncDef i o n p r b l) xs + +funcDefsToTypeSectionType' :: [FuncDef] -> [([Type], Type)] -> [([Type], Type)] +funcDefsToTypeSectionType' [] tSection = tSection +funcDefsToTypeSectionType' (x:xs) tSection = + funcDefsToTypeSectionType' xs tSection' + where + tSection' = addFuncToType x tSection + +toTypeSectionType :: ([Type], Type) -> TypeSectionType +toTypeSectionType (p, r) = + fillBlankTypeSectionType (getDefaultTypeSectionType { + params = map watASTTypeToWasm p, + results = [watASTTypeToWasm r] + }) + +funcDefsToTypeSectionType :: [FuncDef] -> [TypeSectionType] +funcDefsToTypeSectionType fs = map toTypeSectionType tSection + where + tSection = funcDefsToTypeSectionType' fs [] + +funcDefsToTypeSection :: [FuncDef] -> TypeSection +funcDefsToTypeSection f = + fillBlankTypeSection (getDefaultTypeSection { + types = funcDefsToTypeSectionType f + }) + +-- Function Section + +getIndexType :: [([Type], Type)] -> Int -> FuncDef -> Int +getIndexType [] _ (FuncDef _ oName _ _ _ _ _) = error ("No Type in type section: " ++ oName) +getIndexType ((p', r'):xs) ind (FuncDef i o n p r b l) + | p == p' && r == r' = ind + | otherwise = getIndexType xs (ind + 1) (FuncDef i o n p r b l) + +funcDefsToFunctionSection :: [FuncDef] -> FunctionSection +funcDefsToFunctionSection fs = + fillBlankFunctionSection (getDefaultFunctionSection { + funcs = map (getIndexType tSection 0) fs + }) + where + tSection = funcDefsToTypeSectionType' fs [] + +-- Memory Section + +funcDefsToMemorySection :: [FuncDef] -> MemorySection +funcDefsToMemorySection _ = + fillBlankMemorySection (getDefaultMemorySection { + hasMax = 0, + minMS = 1 + }) + +-- Export Section + +funcDefsToExportSectionExport :: [FuncDef] -> [ExportSectionExport] +funcDefsToExportSectionExport [] = [] +funcDefsToExportSectionExport ((FuncDef True oName oInd _ _ _ _):xs) = + fillBlankExportSectionExport (ESE { + nameLength = 0, + name = oName, + typeESE = FuncExport, + indexESE = read (show oInd) :: Int + }) : funcDefsToExportSectionExport xs +funcDefsToExportSectionExport (_:xs) = funcDefsToExportSectionExport xs + +funcDefsToExportSection :: [FuncDef] -> ExportSection +funcDefsToExportSection fs = + fillBlankExportSection (getDefaultExportSection { + exports = funcDefsToExportSectionExport fs + }) + +-- Code Section + +funcDefToCodeSectionCode :: FuncDef -> CodeSectionCode +funcDefToCodeSectionCode (FuncDef _ _ _ _ _ b l) = + fillBlankCodeSectionCode (getDefaultCodeSectionCode { + locals = map (\(x, y) -> (y, watASTTypeToWasm x)) l, + bodyCSC = b + }) + +funcDefsToCodeSection :: [FuncDef] -> CodeSection +funcDefsToCodeSection f = + fillBlankCodeSection (getDefaultCodeSection { + codes = map funcDefToCodeSectionCode f + }) + +-- main + +sortFuncDef :: [FuncDef] -> [FuncDef] +sortFuncDef = sort + watToWasm :: [FuncDef] -> Wasm -watToWasm = undefined +watToWasm fs = + getDefaultWasm { + typeSection = funcDefsToTypeSection fsSorted, + functionSection = funcDefsToFunctionSection fsSorted, + memorySection = funcDefsToMemorySection fsSorted, + exportSection = funcDefsToExportSection fsSorted, + codeSection = funcDefsToCodeSection fsSorted + } + where + fsSorted = sortFuncDef fs diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index b57160c..9d03222 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -16,6 +16,7 @@ import UTParseLvt import UTShuntingYard import UTWatLike import UTWat +import UTWasm main :: IO () main = defaultMain tests @@ -29,7 +30,8 @@ tests = testGroup "Leviator Tests - Compiler" utShuntingYard, utAlias, utWatLike, - utWat + utWat, + utWasm ] testParserHelper :: String -> String -> Expression -> IO () diff --git a/lvtc/test/UTWasm.hs b/lvtc/test/UTWasm.hs new file mode 100644 index 0000000..a91970d --- /dev/null +++ b/lvtc/test/UTWasm.hs @@ -0,0 +1,193 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- UTWasm +-} + +module UTWasm +( + utWasm +) where + +import Test.Tasty +import Test.Tasty.HUnit + +import Builtins +import Wasm +import WatAST +import WatToWasm + +basic1Rep :: Wasm +basic1Rep = + Wasm { + headerWasm = (0,97,115,109), + versionWasm = (1,0,0,0), + typeSection = TS { + headerTS = 1, + sizeTS = 11, + nbTypes = 2, + types = [ + Func { + headerFunc = 96, + nbParams = 2, + params = [Wasm.I32,Wasm.I32], + nbResults = 1, + results = [Wasm.I32] + }, + Func { + headerFunc = 96, + nbParams = 0, + params = [], + nbResults = 1, + results = [Wasm.I32] + } + ] + }, + functionSection = FS { + headerFS = 3, + sizeFS = 12, + nbFuncs = 11, + funcs = [ + 0,0,0,0,0,0,0,0,0,0,1 + ] + }, + memorySection = MS { + headerMS = 5, + sizeMS = 2, + hasMax = 0, + minMS = 1, + maxMS = 0 + }, exportSection = ES { + headerES = 7, + sizeES = 1, + nbExports = 0, + exports = [] + }, + codeSection = CS { + headerCS = 10, + sizeCS = 103, + nbCodes = 11, + codes = [ + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32Add,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32Sub,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32Mul,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32Div,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32EQ,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32LT_S,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0 , + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32GT_S,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32LE_S,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1, I32GE_S,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 8, + nbLocals = 0, + locals = [], + bodyCSC = [ + LocalGet 0,LocalGet 1,I32NE,Return + ], + endCSC = 11 + }, + CSC { + sizeCSC = 11, + nbLocals = 1, + locals = [(1,Wasm.I32)], + bodyCSC = [ + I32Const 97,LocalSet 0,LocalGet 0,Return + ], + endCSC = 11 + } + ] + } + } + +utWasm :: TestTree +utWasm = testGroup "Wasm" + [ + testCase "basic" $ + assertEqual "Basic" + basic1Rep + (watToWasm basic1) + ] + where + basic1 = + getBuiltinsWat ++ + [ + FuncDef False "add" 10 [] WatAST.I32 [ + I32Const 97, + LocalSet 0, + LocalGet 0, + Return + ] [(WatAST.I32, 1)] + ] From 7ce40729bb21ae16e973f094d20458a1494dcf27 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 10 Jan 2024 20:29:54 +0100 Subject: [PATCH 42/99] Fix norm --- lvtc/app/Main.hs | 8 ++++++-- lvtc/src/WatLike.hs | 22 +++++++++++++--------- lvtc/src/WatLikeToWat.hs | 10 +++++----- lvtc/src/WatToWasm.hs | 3 ++- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index f07d3bd..f7da6c3 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -69,6 +69,11 @@ test9 = ] [(WatAST.I32, 1)] ] +main2 :: IO () +main2 = + print (aSTToWatLike test7) + >> print (watToWasm test9) + main :: IO () main = print (runParser parseInstruction test1) @@ -79,5 +84,4 @@ main = >> print (runParser parseInstruction test6) >> print (runParser (proceedAlias <$> parseAllExpression) text) >> print (runParser parseFuncDeclaration test8) - >> print (aSTToWatLike test7) - >> print (watToWasm test9) + >> main2 diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index ebd463e..96e4cab 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -126,12 +126,14 @@ transformType x = x registerParams :: FuncDeclare -> FuncDeclare registerParams (((isExp, fName, [], typ), ins), varsIndex, oName) = (((isExp, fName, [], transformType typ), ins), varsIndex, oName) -registerParams (((isExp, fName, (pName, pTyp):vParams, typ), ins), varsIndex, oName) = +registerParams (((isExp, fName, (pName, pTyp):vParams, typ) + , ins), varsIndex, oName) = (((isExp, fName', newParams:vParams', vTyp'), ins), varsIndex'', oName) where (varsIndex', indVar) = getRegisterIndex pName varsIndex (((_, fName', vParams', vTyp'), _), varsIndex'', _) = - registerParams (((isExp, fName, vParams, typ), ins), varsIndex', oName) + registerParams (((isExp, fName, vParams, typ), ins) + , varsIndex', oName) newParams = (show indVar, transformType pTyp) registerAllFuncs :: [FuncDeclaration] -> [Index] -> [Index] @@ -146,12 +148,12 @@ changeIndexes [] funcsIndex = ([], funcsIndex) changeIndexes (((isExp, fName, vars, typ), ins):xs) funcsIndex = (newFunc:funcs, funcsIndex''') where - (funcsIndex', indFunc) = getRegisterIndex fName funcsIndex - (((_, _, vars', typ'), ins'), varsIndex, _) = + (funcsIndex', iFunc) = getRegisterIndex fName funcsIndex + (((_, _, vars', typ'), ins'), vIndex, _) = registerParams (((isExp, fName, vars, typ), ins), [], fName) - (ins'', varsIndex'', funcsIndex'') = - modifyAll ins' varsIndex funcsIndex' - newFunc = (((isExp, show indFunc, vars', typ'), ins''), varsIndex'', fName) + (ins'', vIndex'', funcsIndex'') = + modifyAll ins' vIndex funcsIndex' + newFunc = (((isExp, show iFunc, vars', typ'), ins''), vIndex'', fName) (funcs, funcsIndex''') = changeIndexes xs funcsIndex'' ------------------------------------------------------------------------------ @@ -276,12 +278,14 @@ instructionsToWatLike (x:xs) oldFuncs varsIndex = funcToWatLike' :: FuncDeclare -> ([FuncDeclare], [Index]) -> FuncDeclare funcToWatLike' (((isExp, fName, fParams, fRet), []), varsIndex, oName) _ = (((isExp, fName, fParams, fRet), []), varsIndex, oName) -funcToWatLike' (((isExp, fName, fParams, fRet), ins:inss), varsIndex, oName) oldFuncs = +funcToWatLike' (((isExp, fName, fParams, fRet), ins:inss), + varsIndex, oName) oldFuncs = (((isExp, fName, fParams, fRet), ins' ++ inss'), varsIndex'', oName) where (varsIndex', ins') = instructionToWatLike ins oldFuncs varsIndex thisFunc = (((isExp, fName, fParams, fRet), inss), varsIndex', oName) - (((_, _, _, _), inss'), varsIndex'', _) = funcToWatLike' thisFunc oldFuncs + (((_, _, _, _), inss'), varsIndex'', _) = + funcToWatLike' thisFunc oldFuncs funcToWatLike :: FuncDeclare -> WatLikeState -> WatLikeState funcToWatLike (((isExp, fName, fParams, fRet), fInss), varsIndex, originName) diff --git a/lvtc/src/WatLikeToWat.hs b/lvtc/src/WatLikeToWat.hs index 1cfeee3..ce3b172 100644 --- a/lvtc/src/WatLikeToWat.hs +++ b/lvtc/src/WatLikeToWat.hs @@ -122,12 +122,12 @@ instructionsToWat = concatMap instructionToWat watLikeToWat :: FuncDeclare -> FuncDef watLikeToWat (((isExp, fName, params, returnType), ins), vars, originName) | isBuiltinsFunc fName = getBuiltinWat fName - | otherwise = FuncDef isExp originName indexName paramType retType opcodes varsDecl + | otherwise = FuncDef isExp originName iName pType rType opcodes vDecl where - indexName = read fName :: Int32 - paramType = paramsToTypes params - retType = typeStringToType returnType - varsDecl = groupVarsToDecl $ varsToDecl vars ins params + iName = read fName :: Int32 + pType = paramsToTypes params + rType = typeStringToType returnType + vDecl = groupVarsToDecl $ varsToDecl vars ins params opcodes = instructionsToWat ins watsLikeToWat :: [FuncDeclare] -> [FuncDef] diff --git a/lvtc/src/WatToWasm.hs b/lvtc/src/WatToWasm.hs index f708026..d51625a 100644 --- a/lvtc/src/WatToWasm.hs +++ b/lvtc/src/WatToWasm.hs @@ -55,7 +55,8 @@ funcDefsToTypeSection f = -- Function Section getIndexType :: [([Type], Type)] -> Int -> FuncDef -> Int -getIndexType [] _ (FuncDef _ oName _ _ _ _ _) = error ("No Type in type section: " ++ oName) +getIndexType [] _ (FuncDef _ oName _ _ _ _ _) = + error ("No Type in type section: " ++ oName) getIndexType ((p', r'):xs) ind (FuncDef i o n p r b l) | p == p' && r == r' = ind | otherwise = getIndexType xs (ind + 1) (FuncDef i o n p r b l) From a2a1cc035700b991b6a3b295d006a2020d3c3eb6 Mon Sep 17 00:00:00 2001 From: tenshi Date: Wed, 10 Jan 2024 21:51:57 +0100 Subject: [PATCH 43/99] add exports --- lvtrun/README.md | 2 -- lvtrun/app/Parsing/Exports.hs | 68 +++++++++++++++++++++++++++++++++++ lvtrun/app/Parsing/Parser.hs | 3 +- lvtrun/app/Types.hs | 17 ++++++--- lvtrun/lvtrun.cabal | 1 + 5 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 lvtrun/app/Parsing/Exports.hs diff --git a/lvtrun/README.md b/lvtrun/README.md index e641c57..66f147e 100644 --- a/lvtrun/README.md +++ b/lvtrun/README.md @@ -135,7 +135,6 @@ b6 # 01 is export type "table" 01 00 - # size 6 06 # name "start" @@ -143,7 +142,6 @@ b6 # its a type function with id 03 00 03 - # size = 16 name = __errno_location " 10 5f 5f 65 72 72 6e 6f 5f 6c 6f 63 61 74 69 6f 6e diff --git a/lvtrun/app/Parsing/Exports.hs b/lvtrun/app/Parsing/Exports.hs new file mode 100644 index 0000000..2fddcf8 --- /dev/null +++ b/lvtrun/app/Parsing/Exports.hs @@ -0,0 +1,68 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Exports +-} + +module Parsing.Exports + ( + getExports + ) +where + +import qualified Data.ByteString.Lazy as Bs +import Control.Exception (throw) +import Data.Int (Int64, Int32) +import Data.Word (Word8) +import Numeric (showHex) +import Data.Char (chr) + +import Leb128 +import Errors +import Types + +import Debug.Trace + +isExportValid :: Word8 -> Bool +isExportValid 0x00 = True +isExportValid 0x01 = True +isExportValid 0x02 = True +isExportValid 0x03 = True +isExportValid _ = False + +getExportNb :: Bs.ByteString -> (Int64, Bs.ByteString) +getExportNb content = extractLEB128 content + +word8ToString :: [Word8] -> String +word8ToString = map (chr . fromIntegral) + +createExport :: [Word8] -> Word8 -> FuncIdx -> Export +createExport name 0x00 idx = Export (word8ToString name) (ExportFunc idx) +createExport name 0x01 idx = Export (word8ToString name) (ExportTable idx) +createExport name 0x02 idx = Export (word8ToString name) (ExportMemory idx) +createExport name 0x03 idx = Export (word8ToString name) (ExportGlobal idx) +createExport _ _ _ = throw $ WasmError "createExport: bad export" + +parseExports :: Int32 -> Int64 -> Bs.ByteString -> [Export] +parseExports idx maxIdx content + | idx >= (fromIntegral maxIdx) = [] + | Bs.length content == 0 = [] + | otherwise = do + let (nameLen, rest) = extractLEB128 content + let (name, rest2) = Bs.splitAt (fromIntegral nameLen) rest + let exportType = head (Bs.unpack rest2) + let (exportValue, rest3) = extractLEB128 (Bs.drop 1 rest2) + let export = createExport (Bs.unpack name) exportType (fromIntegral exportValue) + export : parseExports (idx + 1) maxIdx rest3 + +printHex :: [Word8] -> String +printHex [] = [] +printHex (x:xs) = showHex x " " ++ printHex xs + +getExports :: Section -> [Export] +getExports (Section ExportID _ content) = do + let (exprtsNb, rest) = getExportNb content + trace ("content" ++ printHex (Bs.unpack content)) + parseExports 0 exprtsNb rest +getExports _ = throw $ WasmError "getExports: bad section" diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs index e330b5b..3de0c37 100644 --- a/lvtrun/app/Parsing/Parser.hs +++ b/lvtrun/app/Parsing/Parser.hs @@ -17,6 +17,7 @@ import Parsing.Header import Parsing.Memory import Parsing.FuncTypes import Parsing.Global +import Parsing.Exports import Debug.Trace @@ -30,4 +31,4 @@ parseModule bytes = do [] (getMemories (getSectionWithId sections MemoryID)) (getGlobals (getSectionWithId sections GlobalID)) - [] + (getExports (getSectionWithId sections ExportID)) diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index 52e1997..61818e3 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -159,12 +159,21 @@ instance Show Global where show global = "\n\t(global " ++ (show $ globalType global) ++ " " ++ (show $ mutability global) ++ " " ++ (show $ initExpr global) ++ ")" -data ExportDesc = ExportFunc FuncIdx deriving (Show) + +data ExportDesc = + ExportFunc FuncIdx + | ExportTable TableIdx + | ExportMemory MemIdx + | ExportGlobal GlobalIdx + deriving (Show) data Export = Export { - modName :: String - -- desc -} deriving (Show) + expName :: String, + expDesc :: ExportDesc +} + +instance Show Export where + show export = "\n\t(export \"" ++ (expName export) ++ "\" " ++ (show $ expDesc export) ++ ")" data Table = Table { notImpl :: String diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index a70c8c9..00bef13 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -46,6 +46,7 @@ executable lvtrun-exe IO Leb128 Loader + Parsing.Exports Parsing.FuncTypes Parsing.Global Parsing.Header From 6fe88c3624706235df53a9c0981d530afdf0d8b1 Mon Sep 17 00:00:00 2001 From: tenshi Date: Wed, 10 Jan 2024 22:31:41 +0100 Subject: [PATCH 44/99] add getFuncTypeIdx --- lvtrun/app/Main.hs | 3 ++- lvtrun/app/Parsing/Exports.hs | 23 +++++++++----------- lvtrun/app/Parsing/Functions.hs | 37 +++++++++++++++++++++++++++++++++ lvtrun/app/Parsing/Parser.hs | 3 ++- lvtrun/app/Run/Start.hs | 21 +++++++++++++++++++ lvtrun/app/Types.hs | 7 ++++++- lvtrun/lvtrun.cabal | 2 ++ 7 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 lvtrun/app/Parsing/Functions.hs create mode 100644 lvtrun/app/Run/Start.hs diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 0409807..8fc7fc3 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -10,9 +10,10 @@ module Main (main) where import Control.Exception (try) import Errors import Loader +import Run.Start main :: IO () main = try (loadModule "./test/simple.wasm") >>= \result -> case result of Left err -> handleException err - Right wasmMod -> print wasmMod + Right wasmMod -> start wasmMod diff --git a/lvtrun/app/Parsing/Exports.hs b/lvtrun/app/Parsing/Exports.hs index 2fddcf8..be89d01 100644 --- a/lvtrun/app/Parsing/Exports.hs +++ b/lvtrun/app/Parsing/Exports.hs @@ -22,8 +22,6 @@ import Leb128 import Errors import Types -import Debug.Trace - isExportValid :: Word8 -> Bool isExportValid 0x00 = True isExportValid 0x01 = True @@ -46,15 +44,15 @@ createExport _ _ _ = throw $ WasmError "createExport: bad export" parseExports :: Int32 -> Int64 -> Bs.ByteString -> [Export] parseExports idx maxIdx content - | idx >= (fromIntegral maxIdx) = [] - | Bs.length content == 0 = [] - | otherwise = do - let (nameLen, rest) = extractLEB128 content - let (name, rest2) = Bs.splitAt (fromIntegral nameLen) rest - let exportType = head (Bs.unpack rest2) - let (exportValue, rest3) = extractLEB128 (Bs.drop 1 rest2) - let export = createExport (Bs.unpack name) exportType (fromIntegral exportValue) - export : parseExports (idx + 1) maxIdx rest3 + | idx >= (fromIntegral maxIdx) = [] + | Bs.length content == 0 = [] + | otherwise = do + let (nameLen, rest) = extractLEB128 content + let (name, rest2) = Bs.splitAt (fromIntegral nameLen) rest + let exportType = head (Bs.unpack rest2) + let (exportValue, rest3) = extractLEB128 (Bs.drop 1 rest2) + let export = createExport (Bs.unpack name) exportType (fromIntegral exportValue) + export : parseExports (idx + 1) maxIdx rest3 printHex :: [Word8] -> String printHex [] = [] @@ -63,6 +61,5 @@ printHex (x:xs) = showHex x " " ++ printHex xs getExports :: Section -> [Export] getExports (Section ExportID _ content) = do let (exprtsNb, rest) = getExportNb content - trace ("content" ++ printHex (Bs.unpack content)) - parseExports 0 exprtsNb rest + parseExports 0 exprtsNb rest getExports _ = throw $ WasmError "getExports: bad section" diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/app/Parsing/Functions.hs new file mode 100644 index 0000000..2f2f67b --- /dev/null +++ b/lvtrun/app/Parsing/Functions.hs @@ -0,0 +1,37 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Functions +-} + +module Parsing.Functions +( + getFunctions +) +where + +import qualified Data.ByteString.Lazy as BSL +import Control.Exception (throw) +import Data.Int (Int64, Int32) +import Data.Word (Word8) + +import Types +import Errors +import Leb128 + +import Debug.Trace + +parseFunctionsIndex :: Int32 -> Int64 -> BSL.ByteString -> [Function] +parseFunctionsIndex idx maxIdx content + | idx >= (fromIntegral maxIdx) = [] + | BSL.length content == 0 = [] + | otherwise = do + let (typeIdx, rest) = extractLEB1282 content + Function {funcType = fromIntegral typeIdx, funcIdx = idx, body = []} : parseFunctionsIndex (idx + 1) maxIdx rest + +getFunctions :: Section -> [Function] +getFunctions (Section FunctionID _ content) = do + let (vecSize, rest) = extractLEB128 content + parseFunctionsIndex 0 vecSize rest +getFunctions _ = throw $ WasmError "getFunctions: bad section" diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs index 3de0c37..63db434 100644 --- a/lvtrun/app/Parsing/Parser.hs +++ b/lvtrun/app/Parsing/Parser.hs @@ -18,6 +18,7 @@ import Parsing.Memory import Parsing.FuncTypes import Parsing.Global import Parsing.Exports +import Parsing.Functions import Debug.Trace @@ -27,7 +28,7 @@ parseModule bytes = do WasmModule (getModHeader (getSectionWithId sections CustomID)) (getFuncTypes (getSectionWithId sections TypeID)) [] - [] + (getFunctions (getSectionWithId sections FunctionID)) [] (getMemories (getSectionWithId sections MemoryID)) (getGlobals (getSectionWithId sections GlobalID)) diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs new file mode 100644 index 0000000..eca7a80 --- /dev/null +++ b/lvtrun/app/Run/Start.hs @@ -0,0 +1,21 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Start +-} + +module Run.Start + ( + start + ) +where + +import Types +import Errors + +start :: WasmModule -> IO () +start wasmMod = do + putStrLn "Start" + print wasmMod + putStrLn "End" diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index 61818e3..4fe4c48 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -142,8 +142,13 @@ data ImportDesc = data Function = Function { funcType :: TypeIdx, + funcIdx :: FuncIdx, body :: [Instruction] -} deriving (Show) +} + +instance Show Function where + show func = "\n\t(func idx:" ++ (show $ funcIdx func) ++ " typeId:" ++ (show $ funcType func) ++ " " ++ + (show $ body func) ++ ")" type Memory = Limit diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 00bef13..078ab73 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -47,12 +47,14 @@ executable lvtrun-exe Leb128 Loader Parsing.Exports + Parsing.Functions Parsing.FuncTypes Parsing.Global Parsing.Header Parsing.Memory Parsing.Parser Parsing.Sections + Run.Start Types Paths_lvtrun autogen-modules: From bade394b910f2b826baa31c882571d5407a15fa4 Mon Sep 17 00:00:00 2001 From: tenshi Date: Wed, 10 Jan 2024 22:58:31 +0100 Subject: [PATCH 45/99] getStartFunc --- lvtrun/app/Run/Start.hs | 32 +++++++++++++++++++++++++++++--- lvtrun/app/Run/Types.hs | 18 ++++++++++++++++++ lvtrun/lvtrun.cabal | 1 + 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 lvtrun/app/Run/Types.hs diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index eca7a80..067446a 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -11,11 +11,37 @@ module Run.Start ) where +import Data.Int (Int32) +import Control.Exception (throw) + import Types import Errors +-------------------------------------- + +getStartFunctionId :: [Export] -> Int32 +getStartFunctionId [] = throw $ WasmError "No start function" +getStartFunctionId (x:xs) + | expName x == "_start" = + case expDesc x of + ExportFunc idx -> idx + _ -> throw $ WasmError "getStartFunctionId: bad export" + | otherwise = getStartFunctionId xs +getStartFunctionId _ = throw $ WasmError "getStartFunctionId: bad export" + +getFunctionFromId :: Int32 -> [Function] -> Function +getFunctionFromId id [] = throw $ WasmError "getFunctionFromId: bad id" +getFunctionFromId id (x:xs) + | funcIdx x == id = x + | otherwise = getFunctionFromId id xs + +getStartFunction :: [Export] -> [Function] -> Function +getStartFunction exports functions = + getFunctionFromId (getStartFunctionId exports) functions + + ------------------------- + start :: WasmModule -> IO () start wasmMod = do - putStrLn "Start" - print wasmMod - putStrLn "End" + let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) + print startFunc diff --git a/lvtrun/app/Run/Types.hs b/lvtrun/app/Run/Types.hs new file mode 100644 index 0000000..3e82a9f --- /dev/null +++ b/lvtrun/app/Run/Types.hs @@ -0,0 +1,18 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Types +-} + +module Run.Types + ( + VMConfig(..), + ) +where + +import Types + +data VMConfig = VMConfig { + start :: Bool +} deriving (Show) diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 078ab73..6fcc8d2 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -55,6 +55,7 @@ executable lvtrun-exe Parsing.Parser Parsing.Sections Run.Start + Run.Types Types Paths_lvtrun autogen-modules: From 54f6db5f33572fead7a85422e157fcb817d53cda Mon Sep 17 00:00:00 2001 From: tenshi Date: Thu, 11 Jan 2024 02:55:56 +0100 Subject: [PATCH 46/99] good instruciton parsing --- lvtrun/app/Parsing/Code.hs | 211 ++++++++++++++++++++++++++++++++ lvtrun/app/Parsing/Functions.hs | 4 +- lvtrun/app/Parsing/Global.hs | 4 + lvtrun/app/Parsing/Parser.hs | 3 +- lvtrun/app/Run/Start.hs | 8 +- lvtrun/app/Types.hs | 64 +++++++++- lvtrun/lvtrun.cabal | 1 + 7 files changed, 287 insertions(+), 8 deletions(-) create mode 100644 lvtrun/app/Parsing/Code.hs diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/app/Parsing/Code.hs new file mode 100644 index 0000000..084de79 --- /dev/null +++ b/lvtrun/app/Parsing/Code.hs @@ -0,0 +1,211 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Code +-} + +module Parsing.Code + ( + getFuncCode, + ) +where + +import qualified Data.ByteString.Lazy as BSL +import Control.Exception (throw) +import Control.Monad (when) +import Data.Word (Word8) +import Data.Int (Int64, Int32) +import Numeric (showHex) + +import Leb128 +import Types +import Errors + +import Debug.Trace + +-- GET LOCALS + +diviseBytes :: BSL.ByteString -> [BSL.ByteString] +diviseBytes bytes + | BSL.length bytes == 0 = [] + | otherwise = do + let (size, rest) = extractLEB128 bytes + let (code, rest2) = BSL.splitAt (fromIntegral size) rest + code : diviseBytes rest2 + +createLocal :: LocalIdx -> TypeName -> Local +createLocal idx typee = Local {lcIdx = idx, lcType = typee} + +extractLocal :: Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) +extractLocal id bytes + | BSL.length bytes == 0 = throw $ WasmError "extractLocal: bad section" + | otherwise = do + let (nbOfThisType, rest) = extractLEB1282 bytes + let typee = getTypeFromByte (head (BSL.unpack (BSL.take 1 rest))) + let locals = map (\x -> createLocal (fromIntegral id) typee) [0..(fromIntegral nbOfThisType - 1)] + (locals, BSL.drop 1 rest) + +extractLocals :: Int64 -> Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) +extractLocals id idMax bytes + | id >= idMax = ([], bytes) + | BSL.length bytes == 0 = ([], bytes) + | otherwise = do + let (local, rest) = extractLocal id bytes + let (locals, rest2) = extractLocals (id + 1) idMax rest + (local ++ locals, rest2) + +------------------------- + +extractOpCode :: BSL.ByteString -> ([Word8], Int64, BSL.ByteString) +extractOpCode bytes + | (head $ BSL.unpack bytes) == 0x03 = ([0x00], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x11 = ([0x00], 1, BSL.drop 3 bytes) + + | (head $ BSL.unpack bytes) == 0x00 = ([0x00], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0b = ([0x0b], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0d = ([0x0d], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0c = ([0x0c], 1, BSL.drop 2 bytes) + | (head $ BSL.unpack bytes) == 0x02 = ([0x02], 1, BSL.drop 2 bytes) + + | (head $ BSL.unpack bytes) == 0x01 = ([0x01], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0f = ([0x0f], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x10 = ([0x10], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x41 = ([0x41], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x42 = ([0x42], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x43 = ([0x43], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x44 = ([0x44], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x28 = ([0x28], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x29 = ([0x29], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x22 = ([0x22], 1, BSL.drop 2 bytes) + | (head $ BSL.unpack bytes) == 0x36 = ([0x36], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4b = ([0x4b], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x20 = ([0x20], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4d = ([0x4d], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x21 = ([0x21], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x23 = ([0x23], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x24 = ([0x24], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x45 = ([0x45], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x71 = ([0x00], 1, BSL.drop 1 bytes) + | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) + | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) + | otherwise = throw $ WasmError "extractOpCode: bad instruction" + +createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) +createInstruction [0x03] bytes = (Nop, bytes) +createInstruction [0x11] bytes = (Nop, bytes) + +createInstruction [0x00] bytes = (Unreachable, bytes) +createInstruction [0x01] bytes = (Nop, bytes) +createInstruction [0x02] bytes = (Block EmptyType, bytes) +createInstruction [0x0b] bytes = (End, bytes) +createInstruction [0x0f] bytes = (Return, bytes) +createInstruction [0x4b] bytes = (I32Gtu, bytes) +createInstruction [0x6a] bytes = (I32Add, bytes) +createInstruction [0x6b] bytes = (I32Sub, bytes) +createInstruction [0x45] bytes = (I32Eqz, bytes) +createInstruction [0x4d] bytes = (I32Leu, bytes) +createInstruction [0x71] bytes = (I32And, bytes) +createInstruction [0x0d] bytes = do + let (value, rest) = extractLEB1282 bytes + (BrIf value, rest) +createInstruction [0x0c] bytes = do + let (value, rest) = extractLEB1282 bytes + (Br value, rest) +createInstruction [0x22] bytes = do + let (value, rest) = extractLEB1282 bytes + (LocalTee value, rest) +createInstruction [0x10] bytes = do + let (value, rest) = extractLEB1282 bytes + (Call value, rest) +createInstruction [0x41] bytes = do + let (value, rest) = extractLEB1282 bytes + (I32Const value, rest) +createInstruction [0x42] bytes = do + let (value, rest) = extractLEB128 bytes + (I64Const value, rest) +createInstruction [0x43] bytes = do + let (value, rest) = extractLEB128 bytes + (F32Const (fromIntegral value), rest) +createInstruction [0x44] bytes = do + let (value, rest) = extractLEB128 bytes + (F64Const (fromIntegral value), rest) +createInstruction [0x28] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I32Load (MemArg offset align), rest2) +createInstruction [0x29] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I64Load (MemArg offset align), rest2) +createInstruction [0x36] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I32Store (MemArg offset align), rest2) +createInstruction [0x37] bytes = do + let (align, rest) = extractLEB1282 bytes + let (offset, rest2) = extractLEB1282 rest + (I64Store (MemArg offset align), rest2) +createInstruction [0x20] bytes = do + let (value, rest) = extractLEB1282 bytes + (GetLocal value, rest) +createInstruction [0x24] bytes = do + let (value, rest) = extractLEB1282 bytes + (SetLocal value, rest) +createInstruction [0x23] bytes = do + let (value, rest) = extractLEB1282 bytes + (GetGlobal value, rest) +createInstruction [0x21] bytes = do + let (value, rest) = extractLEB1282 bytes + (SetGlobal value, rest) +createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) +createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) +createInstruction opCode _ = trace ("createInstruction: " ++ show opCode) throw $ WasmError "createInstruction: bad instruction" + +parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) +parseInstruction bytes + | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" + | otherwise = do + let (opCode, nbParams, rest) = extractOpCode bytes + let (instruction, rest2) = createInstruction opCode rest + (instruction, rest2) + +extractCode :: BSL.ByteString -> [Instruction] +extractCode bytes + | BSL.length bytes == 0 = [] + | otherwise = do + let (instruction, rest) = parseInstruction bytes + instruction : extractCode rest + +------------------------ + +showBytes :: BSL.ByteString -> String +showBytes bytes = do + let bytesList = BSL.unpack bytes + let hexList = map (\x -> showHex x " ") bytesList + foldl (\acc x -> acc ++ x) " " hexList + +parseFunction :: BSL.ByteString -> Function -> Function +parseFunction bytes func = do + let (nbLocalsTypes, rest) = extractLEB128 bytes + let (locals, rest2) = extractLocals 0 nbLocalsTypes rest + func {locals = locals, body = extractCode rest2} + +parseFunctions :: [BSL.ByteString] -> [Function] -> [Function] +parseFunctions [] [] = [] +parseFunctions [] _ = throw $ WasmError "parseFunctions: bad section" +parseFunctions _ [] = throw $ WasmError "parseFunctions: bad section" +parseFunctions (x:xs) (y:ys) = parseFunction x y : parseFunctions xs ys + +getFuncCode :: Section -> [Function] -> [Function] +getFuncCode (Section CodeID _ content) functions = do + let (nbFunc, rest) = extractLEB128 content + let funcCodes = diviseBytes rest + if (fromIntegral nbFunc) /= length functions + then throw $ WasmError "getFuncCode: bad section" + else parseFunctions funcCodes functions +getFuncCode _ _ = throw $ WasmError "getFuncCode: bad section" diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/app/Parsing/Functions.hs index 2f2f67b..b2bf129 100644 --- a/lvtrun/app/Parsing/Functions.hs +++ b/lvtrun/app/Parsing/Functions.hs @@ -24,7 +24,7 @@ import Debug.Trace parseFunctionsIndex :: Int32 -> Int64 -> BSL.ByteString -> [Function] parseFunctionsIndex idx maxIdx content - | idx >= (fromIntegral maxIdx) = [] + | idx > (fromIntegral maxIdx) = [] | BSL.length content == 0 = [] | otherwise = do let (typeIdx, rest) = extractLEB1282 content @@ -33,5 +33,5 @@ parseFunctionsIndex idx maxIdx content getFunctions :: Section -> [Function] getFunctions (Section FunctionID _ content) = do let (vecSize, rest) = extractLEB128 content - parseFunctionsIndex 0 vecSize rest + parseFunctionsIndex 1 vecSize rest getFunctions _ = throw $ WasmError "getFunctions: bad section" diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/app/Parsing/Global.hs index 6dc6db2..e09c09e 100644 --- a/lvtrun/app/Parsing/Global.hs +++ b/lvtrun/app/Parsing/Global.hs @@ -40,6 +40,8 @@ extractOpCode bytes | (head $ BSL.unpack bytes) == 0x21 = ([0x21], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x23 = ([0x23], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x24 = ([0x24], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], 1, BSL.drop 1 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) | otherwise = throw $ WasmError "ExtractOpCode: bad opcode" @@ -48,6 +50,8 @@ createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) createInstruction [0x01] bytes = (Unreachable, bytes) createInstruction [0x01] bytes = (Nop, bytes) createInstruction [0x0f] bytes = (Return, bytes) +createInstruction [0x6a] bytes = (I32Add, bytes) +createInstruction [0x6b] bytes = (I32Sub, bytes) createInstruction [0x10] bytes = do let (value, rest) = extractLEB1282 bytes (Call value, rest) diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs index 63db434..93f548e 100644 --- a/lvtrun/app/Parsing/Parser.hs +++ b/lvtrun/app/Parsing/Parser.hs @@ -19,6 +19,7 @@ import Parsing.FuncTypes import Parsing.Global import Parsing.Exports import Parsing.Functions +import Parsing.Code import Debug.Trace @@ -28,7 +29,7 @@ parseModule bytes = do WasmModule (getModHeader (getSectionWithId sections CustomID)) (getFuncTypes (getSectionWithId sections TypeID)) [] - (getFunctions (getSectionWithId sections FunctionID)) + ((getFuncCode (getSectionWithId sections CodeID) (getFunctions (getSectionWithId sections FunctionID)))) [] (getMemories (getSectionWithId sections MemoryID)) (getGlobals (getSectionWithId sections GlobalID)) diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index 067446a..a7810f6 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -2,7 +2,7 @@ -- EPITECH PROJECT, 2023 -- Leviator Run -- File description: --- Start +-- Code -} module Run.Start @@ -41,7 +41,13 @@ getStartFunction exports functions = ------------------------- +execStartFunction :: Function -> IO () +execStartFunction (Function typeIdx funcIdx locals body) = do + print "----execStartFunction---" + start :: WasmModule -> IO () start wasmMod = do let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) print startFunc + execStartFunction startFunc + return () diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index 4fe4c48..d588e68 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -36,7 +36,8 @@ module Types SectionID(..), Section(..), Memory(..), - OpCode + OpCode, + Local(..) ) where import Data.Int (Int32, Int64) @@ -96,6 +97,12 @@ instance Show MemArg where type OpCode = [Word8] +data BlockType = + EmptyType + | ValType TypeName + | TypeIdx TypeIdx + deriving (Show) + data Instruction = Unreachable | Nop @@ -113,12 +120,61 @@ data Instruction = | SetLocal LocalIdx | GetGlobal GlobalIdx | SetGlobal GlobalIdx + | I32Add + | I32Sub + | I32And + | I32Eqz + | I32Gtu + | I32Leu + | LocalTee LocalIdx + | BrIf LabelIdx + | Br LabelIdx + | Block BlockType + | End | MemorySize | MemoryGrow - deriving (Show) + +instance Show Instruction where + show Unreachable = "\n\t\t\t\tunreachable" + show Nop = "\n\t\t\t\tnop" + show Return = "\n\t\t\t\treturn" + show (Call idx) = "\n\t\t\t\tcall " ++ (show idx) + show (I32Const value) = "\n\t\t\t\ti32.const " ++ (show value) + show (I64Const value) = "\n\t\t\t\ti64.const " ++ (show value) + show (F32Const value) = "\n\t\t\t\tf32.const " ++ (show value) + show (F64Const value) = "\n\t\t\t\tf64.const " ++ (show value) + show (I32Load memArg) = "\n\t\t\t\ti32.load " ++ (show memArg) + show (I64Load memArg) = "\n\t\t\t\ti64.load " ++ (show memArg) + show (I32Store memArg) = "\n\t\t\t\ti32.store " ++ (show memArg) + show (I64Store memArg) = "\n\t\t\t\ti64.store " ++ (show memArg) + show (GetLocal idx) = "\n\t\t\t\tget_local " ++ (show idx) + show (SetLocal idx) = "\n\t\t\t\tset_local " ++ (show idx) + show (GetGlobal idx) = "\n\t\t\t\tget_global " ++ (show idx) + show (SetGlobal idx) = "\n\t\t\t\tset_global " ++ (show idx) + show I32Add = "\n\t\t\t\ti32.add" + show I32Sub = "\n\t\t\t\ti32.sub" + show MemorySize = "\n\t\t\t\tmemory.size" + show MemoryGrow = "\n\t\t\t\tmemory.grow" + show I32And = "\n\t\t\t\ti32.and" + show I32Eqz = "\n\t\t\t\ti32.eqz" + show I32Gtu = "\n\t\t\t\ti32.gt_u" + show I32Leu = "\n\t\t\t\ti32.le_u" + show (LocalTee idx) = "\n\t\t\t\tlocal.tee " ++ (show idx) + show (BrIf idx) = "\n\t\t\t\tbr_if " ++ (show idx) + show (Br idx) = "\n\t\t\t\tbr " ++ (show idx) + show End = "\n\t\t\t\tend" + show (Block blockType) = "\n\t\t\t\tblock " ++ (show blockType) -- Module section +data Local = Local { + lcIdx :: LocalIdx, + lcType :: TypeName +} + +instance Show Local where + show local = "\n\t\t(local idx:" ++ (show $ lcIdx local) ++ " type:" ++ (show $ lcType local) ++ ")" + data FuncType = FuncType { typeId :: TypeIdx, params :: [TypeName], @@ -143,12 +199,12 @@ data ImportDesc = data Function = Function { funcType :: TypeIdx, funcIdx :: FuncIdx, + locals :: [Local], body :: [Instruction] } instance Show Function where - show func = "\n\t(func idx:" ++ (show $ funcIdx func) ++ " typeId:" ++ (show $ funcType func) ++ " " ++ - (show $ body func) ++ ")" + show func = "\n\t(func idx:" ++ (show $ funcIdx func) ++ " typeId:" ++ (show $ funcType func) ++ " " ++ (show $ locals func) ++ "\nIntructions:\n" ++ (show $ body func) ++ ")" type Memory = Limit diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 6fcc8d2..3bb58bf 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -46,6 +46,7 @@ executable lvtrun-exe IO Leb128 Loader + Parsing.Code Parsing.Exports Parsing.Functions Parsing.FuncTypes From 2bb85cf891f90575b1ec5836a000cd7f4e3f508e Mon Sep 17 00:00:00 2001 From: tenshi Date: Thu, 11 Jan 2024 04:13:57 +0100 Subject: [PATCH 47/99] add execution --- lvtrun/app/Run/Start.hs | 37 ++++++++++++++++++++++++++++++------- lvtrun/app/Run/Types.hs | 32 +++++++++++++++++++++++++++++++- lvtrun/app/Types.hs | 3 ++- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index a7810f6..683905f 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -11,11 +11,14 @@ module Run.Start ) where -import Data.Int (Int32) +import Data.Int (Int32, Int64) import Control.Exception (throw) import Types import Errors +import Run.Types + +import Debug.Trace -------------------------------------- @@ -39,15 +42,35 @@ getStartFunction :: [Export] -> [Function] -> Function getStartFunction exports functions = getFunctionFromId (getStartFunctionId exports) functions - ------------------------- +----------------------------- + +executeInstruction :: VMConfig -> Instruction -> VMConfig +executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (Block _) = VMConfig stack (instructionIdx + 1) fnIdx wasmMod +executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (End) = VMConfig stack (instructionIdx + 1) fnIdx wasmMod +executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (I32Const value) = VMConfig (addStackValue stack (I_32 value)) (instructionIdx + 1) fnIdx wasmMod +executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (I32Eqz) = do + case stackDrop stack of + I_32 0 -> trace "true" (VMConfig (addStackValue stack (I_32 1)) (instructionIdx + 1) fnIdx wasmMod) + _ -> trace "false" (VMConfig (addStackValue stack (I_32 0)) (instructionIdx + 1) fnIdx wasmMod) +executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (BrIf labelIdx) + | stackDrop stack == I_32 0 = executeInstruction (VMConfig stack (instructionIdx + 1) fnIdx wasmMod) (Br labelIdx) + | otherwise = executeInstruction (VMConfig stack (instructionIdx + 1) fnIdx wasmMod) (Br labelIdx) +executeInstruction vmCOnf (Call funcIdx) = trace ("call") execFunction (vmCOnf { instructionIdx = 0 }) (getFunctionFromId funcIdx (functions (wasmModule vmCOnf))) +executeInstruction vmConf Unreachable = throw $ WasmError "Unreachable" +executeInstruction vmConf _ = vmConf + +------------------------------ -execStartFunction :: Function -> IO () -execStartFunction (Function typeIdx funcIdx locals body) = do - print "----execStartFunction---" +execFunction :: VMConfig -> Function -> VMConfig +execFunction config (Function typeIdx funcIdx locals body) = do + let vmConf = trace ("execFunction: " ++ show body) config { currentFunctionIdx = funcIdx } + let finalVMConf = foldl executeInstruction vmConf body + finalVMConf start :: WasmModule -> IO () start wasmMod = do + let configVm = VMConfig (Stack []) 0 0 wasmMod let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) - print startFunc - execStartFunction startFunc + let finalVMConf = execFunction configVm startFunc + print (vmStack finalVMConf) return () diff --git a/lvtrun/app/Run/Types.hs b/lvtrun/app/Run/Types.hs index 3e82a9f..def3d74 100644 --- a/lvtrun/app/Run/Types.hs +++ b/lvtrun/app/Run/Types.hs @@ -8,11 +8,41 @@ module Run.Types ( VMConfig(..), + Stack(..), + StackValue(..), + addStackValue, + stackPop, + stackDrop ) where +import Data.Int (Int32, Int64) +import Control.Exception (throw) + import Types +import Errors + +------------------------- stack +data StackValue = I_32 Int32 | I_64 Int64 | F_32 Float | F_64 Double | Null deriving (Show, Eq) + +data Stack = Stack [StackValue] deriving (Show) + +addStackValue :: Stack -> StackValue -> Stack +addStackValue (Stack stack) value = Stack (value : stack) + +stackPop :: Stack -> (StackValue, Stack) +stackPop (Stack []) = throw $ WasmError "stackPop: empty stack" +stackPop (Stack (x:xs)) = (x, Stack xs) + +stackDrop :: Stack -> StackValue +stackDrop (Stack []) = throw $ WasmError "stackDrop: empty stack" +stackDrop (Stack (x:xs)) = x + +------------------------- config data VMConfig = VMConfig { - start :: Bool + vmStack :: Stack, + instructionIdx :: Int32, + currentFunctionIdx :: Int32, + wasmModule :: WasmModule } deriving (Show) diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index d588e68..1b89cff 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -37,7 +37,8 @@ module Types Section(..), Memory(..), OpCode, - Local(..) + Local(..), + BlockType(..) ) where import Data.Int (Int32, Int64) From 5ee052c4538c12bc8ee191b0bf27abbd147bc337 Mon Sep 17 00:00:00 2001 From: tenshi Date: Thu, 11 Jan 2024 17:57:48 +0100 Subject: [PATCH 48/99] add work in progress --- lvtrun/app/Run/Functions.hs | 49 ++++++++++++++++++ lvtrun/app/Run/{Types.hs => Stack.hs} | 23 ++++----- lvtrun/app/Run/Start.hs | 73 ++++++++++++--------------- lvtrun/app/Run/Vm.hs | 70 +++++++++++++++++++++++++ lvtrun/lvtrun.cabal | 4 +- lvtrun/test/test.cpp | 15 +++--- 6 files changed, 170 insertions(+), 64 deletions(-) create mode 100644 lvtrun/app/Run/Functions.hs rename lvtrun/app/Run/{Types.hs => Stack.hs} (65%) create mode 100644 lvtrun/app/Run/Vm.hs diff --git a/lvtrun/app/Run/Functions.hs b/lvtrun/app/Run/Functions.hs new file mode 100644 index 0000000..19cb079 --- /dev/null +++ b/lvtrun/app/Run/Functions.hs @@ -0,0 +1,49 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Functions +-} + +module Run.Functions + ( + getStartFunctionId, + getFunctionFromId, + getStartFunction, + getFuncTypeFromId + ) +where + +import Data.Int (Int32) +import Control.Exception (throw) + +import Types +import Errors + +-------------------------------------- + +getStartFunctionId :: [Export] -> Int32 +getStartFunctionId [] = throw $ WasmError "No start function" +getStartFunctionId (x:xs) + | expName x == "_start" = + case expDesc x of + ExportFunc idx -> idx + _ -> throw $ WasmError "getStartFunctionId: bad export" + | otherwise = getStartFunctionId xs +getStartFunctionId _ = throw $ WasmError "getStartFunctionId: bad export" + +getFunctionFromId :: Int32 -> [Function] -> Function +getFunctionFromId id [] = throw $ WasmError "getFunctionFromId: bad id" +getFunctionFromId id (x:xs) + | funcIdx x == id = x + | otherwise = getFunctionFromId id xs + +getStartFunction :: [Export] -> [Function] -> Function +getStartFunction exports functions = + getFunctionFromId (getStartFunctionId exports) functions + +getFuncTypeFromId :: Int32 -> [FuncType] -> FuncType +getFuncTypeFromId id [] = throw $ WasmError "getFuncTypeFromId: bad id" +getFuncTypeFromId id (x:xs) + | typeId x == id = x + | otherwise = getFuncTypeFromId id xs diff --git a/lvtrun/app/Run/Types.hs b/lvtrun/app/Run/Stack.hs similarity index 65% rename from lvtrun/app/Run/Types.hs rename to lvtrun/app/Run/Stack.hs index def3d74..a40505e 100644 --- a/lvtrun/app/Run/Types.hs +++ b/lvtrun/app/Run/Stack.hs @@ -2,12 +2,11 @@ -- EPITECH PROJECT, 2023 -- Leviator Run -- File description: --- Types +-- stack -} -module Run.Types +module Run.Stack ( - VMConfig(..), Stack(..), StackValue(..), addStackValue, @@ -22,8 +21,13 @@ import Control.Exception (throw) import Types import Errors -------------------------- stack -data StackValue = I_32 Int32 | I_64 Int64 | F_32 Float | F_64 Double | Null deriving (Show, Eq) +data StackValue = + I_32 Int32 + | I_64 Int64 + | F_32 Float + | F_64 Double + | Null + deriving (Show, Eq) data Stack = Stack [StackValue] deriving (Show) @@ -37,12 +41,3 @@ stackPop (Stack (x:xs)) = (x, Stack xs) stackDrop :: Stack -> StackValue stackDrop (Stack []) = throw $ WasmError "stackDrop: empty stack" stackDrop (Stack (x:xs)) = x - -------------------------- config - -data VMConfig = VMConfig { - vmStack :: Stack, - instructionIdx :: Int32, - currentFunctionIdx :: Int32, - wasmModule :: WasmModule -} deriving (Show) diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index 683905f..a176f9b 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -16,60 +16,53 @@ import Control.Exception (throw) import Types import Errors -import Run.Types +import Run.Vm +import Run.Stack +import Run.Functions import Debug.Trace --------------------------------------- - -getStartFunctionId :: [Export] -> Int32 -getStartFunctionId [] = throw $ WasmError "No start function" -getStartFunctionId (x:xs) - | expName x == "_start" = - case expDesc x of - ExportFunc idx -> idx - _ -> throw $ WasmError "getStartFunctionId: bad export" - | otherwise = getStartFunctionId xs -getStartFunctionId _ = throw $ WasmError "getStartFunctionId: bad export" - -getFunctionFromId :: Int32 -> [Function] -> Function -getFunctionFromId id [] = throw $ WasmError "getFunctionFromId: bad id" -getFunctionFromId id (x:xs) - | funcIdx x == id = x - | otherwise = getFunctionFromId id xs - -getStartFunction :: [Export] -> [Function] -> Function -getStartFunction exports functions = - getFunctionFromId (getStartFunctionId exports) functions ----------------------------- -executeInstruction :: VMConfig -> Instruction -> VMConfig -executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (Block _) = VMConfig stack (instructionIdx + 1) fnIdx wasmMod -executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (End) = VMConfig stack (instructionIdx + 1) fnIdx wasmMod -executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (I32Const value) = VMConfig (addStackValue stack (I_32 value)) (instructionIdx + 1) fnIdx wasmMod -executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (I32Eqz) = do - case stackDrop stack of - I_32 0 -> trace "true" (VMConfig (addStackValue stack (I_32 1)) (instructionIdx + 1) fnIdx wasmMod) - _ -> trace "false" (VMConfig (addStackValue stack (I_32 0)) (instructionIdx + 1) fnIdx wasmMod) -executeInstruction (VMConfig stack instructionIdx fnIdx wasmMod) (BrIf labelIdx) - | stackDrop stack == I_32 0 = executeInstruction (VMConfig stack (instructionIdx + 1) fnIdx wasmMod) (Br labelIdx) - | otherwise = executeInstruction (VMConfig stack (instructionIdx + 1) fnIdx wasmMod) (Br labelIdx) -executeInstruction vmCOnf (Call funcIdx) = trace ("call") execFunction (vmCOnf { instructionIdx = 0 }) (getFunctionFromId funcIdx (functions (wasmModule vmCOnf))) -executeInstruction vmConf Unreachable = throw $ WasmError "Unreachable" +executeInstruction :: VM -> Instruction -> VM +executeInstruction vm (Block _) = addLabelIdx vm (instructionIdx vm) +executeInstruction vm (Nop) = vm +executeInstruction vm (End) = vm +executeInstruction vm (I32Const value) = vm { vmStack = addStackValue (vmStack vm) (I_32 value) } +executeInstruction vm (I32Eqz) = case stackDrop (vmStack vm) of + I_32 0 -> vm { vmStack = addStackValue (vmStack vm) (I_32 1) } + _ -> vm { vmStack = addStackValue (vmStack vm) (I_32 0) } +executeInstruction vm (Call idx) = execFunction vm (getFunctionFromId idx (functions (wasmModule vm))) +executeInstruction vm (BrIf lIdx) = case stackDrop (vmStack vm) of + I_32 0 -> vm + _ -> executeInstruction (vm { instructionIdx = getInstructionIdxFromLabel vm lIdx }) (Nop) executeInstruction vmConf _ = vmConf ------------------------------ -execFunction :: VMConfig -> Function -> VMConfig +execFunction' :: VM -> Function -> VM +execFunction' vm (Function typeIdx funcIdx locals body) + | instructionIdx vm >= fromIntegral (length body) = vm + | otherwise = do + let instruction = body !! (fromIntegral (instructionIdx vm)) + let newVm = executeInstruction vm instruction + execFunction' (incrementInstructionIdx newVm) (Function typeIdx funcIdx locals body) + +execFunction :: VM -> Function -> VM execFunction config (Function typeIdx funcIdx locals body) = do - let vmConf = trace ("execFunction: " ++ show body) config { currentFunctionIdx = funcIdx } - let finalVMConf = foldl executeInstruction vmConf body - finalVMConf + let vmConf = trace ("execFunction: " ++ show funcIdx) config { currentFunctionIdx = funcIdx } + execFunction' vmConf (Function typeIdx funcIdx locals body) + +getTestAddFunction :: Function +getTestAddFunction = Function 3 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] + +getMainTestFunction :: Function +getMainTestFunction = Function 0 1 [] [I32Const 10, I32Const 5, Call 2, End] start :: WasmModule -> IO () start wasmMod = do - let configVm = VMConfig (Stack []) 0 0 wasmMod + let configVm = VM (Stack []) 0 0 [] [] wasmMod let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) let finalVMConf = execFunction configVm startFunc print (vmStack finalVMConf) diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs new file mode 100644 index 0000000..8b8f31c --- /dev/null +++ b/lvtrun/app/Run/Vm.hs @@ -0,0 +1,70 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Vm +-} + +module Run.Vm + ( + VM(..), + incrementInstructionIdx, + getInstructionIdxFromLabel, + addLabelIdx + ) +where + +import Data.Int (Int32, Int64) +import Control.Exception (throw) + +import Types +import Errors +import Run.Stack +import Run.Functions + +data VM = VM { + vmStack :: Stack, + instructionIdx :: Int32, + currentFunctionIdx :: Int32, + labels :: [Int32], + vmLocals :: [StackValue], + wasmModule :: WasmModule +} deriving (Show) + +endInstruction :: VM -> VM +endInstruction (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod + +incrementInstructionIdx :: VM -> VM +incrementInstructionIdx (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod + +getInstructionIdxFromLabel :: VM -> Int32 -> Int32 +getInstructionIdxFromLabel vm labelIdx + | labelIdx < 0 = throw $ WasmError "getInstructionIdxFromLabel: bad label" + | labelIdx >= fromIntegral (length (labels vm)) = throw $ WasmError "getInstructionIdxFromLabel: bad label" + | otherwise = (labels vm) !! (fromIntegral labelIdx) + +addLabelIdx :: VM -> Int32 -> VM +addLabelIdx vm labelIdx = vm { labels = labelIdx:(labels vm) } + +--------------------------- + +initFuncVars :: Function -> [StackValue] +initFuncVars (Function _ _ [] _) = [] +initFuncVars (Function _ _ ((Local _ I32):xs) _) = (I_32 0):(initFuncVars (Function 0 0 xs [])) +initFuncVars (Function _ _ ((Local _ I64):xs) _) = (I_64 0):(initFuncVars (Function 0 0 xs [])) +initFuncVars (Function _ _ ((Local _ F32):xs) _) = (F_32 0.0):(initFuncVars (Function 0 0 xs [])) +initFuncVars (Function _ _ ((Local _ F64):xs) _) = (F_64 0.0):(initFuncVars (Function 0 0 xs [])) +initFuncVars _ = throw $ WasmError "initFuncVars: bad local" + +initLocalVars :: Function -> FuncType -> [StackValue] +initLocalVars func funcType = (initFuncVars func) + +--------------------------- + +initLocals :: VM -> VM +initLocals vm = do + let fnTypes = types (wasmModule vm) + let currentFunc = getFunctionFromId (currentFunctionIdx vm) (functions (wasmModule vm)) + let fnType = getFuncTypeFromId (funcType currentFunc) fnTypes + let localVars = initLocalVars currentFunc fnType + vm { vmLocals = localVars } diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 3bb58bf..1c6f906 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -55,8 +55,10 @@ executable lvtrun-exe Parsing.Memory Parsing.Parser Parsing.Sections + Run.Functions + Run.Stack Run.Start - Run.Types + Run.Vm Types Paths_lvtrun autogen-modules: diff --git a/lvtrun/test/test.cpp b/lvtrun/test/test.cpp index e03428a..87eb861 100644 --- a/lvtrun/test/test.cpp +++ b/lvtrun/test/test.cpp @@ -1,13 +1,10 @@ -int globa15 = 15; - int add(int a, int b) { - int c = a + b; - return c; + int one = a; + int two = b; + return one + two; } -int main() { - int a = 10; - int b = 20; - int res = add(a, b); - return 0; +int main() +{ + return add(10, 5); } From b0e63f0645b3aaf99a32b8c5220a6a61ceec0f44 Mon Sep 17 00:00:00 2001 From: tenshi Date: Thu, 11 Jan 2024 23:00:12 +0100 Subject: [PATCH 49/99] add work in progress --- lvtrun/app/Run/Start.hs | 23 +++++++--- lvtrun/app/Run/Vm.hs | 40 +++++++++++++----- lvtrun/save/Functions.hs | 49 ++++++++++++++++++++++ lvtrun/save/Stack.hs | 43 +++++++++++++++++++ lvtrun/save/Start.hs | 82 ++++++++++++++++++++++++++++++++++++ lvtrun/save/Vm.hs | 90 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 312 insertions(+), 15 deletions(-) create mode 100644 lvtrun/save/Functions.hs create mode 100644 lvtrun/save/Stack.hs create mode 100644 lvtrun/save/Start.hs create mode 100644 lvtrun/save/Vm.hs diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index a176f9b..08f9b8b 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -37,6 +37,15 @@ executeInstruction vm (Call idx) = execFunction vm (getFunctionFromId idx (funct executeInstruction vm (BrIf lIdx) = case stackDrop (vmStack vm) of I_32 0 -> vm _ -> executeInstruction (vm { instructionIdx = getInstructionIdxFromLabel vm lIdx }) (Nop) +executeInstruction vm (I32Add) = do + let (var1, vmStack') = stackPop (vmStack vm) + let (var2, vmStack'') = stackPop vmStack' + case (var1, var2) of + (I_32 x, I_32 y) -> vm { vmStack = addStackValue vmStack'' (I_32 (x + y)) } + _ -> throw $ WasmError "I32Add: bad parameters" +executeInstruction vm (GetLocal idx) = + let local = (vmLocals vm) !! (fromIntegral idx) + in vm { vmStack = addStackValue (vmStack vm) local } executeInstruction vmConf _ = vmConf ------------------------------ @@ -46,13 +55,13 @@ execFunction' vm (Function typeIdx funcIdx locals body) | instructionIdx vm >= fromIntegral (length body) = vm | otherwise = do let instruction = body !! (fromIntegral (instructionIdx vm)) - let newVm = executeInstruction vm instruction + let newVm = trace ("Exe Instruciton: " ++ show instruction ++ " locals: " ++ show (vmLocals vm)) executeInstruction vm instruction execFunction' (incrementInstructionIdx newVm) (Function typeIdx funcIdx locals body) execFunction :: VM -> Function -> VM execFunction config (Function typeIdx funcIdx locals body) = do - let vmConf = trace ("execFunction: " ++ show funcIdx) config { currentFunctionIdx = funcIdx } - execFunction' vmConf (Function typeIdx funcIdx locals body) + let vmConf = config { currentFunctionIdx = funcIdx, instructionIdx = 0} + execFunction' (initLocals vmConf) (Function typeIdx funcIdx locals body) getTestAddFunction :: Function getTestAddFunction = Function 3 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] @@ -60,10 +69,14 @@ getTestAddFunction = Function 3 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLoc getMainTestFunction :: Function getMainTestFunction = Function 0 1 [] [I32Const 10, I32Const 5, Call 2, End] +getFunctionsForWasmMod :: [Function] +getFunctionsForWasmMod = [getTestAddFunction, getMainTestFunction] + start :: WasmModule -> IO () start wasmMod = do - let configVm = VM (Stack []) 0 0 [] [] wasmMod - let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) + let configVm = VM (Stack []) 0 0 [] [] (wasmMod { functions = getFunctionsForWasmMod }) + --let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) + let startFunc = getMainTestFunction let finalVMConf = execFunction configVm startFunc print (vmStack finalVMConf) return () diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index 8b8f31c..a292e77 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -10,7 +10,8 @@ module Run.Vm VM(..), incrementInstructionIdx, getInstructionIdxFromLabel, - addLabelIdx + addLabelIdx, + initLocals ) where @@ -22,12 +23,16 @@ import Errors import Run.Stack import Run.Functions +import Debug.Trace + +type VmLocals = [StackValue] + data VM = VM { vmStack :: Stack, instructionIdx :: Int32, currentFunctionIdx :: Int32, labels :: [Int32], - vmLocals :: [StackValue], + vmLocals :: VmLocals, wasmModule :: WasmModule } deriving (Show) @@ -48,16 +53,26 @@ addLabelIdx vm labelIdx = vm { labels = labelIdx:(labels vm) } --------------------------- -initFuncVars :: Function -> [StackValue] +setLocalWithParameters :: FuncType -> Stack -> VmLocals -> (VmLocals, Stack) +setLocalWithParameters _ stack [] = ([], stack) +setLocalWithParameters (FuncType id [] res) stack locals = trace ("here3") (locals, stack) +setLocalWithParameters (FuncType id (I32:xs) res) (Stack (I_32 x:xsStack)) (I_32 y:xsLocals) + = trace ("here") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_32 x:xsLocals) +setLocalWithParameters (FuncType id (I64:xs) res) (Stack (I_64 x:xsStack)) (I_64 y:xsLocals) + = trace ("here2") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_64 x:xsLocals) +setLocalWithParameters _ _ _ = throw $ WasmError "setLocalWithParameters: bad parameters" + +initFuncVars :: Function -> VmLocals initFuncVars (Function _ _ [] _) = [] initFuncVars (Function _ _ ((Local _ I32):xs) _) = (I_32 0):(initFuncVars (Function 0 0 xs [])) -initFuncVars (Function _ _ ((Local _ I64):xs) _) = (I_64 0):(initFuncVars (Function 0 0 xs [])) -initFuncVars (Function _ _ ((Local _ F32):xs) _) = (F_32 0.0):(initFuncVars (Function 0 0 xs [])) -initFuncVars (Function _ _ ((Local _ F64):xs) _) = (F_64 0.0):(initFuncVars (Function 0 0 xs [])) initFuncVars _ = throw $ WasmError "initFuncVars: bad local" -initLocalVars :: Function -> FuncType -> [StackValue] -initLocalVars func funcType = (initFuncVars func) +initLocalVars :: Function -> Stack -> FuncType -> (VmLocals, Stack) +initLocalVars func stack funcType = do + let localsDefaultInit = initFuncVars func + let nbOfLocals = length localsDefaultInit + let values = stackPopN stack nbOfLocals + --------------------------- @@ -66,5 +81,10 @@ initLocals vm = do let fnTypes = types (wasmModule vm) let currentFunc = getFunctionFromId (currentFunctionIdx vm) (functions (wasmModule vm)) let fnType = getFuncTypeFromId (funcType currentFunc) fnTypes - let localVars = initLocalVars currentFunc fnType - vm { vmLocals = localVars } + let (localVars, newStack) = initLocalVars currentFunc (vmStack vm) fnType + vm { vmLocals = localVars, vmStack = newStack } + + +-- initFuncVars (Function _ _ ((Local _ I64):xs) _) = trace ("hh2") (I_64 0):(initFuncVars (Function 0 0 xs [])) +-- initFuncVars (Function _ _ ((Local _ F32):xs) _) = trace ("hh3") (F_32 0.0):(initFuncVars (Function 0 0 xs [])) +-- initFuncVars (Function _ _ ((Local _ F64):xs) _) = trace ("hh4") (F_64 0.0):(initFuncVars (Function 0 0 xs [])) \ No newline at end of file diff --git a/lvtrun/save/Functions.hs b/lvtrun/save/Functions.hs new file mode 100644 index 0000000..19cb079 --- /dev/null +++ b/lvtrun/save/Functions.hs @@ -0,0 +1,49 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Functions +-} + +module Run.Functions + ( + getStartFunctionId, + getFunctionFromId, + getStartFunction, + getFuncTypeFromId + ) +where + +import Data.Int (Int32) +import Control.Exception (throw) + +import Types +import Errors + +-------------------------------------- + +getStartFunctionId :: [Export] -> Int32 +getStartFunctionId [] = throw $ WasmError "No start function" +getStartFunctionId (x:xs) + | expName x == "_start" = + case expDesc x of + ExportFunc idx -> idx + _ -> throw $ WasmError "getStartFunctionId: bad export" + | otherwise = getStartFunctionId xs +getStartFunctionId _ = throw $ WasmError "getStartFunctionId: bad export" + +getFunctionFromId :: Int32 -> [Function] -> Function +getFunctionFromId id [] = throw $ WasmError "getFunctionFromId: bad id" +getFunctionFromId id (x:xs) + | funcIdx x == id = x + | otherwise = getFunctionFromId id xs + +getStartFunction :: [Export] -> [Function] -> Function +getStartFunction exports functions = + getFunctionFromId (getStartFunctionId exports) functions + +getFuncTypeFromId :: Int32 -> [FuncType] -> FuncType +getFuncTypeFromId id [] = throw $ WasmError "getFuncTypeFromId: bad id" +getFuncTypeFromId id (x:xs) + | typeId x == id = x + | otherwise = getFuncTypeFromId id xs diff --git a/lvtrun/save/Stack.hs b/lvtrun/save/Stack.hs new file mode 100644 index 0000000..a40505e --- /dev/null +++ b/lvtrun/save/Stack.hs @@ -0,0 +1,43 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- stack +-} + +module Run.Stack + ( + Stack(..), + StackValue(..), + addStackValue, + stackPop, + stackDrop + ) +where + +import Data.Int (Int32, Int64) +import Control.Exception (throw) + +import Types +import Errors + +data StackValue = + I_32 Int32 + | I_64 Int64 + | F_32 Float + | F_64 Double + | Null + deriving (Show, Eq) + +data Stack = Stack [StackValue] deriving (Show) + +addStackValue :: Stack -> StackValue -> Stack +addStackValue (Stack stack) value = Stack (value : stack) + +stackPop :: Stack -> (StackValue, Stack) +stackPop (Stack []) = throw $ WasmError "stackPop: empty stack" +stackPop (Stack (x:xs)) = (x, Stack xs) + +stackDrop :: Stack -> StackValue +stackDrop (Stack []) = throw $ WasmError "stackDrop: empty stack" +stackDrop (Stack (x:xs)) = x diff --git a/lvtrun/save/Start.hs b/lvtrun/save/Start.hs new file mode 100644 index 0000000..08f9b8b --- /dev/null +++ b/lvtrun/save/Start.hs @@ -0,0 +1,82 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Code +-} + +module Run.Start + ( + start + ) +where + +import Data.Int (Int32, Int64) +import Control.Exception (throw) + +import Types +import Errors +import Run.Vm +import Run.Stack +import Run.Functions + +import Debug.Trace + + +----------------------------- + +executeInstruction :: VM -> Instruction -> VM +executeInstruction vm (Block _) = addLabelIdx vm (instructionIdx vm) +executeInstruction vm (Nop) = vm +executeInstruction vm (End) = vm +executeInstruction vm (I32Const value) = vm { vmStack = addStackValue (vmStack vm) (I_32 value) } +executeInstruction vm (I32Eqz) = case stackDrop (vmStack vm) of + I_32 0 -> vm { vmStack = addStackValue (vmStack vm) (I_32 1) } + _ -> vm { vmStack = addStackValue (vmStack vm) (I_32 0) } +executeInstruction vm (Call idx) = execFunction vm (getFunctionFromId idx (functions (wasmModule vm))) +executeInstruction vm (BrIf lIdx) = case stackDrop (vmStack vm) of + I_32 0 -> vm + _ -> executeInstruction (vm { instructionIdx = getInstructionIdxFromLabel vm lIdx }) (Nop) +executeInstruction vm (I32Add) = do + let (var1, vmStack') = stackPop (vmStack vm) + let (var2, vmStack'') = stackPop vmStack' + case (var1, var2) of + (I_32 x, I_32 y) -> vm { vmStack = addStackValue vmStack'' (I_32 (x + y)) } + _ -> throw $ WasmError "I32Add: bad parameters" +executeInstruction vm (GetLocal idx) = + let local = (vmLocals vm) !! (fromIntegral idx) + in vm { vmStack = addStackValue (vmStack vm) local } +executeInstruction vmConf _ = vmConf + +------------------------------ + +execFunction' :: VM -> Function -> VM +execFunction' vm (Function typeIdx funcIdx locals body) + | instructionIdx vm >= fromIntegral (length body) = vm + | otherwise = do + let instruction = body !! (fromIntegral (instructionIdx vm)) + let newVm = trace ("Exe Instruciton: " ++ show instruction ++ " locals: " ++ show (vmLocals vm)) executeInstruction vm instruction + execFunction' (incrementInstructionIdx newVm) (Function typeIdx funcIdx locals body) + +execFunction :: VM -> Function -> VM +execFunction config (Function typeIdx funcIdx locals body) = do + let vmConf = config { currentFunctionIdx = funcIdx, instructionIdx = 0} + execFunction' (initLocals vmConf) (Function typeIdx funcIdx locals body) + +getTestAddFunction :: Function +getTestAddFunction = Function 3 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] + +getMainTestFunction :: Function +getMainTestFunction = Function 0 1 [] [I32Const 10, I32Const 5, Call 2, End] + +getFunctionsForWasmMod :: [Function] +getFunctionsForWasmMod = [getTestAddFunction, getMainTestFunction] + +start :: WasmModule -> IO () +start wasmMod = do + let configVm = VM (Stack []) 0 0 [] [] (wasmMod { functions = getFunctionsForWasmMod }) + --let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) + let startFunc = getMainTestFunction + let finalVMConf = execFunction configVm startFunc + print (vmStack finalVMConf) + return () diff --git a/lvtrun/save/Vm.hs b/lvtrun/save/Vm.hs new file mode 100644 index 0000000..a292e77 --- /dev/null +++ b/lvtrun/save/Vm.hs @@ -0,0 +1,90 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Vm +-} + +module Run.Vm + ( + VM(..), + incrementInstructionIdx, + getInstructionIdxFromLabel, + addLabelIdx, + initLocals + ) +where + +import Data.Int (Int32, Int64) +import Control.Exception (throw) + +import Types +import Errors +import Run.Stack +import Run.Functions + +import Debug.Trace + +type VmLocals = [StackValue] + +data VM = VM { + vmStack :: Stack, + instructionIdx :: Int32, + currentFunctionIdx :: Int32, + labels :: [Int32], + vmLocals :: VmLocals, + wasmModule :: WasmModule +} deriving (Show) + +endInstruction :: VM -> VM +endInstruction (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod + +incrementInstructionIdx :: VM -> VM +incrementInstructionIdx (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod + +getInstructionIdxFromLabel :: VM -> Int32 -> Int32 +getInstructionIdxFromLabel vm labelIdx + | labelIdx < 0 = throw $ WasmError "getInstructionIdxFromLabel: bad label" + | labelIdx >= fromIntegral (length (labels vm)) = throw $ WasmError "getInstructionIdxFromLabel: bad label" + | otherwise = (labels vm) !! (fromIntegral labelIdx) + +addLabelIdx :: VM -> Int32 -> VM +addLabelIdx vm labelIdx = vm { labels = labelIdx:(labels vm) } + +--------------------------- + +setLocalWithParameters :: FuncType -> Stack -> VmLocals -> (VmLocals, Stack) +setLocalWithParameters _ stack [] = ([], stack) +setLocalWithParameters (FuncType id [] res) stack locals = trace ("here3") (locals, stack) +setLocalWithParameters (FuncType id (I32:xs) res) (Stack (I_32 x:xsStack)) (I_32 y:xsLocals) + = trace ("here") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_32 x:xsLocals) +setLocalWithParameters (FuncType id (I64:xs) res) (Stack (I_64 x:xsStack)) (I_64 y:xsLocals) + = trace ("here2") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_64 x:xsLocals) +setLocalWithParameters _ _ _ = throw $ WasmError "setLocalWithParameters: bad parameters" + +initFuncVars :: Function -> VmLocals +initFuncVars (Function _ _ [] _) = [] +initFuncVars (Function _ _ ((Local _ I32):xs) _) = (I_32 0):(initFuncVars (Function 0 0 xs [])) +initFuncVars _ = throw $ WasmError "initFuncVars: bad local" + +initLocalVars :: Function -> Stack -> FuncType -> (VmLocals, Stack) +initLocalVars func stack funcType = do + let localsDefaultInit = initFuncVars func + let nbOfLocals = length localsDefaultInit + let values = stackPopN stack nbOfLocals + + +--------------------------- + +initLocals :: VM -> VM +initLocals vm = do + let fnTypes = types (wasmModule vm) + let currentFunc = getFunctionFromId (currentFunctionIdx vm) (functions (wasmModule vm)) + let fnType = getFuncTypeFromId (funcType currentFunc) fnTypes + let (localVars, newStack) = initLocalVars currentFunc (vmStack vm) fnType + vm { vmLocals = localVars, vmStack = newStack } + + +-- initFuncVars (Function _ _ ((Local _ I64):xs) _) = trace ("hh2") (I_64 0):(initFuncVars (Function 0 0 xs [])) +-- initFuncVars (Function _ _ ((Local _ F32):xs) _) = trace ("hh3") (F_32 0.0):(initFuncVars (Function 0 0 xs [])) +-- initFuncVars (Function _ _ ((Local _ F64):xs) _) = trace ("hh4") (F_64 0.0):(initFuncVars (Function 0 0 xs [])) \ No newline at end of file From f6359bf14b49e630a795b138d94a43d90e93331b Mon Sep 17 00:00:00 2001 From: tenshi Date: Fri, 12 Jan 2024 19:48:36 +0100 Subject: [PATCH 50/99] add new execution version --- lvtrun/app/Run/Stack.hs | 43 ------ lvtrun/app/Run/Start.hs | 56 ++------ lvtrun/app/Run/Vm.hs | 273 +++++++++++++++++++++++++++++++-------- lvtrun/app/Types.hs | 6 +- lvtrun/lvtrun.cabal | 1 - lvtrun/save/Functions.hs | 49 ------- lvtrun/save/Stack.hs | 43 ------ lvtrun/save/Start.hs | 82 ------------ lvtrun/save/Vm.hs | 90 ------------- 9 files changed, 231 insertions(+), 412 deletions(-) delete mode 100644 lvtrun/app/Run/Stack.hs delete mode 100644 lvtrun/save/Functions.hs delete mode 100644 lvtrun/save/Stack.hs delete mode 100644 lvtrun/save/Start.hs delete mode 100644 lvtrun/save/Vm.hs diff --git a/lvtrun/app/Run/Stack.hs b/lvtrun/app/Run/Stack.hs deleted file mode 100644 index a40505e..0000000 --- a/lvtrun/app/Run/Stack.hs +++ /dev/null @@ -1,43 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- stack --} - -module Run.Stack - ( - Stack(..), - StackValue(..), - addStackValue, - stackPop, - stackDrop - ) -where - -import Data.Int (Int32, Int64) -import Control.Exception (throw) - -import Types -import Errors - -data StackValue = - I_32 Int32 - | I_64 Int64 - | F_32 Float - | F_64 Double - | Null - deriving (Show, Eq) - -data Stack = Stack [StackValue] deriving (Show) - -addStackValue :: Stack -> StackValue -> Stack -addStackValue (Stack stack) value = Stack (value : stack) - -stackPop :: Stack -> (StackValue, Stack) -stackPop (Stack []) = throw $ WasmError "stackPop: empty stack" -stackPop (Stack (x:xs)) = (x, Stack xs) - -stackDrop :: Stack -> StackValue -stackDrop (Stack []) = throw $ WasmError "stackDrop: empty stack" -stackDrop (Stack (x:xs)) = x diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index 08f9b8b..fb6daf8 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -17,66 +17,26 @@ import Control.Exception (throw) import Types import Errors import Run.Vm -import Run.Stack import Run.Functions import Debug.Trace +getTypeFunc1 :: FuncType +getTypeFunc1 = FuncType 0 [I32, I32] [I32] ------------------------------ - -executeInstruction :: VM -> Instruction -> VM -executeInstruction vm (Block _) = addLabelIdx vm (instructionIdx vm) -executeInstruction vm (Nop) = vm -executeInstruction vm (End) = vm -executeInstruction vm (I32Const value) = vm { vmStack = addStackValue (vmStack vm) (I_32 value) } -executeInstruction vm (I32Eqz) = case stackDrop (vmStack vm) of - I_32 0 -> vm { vmStack = addStackValue (vmStack vm) (I_32 1) } - _ -> vm { vmStack = addStackValue (vmStack vm) (I_32 0) } -executeInstruction vm (Call idx) = execFunction vm (getFunctionFromId idx (functions (wasmModule vm))) -executeInstruction vm (BrIf lIdx) = case stackDrop (vmStack vm) of - I_32 0 -> vm - _ -> executeInstruction (vm { instructionIdx = getInstructionIdxFromLabel vm lIdx }) (Nop) -executeInstruction vm (I32Add) = do - let (var1, vmStack') = stackPop (vmStack vm) - let (var2, vmStack'') = stackPop vmStack' - case (var1, var2) of - (I_32 x, I_32 y) -> vm { vmStack = addStackValue vmStack'' (I_32 (x + y)) } - _ -> throw $ WasmError "I32Add: bad parameters" -executeInstruction vm (GetLocal idx) = - let local = (vmLocals vm) !! (fromIntegral idx) - in vm { vmStack = addStackValue (vmStack vm) local } -executeInstruction vmConf _ = vmConf - ------------------------------- - -execFunction' :: VM -> Function -> VM -execFunction' vm (Function typeIdx funcIdx locals body) - | instructionIdx vm >= fromIntegral (length body) = vm - | otherwise = do - let instruction = body !! (fromIntegral (instructionIdx vm)) - let newVm = trace ("Exe Instruciton: " ++ show instruction ++ " locals: " ++ show (vmLocals vm)) executeInstruction vm instruction - execFunction' (incrementInstructionIdx newVm) (Function typeIdx funcIdx locals body) - -execFunction :: VM -> Function -> VM -execFunction config (Function typeIdx funcIdx locals body) = do - let vmConf = config { currentFunctionIdx = funcIdx, instructionIdx = 0} - execFunction' (initLocals vmConf) (Function typeIdx funcIdx locals body) +getTypeFunc2 :: FuncType +getTypeFunc2 = FuncType 1 [] [I32] getTestAddFunction :: Function -getTestAddFunction = Function 3 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] +getTestAddFunction = Function 0 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] getMainTestFunction :: Function -getMainTestFunction = Function 0 1 [] [I32Const 10, I32Const 5, Call 2, End] +getMainTestFunction = Function 1 1 [] [I32Const 10, I32Const 5, Call 2, End] getFunctionsForWasmMod :: [Function] getFunctionsForWasmMod = [getTestAddFunction, getMainTestFunction] start :: WasmModule -> IO () start wasmMod = do - let configVm = VM (Stack []) 0 0 [] [] (wasmMod { functions = getFunctionsForWasmMod }) - --let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) - let startFunc = getMainTestFunction - let finalVMConf = execFunction configVm startFunc - print (vmStack finalVMConf) - return () + let newWasmMod = wasmMod { functions = getFunctionsForWasmMod, types = [getTypeFunc1, getTypeFunc2] } + startExecution (createVm newWasmMod) 1 diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index a292e77..c13928a 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -8,83 +8,246 @@ module Run.Vm ( VM(..), - incrementInstructionIdx, - getInstructionIdxFromLabel, - addLabelIdx, - initLocals + startExecution, + createVm ) where import Data.Int (Int32, Int64) +import Data.Word (Word8) import Control.Exception (throw) +import System.Exit import Types import Errors -import Run.Stack import Run.Functions import Debug.Trace -type VmLocals = [StackValue] +data Value = + I_32 Int32 + | I_64 Int64 + | F_32 Float + | F_64 Double + deriving (Show) + +type Stack = [Value] +type Locals = [Value] + +data CurrentExec = CurrentExec { + ceLocals :: Locals, + ceStack :: Stack, + ceInstructions :: [Instruction], + ceInstIdx :: Int, + ceLabels :: [Int], + ceParams :: [TypeName], + ceResults :: [TypeName] +} deriving (Show) + +data InstMemory = Memory { + memRange :: Limit, + memData :: [Word8] +} deriving (Show) data VM = VM { vmStack :: Stack, - instructionIdx :: Int32, - currentFunctionIdx :: Int32, - labels :: [Int32], - vmLocals :: VmLocals, + currentExec :: CurrentExec, + vmMemory :: InstMemory, wasmModule :: WasmModule -} deriving (Show) - -endInstruction :: VM -> VM -endInstruction (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod - -incrementInstructionIdx :: VM -> VM -incrementInstructionIdx (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod - -getInstructionIdxFromLabel :: VM -> Int32 -> Int32 -getInstructionIdxFromLabel vm labelIdx - | labelIdx < 0 = throw $ WasmError "getInstructionIdxFromLabel: bad label" - | labelIdx >= fromIntegral (length (labels vm)) = throw $ WasmError "getInstructionIdxFromLabel: bad label" - | otherwise = (labels vm) !! (fromIntegral labelIdx) - -addLabelIdx :: VM -> Int32 -> VM -addLabelIdx vm labelIdx = vm { labels = labelIdx:(labels vm) } +} + +instance Show VM where + show vm = "VM { vmStack = " ++ show (vmStack vm) ++ ", currentExec = " ++ show (currentExec vm) ++ " }" + +createVm :: WasmModule -> VM +createVm wasmMod = VM { + vmStack = [], + currentExec = CurrentExec { + ceLocals = [], + ceStack = [], + ceInstructions = [], + ceParams = [], + ceResults = [] + }, + vmMemory = Memory { + memRange = Limit 0 Nothing, + memData = [] + }, + wasmModule = wasmMod +} + + +---------------------------- + +getLocalFromId' :: Int32 -> LocalIdx -> Locals -> Value +getLocalFromId' _ _ [] = throw $ WasmError "getLocalFromId: bad id" +getLocalFromId' idx id (x:xs) + | idx > id = throw $ WasmError "getLocalFromId: bad id" + | idx == id = x + | otherwise = getLocalFromId' (idx + 1) id xs + +getLocalFromId :: CurrentExec -> LocalIdx -> Value +getLocalFromId cEx id = getLocalFromId' 0 id (ceLocals cEx) + +-- pushResults StackToPushTo StackToPopFrom ResultTypes +pushResults :: Stack -> Stack -> [TypeName] -> Stack +pushResults stack1 stack2 [] = stack1 +pushResults stack1 stack2 ((I32):xs) = case stackTop stack2 of + I_32 val -> pushResults (stackPush stack1 (I_32 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 ((I64):xs) = case stackTop stack2 of + I_64 val -> pushResults (stackPush stack1 (I_64 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 ((F32):xs) = case stackTop stack2 of + F_32 val -> pushResults (stackPush stack1 (F_32 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 ((F64):xs) = case stackTop stack2 of + F_64 val -> pushResults (stackPush stack1 (F_64 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 _ = throw $ WasmError "pushResults: bad type" + +stackPush :: Stack -> Value -> Stack +stackPush stack value = value:stack + +stackPop :: Stack -> (Value, Stack) +stackPop [] = throw $ WasmError "stackPop: empty stack" +stackPop (x:xs) = (x, xs) + +stackTop :: Stack -> Value +stackTop [] = throw $ WasmError "stackTop: empty stack" +stackTop (x:xs) = x + +stackPopN :: Stack -> Int -> ([Value], Stack) +stackPopN stack 0 = ([], stack) +stackPopN stack n + | n > 0 = do + let (value, newStack) = stackPop stack + let (values, finalStack) = stackPopN newStack (n - 1) + (value : values, finalStack) + | otherwise = error "stackPopN: bad n" --------------------------- -setLocalWithParameters :: FuncType -> Stack -> VmLocals -> (VmLocals, Stack) -setLocalWithParameters _ stack [] = ([], stack) -setLocalWithParameters (FuncType id [] res) stack locals = trace ("here3") (locals, stack) -setLocalWithParameters (FuncType id (I32:xs) res) (Stack (I_32 x:xsStack)) (I_32 y:xsLocals) - = trace ("here") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_32 x:xsLocals) -setLocalWithParameters (FuncType id (I64:xs) res) (Stack (I_64 x:xsStack)) (I_64 y:xsLocals) - = trace ("here2") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_64 x:xsLocals) -setLocalWithParameters _ _ _ = throw $ WasmError "setLocalWithParameters: bad parameters" +createEmptyLocals :: Locals -> [Local] -> Locals +createEmptyLocals newLocals [] = newLocals +createEmptyLocals newLocals ((Local _ I32):xs) = createEmptyLocals (I_32 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ I64):xs) = createEmptyLocals (I_64 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ F32):xs) = createEmptyLocals (F_32 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ F64):xs) = createEmptyLocals (F_64 0 : newLocals) xs + +fillLocals :: [TypeName] -> [Value] -> Locals -> Locals -> Locals +fillLocals [] [] _ acc = reverse acc +fillLocals (I32:xs) (I_32 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (I_32 val : acc) +fillLocals (I64:xs) (I_64 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (I_64 val : acc) +fillLocals (F32:xs) (F_32 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (F_32 val : acc) +fillLocals (F64:xs) (F_64 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (F_64 val : acc) +fillLocals _ _ _ _ = throw $ WasmError "fillLocals: bad type" + +initLocals :: Int -> [TypeName] -> Stack -> Locals -> (Locals, Stack) +initLocals nb types stack locals + | nb /= length types = throw $ WasmError "initLocals: bad nb" + | nb > length stack = throw $ WasmError "initLocals: bad nb" + | otherwise = do + let (values, newStack) = stackPopN stack nb + let reversedValues = reverse values + let newLocals = fillLocals types reversedValues locals [] + (newLocals, newStack) -initFuncVars :: Function -> VmLocals -initFuncVars (Function _ _ [] _) = [] -initFuncVars (Function _ _ ((Local _ I32):xs) _) = (I_32 0):(initFuncVars (Function 0 0 xs [])) -initFuncVars _ = throw $ WasmError "initFuncVars: bad local" +--------------------------- -initLocalVars :: Function -> Stack -> FuncType -> (VmLocals, Stack) -initLocalVars func stack funcType = do - let localsDefaultInit = initFuncVars func - let nbOfLocals = length localsDefaultInit - let values = stackPopN stack nbOfLocals +addLabel :: CurrentExec -> CurrentExec +addLabel cEx = cEx { ceLabels = (ceLabels cEx) ++ [ceInstIdx cEx] } +incrementInstIdx :: CurrentExec -> CurrentExec +incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } --------------------------- -initLocals :: VM -> VM -initLocals vm = do - let fnTypes = types (wasmModule vm) - let currentFunc = getFunctionFromId (currentFunctionIdx vm) (functions (wasmModule vm)) - let fnType = getFuncTypeFromId (funcType currentFunc) fnTypes - let (localVars, newStack) = initLocalVars currentFunc (vmStack vm) fnType - vm { vmLocals = localVars, vmStack = newStack } - - --- initFuncVars (Function _ _ ((Local _ I64):xs) _) = trace ("hh2") (I_64 0):(initFuncVars (Function 0 0 xs [])) --- initFuncVars (Function _ _ ((Local _ F32):xs) _) = trace ("hh3") (F_32 0.0):(initFuncVars (Function 0 0 xs [])) --- initFuncVars (Function _ _ ((Local _ F64):xs) _) = trace ("hh4") (F_64 0.0):(initFuncVars (Function 0 0 xs [])) \ No newline at end of file +execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec +execOpCode vm cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } +execOpCode vm cEx (Block _) = addLabel cEx +execOpCode vm cEx (I32Eqz) = do + let value = stackTop (ceStack cEx) + case value of + I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } + I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } + _ -> throw $ WasmError "exec I32eqz: bad type" +execOpCode vm cEx (I32Add) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } + _ -> throw $ WasmError "exec I32Add: bad type" +execOpCode vm cEx (BrIf labelIdx) = do + let (value, newStack) = stackPop (ceStack cEx) + case value of + I_32 0 -> cEx + I_32 _ -> cEx { ceStack = newStack, ceInstIdx = (fromIntegral labelIdx) } + _ -> throw $ WasmError "exec brIf: bad type" +execOpCode vm cEx (Call funcIdx) = do + let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) + let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) + cEx { ceStack = newStack } +execOpCode vm cEx (GetLocal localIdx) = do + let value = getLocalFromId cEx localIdx + cEx { ceStack = stackPush (ceStack cEx) value } +execOpCode vm cEx _ = cEx + +execOpCodes :: VM -> [Instruction] -> CurrentExec +execOpCodes vm [] = currentExec vm +execOpCodes vm instructions + | ceInstIdx cEx >= length instructions = cEx + | ceInstIdx cEx < 0 = throw $ WasmError "execOpCodes: bad index" + | (instructions !! ceInstIdx cEx) == End = cEx + | otherwise = do + let newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) + let newVm = vm { currentExec = (incrementInstIdx newCEx) } + execOpCodes newVm instructions + where cEx = currentExec vm + +execFunction :: VM -> VM +execFunction vm = do + let newCEx = trace ("opcodes=" ++ show (ceInstructions (currentExec vm))) execOpCodes vm (ceInstructions (currentExec vm)) + vm { currentExec = newCEx, vmStack = (pushResults (vmStack vm) (ceStack newCEx) (ceResults newCEx)) } + +execFunctionWithIdx :: VM -> FuncIdx -> Stack -> VM +execFunctionWithIdx vm funcIdx currentStack = do + let function = getFunctionFromId funcIdx (functions (wasmModule vm)) + let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) + let emptyLocals = createEmptyLocals [] (locals function) + let stack = currentStack + let (newLocals, newStack) = initLocals (length (params funcTypee)) (params funcTypee) stack emptyLocals + let cexec = CurrentExec { + ceLocals = newLocals, + ceStack = newStack, + ceInstructions = body function, + ceInstIdx = 0, + ceLabels = [], + ceParams = params funcTypee, + ceResults = results funcTypee + } + execFunction vm { currentExec = cexec } + +startExecution :: VM -> FuncIdx -> IO () +startExecution vm funcIdx = do + let function = getFunctionFromId funcIdx (functions (wasmModule vm)) + let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) + let cexec = CurrentExec { + ceLocals = [], + ceStack = [], + ceInstructions = body function, + ceInstIdx = 0, + ceLabels = [], + ceParams = params funcTypee, + ceResults = results funcTypee + } + let newVm = execFunction vm { currentExec = cexec } + let resStack = [] + let res = pushResults resStack (vmStack newVm) (ceResults (currentExec newVm)) + let exitCode = case res of + [] -> 0 + (x:xs) -> case x of + I_32 val -> val + _ -> 0 + putStrLn $ "Exit correctly with code: " ++ show exitCode + exitWith $ ExitSuccess diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index 1b89cff..3297993 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -93,6 +93,9 @@ data MemArg = MemArg { align :: Int32 } +instance Eq MemArg where + (==) memArg1 memArg2 = (offset memArg1) == (offset memArg2) && (align memArg1) == (align memArg2) + instance Show MemArg where show memArg = "[\n\toffset: " ++ (show $ offset memArg) ++ "\n\talign: " ++ (show $ align memArg) ++ "\n]" @@ -102,7 +105,7 @@ data BlockType = EmptyType | ValType TypeName | TypeIdx TypeIdx - deriving (Show) + deriving (Show, Eq) data Instruction = Unreachable @@ -134,6 +137,7 @@ data Instruction = | End | MemorySize | MemoryGrow + deriving (Eq) instance Show Instruction where show Unreachable = "\n\t\t\t\tunreachable" diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 1c6f906..27e4c2b 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -56,7 +56,6 @@ executable lvtrun-exe Parsing.Parser Parsing.Sections Run.Functions - Run.Stack Run.Start Run.Vm Types diff --git a/lvtrun/save/Functions.hs b/lvtrun/save/Functions.hs deleted file mode 100644 index 19cb079..0000000 --- a/lvtrun/save/Functions.hs +++ /dev/null @@ -1,49 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Functions --} - -module Run.Functions - ( - getStartFunctionId, - getFunctionFromId, - getStartFunction, - getFuncTypeFromId - ) -where - -import Data.Int (Int32) -import Control.Exception (throw) - -import Types -import Errors - --------------------------------------- - -getStartFunctionId :: [Export] -> Int32 -getStartFunctionId [] = throw $ WasmError "No start function" -getStartFunctionId (x:xs) - | expName x == "_start" = - case expDesc x of - ExportFunc idx -> idx - _ -> throw $ WasmError "getStartFunctionId: bad export" - | otherwise = getStartFunctionId xs -getStartFunctionId _ = throw $ WasmError "getStartFunctionId: bad export" - -getFunctionFromId :: Int32 -> [Function] -> Function -getFunctionFromId id [] = throw $ WasmError "getFunctionFromId: bad id" -getFunctionFromId id (x:xs) - | funcIdx x == id = x - | otherwise = getFunctionFromId id xs - -getStartFunction :: [Export] -> [Function] -> Function -getStartFunction exports functions = - getFunctionFromId (getStartFunctionId exports) functions - -getFuncTypeFromId :: Int32 -> [FuncType] -> FuncType -getFuncTypeFromId id [] = throw $ WasmError "getFuncTypeFromId: bad id" -getFuncTypeFromId id (x:xs) - | typeId x == id = x - | otherwise = getFuncTypeFromId id xs diff --git a/lvtrun/save/Stack.hs b/lvtrun/save/Stack.hs deleted file mode 100644 index a40505e..0000000 --- a/lvtrun/save/Stack.hs +++ /dev/null @@ -1,43 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- stack --} - -module Run.Stack - ( - Stack(..), - StackValue(..), - addStackValue, - stackPop, - stackDrop - ) -where - -import Data.Int (Int32, Int64) -import Control.Exception (throw) - -import Types -import Errors - -data StackValue = - I_32 Int32 - | I_64 Int64 - | F_32 Float - | F_64 Double - | Null - deriving (Show, Eq) - -data Stack = Stack [StackValue] deriving (Show) - -addStackValue :: Stack -> StackValue -> Stack -addStackValue (Stack stack) value = Stack (value : stack) - -stackPop :: Stack -> (StackValue, Stack) -stackPop (Stack []) = throw $ WasmError "stackPop: empty stack" -stackPop (Stack (x:xs)) = (x, Stack xs) - -stackDrop :: Stack -> StackValue -stackDrop (Stack []) = throw $ WasmError "stackDrop: empty stack" -stackDrop (Stack (x:xs)) = x diff --git a/lvtrun/save/Start.hs b/lvtrun/save/Start.hs deleted file mode 100644 index 08f9b8b..0000000 --- a/lvtrun/save/Start.hs +++ /dev/null @@ -1,82 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Code --} - -module Run.Start - ( - start - ) -where - -import Data.Int (Int32, Int64) -import Control.Exception (throw) - -import Types -import Errors -import Run.Vm -import Run.Stack -import Run.Functions - -import Debug.Trace - - ------------------------------ - -executeInstruction :: VM -> Instruction -> VM -executeInstruction vm (Block _) = addLabelIdx vm (instructionIdx vm) -executeInstruction vm (Nop) = vm -executeInstruction vm (End) = vm -executeInstruction vm (I32Const value) = vm { vmStack = addStackValue (vmStack vm) (I_32 value) } -executeInstruction vm (I32Eqz) = case stackDrop (vmStack vm) of - I_32 0 -> vm { vmStack = addStackValue (vmStack vm) (I_32 1) } - _ -> vm { vmStack = addStackValue (vmStack vm) (I_32 0) } -executeInstruction vm (Call idx) = execFunction vm (getFunctionFromId idx (functions (wasmModule vm))) -executeInstruction vm (BrIf lIdx) = case stackDrop (vmStack vm) of - I_32 0 -> vm - _ -> executeInstruction (vm { instructionIdx = getInstructionIdxFromLabel vm lIdx }) (Nop) -executeInstruction vm (I32Add) = do - let (var1, vmStack') = stackPop (vmStack vm) - let (var2, vmStack'') = stackPop vmStack' - case (var1, var2) of - (I_32 x, I_32 y) -> vm { vmStack = addStackValue vmStack'' (I_32 (x + y)) } - _ -> throw $ WasmError "I32Add: bad parameters" -executeInstruction vm (GetLocal idx) = - let local = (vmLocals vm) !! (fromIntegral idx) - in vm { vmStack = addStackValue (vmStack vm) local } -executeInstruction vmConf _ = vmConf - ------------------------------- - -execFunction' :: VM -> Function -> VM -execFunction' vm (Function typeIdx funcIdx locals body) - | instructionIdx vm >= fromIntegral (length body) = vm - | otherwise = do - let instruction = body !! (fromIntegral (instructionIdx vm)) - let newVm = trace ("Exe Instruciton: " ++ show instruction ++ " locals: " ++ show (vmLocals vm)) executeInstruction vm instruction - execFunction' (incrementInstructionIdx newVm) (Function typeIdx funcIdx locals body) - -execFunction :: VM -> Function -> VM -execFunction config (Function typeIdx funcIdx locals body) = do - let vmConf = config { currentFunctionIdx = funcIdx, instructionIdx = 0} - execFunction' (initLocals vmConf) (Function typeIdx funcIdx locals body) - -getTestAddFunction :: Function -getTestAddFunction = Function 3 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] - -getMainTestFunction :: Function -getMainTestFunction = Function 0 1 [] [I32Const 10, I32Const 5, Call 2, End] - -getFunctionsForWasmMod :: [Function] -getFunctionsForWasmMod = [getTestAddFunction, getMainTestFunction] - -start :: WasmModule -> IO () -start wasmMod = do - let configVm = VM (Stack []) 0 0 [] [] (wasmMod { functions = getFunctionsForWasmMod }) - --let startFunc = getStartFunction (exports wasmMod) (functions wasmMod) - let startFunc = getMainTestFunction - let finalVMConf = execFunction configVm startFunc - print (vmStack finalVMConf) - return () diff --git a/lvtrun/save/Vm.hs b/lvtrun/save/Vm.hs deleted file mode 100644 index a292e77..0000000 --- a/lvtrun/save/Vm.hs +++ /dev/null @@ -1,90 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Vm --} - -module Run.Vm - ( - VM(..), - incrementInstructionIdx, - getInstructionIdxFromLabel, - addLabelIdx, - initLocals - ) -where - -import Data.Int (Int32, Int64) -import Control.Exception (throw) - -import Types -import Errors -import Run.Stack -import Run.Functions - -import Debug.Trace - -type VmLocals = [StackValue] - -data VM = VM { - vmStack :: Stack, - instructionIdx :: Int32, - currentFunctionIdx :: Int32, - labels :: [Int32], - vmLocals :: VmLocals, - wasmModule :: WasmModule -} deriving (Show) - -endInstruction :: VM -> VM -endInstruction (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod - -incrementInstructionIdx :: VM -> VM -incrementInstructionIdx (VM stack instructionIdx fnIdx lb lc wasmMod) = VM stack (instructionIdx + 1) fnIdx lb lc wasmMod - -getInstructionIdxFromLabel :: VM -> Int32 -> Int32 -getInstructionIdxFromLabel vm labelIdx - | labelIdx < 0 = throw $ WasmError "getInstructionIdxFromLabel: bad label" - | labelIdx >= fromIntegral (length (labels vm)) = throw $ WasmError "getInstructionIdxFromLabel: bad label" - | otherwise = (labels vm) !! (fromIntegral labelIdx) - -addLabelIdx :: VM -> Int32 -> VM -addLabelIdx vm labelIdx = vm { labels = labelIdx:(labels vm) } - ---------------------------- - -setLocalWithParameters :: FuncType -> Stack -> VmLocals -> (VmLocals, Stack) -setLocalWithParameters _ stack [] = ([], stack) -setLocalWithParameters (FuncType id [] res) stack locals = trace ("here3") (locals, stack) -setLocalWithParameters (FuncType id (I32:xs) res) (Stack (I_32 x:xsStack)) (I_32 y:xsLocals) - = trace ("here") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_32 x:xsLocals) -setLocalWithParameters (FuncType id (I64:xs) res) (Stack (I_64 x:xsStack)) (I_64 y:xsLocals) - = trace ("here2") setLocalWithParameters (FuncType id xs res) (Stack xsStack) (I_64 x:xsLocals) -setLocalWithParameters _ _ _ = throw $ WasmError "setLocalWithParameters: bad parameters" - -initFuncVars :: Function -> VmLocals -initFuncVars (Function _ _ [] _) = [] -initFuncVars (Function _ _ ((Local _ I32):xs) _) = (I_32 0):(initFuncVars (Function 0 0 xs [])) -initFuncVars _ = throw $ WasmError "initFuncVars: bad local" - -initLocalVars :: Function -> Stack -> FuncType -> (VmLocals, Stack) -initLocalVars func stack funcType = do - let localsDefaultInit = initFuncVars func - let nbOfLocals = length localsDefaultInit - let values = stackPopN stack nbOfLocals - - ---------------------------- - -initLocals :: VM -> VM -initLocals vm = do - let fnTypes = types (wasmModule vm) - let currentFunc = getFunctionFromId (currentFunctionIdx vm) (functions (wasmModule vm)) - let fnType = getFuncTypeFromId (funcType currentFunc) fnTypes - let (localVars, newStack) = initLocalVars currentFunc (vmStack vm) fnType - vm { vmLocals = localVars, vmStack = newStack } - - --- initFuncVars (Function _ _ ((Local _ I64):xs) _) = trace ("hh2") (I_64 0):(initFuncVars (Function 0 0 xs [])) --- initFuncVars (Function _ _ ((Local _ F32):xs) _) = trace ("hh3") (F_32 0.0):(initFuncVars (Function 0 0 xs [])) --- initFuncVars (Function _ _ ((Local _ F64):xs) _) = trace ("hh4") (F_64 0.0):(initFuncVars (Function 0 0 xs [])) \ No newline at end of file From 280d80c46411f84033e2ba75689fb507f10332a3 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 13:44:41 +0100 Subject: [PATCH 51/99] Add write for wasm --- lvtc/lvtc.cabal | 2 + lvtc/package.yaml | 2 + lvtc/src/WasmUtils.hs | 35 ++++++++++++ lvtc/src/WriteWasm.hs | 123 ++++++++++++++++++++++++++++++++++++++++++ lvtc/stack.yaml | 1 + lvtc/stack.yaml.lock | 7 +++ 6 files changed, 170 insertions(+) create mode 100644 lvtc/src/WriteWasm.hs diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 7c78fc8..1336253 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -40,6 +40,7 @@ library WatLike WatLikeToWat WatToWasm + WriteWasm other-modules: Paths_lvtc autogen-modules: @@ -49,6 +50,7 @@ library ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , bytestring default-language: Haskell2010 executable lvtc-exe diff --git a/lvtc/package.yaml b/lvtc/package.yaml index 1476033..a278463 100644 --- a/lvtc/package.yaml +++ b/lvtc/package.yaml @@ -35,6 +35,8 @@ ghc-options: library: source-dirs: src + dependencies: + - bytestring executables: lvtc-exe: diff --git a/lvtc/src/WasmUtils.hs b/lvtc/src/WasmUtils.hs index 1cf6b58..5d08b74 100644 --- a/lvtc/src/WasmUtils.hs +++ b/lvtc/src/WasmUtils.hs @@ -24,6 +24,10 @@ module WasmUtils fillBlankExportSection, fillBlankCodeSectionCode, fillBlankCodeSection, + -- + opCodeByte, + variableTypeByte, + exportSectionExportTypeByte ) where import Wasm @@ -214,3 +218,34 @@ getDefaultWasm = Wasm { exportSection = getDefaultExportSection, codeSection = getDefaultCodeSection } + +opCodeByte :: OpCode -> Int +opCodeByte (LocalGet _) = 0x20 +opCodeByte (LocalSet _) = 0x21 +opCodeByte (I32Const _) = 0x41 +opCodeByte I32Store = 0x36 +opCodeByte I32Load = 0x28 +opCodeByte I32GT_S = 0x4a +opCodeByte I32LT_S = 0x48 +opCodeByte I32GE_S = 0x4e +opCodeByte I32LE_S = 0x4c +opCodeByte I32EQ = 0x46 +opCodeByte I32NE = 0x47 +opCodeByte I32Add = 0x6a +opCodeByte I32Sub = 0x6b +opCodeByte I32Mul = 0x6c +opCodeByte I32Div = 0x6d +opCodeByte Return = 0x0f +opCodeByte (Call _) = 0x10 +opCodeByte If = 0x04 +opCodeByte Else = 0x05 +opCodeByte End = 0x0b + +variableTypeByte :: VariableType -> Int +variableTypeByte I32 = 0x7f + +exportSectionExportTypeByte :: ExportSectionExportType -> Int +exportSectionExportTypeByte (FuncExport) = 0x00 +exportSectionExportTypeByte (TableExport) = 0x01 +exportSectionExportTypeByte (MemoryExport) = 0x02 +exportSectionExportTypeByte (GlobalExport) = 0x03 diff --git a/lvtc/src/WriteWasm.hs b/lvtc/src/WriteWasm.hs new file mode 100644 index 0000000..81516c3 --- /dev/null +++ b/lvtc/src/WriteWasm.hs @@ -0,0 +1,123 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- WriteWasm +-} + +module WriteWasm +( + writeWasm + , wasmToByteString +) where + +import Wasm +import WasmUtils +import qualified Data.ByteString as B +import WatAST (OpCode (..)) +import Data.Char (ord) + +-- extend + +extendBytes :: B.ByteString -> [B.ByteString] -> B.ByteString +extendBytes l [] = l +extendBytes l (x:xs) = extendBytes (l `B.append` x) xs + +extendsBytes :: B.ByteString -> [[B.ByteString]] -> B.ByteString +extendsBytes a [] = a +extendsBytes a (x:xs) = extendsBytes (extendBytes a x) xs + +-- + +headerWasmToByteString :: Wasm -> B.ByteString +headerWasmToByteString (Wasm (a, b, c, d) (e, f, g, h) _ _ _ _ _) = + B.pack (map fromIntegral [a, b, c, d, e, f, g, h]) + +-- + +typeSectionTypeToByteString :: TypeSectionType -> B.ByteString +typeSectionTypeToByteString (Func a b lc d le) = + extendBytes + (B.pack (map fromIntegral [a, b])) + [ + B.pack (map (fromIntegral . variableTypeByte) lc), + B.pack [fromIntegral d], + B.pack (map (fromIntegral . variableTypeByte) le) + ] + +typeSectionToByteString :: TypeSection -> B.ByteString +typeSectionToByteString (TS a b c ld) = + extendBytes + (B.pack (map fromIntegral [a, b, c])) + (map typeSectionTypeToByteString ld) + +-- + +functionSectionToByteString :: FunctionSection -> B.ByteString +functionSectionToByteString (FS a b c ld) = + B.pack (map fromIntegral ([a, b, c] ++ ld)) + +-- + +memorySectionToByteString :: MemorySection -> B.ByteString +memorySectionToByteString (MS a b 0 d _) = + B.pack (map fromIntegral ([a, b, 0, d])) +memorySectionToByteString (MS a b _ d e) = + B.pack (map fromIntegral ([a, b, 1, d, e])) + +-- + +exportSectionExportToByteString :: ExportSectionExport -> B.ByteString +exportSectionExportToByteString (ESE a lb c d) = + B.pack (map fromIntegral ([a] ++ (map ord lb) ++ [exportSectionExportTypeByte c, d])) + +exportSectionToByteString :: ExportSection -> B.ByteString +exportSectionToByteString (ES a b c ld) = + extendBytes + (B.pack (map fromIntegral [a, b, c])) + (map exportSectionExportToByteString ld) + +-- + +codeSectionCodeLocalsToByte :: CodeSectionCodeLocals -> B.ByteString +codeSectionCodeLocalsToByte (a, b) = + B.pack (map fromIntegral [fromIntegral a, variableTypeByte b]) + +opCodeToByte :: OpCode -> B.ByteString +opCodeToByte (LocalGet a) = B.pack (map fromIntegral [opCodeByte (LocalGet a), fromIntegral a]) +opCodeToByte (LocalSet a) = B.pack (map fromIntegral [opCodeByte (LocalSet a), fromIntegral a]) +opCodeToByte (I32Const a) = B.pack (map fromIntegral [opCodeByte (I32Const a), fromIntegral a]) +opCodeToByte op = B.pack [fromIntegral (opCodeByte op)] + +codeSectionCodeToByte :: CodeSectionCode -> B.ByteString +codeSectionCodeToByte (CSC a b lc ld e) = + extendsBytes + (B.pack (map fromIntegral [a, b])) + [ + (map codeSectionCodeLocalsToByte lc), + (map opCodeToByte ld), + ([B.pack [fromIntegral e]]) + ] + +codeSectionToByte :: CodeSection -> B.ByteString +codeSectionToByte (CS a b c ld) = + extendBytes + (B.pack (map fromIntegral [a, b, c])) + (map codeSectionCodeToByte ld) + +wasmToByteString :: Wasm -> B.ByteString +wasmToByteString (Wasm hW vW tS fS mS eS cS) = + extendBytes + (headerWasmToByteString (Wasm hW vW tS fS mS eS cS)) + [ + typeSectionToByteString tS, + functionSectionToByteString fS, + memorySectionToByteString mS, + exportSectionToByteString eS, + codeSectionToByte cS + ] + +writeWasm :: Wasm -> FilePath -> IO () +writeWasm w f = B.writeFile f bytes + where + bytes = wasmToByteString w diff --git a/lvtc/stack.yaml b/lvtc/stack.yaml index 03d26e7..4fa2423 100644 --- a/lvtc/stack.yaml +++ b/lvtc/stack.yaml @@ -43,6 +43,7 @@ packages: extra-deps: - tasty-1.4.2.2 - tasty-hunit-0.10.1 +- bytestring-0.12.0.2 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtc/stack.yaml.lock b/lvtc/stack.yaml.lock index 246c84e..1ca809c 100644 --- a/lvtc/stack.yaml.lock +++ b/lvtc/stack.yaml.lock @@ -18,6 +18,13 @@ packages: size: 399 original: hackage: tasty-hunit-0.10.1 +- completed: + hackage: bytestring-0.12.0.2@sha256:9fc077ff5b7ed2246773c3ac4370ef8822e4834d4587522b68ae551a5968fb86,7891 + pantry-tree: + sha256: 05b5b3ef529f137062c632c38d9c94482ee25bcc0438d51a4be5448dafe690c9 + size: 4355 + original: + hackage: bytestring-0.12.0.2 snapshots: - completed: sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f From a8a25e9d08c8cdbbb95144cc594ac7039edd68e5 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 14:16:29 +0100 Subject: [PATCH 52/99] Fix tests and norm --- lvtc/src/WriteWasm.hs | 13 +++++++++---- lvtc/stack.yaml | 6 ++++++ lvtc/stack.yaml.lock | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/lvtc/src/WriteWasm.hs b/lvtc/src/WriteWasm.hs index 81516c3..a78d7af 100644 --- a/lvtc/src/WriteWasm.hs +++ b/lvtc/src/WriteWasm.hs @@ -69,7 +69,9 @@ memorySectionToByteString (MS a b _ d e) = exportSectionExportToByteString :: ExportSectionExport -> B.ByteString exportSectionExportToByteString (ESE a lb c d) = - B.pack (map fromIntegral ([a] ++ (map ord lb) ++ [exportSectionExportTypeByte c, d])) + B.pack (map fromIntegral ([a] + ++ (map ord lb) + ++ [exportSectionExportTypeByte c, d])) exportSectionToByteString :: ExportSection -> B.ByteString exportSectionToByteString (ES a b c ld) = @@ -84,9 +86,12 @@ codeSectionCodeLocalsToByte (a, b) = B.pack (map fromIntegral [fromIntegral a, variableTypeByte b]) opCodeToByte :: OpCode -> B.ByteString -opCodeToByte (LocalGet a) = B.pack (map fromIntegral [opCodeByte (LocalGet a), fromIntegral a]) -opCodeToByte (LocalSet a) = B.pack (map fromIntegral [opCodeByte (LocalSet a), fromIntegral a]) -opCodeToByte (I32Const a) = B.pack (map fromIntegral [opCodeByte (I32Const a), fromIntegral a]) +opCodeToByte (LocalGet a) = + B.pack (map fromIntegral [opCodeByte (LocalGet a), fromIntegral a]) +opCodeToByte (LocalSet a) = + B.pack (map fromIntegral [opCodeByte (LocalSet a), fromIntegral a]) +opCodeToByte (I32Const a) = + B.pack (map fromIntegral [opCodeByte (I32Const a), fromIntegral a]) opCodeToByte op = B.pack [fromIntegral (opCodeByte op)] codeSectionCodeToByte :: CodeSectionCode -> B.ByteString diff --git a/lvtc/stack.yaml b/lvtc/stack.yaml index 4fa2423..fe3802b 100644 --- a/lvtc/stack.yaml +++ b/lvtc/stack.yaml @@ -44,6 +44,12 @@ extra-deps: - tasty-1.4.2.2 - tasty-hunit-0.10.1 - bytestring-0.12.0.2 +- unix-2.8.5.0 +- process-1.6.18.0 +- text-2.1 +- binary-0.8.9.1 +- directory-1.3.8.2 +- filepath-1.4.100.4 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtc/stack.yaml.lock b/lvtc/stack.yaml.lock index 1ca809c..97f43b3 100644 --- a/lvtc/stack.yaml.lock +++ b/lvtc/stack.yaml.lock @@ -25,6 +25,48 @@ packages: size: 4355 original: hackage: bytestring-0.12.0.2 +- completed: + hackage: unix-2.8.5.0@sha256:633f15ef0bd50a16a7b5c5e86e6659fee6e4e211e098cc8bd0029f452bfcfddc,9808 + pantry-tree: + sha256: d02b6227c6717f58c6f6ef1923f70af11b1a88987917010c3819c433344f4e3a + size: 5821 + original: + hackage: unix-2.8.5.0 +- completed: + hackage: process-1.6.18.0@sha256:69fbbca4151e1a6d1a5da41a1e17c254871675a4f2aed5213bbdfb10b5e52742,3148 + pantry-tree: + sha256: cd0bf20226dad3e1a1cfee36d38c3f74e851c3d1418d41d8cd3fb656d4f16634 + size: 1675 + original: + hackage: process-1.6.18.0 +- completed: + hackage: text-2.1@sha256:471b9a22f88b1d51bc343e7d1db7bf88b84e1582eb6d5fbe643fe7afc683c256,9422 + pantry-tree: + sha256: eeaf5496ca61f2c7823c2c851b6841203a854166b2a1d458fb8f302b7bcc6092 + size: 7878 + original: + hackage: text-2.1 +- completed: + hackage: binary-0.8.9.1@sha256:81f468c1c75fd6535152ab69b2d32ac6cfcc03e345267b069abe4da56ec95801,6523 + pantry-tree: + sha256: 956ecd662408f69615977b87a92e042abcdc447b7824b8aabf5788c4393c10c5 + size: 1976 + original: + hackage: binary-0.8.9.1 +- completed: + hackage: directory-1.3.8.2@sha256:aa62af76daa1ed082933561a98ae342d4c3ef24bcca7197376ef605fee7d0949,3150 + pantry-tree: + sha256: 80e22e8d8bccbc6a9b26bd4a153550c2c8e3739d5a77efe0633e3e1bd2f18a60 + size: 3519 + original: + hackage: directory-1.3.8.2 +- completed: + hackage: filepath-1.4.100.4@sha256:2de84756d3907308230e34fcc7c1917a73f218f6d53838618b7d5b95dd33e2c3,5536 + pantry-tree: + sha256: 3f8869f574ea76933efe77ed3c6e4e5a646317b38e8962970c8d0d092266f230 + size: 3346 + original: + hackage: filepath-1.4.100.4 snapshots: - completed: sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f From 4f91529a7d8021f9cc251dc6d516bf2ad3f74ed5 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 14:32:44 +0100 Subject: [PATCH 53/99] Fix compil --- lvtc/test/UTParseLvt.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index b064a96..4d2b596 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -119,10 +119,10 @@ utParserLvt = testGroup "Parse Lvt" ] ) , testCase "test func start" $ - testParserFunc "fn start() -> Int\n{\n <- 0;\n};\n" + testParserFunc "export fn start() -> Int\n{\n <- 0;\n};\n" "" ( - ("start", [], "Int"), + (True, "start", [], "Int"), [ Return (Integer 0) ] From a336d429eff2ec4a75ab32ee528c7c8660fea5cc Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 15:10:05 +0100 Subject: [PATCH 54/99] Fix stack lock --- lvtc/stack.yaml.lock | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/lvtc/stack.yaml.lock b/lvtc/stack.yaml.lock index e69de29..97f43b3 100644 --- a/lvtc/stack.yaml.lock +++ b/lvtc/stack.yaml.lock @@ -0,0 +1,76 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: +- completed: + hackage: tasty-1.4.2.2@sha256:b987609178d70c0042b950302161a049be8a878aa8cee4a9c7ba81d22d29a3f5,2719 + pantry-tree: + sha256: a93f5e31aac66a82a885cb2ddc8eada9a8adefe8587da1c4085fae58b6bc4683 + size: 1944 + original: + hackage: tasty-1.4.2.2 +- completed: + hackage: tasty-hunit-0.10.1@sha256:ebc17b490750d4796b21d44001b852688cc39f9c34e387d5e7958e09b9b3f3b9,1602 + pantry-tree: + sha256: c00ed23d8281b6c6f4ec33dd1e9e3a7971b0a769b6140978cfaf2a6eff025c78 + size: 399 + original: + hackage: tasty-hunit-0.10.1 +- completed: + hackage: bytestring-0.12.0.2@sha256:9fc077ff5b7ed2246773c3ac4370ef8822e4834d4587522b68ae551a5968fb86,7891 + pantry-tree: + sha256: 05b5b3ef529f137062c632c38d9c94482ee25bcc0438d51a4be5448dafe690c9 + size: 4355 + original: + hackage: bytestring-0.12.0.2 +- completed: + hackage: unix-2.8.5.0@sha256:633f15ef0bd50a16a7b5c5e86e6659fee6e4e211e098cc8bd0029f452bfcfddc,9808 + pantry-tree: + sha256: d02b6227c6717f58c6f6ef1923f70af11b1a88987917010c3819c433344f4e3a + size: 5821 + original: + hackage: unix-2.8.5.0 +- completed: + hackage: process-1.6.18.0@sha256:69fbbca4151e1a6d1a5da41a1e17c254871675a4f2aed5213bbdfb10b5e52742,3148 + pantry-tree: + sha256: cd0bf20226dad3e1a1cfee36d38c3f74e851c3d1418d41d8cd3fb656d4f16634 + size: 1675 + original: + hackage: process-1.6.18.0 +- completed: + hackage: text-2.1@sha256:471b9a22f88b1d51bc343e7d1db7bf88b84e1582eb6d5fbe643fe7afc683c256,9422 + pantry-tree: + sha256: eeaf5496ca61f2c7823c2c851b6841203a854166b2a1d458fb8f302b7bcc6092 + size: 7878 + original: + hackage: text-2.1 +- completed: + hackage: binary-0.8.9.1@sha256:81f468c1c75fd6535152ab69b2d32ac6cfcc03e345267b069abe4da56ec95801,6523 + pantry-tree: + sha256: 956ecd662408f69615977b87a92e042abcdc447b7824b8aabf5788c4393c10c5 + size: 1976 + original: + hackage: binary-0.8.9.1 +- completed: + hackage: directory-1.3.8.2@sha256:aa62af76daa1ed082933561a98ae342d4c3ef24bcca7197376ef605fee7d0949,3150 + pantry-tree: + sha256: 80e22e8d8bccbc6a9b26bd4a153550c2c8e3739d5a77efe0633e3e1bd2f18a60 + size: 3519 + original: + hackage: directory-1.3.8.2 +- completed: + hackage: filepath-1.4.100.4@sha256:2de84756d3907308230e34fcc7c1917a73f218f6d53838618b7d5b95dd33e2c3,5536 + pantry-tree: + sha256: 3f8869f574ea76933efe77ed3c6e4e5a646317b38e8962970c8d0d092266f230 + size: 3346 + original: + hackage: filepath-1.4.100.4 +snapshots: +- completed: + sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f + size: 712153 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/0.yaml + original: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/22/0.yaml From 2db7c6d6dd91328e81c042eefba6e8f235e48407 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 15:26:58 +0100 Subject: [PATCH 55/99] Fix windows compil --- lvtc/stack.yaml | 2 ++ lvtc/stack.yaml.lock | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lvtc/stack.yaml b/lvtc/stack.yaml index fe3802b..cabf00c 100644 --- a/lvtc/stack.yaml +++ b/lvtc/stack.yaml @@ -50,6 +50,8 @@ extra-deps: - binary-0.8.9.1 - directory-1.3.8.2 - filepath-1.4.100.4 +- Win32-2.13.4.0 +- time-1.12.2 # Override default flag values for local packages and extra-deps # flags: {} diff --git a/lvtc/stack.yaml.lock b/lvtc/stack.yaml.lock index 97f43b3..0ee44a8 100644 --- a/lvtc/stack.yaml.lock +++ b/lvtc/stack.yaml.lock @@ -67,6 +67,20 @@ packages: size: 3346 original: hackage: filepath-1.4.100.4 +- completed: + hackage: Win32-2.13.4.0@sha256:6a1299d051c514aa5ac7b77ef5f86be6c0aa6940b00302c6dc246192c7a97d99,5769 + pantry-tree: + sha256: d9d803aee91429f95e4de4795fc41451765761f73df5c009edd7333e2f3a49a1 + size: 8011 + original: + hackage: Win32-2.13.4.0 +- completed: + hackage: time-1.12.2@sha256:88e8493d9130038d3b9968a2530a0900141cd3d938483c83dde56e12b875ebc8,6510 + pantry-tree: + sha256: de0ab314661da3788b5dad20254e44929b1659b00d32b5a0cd54922a05e006e8 + size: 7264 + original: + hackage: time-1.12.2 snapshots: - completed: sha256: e176944bc843f740e05242fa7a66ca1f440c127e425254f7f1257f9b19add23f From c441cd0d196fe1339fba98b4290b94b05bde3941 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 16:05:59 +0100 Subject: [PATCH 56/99] Add link to all step for wasm --- lvtc/app/Run.hs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lvtc/app/Run.hs b/lvtc/app/Run.hs index f56049c..d3975df 100644 --- a/lvtc/app/Run.hs +++ b/lvtc/app/Run.hs @@ -16,6 +16,11 @@ import ParseLvt (parseFuncDeclaration) import WatLike (aSTToWatLike, FuncDeclare) import Parser (runParser) import AST (FuncDeclaration) +import WatAST (FuncDef) +import WatLikeToWat (watsLikeToWat) +import Wasm (Wasm) +import WatToWasm (watToWasm) +import WriteWasm (writeWasm) import Args import System.Directory (listDirectory) @@ -38,7 +43,7 @@ getFilesExpression (file:files) = getFilesExpression [] = return [] selectGoodFiles :: FilePath -> [FilePath] -> IO [FilePath] -selectGoodFiles folder [] = return [] +selectGoodFiles _ [] = return [] selectGoodFiles folder (file:files) | ".lvt" `isSuffixOf` trueFile = putStrLn ("- " ++ trueFile) @@ -73,11 +78,19 @@ transformToWatLike funcsIo = funcsIo >>= (\funcs -> return (aSTToWatLike funcs)) +transformToWat :: IO [FuncDeclare] -> IO [FuncDef] +transformToWat funcsIo = funcsIo >>= return . watsLikeToWat + +transformToWasm :: IO [FuncDef] -> IO Wasm +transformToWasm funcsIo = funcsIo >>= return . watToWasm + run :: Args -> IO () run (Args Run fPath oFile) = putStrLn ("Compiling from: " ++ fPath) >> - transformed >>= print + transformedWasm >>= \wasm -> writeWasm wasm oFile where expressions = listAllFiles fPath >>= getFilesExpression funcs = expressions >>= getAllFunc - transformed = transformToWatLike (checkAst funcs) + transformedWatLike = transformToWatLike (checkAst funcs) + transformedWat = transformToWat (transformedWatLike) + transformedWasm = transformToWasm (transformedWat) run _ = fail "Invalid option called" From cabc04b92ee94b0d5e89ed0558f5e9aed1c0ca27 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 16:35:10 +0100 Subject: [PATCH 57/99] Add true program --- lvtc/test/lvt/Test.lvt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvtc/test/lvt/Test.lvt b/lvtc/test/lvt/Test.lvt index 369dd3b..4175791 100644 --- a/lvtc/test/lvt/Test.lvt +++ b/lvtc/test/lvt/Test.lvt @@ -3,7 +3,7 @@ fn abc(a: Int) -> Int <- a; }; -fn main() -> Int +export fn start() -> Int { <- abc(1); }; From 185c58ebdc36c657051ecd6a769b6d6eac5e820c Mon Sep 17 00:00:00 2001 From: tenshi Date: Sat, 13 Jan 2024 17:15:20 +0100 Subject: [PATCH 58/99] add new operations --- lvtrun/app/Main.hs | 2 +- lvtrun/app/Parsing/Code.hs | 18 +++++++++++++++++- lvtrun/app/Parsing/Global.hs | 18 +++++++++++++++++- lvtrun/app/Run/Functions.hs | 2 +- lvtrun/app/Run/Start.hs | 20 +++----------------- lvtrun/app/Run/Vm.hs | 23 +++++++++++++++++------ lvtrun/app/Types.hs | 18 ++++++++++++++++++ lvtrun/test/out.wasm | Bin 0 -> 172 bytes lvtrun/test/test.wasm | Bin 170592 -> 0 bytes 9 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 lvtrun/test/out.wasm delete mode 100644 lvtrun/test/test.wasm diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 8fc7fc3..8eeca28 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -13,7 +13,7 @@ import Loader import Run.Start main :: IO () -main = try (loadModule "./test/simple.wasm") >>= \result -> +main = try (loadModule "./test/out.wasm") >>= \result -> case result of Left err -> handleException err Right wasmMod -> start wasmMod diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/app/Parsing/Code.hs index 084de79..8f40df8 100644 --- a/lvtrun/app/Parsing/Code.hs +++ b/lvtrun/app/Parsing/Code.hs @@ -73,6 +73,8 @@ extractOpCode bytes | (head $ BSL.unpack bytes) == 0x10 = ([0x10], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x41 = ([0x41], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x42 = ([0x42], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6c = ([0x6c], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6d = ([0x6d], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x43 = ([0x43], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x44 = ([0x44], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x28 = ([0x28], 1, BSL.drop 1 bytes) @@ -90,10 +92,16 @@ extractOpCode bytes | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x45 = ([0x45], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x46 = ([0x46], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x71 = ([0x00], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x48 = ([0x48], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4a = ([0x4a], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4c = ([0x4c], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4e = ([0x4e], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x47 = ([0x47], 1, BSL.drop 1 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) - | otherwise = throw $ WasmError "extractOpCode: bad instruction" + | otherwise = trace ("extractOpCode: " ++ showBytes bytes) throw $ WasmError "ExtractOpCode2: bad opcode" createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) createInstruction [0x03] bytes = (Nop, bytes) @@ -103,12 +111,20 @@ createInstruction [0x00] bytes = (Unreachable, bytes) createInstruction [0x01] bytes = (Nop, bytes) createInstruction [0x02] bytes = (Block EmptyType, bytes) createInstruction [0x0b] bytes = (End, bytes) +createInstruction [0x48] bytes = (I32Lts, bytes) createInstruction [0x0f] bytes = (Return, bytes) createInstruction [0x4b] bytes = (I32Gtu, bytes) createInstruction [0x6a] bytes = (I32Add, bytes) +createInstruction [0x6c] bytes = (I32Mul, bytes) +createInstruction [0x6d] bytes = (I32Divs, bytes) +createInstruction [0x47] bytes = (I32Ne, bytes) createInstruction [0x6b] bytes = (I32Sub, bytes) +createInstruction [0x4a] bytes = (I32Gts, bytes) +createInstruction [0x46] bytes = (I32Eqz, bytes) createInstruction [0x45] bytes = (I32Eqz, bytes) createInstruction [0x4d] bytes = (I32Leu, bytes) +createInstruction [0x4e] bytes = (I32Ges, bytes) +createInstruction [0x4c] bytes = (I32Les, bytes) createInstruction [0x71] bytes = (I32And, bytes) createInstruction [0x0d] bytes = do let (value, rest) = extractLEB1282 bytes diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/app/Parsing/Global.hs index e09c09e..ae6d7dd 100644 --- a/lvtrun/app/Parsing/Global.hs +++ b/lvtrun/app/Parsing/Global.hs @@ -37,14 +37,22 @@ extractOpCode bytes | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x20 = ([0x20], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6c = ([0x6c], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6d = ([0x6d], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x21 = ([0x21], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x23 = ([0x23], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x24 = ([0x24], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], 1, BSL.drop 1 bytes) | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x46 = ([0x46], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x48 = ([0x48], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4a = ([0x4a], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4c = ([0x4c], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4e = ([0x4e], 1, BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x47 = ([0x47], 1, BSL.drop 1 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) - | otherwise = throw $ WasmError "ExtractOpCode: bad opcode" + | otherwise = throw $ WasmError "ExtractOpCode2: bad opcode" createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) createInstruction [0x01] bytes = (Unreachable, bytes) @@ -52,6 +60,14 @@ createInstruction [0x01] bytes = (Nop, bytes) createInstruction [0x0f] bytes = (Return, bytes) createInstruction [0x6a] bytes = (I32Add, bytes) createInstruction [0x6b] bytes = (I32Sub, bytes) +createInstruction [0x48] bytes = (I32Lts, bytes) +createInstruction [0x6c] bytes = (I32Mul, bytes) +createInstruction [0x6d] bytes = (I32Divs, bytes) +createInstruction [0x4e] bytes = (I32Ges, bytes) +createInstruction [0x4c] bytes = (I32Les, bytes) +createInstruction [0x4a] bytes = (I32Gts, bytes) +createInstruction [0x46] bytes = (I32Eqz, bytes) +createInstruction [0x47] bytes = (I32Ne, bytes) createInstruction [0x10] bytes = do let (value, rest) = extractLEB1282 bytes (Call value, rest) diff --git a/lvtrun/app/Run/Functions.hs b/lvtrun/app/Run/Functions.hs index 19cb079..ac52546 100644 --- a/lvtrun/app/Run/Functions.hs +++ b/lvtrun/app/Run/Functions.hs @@ -25,7 +25,7 @@ import Errors getStartFunctionId :: [Export] -> Int32 getStartFunctionId [] = throw $ WasmError "No start function" getStartFunctionId (x:xs) - | expName x == "_start" = + | expName x == "start" = case expDesc x of ExportFunc idx -> idx _ -> throw $ WasmError "getStartFunctionId: bad export" diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index fb6daf8..c1e52d5 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -21,22 +21,8 @@ import Run.Functions import Debug.Trace -getTypeFunc1 :: FuncType -getTypeFunc1 = FuncType 0 [I32, I32] [I32] - -getTypeFunc2 :: FuncType -getTypeFunc2 = FuncType 1 [] [I32] - -getTestAddFunction :: Function -getTestAddFunction = Function 0 2 [Local 0 I32, Local 1 I32] [GetLocal 0, GetLocal 1, I32Add, End] - -getMainTestFunction :: Function -getMainTestFunction = Function 1 1 [] [I32Const 10, I32Const 5, Call 2, End] - -getFunctionsForWasmMod :: [Function] -getFunctionsForWasmMod = [getTestAddFunction, getMainTestFunction] - start :: WasmModule -> IO () start wasmMod = do - let newWasmMod = wasmMod { functions = getFunctionsForWasmMod, types = [getTypeFunc1, getTypeFunc2] } - startExecution (createVm newWasmMod) 1 + print wasmMod + let res = startExecution (createVm wasmMod) (getStartFunctionId (exports wasmMod)) + return () diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index c13928a..b9203bc 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -41,7 +41,8 @@ data CurrentExec = CurrentExec { ceInstIdx :: Int, ceLabels :: [Int], ceParams :: [TypeName], - ceResults :: [TypeName] + ceResults :: [TypeName], + crBlockIndents :: Int } deriving (Show) data InstMemory = Memory { @@ -165,7 +166,7 @@ incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec execOpCode vm cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } -execOpCode vm cEx (Block _) = addLabel cEx +execOpCode vm cEx (Block _) = addLabel cEx { crBlockIndents = (crBlockIndents cEx) + 1 } execOpCode vm cEx (I32Eqz) = do let value = stackTop (ceStack cEx) case value of @@ -178,6 +179,12 @@ execOpCode vm cEx (I32Add) = do case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } _ -> throw $ WasmError "exec I32Add: bad type" +execOpCode vm cEx (I32Sub) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } + _ -> throw $ WasmError "exec I32Sub: bad type" execOpCode vm cEx (BrIf labelIdx) = do let (value, newStack) = stackPop (ceStack cEx) case value of @@ -188,6 +195,8 @@ execOpCode vm cEx (Call funcIdx) = do let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) cEx { ceStack = newStack } +execOpCode vm cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode vm cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" execOpCode vm cEx (GetLocal localIdx) = do let value = getLocalFromId cEx localIdx cEx { ceStack = stackPush (ceStack cEx) value } @@ -198,7 +207,7 @@ execOpCodes vm [] = currentExec vm execOpCodes vm instructions | ceInstIdx cEx >= length instructions = cEx | ceInstIdx cEx < 0 = throw $ WasmError "execOpCodes: bad index" - | (instructions !! ceInstIdx cEx) == End = cEx + | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx | otherwise = do let newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) let newVm = vm { currentExec = (incrementInstIdx newCEx) } @@ -215,7 +224,7 @@ execFunctionWithIdx vm funcIdx currentStack = do let function = getFunctionFromId funcIdx (functions (wasmModule vm)) let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) let emptyLocals = createEmptyLocals [] (locals function) - let stack = currentStack + let stack = trace ("newFunc") currentStack let (newLocals, newStack) = initLocals (length (params funcTypee)) (params funcTypee) stack emptyLocals let cexec = CurrentExec { ceLocals = newLocals, @@ -224,7 +233,8 @@ execFunctionWithIdx vm funcIdx currentStack = do ceInstIdx = 0, ceLabels = [], ceParams = params funcTypee, - ceResults = results funcTypee + ceResults = results funcTypee, + crBlockIndents = 0 } execFunction vm { currentExec = cexec } @@ -239,7 +249,8 @@ startExecution vm funcIdx = do ceInstIdx = 0, ceLabels = [], ceParams = params funcTypee, - ceResults = results funcTypee + ceResults = results funcTypee, + crBlockIndents = 0 } let newVm = execFunction vm { currentExec = cexec } let resStack = [] diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index 3297993..c953268 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -113,6 +113,7 @@ data Instruction = | Return | Call FuncIdx | I32Const Int32 + | I64Const Int64 | F32Const Float | F64Const Double @@ -127,9 +128,17 @@ data Instruction = | I32Add | I32Sub | I32And + | I32Mul + | I32Divs | I32Eqz | I32Gtu | I32Leu + | I32Eq + | I32Lts + | I32Gts + | I32Les + | I32Ges + | I32Ne | LocalTee LocalIdx | BrIf LabelIdx | Br LabelIdx @@ -158,10 +167,18 @@ instance Show Instruction where show (SetGlobal idx) = "\n\t\t\t\tset_global " ++ (show idx) show I32Add = "\n\t\t\t\ti32.add" show I32Sub = "\n\t\t\t\ti32.sub" + show I32Mul = "\n\t\t\t\ti32.mul" + show I32Divs = "\n\t\t\t\ti32.div_s" show MemorySize = "\n\t\t\t\tmemory.size" show MemoryGrow = "\n\t\t\t\tmemory.grow" show I32And = "\n\t\t\t\ti32.and" show I32Eqz = "\n\t\t\t\ti32.eqz" + show I32Gts = "\n\t\t\t\ti32.gt_s" + show I32Les = "\n\t\t\t\ti32.le_s" + show I32Eq = "\n\t\t\t\ti32.eq" + show I32Ne = "\n\t\t\t\ti32.ne" + show I32Ges = "\n\t\t\t\ti32.ge_s" + show I32Lts = "\n\t\t\t\ti32.lt_s" show I32Gtu = "\n\t\t\t\ti32.gt_u" show I32Leu = "\n\t\t\t\ti32.le_u" show (LocalTee idx) = "\n\t\t\t\tlocal.tee " ++ (show idx) @@ -169,6 +186,7 @@ instance Show Instruction where show (Br idx) = "\n\t\t\t\tbr " ++ (show idx) show End = "\n\t\t\t\tend" show (Block blockType) = "\n\t\t\t\tblock " ++ (show blockType) + show _ = throw $ WasmError "Show Instruction: bad instruction" -- Module section diff --git a/lvtrun/test/out.wasm b/lvtrun/test/out.wasm new file mode 100644 index 0000000000000000000000000000000000000000..0beed09cba54e336d16151986f463d1c25d5c573 GIT binary patch literal 172 zcmXxcK@Ng26a>(jl1B7n3O6W6af8Mf&(LlaHkAFpIyLfVF?pHAAeV&z*f+_kQWJj# zYIE)CeuU0D@N}jxTV6NFrF1PKB0oX?_!?%zVwemM!_)9GybbptzCH&T==8?1x*r)C FWCz&)5q$sv literal 0 HcmV?d00001 diff --git a/lvtrun/test/test.wasm b/lvtrun/test/test.wasm deleted file mode 100644 index 30ee53f9366761bfe51ce0b10de69dd2de9b12a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170592 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

    nEzt=oklm`!wG|c~*AZiKVid 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 B?5qF) From 1653978aea69023a8bfe8743b1432a0aa6f78586 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 18:05:25 +0100 Subject: [PATCH 59/99] Fix memory error wasm --- lvtc/src/Wasm.hs | 14 +++++++++++--- lvtc/src/WasmUtils.hs | 37 ++++++++++++++++++++++--------------- lvtc/src/WatToWasm.hs | 9 +++++++-- lvtc/src/WriteWasm.hs | 14 ++++++++++---- 4 files changed, 50 insertions(+), 24 deletions(-) diff --git a/lvtc/src/Wasm.hs b/lvtc/src/Wasm.hs index 7719a37..7acf9c7 100644 --- a/lvtc/src/Wasm.hs +++ b/lvtc/src/Wasm.hs @@ -11,6 +11,7 @@ module Wasm , TypeSectionType (..) , TypeSection (..) , FunctionSection (..) + , MemorySectionLimits (..) , MemorySection (..) , ExportSectionExportType (..) , ExportSectionExport (..) @@ -56,13 +57,20 @@ data FunctionSection = } deriving (Show, Eq) +data MemorySectionLimits = + MSL { + hasMax :: Int, + minMS :: Int, + maxMS :: Int + } + deriving (Show, Eq) + data MemorySection = MS { headerMS :: Int, sizeMS :: Int, - hasMax :: Int, - minMS :: Int, - maxMS :: Int + nbLimits :: Int, + limits :: [MemorySectionLimits] } deriving (Show, Eq) diff --git a/lvtc/src/WasmUtils.hs b/lvtc/src/WasmUtils.hs index 5d08b74..d4445d0 100644 --- a/lvtc/src/WasmUtils.hs +++ b/lvtc/src/WasmUtils.hs @@ -19,6 +19,7 @@ module WasmUtils fillBlankTypeSectionType, fillBlankTypeSection, fillBlankFunctionSection, + fillBlankMemorySectionLimits, fillBlankMemorySection, fillBlankExportSectionExport, fillBlankExportSection, @@ -98,32 +99,38 @@ getDefaultMemorySection :: MemorySection getDefaultMemorySection = MS { headerMS = 0x05, sizeMS = 0x0, - hasMax = 0x0, - minMS = 0x0, - maxMS = 0x0 + nbLimits = 0, + limits = [] } -fillBlankMemorySection :: MemorySection -> MemorySection -fillBlankMemorySection (MS hM _ 0 miMS maMS) = - MS { - headerMS = hM, - sizeMS = size, +fillBlankMemorySectionLimits :: MemorySectionLimits -> MemorySectionLimits +fillBlankMemorySectionLimits (MSL 0 miMS maMS) = + MSL { hasMax = 0, minMS = miMS, maxMS = maMS } - where - size = 2 -fillBlankMemorySection (MS hM _ _ miMS maMS) = - MS { - headerMS = hM, - sizeMS = size, +fillBlankMemorySectionLimits (MSL _ miMS maMS) = + MSL { hasMax = 1, minMS = miMS, maxMS = maMS } + +getSizeMemorySectionLimits :: MemorySectionLimits -> Int +getSizeMemorySectionLimits (MSL 0 _ _) = 1 + 1 +getSizeMemorySectionLimits (MSL _ _ _) = 1 + 1 + 1 + +fillBlankMemorySection :: MemorySection -> MemorySection +fillBlankMemorySection (MS hM _ _ m) = + MS { + headerMS = hM, + sizeMS = size, + nbLimits = length m, + limits = m + } where - size = 3 + size = 1 + sum (map getSizeMemorySectionLimits m) fillBlankExportSectionExport :: ExportSectionExport -> ExportSectionExport fillBlankExportSectionExport (ESE _ n t i) = diff --git a/lvtc/src/WatToWasm.hs b/lvtc/src/WatToWasm.hs index d51625a..342d55a 100644 --- a/lvtc/src/WatToWasm.hs +++ b/lvtc/src/WatToWasm.hs @@ -74,8 +74,13 @@ funcDefsToFunctionSection fs = funcDefsToMemorySection :: [FuncDef] -> MemorySection funcDefsToMemorySection _ = fillBlankMemorySection (getDefaultMemorySection { - hasMax = 0, - minMS = 1 + limits = [ + fillBlankMemorySectionLimits (MSL { + hasMax = 0, + minMS = 1, + maxMS = 0 + }) + ] }) -- Export Section diff --git a/lvtc/src/WriteWasm.hs b/lvtc/src/WriteWasm.hs index a78d7af..4fb58af 100644 --- a/lvtc/src/WriteWasm.hs +++ b/lvtc/src/WriteWasm.hs @@ -59,11 +59,17 @@ functionSectionToByteString (FS a b c ld) = -- +memorySectionLimitToByteString :: MemorySectionLimits -> B.ByteString +memorySectionLimitToByteString (MSL 0 a _) = + B.pack [0, fromIntegral a] +memorySectionLimitToByteString (MSL _ a b) = + B.pack [0, fromIntegral a, fromIntegral b] + memorySectionToByteString :: MemorySection -> B.ByteString -memorySectionToByteString (MS a b 0 d _) = - B.pack (map fromIntegral ([a, b, 0, d])) -memorySectionToByteString (MS a b _ d e) = - B.pack (map fromIntegral ([a, b, 1, d, e])) +memorySectionToByteString (MS a b e ld) = + extendBytes + (B.pack (map fromIntegral ([a, b, e]))) + (map memorySectionLimitToByteString ld) -- From 7710b62d8fa066a198afe22c880d23b00b7a787c Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 18:17:42 +0100 Subject: [PATCH 60/99] Fix wasm generation --- lvtc/src/WriteWasm.hs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lvtc/src/WriteWasm.hs b/lvtc/src/WriteWasm.hs index 4fb58af..180f564 100644 --- a/lvtc/src/WriteWasm.hs +++ b/lvtc/src/WriteWasm.hs @@ -20,12 +20,10 @@ import Data.Char (ord) -- extend extendBytes :: B.ByteString -> [B.ByteString] -> B.ByteString -extendBytes l [] = l -extendBytes l (x:xs) = extendBytes (l `B.append` x) xs +extendBytes = foldl B.append extendsBytes :: B.ByteString -> [[B.ByteString]] -> B.ByteString -extendsBytes a [] = a -extendsBytes a (x:xs) = extendsBytes (extendBytes a x) xs +extendsBytes = foldl extendBytes -- @@ -68,7 +66,7 @@ memorySectionLimitToByteString (MSL _ a b) = memorySectionToByteString :: MemorySection -> B.ByteString memorySectionToByteString (MS a b e ld) = extendBytes - (B.pack (map fromIntegral ([a, b, e]))) + (B.pack (map fromIntegral [a, b, e])) (map memorySectionLimitToByteString ld) -- @@ -76,7 +74,7 @@ memorySectionToByteString (MS a b e ld) = exportSectionExportToByteString :: ExportSectionExport -> B.ByteString exportSectionExportToByteString (ESE a lb c d) = B.pack (map fromIntegral ([a] - ++ (map ord lb) + ++ map ord lb ++ [exportSectionExportTypeByte c, d])) exportSectionToByteString :: ExportSection -> B.ByteString @@ -98,6 +96,8 @@ opCodeToByte (LocalSet a) = B.pack (map fromIntegral [opCodeByte (LocalSet a), fromIntegral a]) opCodeToByte (I32Const a) = B.pack (map fromIntegral [opCodeByte (I32Const a), fromIntegral a]) +opCodeToByte (Call a) = + B.pack (map fromIntegral [opCodeByte (Call a), fromIntegral a]) opCodeToByte op = B.pack [fromIntegral (opCodeByte op)] codeSectionCodeToByte :: CodeSectionCode -> B.ByteString @@ -105,9 +105,9 @@ codeSectionCodeToByte (CSC a b lc ld e) = extendsBytes (B.pack (map fromIntegral [a, b])) [ - (map codeSectionCodeLocalsToByte lc), - (map opCodeToByte ld), - ([B.pack [fromIntegral e]]) + map codeSectionCodeLocalsToByte lc, + map opCodeToByte ld, + [B.pack [fromIntegral e]] ] codeSectionToByte :: CodeSection -> B.ByteString From bfcab449831e44a09ae74381a2f23f36411f73fa Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 18:56:14 +0100 Subject: [PATCH 61/99] Fix test --- lvtc/test/UTWasm.hs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lvtc/test/UTWasm.hs b/lvtc/test/UTWasm.hs index a91970d..cc7cd12 100644 --- a/lvtc/test/UTWasm.hs +++ b/lvtc/test/UTWasm.hs @@ -54,11 +54,17 @@ basic1Rep = }, memorySection = MS { headerMS = 5, - sizeMS = 2, - hasMax = 0, - minMS = 1, - maxMS = 0 - }, exportSection = ES { + sizeMS = 3, + nbLimits = 1, + limits = [ + MSL { + hasMax = 0, + minMS = 1, + maxMS = 0 + } + ] + }, + exportSection = ES { headerES = 7, sizeES = 1, nbExports = 0, From 4a6314fd754de1283a452c732d3c6ee6b043f162 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 20:46:22 +0100 Subject: [PATCH 62/99] Add debug rule --- Makefile | 4 ++++ lvtc/Makefile | 3 +++ lvtrun/Makefile | 3 +++ 3 files changed, 10 insertions(+) diff --git a/Makefile b/Makefile index ee3e8f1..24566f5 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,10 @@ $(TARGET): "$(MAKE)" -C "$(LVT_COMPILER)" "$(MAKE)" -C "$(LVT_RUNER)" +debug: + "$(MAKE)" -C "$(LVT_COMPILER)" debug + "$(MAKE)" -C "$(LVT_RUNER)" debug + clean: "$(MAKE)" -C "$(LVT_COMPILER)" clean "$(MAKE)" -C "$(LVT_RUNER)" clean diff --git a/lvtc/Makefile b/lvtc/Makefile index 3df21cd..45fe629 100644 --- a/lvtc/Makefile +++ b/lvtc/Makefile @@ -21,6 +21,9 @@ all: $(TARGET) $(TARGET): stack build --copy-bins --local-bin-path . +debug: + stack build --trace --copy-bins --local-bin-path . + clean: stack clean diff --git a/lvtrun/Makefile b/lvtrun/Makefile index 474c67b..e15efd5 100644 --- a/lvtrun/Makefile +++ b/lvtrun/Makefile @@ -21,6 +21,9 @@ all: $(TARGET) $(TARGET): stack build --copy-bins --local-bin-path . +debug: + stack build --trace --copy-bins --local-bin-path . + clean: stack clean From 54cc9f1aa1cea4d7cf88f4926f8a5960e6323f34 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sat, 13 Jan 2024 20:46:43 +0100 Subject: [PATCH 63/99] Fix vars modif --- lvtc/src/WatLike.hs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lvtc/src/WatLike.hs b/lvtc/src/WatLike.hs index 96e4cab..0306fc3 100644 --- a/lvtc/src/WatLike.hs +++ b/lvtc/src/WatLike.hs @@ -94,11 +94,14 @@ modifyAll ((Return vValue):xs) varsIndex funcsIndex = newReturn = Return vValue' (ins', varsIndex'', funcsIndex'') = modifyAll xs varsIndex' funcsIndex' modifyAll ((Declaration ((vName, vTyp), vValue)):xs) varsIndex funcsIndex = - (newDeclaration : ins', varsIndex'', funcsIndex'') + (newDeclaration : ins', varsIndex''', funcsIndex''') where (varsIndex', ind) = getRegisterIndex vName varsIndex - newDeclaration = Declaration ((show ind, vTyp), vValue) - (ins', varsIndex'', funcsIndex'') = modifyAll xs varsIndex' funcsIndex + (vValue'', varsIndex'', funcsIndex'') = + modifyAll' vValue varsIndex' funcsIndex + newDeclaration = Declaration ((show ind, vTyp), vValue'') + (ins', varsIndex''', funcsIndex''') = + modifyAll xs varsIndex'' funcsIndex'' modifyAll ((Assignation (vName, vValue)):xs) varsIndex funcsIndex = (newAssignation:ins', varsIndex''', funcsIndex''') where From d3a18ba3a7d4f667dee84828dcfac6790738e5fc Mon Sep 17 00:00:00 2001 From: tenshi Date: Sat, 13 Jan 2024 23:11:15 +0100 Subject: [PATCH 64/99] add some fixes --- lvtrun/app/Parsing/Code.hs | 4 ++-- lvtrun/app/Parsing/Exports.hs | 4 ++++ lvtrun/app/Parsing/Functions.hs | 12 ++++++------ lvtrun/app/Parsing/Global.hs | 4 ++-- lvtrun/app/Parsing/Parser.hs | 2 +- lvtrun/app/Run/Start.hs | 5 +---- lvtrun/app/Run/Vm.hs | 12 +++++++++++- lvtrun/test/out.wasm | Bin 172 -> 194 bytes 8 files changed, 27 insertions(+), 16 deletions(-) diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/app/Parsing/Code.hs index 8f40df8..793d406 100644 --- a/lvtrun/app/Parsing/Code.hs +++ b/lvtrun/app/Parsing/Code.hs @@ -171,13 +171,13 @@ createInstruction [0x20] bytes = do (GetLocal value, rest) createInstruction [0x24] bytes = do let (value, rest) = extractLEB1282 bytes - (SetLocal value, rest) + (SetGlobal value, rest) createInstruction [0x23] bytes = do let (value, rest) = extractLEB1282 bytes (GetGlobal value, rest) createInstruction [0x21] bytes = do let (value, rest) = extractLEB1282 bytes - (SetGlobal value, rest) + (SetLocal value, rest) createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) createInstruction opCode _ = trace ("createInstruction: " ++ show opCode) throw $ WasmError "createInstruction: bad instruction" diff --git a/lvtrun/app/Parsing/Exports.hs b/lvtrun/app/Parsing/Exports.hs index be89d01..85890fa 100644 --- a/lvtrun/app/Parsing/Exports.hs +++ b/lvtrun/app/Parsing/Exports.hs @@ -17,6 +17,7 @@ import Data.Int (Int64, Int32) import Data.Word (Word8) import Numeric (showHex) import Data.Char (chr) +import Control.Monad (when) import Leb128 import Errors @@ -48,7 +49,10 @@ parseExports idx maxIdx content | Bs.length content == 0 = [] | otherwise = do let (nameLen, rest) = extractLEB128 content + when (nameLen == 0) (throw $ WasmError "parseExports: bad export") + when (Bs.length rest == 0) (throw $ WasmError "parseExports: bad export") let (name, rest2) = Bs.splitAt (fromIntegral nameLen) rest + when (Bs.length rest2 == 0) (throw $ WasmError "parseExports: bad export") let exportType = head (Bs.unpack rest2) let (exportValue, rest3) = extractLEB128 (Bs.drop 1 rest2) let export = createExport (Bs.unpack name) exportType (fromIntegral exportValue) diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/app/Parsing/Functions.hs index b2bf129..a118865 100644 --- a/lvtrun/app/Parsing/Functions.hs +++ b/lvtrun/app/Parsing/Functions.hs @@ -24,14 +24,14 @@ import Debug.Trace parseFunctionsIndex :: Int32 -> Int64 -> BSL.ByteString -> [Function] parseFunctionsIndex idx maxIdx content - | idx > (fromIntegral maxIdx) = [] - | BSL.length content == 0 = [] - | otherwise = do - let (typeIdx, rest) = extractLEB1282 content - Function {funcType = fromIntegral typeIdx, funcIdx = idx, body = []} : parseFunctionsIndex (idx + 1) maxIdx rest + | idx > (fromIntegral maxIdx) = [] + | BSL.length content == 0 = [] + | otherwise = do + let (typeIdx, rest) = extractLEB1282 content + Function {funcType = fromIntegral typeIdx, funcIdx = idx, body = []} : parseFunctionsIndex (idx + 1) maxIdx rest getFunctions :: Section -> [Function] getFunctions (Section FunctionID _ content) = do let (vecSize, rest) = extractLEB128 content - parseFunctionsIndex 1 vecSize rest + parseFunctionsIndex 0 vecSize rest getFunctions _ = throw $ WasmError "getFunctions: bad section" diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/app/Parsing/Global.hs index ae6d7dd..0a3fc7f 100644 --- a/lvtrun/app/Parsing/Global.hs +++ b/lvtrun/app/Parsing/Global.hs @@ -104,13 +104,13 @@ createInstruction [0x20] bytes = do (GetLocal value, rest) createInstruction [0x24] bytes = do let (value, rest) = extractLEB1282 bytes - (SetLocal value, rest) + (SetGlobal value, rest) createInstruction [0x23] bytes = do let (value, rest) = extractLEB1282 bytes (GetGlobal value, rest) createInstruction [0x21] bytes = do let (value, rest) = extractLEB1282 bytes - (SetGlobal value, rest) + (SetLocal value, rest) createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) createInstruction _ _ = throw $ WasmError "CreateInstruction: bad instruction" diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs index 93f548e..41021ba 100644 --- a/lvtrun/app/Parsing/Parser.hs +++ b/lvtrun/app/Parsing/Parser.hs @@ -32,5 +32,5 @@ parseModule bytes = do ((getFuncCode (getSectionWithId sections CodeID) (getFunctions (getSectionWithId sections FunctionID)))) [] (getMemories (getSectionWithId sections MemoryID)) - (getGlobals (getSectionWithId sections GlobalID)) + [] (getExports (getSectionWithId sections ExportID)) diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index c1e52d5..eb29556 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -22,7 +22,4 @@ import Run.Functions import Debug.Trace start :: WasmModule -> IO () -start wasmMod = do - print wasmMod - let res = startExecution (createVm wasmMod) (getStartFunctionId (exports wasmMod)) - return () +start wasmMod = startExecution (createVm wasmMod) (getStartFunctionId (exports wasmMod)) diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index b9203bc..1478781 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -90,6 +90,12 @@ getLocalFromId' idx id (x:xs) getLocalFromId :: CurrentExec -> LocalIdx -> Value getLocalFromId cEx id = getLocalFromId' 0 id (ceLocals cEx) +setLocalWithId :: Locals -> Value -> LocalIdx -> Locals +setLocalWithId [] _ _ = throw $ WasmError "setLocalWithId: bad id" +setLocalWithId (x:xs) value id + | id == 0 = value : xs + | otherwise = x : setLocalWithId xs value (id - 1) + -- pushResults StackToPushTo StackToPopFrom ResultTypes pushResults :: Stack -> Stack -> [TypeName] -> Stack pushResults stack1 stack2 [] = stack1 @@ -200,6 +206,10 @@ execOpCode vm cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" execOpCode vm cEx (GetLocal localIdx) = do let value = getLocalFromId cEx localIdx cEx { ceStack = stackPush (ceStack cEx) value } +execOpCode vm cEx (SetLocal localIdx) = do + let (value, newStack) = stackPop (ceStack cEx) + let newLocals = setLocalWithId (ceLocals cEx) value localIdx + cEx { ceStack = newStack, ceLocals = newLocals } execOpCode vm cEx _ = cEx execOpCodes :: VM -> [Instruction] -> CurrentExec @@ -243,7 +253,7 @@ startExecution vm funcIdx = do let function = getFunctionFromId funcIdx (functions (wasmModule vm)) let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) let cexec = CurrentExec { - ceLocals = [], + ceLocals = createEmptyLocals [] (locals function), ceStack = [], ceInstructions = body function, ceInstIdx = 0, diff --git a/lvtrun/test/out.wasm b/lvtrun/test/out.wasm index 0beed09cba54e336d16151986f463d1c25d5c573..550ce5a9a0b9bbeecb4775813b197d281db70247 100644 GIT binary patch delta 112 zcmXxau?>Sj5Jb_LT~0`Mwjgu5+krDnWLF0X6yU^=Zw>B)DyR$y_~FyvxbuT~`4Rw& zOcKGEz|iO8q&p@h*e0fBoqsDz&ioJK`$Y|di_z7@w1+p=bmj7z9W^-(#y+2qbmahp C3JsS4 delta 90 zcmX@axQ5Y+A+b1@k%57MQGhvtslJ}EK7kQLFfi6L^YQ@2p@5Nzm5G6oos*HZxFoTt jgn^r@c%pf Date: Sat, 13 Jan 2024 23:45:24 +0100 Subject: [PATCH 65/99] Fix leb128 and declaration --- lvtc/lvtc.cabal | 1 + lvtc/src/Leb128Encode.hs | 18 ++++++++++ lvtc/src/WasmUtils.hs | 15 +++++--- lvtc/src/WriteWasm.hs | 76 ++++++++++++++++++++++++++++------------ 4 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 lvtc/src/Leb128Encode.hs diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index 19648fe..dc745fa 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -29,6 +29,7 @@ library AST Builtins Expression + Leb128Encode Lib LvtLibVersion ParseLvt diff --git a/lvtc/src/Leb128Encode.hs b/lvtc/src/Leb128Encode.hs new file mode 100644 index 0000000..b30185b --- /dev/null +++ b/lvtc/src/Leb128Encode.hs @@ -0,0 +1,18 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- Leb128Encode +-} + +module Leb128Encode +( + leb128Encode +) where + +import Data.Bits + +leb128Encode :: Int -> [Int] +leb128Encode n + | n < 0x80 = [n] + | otherwise = ((n .&. 0x7F) .|. 0x80) : leb128Encode (n `shiftR` 7) diff --git a/lvtc/src/WasmUtils.hs b/lvtc/src/WasmUtils.hs index d4445d0..b8064d1 100644 --- a/lvtc/src/WasmUtils.hs +++ b/lvtc/src/WasmUtils.hs @@ -33,6 +33,7 @@ module WasmUtils import Wasm import WatAST (OpCode (..)) +import Leb128Encode getDefaultTypeSectionType :: TypeSectionType getDefaultTypeSectionType = Func { @@ -143,7 +144,7 @@ fillBlankExportSectionExport (ESE _ n t i) = getSizeExportSectionExport :: ExportSectionExport -> Int getSizeExportSectionExport (ESE _ n _ _) = - 1 + ((length n) * 1) + 1 + 1 + (length (leb128Encode (length n))) + (length n) + 1 + 1 getDefaultExportSection :: ExportSection getDefaultExportSection = ES { @@ -162,7 +163,7 @@ fillBlankExportSection (ES hE _ _ e) = exports = e } where - size = 1 + sum (map getSizeExportSectionExport e) + size = 1 + sum (map (getSizeExportSectionExport) e) getDefaultCodeSectionCode :: CodeSectionCode getDefaultCodeSectionCode = CSC { @@ -201,8 +202,11 @@ getDefaultCodeSection = CS { } getSizeCodeSectionCode :: CodeSectionCode -> Int -getSizeCodeSectionCode (CSC s _ _ _ _) = - 1 + s +getSizeCodeSectionCode csc = lN + s + where + newCsc = fillBlankCodeSectionCode csc + s = sizeCSC newCsc + lN = length (leb128Encode s) fillBlankCodeSection :: CodeSection -> CodeSection fillBlankCodeSection (CS hC _ _ c) = @@ -213,7 +217,8 @@ fillBlankCodeSection (CS hC _ _ c) = codes = c } where - size = 1 + sum (map getSizeCodeSectionCode c) + size1 = sum (map getSizeCodeSectionCode c) + size = size1 + 1 getDefaultWasm :: Wasm getDefaultWasm = Wasm { diff --git a/lvtc/src/WriteWasm.hs b/lvtc/src/WriteWasm.hs index 180f564..58bb9c8 100644 --- a/lvtc/src/WriteWasm.hs +++ b/lvtc/src/WriteWasm.hs @@ -13,6 +13,7 @@ module WriteWasm import Wasm import WasmUtils +import Leb128Encode import qualified Data.ByteString as B import WatAST (OpCode (..)) import Data.Char (ord) @@ -45,15 +46,25 @@ typeSectionTypeToByteString (Func a b lc d le) = typeSectionToByteString :: TypeSection -> B.ByteString typeSectionToByteString (TS a b c ld) = - extendBytes - (B.pack (map fromIntegral [a, b, c])) - (map typeSectionTypeToByteString ld) + extendsBytes + (B.pack [fromIntegral a]) + [ + [B.pack (map fromIntegral (leb128Encode b))], + [B.pack [fromIntegral c]], + map typeSectionTypeToByteString ld + ] -- functionSectionToByteString :: FunctionSection -> B.ByteString functionSectionToByteString (FS a b c ld) = - B.pack (map fromIntegral ([a, b, c] ++ ld)) + extendBytes + (B.pack [fromIntegral a]) + [ + B.pack (map (fromIntegral) (leb128Encode b)), + B.pack [fromIntegral c], + B.pack (map fromIntegral ld) + ] -- @@ -64,47 +75,62 @@ memorySectionLimitToByteString (MSL _ a b) = B.pack [0, fromIntegral a, fromIntegral b] memorySectionToByteString :: MemorySection -> B.ByteString -memorySectionToByteString (MS a b e ld) = - extendBytes - (B.pack (map fromIntegral [a, b, e])) - (map memorySectionLimitToByteString ld) +memorySectionToByteString (MS a b c ld) = + extendsBytes + (B.pack [fromIntegral a]) + [ + [B.pack (map fromIntegral (leb128Encode b))], + [B.pack [fromIntegral c]], + map memorySectionLimitToByteString ld + ] -- exportSectionExportToByteString :: ExportSectionExport -> B.ByteString exportSectionExportToByteString (ESE a lb c d) = - B.pack (map fromIntegral ([a] - ++ map ord lb - ++ [exportSectionExportTypeByte c, d])) + extendBytes + (B.pack (map fromIntegral (leb128Encode a))) + [ + B.pack (map (fromIntegral . ord) lb), + B.pack [ + fromIntegral (exportSectionExportTypeByte c), + fromIntegral d + ] + ] exportSectionToByteString :: ExportSection -> B.ByteString exportSectionToByteString (ES a b c ld) = - extendBytes - (B.pack (map fromIntegral [a, b, c])) - (map exportSectionExportToByteString ld) + extendsBytes + (B.pack [fromIntegral a]) + [ + [B.pack (map fromIntegral (leb128Encode b))], + [B.pack [fromIntegral c]], + map exportSectionExportToByteString ld + ] -- codeSectionCodeLocalsToByte :: CodeSectionCodeLocals -> B.ByteString codeSectionCodeLocalsToByte (a, b) = - B.pack (map fromIntegral [fromIntegral a, variableTypeByte b]) + B.pack [fromIntegral a, fromIntegral (variableTypeByte b)] opCodeToByte :: OpCode -> B.ByteString opCodeToByte (LocalGet a) = - B.pack (map fromIntegral [opCodeByte (LocalGet a), fromIntegral a]) + B.pack [fromIntegral (opCodeByte (LocalGet a)), fromIntegral a] opCodeToByte (LocalSet a) = - B.pack (map fromIntegral [opCodeByte (LocalSet a), fromIntegral a]) + B.pack [fromIntegral (opCodeByte (LocalSet a)), fromIntegral a] opCodeToByte (I32Const a) = - B.pack (map fromIntegral [opCodeByte (I32Const a), fromIntegral a]) + B.pack [fromIntegral (opCodeByte (I32Const a)), fromIntegral a] opCodeToByte (Call a) = - B.pack (map fromIntegral [opCodeByte (Call a), fromIntegral a]) + B.pack [fromIntegral (opCodeByte (Call a)), fromIntegral a] opCodeToByte op = B.pack [fromIntegral (opCodeByte op)] codeSectionCodeToByte :: CodeSectionCode -> B.ByteString codeSectionCodeToByte (CSC a b lc ld e) = extendsBytes - (B.pack (map fromIntegral [a, b])) + (B.pack (map fromIntegral (leb128Encode a))) [ + [B.pack [fromIntegral b]], map codeSectionCodeLocalsToByte lc, map opCodeToByte ld, [B.pack [fromIntegral e]] @@ -112,9 +138,13 @@ codeSectionCodeToByte (CSC a b lc ld e) = codeSectionToByte :: CodeSection -> B.ByteString codeSectionToByte (CS a b c ld) = - extendBytes - (B.pack (map fromIntegral [a, b, c])) - (map codeSectionCodeToByte ld) + extendsBytes + (B.pack [fromIntegral a]) + [ + [B.pack (map fromIntegral (leb128Encode b))], + [B.pack [fromIntegral c]], + map (codeSectionCodeToByte) ld + ] wasmToByteString :: Wasm -> B.ByteString wasmToByteString (Wasm hW vW tS fS mS eS cS) = From 26f6c47f7d4a2b7cf037728bc2fca0c052d26789 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 03:26:22 +0100 Subject: [PATCH 66/99] fix locals index --- lvtrun/app/Run/Vm.hs | 111 ++++++++++++++++++++++++++++--------------- lvtrun/test/out.wasm | Bin 194 -> 194 bytes 2 files changed, 72 insertions(+), 39 deletions(-) diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index 1478781..69c049c 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -90,11 +90,12 @@ getLocalFromId' idx id (x:xs) getLocalFromId :: CurrentExec -> LocalIdx -> Value getLocalFromId cEx id = getLocalFromId' 0 id (ceLocals cEx) -setLocalWithId :: Locals -> Value -> LocalIdx -> Locals -setLocalWithId [] _ _ = throw $ WasmError "setLocalWithId: bad id" -setLocalWithId (x:xs) value id - | id == 0 = value : xs - | otherwise = x : setLocalWithId xs value (id - 1) +setLocalWithId :: Int32 -> Locals -> Value -> LocalIdx -> Locals +setLocalWithId _ [] _ _ = throw $ WasmError "setLocalWithId: bad id" +setLocalWithId idx (x:xs) value id + | idx > id = throw $ WasmError "setLocalWithId: bad id" + | idx == id = value : xs + | otherwise = x : setLocalWithId (idx + 1) xs value id -- pushResults StackToPushTo StackToPopFrom ResultTypes pushResults :: Stack -> Stack -> [TypeName] -> Stack @@ -135,6 +136,39 @@ stackPopN stack n --------------------------- +initLocalsVar :: Locals -> [Local] -> Locals +initLocalsVar newLocals [] = newLocals +initLocalsVar newLocals ((Local _ I32):xs) = initLocalsVar (I_32 0 : newLocals) xs +initLocalsVar newLocals ((Local _ I64):xs) = initLocalsVar (I_64 0 : newLocals) xs +initLocalsVar newLocals ((Local _ F32):xs) = initLocalsVar (F_32 0 : newLocals) xs +initLocalsVar newLocals ((Local _ F64):xs) = initLocalsVar (F_64 0 : newLocals) xs + +createLocalsParams :: [TypeName] -> [Value] -> Locals +createLocalsParams [] [] = [] +createLocalsParams (I32:xs) (I_32 val:xs2) = (I_32 val : createLocalsParams xs xs2) +createLocalsParams (I64:xs) (I_64 val:xs2) = (I_64 val : createLocalsParams xs xs2) +createLocalsParams (F32:xs) (F_32 val:xs2) = (F_32 val : createLocalsParams xs xs2) +createLocalsParams (F64:xs) (F_64 val:xs2) = (F_64 val : createLocalsParams xs xs2) +createLocalsParams _ _ = throw $ WasmError "createLocalsParams: bad type" + +initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) +initLocalsParams [] stack = ([], stack) +initLocalsParams params stack + | length params > length stack = throw $ WasmError "initLocalsParam: bad nb" + | otherwise = do + let (values, newStack) = stackPopN stack (length params) + let reversedValues = reverse values + let newLocals = createLocalsParams params reversedValues + (newLocals, newStack) + +initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) +initLocals localVarTypes paramTypes stack = do + let (newLocals, newStack) = initLocalsParams paramTypes stack + let localsVar = initLocalsVar newLocals localVarTypes + (newLocals ++ localsVar, newStack) + +--------------------------- + createEmptyLocals :: Locals -> [Local] -> Locals createEmptyLocals newLocals [] = newLocals createEmptyLocals newLocals ((Local _ I32):xs) = createEmptyLocals (I_32 0 : newLocals) xs @@ -142,23 +176,23 @@ createEmptyLocals newLocals ((Local _ I64):xs) = createEmptyLocals (I_64 0 : new createEmptyLocals newLocals ((Local _ F32):xs) = createEmptyLocals (F_32 0 : newLocals) xs createEmptyLocals newLocals ((Local _ F64):xs) = createEmptyLocals (F_64 0 : newLocals) xs -fillLocals :: [TypeName] -> [Value] -> Locals -> Locals -> Locals -fillLocals [] [] _ acc = reverse acc -fillLocals (I32:xs) (I_32 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (I_32 val : acc) -fillLocals (I64:xs) (I_64 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (I_64 val : acc) -fillLocals (F32:xs) (F_32 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (F_32 val : acc) -fillLocals (F64:xs) (F_64 val:xs2) (_:locals) acc = fillLocals xs xs2 locals (F_64 val : acc) -fillLocals _ _ _ _ = throw $ WasmError "fillLocals: bad type" - -initLocals :: Int -> [TypeName] -> Stack -> Locals -> (Locals, Stack) -initLocals nb types stack locals - | nb /= length types = throw $ WasmError "initLocals: bad nb" - | nb > length stack = throw $ WasmError "initLocals: bad nb" - | otherwise = do - let (values, newStack) = stackPopN stack nb - let reversedValues = reverse values - let newLocals = fillLocals types reversedValues locals [] - (newLocals, newStack) +-- fillLocals :: [TypeName] -> [Value] -> Locals -> Locals +-- fillLocals [] [] locals = locals +-- fillLocals (I32:xs) (I_32 val:xs2) (_:locals) = (I_32 val : fillLocals xs xs2 locals) +-- fillLocals (I64:xs) (I_64 val:xs2) (_:locals) = (I_64 val : fillLocals xs xs2 locals) +-- fillLocals (F32:xs) (F_32 val:xs2) (_:locals) = (F_32 val : fillLocals xs xs2 locals) +-- fillLocals (F64:xs) (F_64 val:xs2) (_:locals) = (F_64 val : fillLocals xs xs2 locals) +-- fillLocals _ _ _ = throw $ WasmError "fillLocals: bad type" + +-- initLocals :: Int -> [TypeName] -> Stack -> Locals -> (Locals, Stack) +-- initLocals nb types stack locals +-- | nb /= length types = throw $ WasmError "initLocals: bad nb" +-- | nb > length stack = throw $ WasmError "initLocals: bad nb" +-- | otherwise = do +-- let (values, newStack) = stackPopN stack nb +-- let reversedValues = reverse values +-- let newLocals = fillLocals types reversedValues locals +-- (newLocals, newStack) --------------------------- @@ -171,22 +205,22 @@ incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } --------------------------- execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec -execOpCode vm cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } -execOpCode vm cEx (Block _) = addLabel cEx { crBlockIndents = (crBlockIndents cEx) + 1 } +execOpCode vm cEx (I32Const val) = trace ("--i32const--" ++ show val) cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } +execOpCode vm cEx (Block _) = trace "--block--" addLabel cEx { crBlockIndents = (crBlockIndents cEx) + 1 } execOpCode vm cEx (I32Eqz) = do - let value = stackTop (ceStack cEx) + let value = trace "--i32eqz--" stackTop (ceStack cEx) case value of I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } _ -> throw $ WasmError "exec I32eqz: bad type" execOpCode vm cEx (I32Add) = do - let (value2, newStack1) = stackPop (ceStack cEx) + let (value2, newStack1) = trace "--i32add--" stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } _ -> throw $ WasmError "exec I32Add: bad type" execOpCode vm cEx (I32Sub) = do - let (value2, newStack1) = stackPop (ceStack cEx) + let (value2, newStack1) = trace "--i32sub--" stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } @@ -198,19 +232,20 @@ execOpCode vm cEx (BrIf labelIdx) = do I_32 _ -> cEx { ceStack = newStack, ceInstIdx = (fromIntegral labelIdx) } _ -> throw $ WasmError "exec brIf: bad type" execOpCode vm cEx (Call funcIdx) = do - let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) + let newVm = trace ("--call--" ++ show funcIdx) execFunctionWithIdx vm funcIdx (ceStack cEx) let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) cEx { ceStack = newStack } -execOpCode vm cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode vm cEx (End) = trace "--end--" cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode vm cEx (Return) = trace "--end--" cEx { crBlockIndents = (crBlockIndents cEx) - 1 } execOpCode vm cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" execOpCode vm cEx (GetLocal localIdx) = do - let value = getLocalFromId cEx localIdx + let value = trace ("--getLocal--" ++ show localIdx) getLocalFromId cEx localIdx cEx { ceStack = stackPush (ceStack cEx) value } execOpCode vm cEx (SetLocal localIdx) = do - let (value, newStack) = stackPop (ceStack cEx) - let newLocals = setLocalWithId (ceLocals cEx) value localIdx + let (value, newStack) = trace ("--setLocal--" ++ show localIdx) stackPop (ceStack cEx) + let newLocals = setLocalWithId 0 (ceLocals cEx) value localIdx cEx { ceStack = newStack, ceLocals = newLocals } -execOpCode vm cEx _ = cEx +execOpCode vm cEx _ = trace ("not for: " ++ show (ceInstIdx cEx)) cEx execOpCodes :: VM -> [Instruction] -> CurrentExec execOpCodes vm [] = currentExec vm @@ -219,25 +254,23 @@ execOpCodes vm instructions | ceInstIdx cEx < 0 = throw $ WasmError "execOpCodes: bad index" | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx | otherwise = do - let newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) + let newCEx = trace ("currentOpCode: " ++ show (instructions !! ceInstIdx cEx)) execOpCode vm cEx (instructions !! ceInstIdx cEx) let newVm = vm { currentExec = (incrementInstIdx newCEx) } execOpCodes newVm instructions where cEx = currentExec vm execFunction :: VM -> VM execFunction vm = do - let newCEx = trace ("opcodes=" ++ show (ceInstructions (currentExec vm))) execOpCodes vm (ceInstructions (currentExec vm)) + let newCEx = trace ("exex: " ++ show (ceInstructions (currentExec vm))) execOpCodes vm (ceInstructions (currentExec vm)) vm { currentExec = newCEx, vmStack = (pushResults (vmStack vm) (ceStack newCEx) (ceResults newCEx)) } execFunctionWithIdx :: VM -> FuncIdx -> Stack -> VM execFunctionWithIdx vm funcIdx currentStack = do let function = getFunctionFromId funcIdx (functions (wasmModule vm)) let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) - let emptyLocals = createEmptyLocals [] (locals function) - let stack = trace ("newFunc") currentStack - let (newLocals, newStack) = initLocals (length (params funcTypee)) (params funcTypee) stack emptyLocals + let (newLocals, newStack) = initLocals (locals function) (params funcTypee) currentStack let cexec = CurrentExec { - ceLocals = newLocals, + ceLocals = trace ("ij" ++ show newLocals) newLocals, ceStack = newStack, ceInstructions = body function, ceInstIdx = 0, diff --git a/lvtrun/test/out.wasm b/lvtrun/test/out.wasm index 550ce5a9a0b9bbeecb4775813b197d281db70247..c9736277e4fded223ed4b1c211b72bc64f6002e3 100644 GIT binary patch delta 22 dcmX@ac!+U=77r&QYjH_pQ3(S#SNBA-9so(H27Lek delta 22 dcmX@ac!+U=77r^UYjH_pQ3(S#7uQ6y9soya1^55} From cafae16cf501f7b206d3802d16ae5bed3422826a Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 03:28:06 +0100 Subject: [PATCH 67/99] remove trace --- lvtrun/app/Parsing/Code.hs | 6 ++---- lvtrun/app/Parsing/Functions.hs | 2 -- lvtrun/app/Parsing/Parser.hs | 2 -- lvtrun/app/Run/Start.hs | 2 -- lvtrun/app/Run/Vm.hs | 30 ++++++++++++++---------------- 5 files changed, 16 insertions(+), 26 deletions(-) diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/app/Parsing/Code.hs index 793d406..b91a7a7 100644 --- a/lvtrun/app/Parsing/Code.hs +++ b/lvtrun/app/Parsing/Code.hs @@ -22,8 +22,6 @@ import Leb128 import Types import Errors -import Debug.Trace - -- GET LOCALS diviseBytes :: BSL.ByteString -> [BSL.ByteString] @@ -101,7 +99,7 @@ extractOpCode bytes | (head $ BSL.unpack bytes) == 0x47 = ([0x47], 1, BSL.drop 1 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) - | otherwise = trace ("extractOpCode: " ++ showBytes bytes) throw $ WasmError "ExtractOpCode2: bad opcode" + | otherwise = throw $ WasmError "ExtractOpCode2: bad opcode" createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) createInstruction [0x03] bytes = (Nop, bytes) @@ -180,7 +178,7 @@ createInstruction [0x21] bytes = do (SetLocal value, rest) createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) -createInstruction opCode _ = trace ("createInstruction: " ++ show opCode) throw $ WasmError "createInstruction: bad instruction" +createInstruction opCode _ = throw $ WasmError "createInstruction: bad instruction" parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) parseInstruction bytes diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/app/Parsing/Functions.hs index a118865..efd0429 100644 --- a/lvtrun/app/Parsing/Functions.hs +++ b/lvtrun/app/Parsing/Functions.hs @@ -20,8 +20,6 @@ import Types import Errors import Leb128 -import Debug.Trace - parseFunctionsIndex :: Int32 -> Int64 -> BSL.ByteString -> [Function] parseFunctionsIndex idx maxIdx content | idx > (fromIntegral maxIdx) = [] diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs index 41021ba..b5e067b 100644 --- a/lvtrun/app/Parsing/Parser.hs +++ b/lvtrun/app/Parsing/Parser.hs @@ -21,8 +21,6 @@ import Parsing.Exports import Parsing.Functions import Parsing.Code -import Debug.Trace - parseModule :: FileContent -> WasmModule parseModule bytes = do let sections = getSections bytes diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index eb29556..91fb24a 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -19,7 +19,5 @@ import Errors import Run.Vm import Run.Functions -import Debug.Trace - start :: WasmModule -> IO () start wasmMod = startExecution (createVm wasmMod) (getStartFunctionId (exports wasmMod)) diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index 69c049c..50dcb6f 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -22,8 +22,6 @@ import Types import Errors import Run.Functions -import Debug.Trace - data Value = I_32 Int32 | I_64 Int64 @@ -205,22 +203,22 @@ incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } --------------------------- execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec -execOpCode vm cEx (I32Const val) = trace ("--i32const--" ++ show val) cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } -execOpCode vm cEx (Block _) = trace "--block--" addLabel cEx { crBlockIndents = (crBlockIndents cEx) + 1 } +execOpCode vm cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } +execOpCode vm cEx (Block _) = cEx { crBlockIndents = (crBlockIndents cEx) + 1 } execOpCode vm cEx (I32Eqz) = do - let value = trace "--i32eqz--" stackTop (ceStack cEx) + let value = stackTop (ceStack cEx) case value of I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } _ -> throw $ WasmError "exec I32eqz: bad type" execOpCode vm cEx (I32Add) = do - let (value2, newStack1) = trace "--i32add--" stackPop (ceStack cEx) + let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } _ -> throw $ WasmError "exec I32Add: bad type" execOpCode vm cEx (I32Sub) = do - let (value2, newStack1) = trace "--i32sub--" stackPop (ceStack cEx) + let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } @@ -232,20 +230,20 @@ execOpCode vm cEx (BrIf labelIdx) = do I_32 _ -> cEx { ceStack = newStack, ceInstIdx = (fromIntegral labelIdx) } _ -> throw $ WasmError "exec brIf: bad type" execOpCode vm cEx (Call funcIdx) = do - let newVm = trace ("--call--" ++ show funcIdx) execFunctionWithIdx vm funcIdx (ceStack cEx) + let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) cEx { ceStack = newStack } -execOpCode vm cEx (End) = trace "--end--" cEx { crBlockIndents = (crBlockIndents cEx) - 1 } -execOpCode vm cEx (Return) = trace "--end--" cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode vm cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode vm cEx (Return) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } execOpCode vm cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" execOpCode vm cEx (GetLocal localIdx) = do - let value = trace ("--getLocal--" ++ show localIdx) getLocalFromId cEx localIdx + let value = getLocalFromId cEx localIdx cEx { ceStack = stackPush (ceStack cEx) value } execOpCode vm cEx (SetLocal localIdx) = do - let (value, newStack) = trace ("--setLocal--" ++ show localIdx) stackPop (ceStack cEx) + let (value, newStack) = stackPop (ceStack cEx) let newLocals = setLocalWithId 0 (ceLocals cEx) value localIdx cEx { ceStack = newStack, ceLocals = newLocals } -execOpCode vm cEx _ = trace ("not for: " ++ show (ceInstIdx cEx)) cEx +execOpCode vm cEx _ = cEx execOpCodes :: VM -> [Instruction] -> CurrentExec execOpCodes vm [] = currentExec vm @@ -254,14 +252,14 @@ execOpCodes vm instructions | ceInstIdx cEx < 0 = throw $ WasmError "execOpCodes: bad index" | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx | otherwise = do - let newCEx = trace ("currentOpCode: " ++ show (instructions !! ceInstIdx cEx)) execOpCode vm cEx (instructions !! ceInstIdx cEx) + let newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) let newVm = vm { currentExec = (incrementInstIdx newCEx) } execOpCodes newVm instructions where cEx = currentExec vm execFunction :: VM -> VM execFunction vm = do - let newCEx = trace ("exex: " ++ show (ceInstructions (currentExec vm))) execOpCodes vm (ceInstructions (currentExec vm)) + let newCEx = execOpCodes vm (ceInstructions (currentExec vm)) vm { currentExec = newCEx, vmStack = (pushResults (vmStack vm) (ceStack newCEx) (ceResults newCEx)) } execFunctionWithIdx :: VM -> FuncIdx -> Stack -> VM @@ -270,7 +268,7 @@ execFunctionWithIdx vm funcIdx currentStack = do let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) let (newLocals, newStack) = initLocals (locals function) (params funcTypee) currentStack let cexec = CurrentExec { - ceLocals = trace ("ij" ++ show newLocals) newLocals, + ceLocals = newLocals, ceStack = newStack, ceInstructions = body function, ceInstIdx = 0, From 00db589fc6731be1bc7b873015668041b46a4b1a Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 04:03:42 +0100 Subject: [PATCH 68/99] add better main --- lvtrun/app/Errors.hs | 15 ++-- lvtrun/app/Leb128.hs | 19 +++-- lvtrun/app/Loader.hs | 19 ++++- lvtrun/app/Main.hs | 8 +-- lvtrun/app/Run/Locals.hs | 83 ++++++++++++++++++++++ lvtrun/app/Run/Stack.hs | 60 ++++++++++++++++ lvtrun/app/Run/Start.hs | 10 +-- lvtrun/app/Run/Vm.hs | 148 +++------------------------------------ lvtrun/app/Types.hs | 10 ++- lvtrun/lvtrun.cabal | 2 + 10 files changed, 206 insertions(+), 168 deletions(-) create mode 100644 lvtrun/app/Run/Locals.hs create mode 100644 lvtrun/app/Run/Stack.hs diff --git a/lvtrun/app/Errors.hs b/lvtrun/app/Errors.hs index 4586488..b86a40a 100644 --- a/lvtrun/app/Errors.hs +++ b/lvtrun/app/Errors.hs @@ -6,18 +6,19 @@ -} module Errors - ( - CustomException(..), - handleException - ) +( + CustomException(..), + handleException +) where import Control.Exception (Exception(..), SomeException, displayException) data CustomException = - ParseError String | - WasmError String | - RuntimeError String + ParseError String + | WasmError String + | RuntimeError String + | UsageError String deriving (Show, Eq) instance Exception CustomException diff --git a/lvtrun/app/Leb128.hs b/lvtrun/app/Leb128.hs index da83419..69e4400 100644 --- a/lvtrun/app/Leb128.hs +++ b/lvtrun/app/Leb128.hs @@ -6,11 +6,11 @@ -} module Leb128 - ( - getLEB128, - extractLEB128, - extractLEB1282, - ) +( + getLEB128, + extractLEB128, + extractLEB1282, +) where import Data.Binary.Get @@ -42,9 +42,8 @@ extractLEB128' = do --function that returns the value and the rest of the bytestring extractLEB128 :: BS.ByteString -> (Int64, BS.ByteString) extractLEB128 bytes = do - let (value, size) = runGet extractLEB128' bytes - (value, BS.drop size bytes) - + let (value, size) = runGet extractLEB128' bytes + (value, BS.drop size bytes) extractLEB1282' :: Get (Int32, Int64) extractLEB1282' = do @@ -58,5 +57,5 @@ extractLEB1282' = do extractLEB1282 :: BS.ByteString -> (Int32, BS.ByteString) extractLEB1282 bytes = do - let (value, size) = runGet extractLEB1282' bytes - (value, BS.drop size bytes) + let (value, size) = runGet extractLEB1282' bytes + (value, BS.drop size bytes) diff --git a/lvtrun/app/Loader.hs b/lvtrun/app/Loader.hs index cff277a..fe25ddd 100644 --- a/lvtrun/app/Loader.hs +++ b/lvtrun/app/Loader.hs @@ -11,10 +11,23 @@ module Loader ) where +import System.Environment (getArgs) +import Control.Exception (throw) + import Parsing.Parser import Types import IO +import Errors + +getFilePath :: IO String +getFilePath = do + args <- getArgs + case args of + [path] -> return path + _ -> throw $ UsageError "Usage: ./run " -loadModule :: String -> IO WasmModule -loadModule path = getFileContent path >>= \bytes -> - return $ parseModule bytes +loadModule :: IO WasmModule +loadModule = do + filePath <- getFilePath + getFileContent filePath >>= \bytes -> + return $ parseModule bytes diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index 8eeca28..a21b372 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -13,7 +13,7 @@ import Loader import Run.Start main :: IO () -main = try (loadModule "./test/out.wasm") >>= \result -> - case result of - Left err -> handleException err - Right wasmMod -> start wasmMod +main = try (startExecution =<< loadModule) >>= \result -> + case result of + Left err -> handleException err + Right _ -> return () diff --git a/lvtrun/app/Run/Locals.hs b/lvtrun/app/Run/Locals.hs new file mode 100644 index 0000000..930f1a3 --- /dev/null +++ b/lvtrun/app/Run/Locals.hs @@ -0,0 +1,83 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Locals +-} + +module Run.Locals +( + Locals, + getLocalFromId, + setLocalWithId, + initLocals, + createEmptyLocals +) +where + +import Data.Int (Int32, Int64) +import Data.Word (Word8) +import Control.Exception (throw) + +import Types +import Errors +import Run.Stack + +type Locals = [Value] + +getLocalFromId' :: Int32 -> LocalIdx -> Locals -> Value +getLocalFromId' _ _ [] = throw $ WasmError "getLocalFromId: bad id" +getLocalFromId' idx id (x:xs) + | idx > id = throw $ WasmError "getLocalFromId: bad id" + | idx == id = x + | otherwise = getLocalFromId' (idx + 1) id xs + +getLocalFromId :: Locals -> LocalIdx -> Value +getLocalFromId locals id = getLocalFromId' 0 id locals + +setLocalWithId :: Int32 -> Locals -> Value -> LocalIdx -> Locals +setLocalWithId _ [] _ _ = throw $ WasmError "setLocalWithId: bad id" +setLocalWithId idx (x:xs) value id + | idx > id = throw $ WasmError "setLocalWithId: bad id" + | idx == id = value : xs + | otherwise = x : setLocalWithId (idx + 1) xs value id + +--------------------------- + +initLocalsVar :: Locals -> [Local] -> Locals +initLocalsVar newLocals [] = newLocals +initLocalsVar newLocals ((Local _ I32):xs) = initLocalsVar (I_32 0 : newLocals) xs +initLocalsVar newLocals ((Local _ I64):xs) = initLocalsVar (I_64 0 : newLocals) xs +initLocalsVar newLocals ((Local _ F32):xs) = initLocalsVar (F_32 0 : newLocals) xs +initLocalsVar newLocals ((Local _ F64):xs) = initLocalsVar (F_64 0 : newLocals) xs + +createLocalsParams :: [TypeName] -> [Value] -> Locals +createLocalsParams [] [] = [] +createLocalsParams (I32:xs) (I_32 val:xs2) = (I_32 val : createLocalsParams xs xs2) +createLocalsParams (I64:xs) (I_64 val:xs2) = (I_64 val : createLocalsParams xs xs2) +createLocalsParams (F32:xs) (F_32 val:xs2) = (F_32 val : createLocalsParams xs xs2) +createLocalsParams (F64:xs) (F_64 val:xs2) = (F_64 val : createLocalsParams xs xs2) +createLocalsParams _ _ = throw $ WasmError "createLocalsParams: bad type" + +initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) +initLocalsParams [] stack = ([], stack) +initLocalsParams params stack + | length params > length stack = throw $ WasmError "initLocalsParam: bad nb" + | otherwise = do + let (values, newStack) = stackPopN stack (length params) + let reversedValues = reverse values + let newLocals = createLocalsParams params reversedValues + (newLocals, newStack) + +initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) +initLocals localVarTypes paramTypes stack = do + let (newLocals, newStack) = initLocalsParams paramTypes stack + let localsVar = initLocalsVar newLocals localVarTypes + (newLocals ++ localsVar, newStack) + +createEmptyLocals :: Locals -> [Local] -> Locals +createEmptyLocals newLocals [] = newLocals +createEmptyLocals newLocals ((Local _ I32):xs) = createEmptyLocals (I_32 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ I64):xs) = createEmptyLocals (I_64 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ F32):xs) = createEmptyLocals (F_32 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ F64):xs) = createEmptyLocals (F_64 0 : newLocals) xs diff --git a/lvtrun/app/Run/Stack.hs b/lvtrun/app/Run/Stack.hs new file mode 100644 index 0000000..325809f --- /dev/null +++ b/lvtrun/app/Run/Stack.hs @@ -0,0 +1,60 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Stack +-} + +module Run.Stack +( + Stack, + pushResults, + stackPush, + stackPop, + stackTop, + stackPopN +) +where + +import Control.Exception (throw) + +import Types +import Errors + +type Stack = [Value] + +pushResults :: Stack -> Stack -> [TypeName] -> Stack +pushResults stack1 stack2 [] = stack1 +pushResults stack1 stack2 ((I32):xs) = case stackTop stack2 of + I_32 val -> pushResults (stackPush stack1 (I_32 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 ((I64):xs) = case stackTop stack2 of + I_64 val -> pushResults (stackPush stack1 (I_64 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 ((F32):xs) = case stackTop stack2 of + F_32 val -> pushResults (stackPush stack1 (F_32 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 ((F64):xs) = case stackTop stack2 of + F_64 val -> pushResults (stackPush stack1 (F_64 val)) (tail stack2) xs + _ -> throw $ WasmError "pushResults: bad type" +pushResults stack1 stack2 _ = throw $ WasmError "pushResults: bad type" + +stackPush :: Stack -> Value -> Stack +stackPush stack value = value:stack + +stackPop :: Stack -> (Value, Stack) +stackPop [] = throw $ WasmError "stackPop: empty stack" +stackPop (x:xs) = (x, xs) + +stackTop :: Stack -> Value +stackTop [] = throw $ WasmError "stackTop: empty stack" +stackTop (x:xs) = x + +stackPopN :: Stack -> Int -> ([Value], Stack) +stackPopN stack 0 = ([], stack) +stackPopN stack n + | n > 0 = do + let (value, newStack) = stackPop stack + let (values, finalStack) = stackPopN newStack (n - 1) + (value : values, finalStack) + | otherwise = error "stackPopN: bad n" diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index 91fb24a..353a886 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -6,9 +6,9 @@ -} module Run.Start - ( - start - ) +( + startExecution +) where import Data.Int (Int32, Int64) @@ -19,5 +19,5 @@ import Errors import Run.Vm import Run.Functions -start :: WasmModule -> IO () -start wasmMod = startExecution (createVm wasmMod) (getStartFunctionId (exports wasmMod)) +startExecution :: WasmModule -> IO () +startExecution wasmMod = startExecution2 (createVm wasmMod) (getStartFunctionId (exports wasmMod)) diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index 50dcb6f..668e053 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -6,11 +6,11 @@ -} module Run.Vm - ( - VM(..), - startExecution, - createVm - ) +( + VM(..), + startExecution2, + createVm +) where import Data.Int (Int32, Int64) @@ -21,16 +21,8 @@ import System.Exit import Types import Errors import Run.Functions - -data Value = - I_32 Int32 - | I_64 Int64 - | F_32 Float - | F_64 Double - deriving (Show) - -type Stack = [Value] -type Locals = [Value] +import Run.Stack +import Run.Locals data CurrentExec = CurrentExec { ceLocals :: Locals, @@ -75,125 +67,6 @@ createVm wasmMod = VM { wasmModule = wasmMod } - ----------------------------- - -getLocalFromId' :: Int32 -> LocalIdx -> Locals -> Value -getLocalFromId' _ _ [] = throw $ WasmError "getLocalFromId: bad id" -getLocalFromId' idx id (x:xs) - | idx > id = throw $ WasmError "getLocalFromId: bad id" - | idx == id = x - | otherwise = getLocalFromId' (idx + 1) id xs - -getLocalFromId :: CurrentExec -> LocalIdx -> Value -getLocalFromId cEx id = getLocalFromId' 0 id (ceLocals cEx) - -setLocalWithId :: Int32 -> Locals -> Value -> LocalIdx -> Locals -setLocalWithId _ [] _ _ = throw $ WasmError "setLocalWithId: bad id" -setLocalWithId idx (x:xs) value id - | idx > id = throw $ WasmError "setLocalWithId: bad id" - | idx == id = value : xs - | otherwise = x : setLocalWithId (idx + 1) xs value id - --- pushResults StackToPushTo StackToPopFrom ResultTypes -pushResults :: Stack -> Stack -> [TypeName] -> Stack -pushResults stack1 stack2 [] = stack1 -pushResults stack1 stack2 ((I32):xs) = case stackTop stack2 of - I_32 val -> pushResults (stackPush stack1 (I_32 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 ((I64):xs) = case stackTop stack2 of - I_64 val -> pushResults (stackPush stack1 (I_64 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 ((F32):xs) = case stackTop stack2 of - F_32 val -> pushResults (stackPush stack1 (F_32 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 ((F64):xs) = case stackTop stack2 of - F_64 val -> pushResults (stackPush stack1 (F_64 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 _ = throw $ WasmError "pushResults: bad type" - -stackPush :: Stack -> Value -> Stack -stackPush stack value = value:stack - -stackPop :: Stack -> (Value, Stack) -stackPop [] = throw $ WasmError "stackPop: empty stack" -stackPop (x:xs) = (x, xs) - -stackTop :: Stack -> Value -stackTop [] = throw $ WasmError "stackTop: empty stack" -stackTop (x:xs) = x - -stackPopN :: Stack -> Int -> ([Value], Stack) -stackPopN stack 0 = ([], stack) -stackPopN stack n - | n > 0 = do - let (value, newStack) = stackPop stack - let (values, finalStack) = stackPopN newStack (n - 1) - (value : values, finalStack) - | otherwise = error "stackPopN: bad n" - ---------------------------- - -initLocalsVar :: Locals -> [Local] -> Locals -initLocalsVar newLocals [] = newLocals -initLocalsVar newLocals ((Local _ I32):xs) = initLocalsVar (I_32 0 : newLocals) xs -initLocalsVar newLocals ((Local _ I64):xs) = initLocalsVar (I_64 0 : newLocals) xs -initLocalsVar newLocals ((Local _ F32):xs) = initLocalsVar (F_32 0 : newLocals) xs -initLocalsVar newLocals ((Local _ F64):xs) = initLocalsVar (F_64 0 : newLocals) xs - -createLocalsParams :: [TypeName] -> [Value] -> Locals -createLocalsParams [] [] = [] -createLocalsParams (I32:xs) (I_32 val:xs2) = (I_32 val : createLocalsParams xs xs2) -createLocalsParams (I64:xs) (I_64 val:xs2) = (I_64 val : createLocalsParams xs xs2) -createLocalsParams (F32:xs) (F_32 val:xs2) = (F_32 val : createLocalsParams xs xs2) -createLocalsParams (F64:xs) (F_64 val:xs2) = (F_64 val : createLocalsParams xs xs2) -createLocalsParams _ _ = throw $ WasmError "createLocalsParams: bad type" - -initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) -initLocalsParams [] stack = ([], stack) -initLocalsParams params stack - | length params > length stack = throw $ WasmError "initLocalsParam: bad nb" - | otherwise = do - let (values, newStack) = stackPopN stack (length params) - let reversedValues = reverse values - let newLocals = createLocalsParams params reversedValues - (newLocals, newStack) - -initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) -initLocals localVarTypes paramTypes stack = do - let (newLocals, newStack) = initLocalsParams paramTypes stack - let localsVar = initLocalsVar newLocals localVarTypes - (newLocals ++ localsVar, newStack) - ---------------------------- - -createEmptyLocals :: Locals -> [Local] -> Locals -createEmptyLocals newLocals [] = newLocals -createEmptyLocals newLocals ((Local _ I32):xs) = createEmptyLocals (I_32 0 : newLocals) xs -createEmptyLocals newLocals ((Local _ I64):xs) = createEmptyLocals (I_64 0 : newLocals) xs -createEmptyLocals newLocals ((Local _ F32):xs) = createEmptyLocals (F_32 0 : newLocals) xs -createEmptyLocals newLocals ((Local _ F64):xs) = createEmptyLocals (F_64 0 : newLocals) xs - --- fillLocals :: [TypeName] -> [Value] -> Locals -> Locals --- fillLocals [] [] locals = locals --- fillLocals (I32:xs) (I_32 val:xs2) (_:locals) = (I_32 val : fillLocals xs xs2 locals) --- fillLocals (I64:xs) (I_64 val:xs2) (_:locals) = (I_64 val : fillLocals xs xs2 locals) --- fillLocals (F32:xs) (F_32 val:xs2) (_:locals) = (F_32 val : fillLocals xs xs2 locals) --- fillLocals (F64:xs) (F_64 val:xs2) (_:locals) = (F_64 val : fillLocals xs xs2 locals) --- fillLocals _ _ _ = throw $ WasmError "fillLocals: bad type" - --- initLocals :: Int -> [TypeName] -> Stack -> Locals -> (Locals, Stack) --- initLocals nb types stack locals --- | nb /= length types = throw $ WasmError "initLocals: bad nb" --- | nb > length stack = throw $ WasmError "initLocals: bad nb" --- | otherwise = do --- let (values, newStack) = stackPopN stack nb --- let reversedValues = reverse values --- let newLocals = fillLocals types reversedValues locals --- (newLocals, newStack) - ---------------------------- - addLabel :: CurrentExec -> CurrentExec addLabel cEx = cEx { ceLabels = (ceLabels cEx) ++ [ceInstIdx cEx] } @@ -237,7 +110,7 @@ execOpCode vm cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } execOpCode vm cEx (Return) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } execOpCode vm cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" execOpCode vm cEx (GetLocal localIdx) = do - let value = getLocalFromId cEx localIdx + let value = getLocalFromId (ceLocals cEx) localIdx cEx { ceStack = stackPush (ceStack cEx) value } execOpCode vm cEx (SetLocal localIdx) = do let (value, newStack) = stackPop (ceStack cEx) @@ -279,8 +152,8 @@ execFunctionWithIdx vm funcIdx currentStack = do } execFunction vm { currentExec = cexec } -startExecution :: VM -> FuncIdx -> IO () -startExecution vm funcIdx = do +startExecution2 :: VM -> FuncIdx -> IO () +startExecution2 vm funcIdx = do let function = getFunctionFromId funcIdx (functions (wasmModule vm)) let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) let cexec = CurrentExec { @@ -302,4 +175,3 @@ startExecution vm funcIdx = do I_32 val -> val _ -> 0 putStrLn $ "Exit correctly with code: " ++ show exitCode - exitWith $ ExitSuccess diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index c953268..e82eb49 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -38,7 +38,8 @@ module Types Memory(..), OpCode, Local(..), - BlockType(..) + BlockType(..), + Value(..) ) where import Data.Int (Int32, Int64) @@ -190,6 +191,13 @@ instance Show Instruction where -- Module section +data Value = + I_32 Int32 + | I_64 Int64 + | F_32 Float + | F_64 Double + deriving (Show) + data Local = Local { lcIdx :: LocalIdx, lcType :: TypeName diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 27e4c2b..883926e 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -56,6 +56,8 @@ executable lvtrun-exe Parsing.Parser Parsing.Sections Run.Functions + Run.Locals + Run.Stack Run.Start Run.Vm Types From e330c9159c114546f1f5caf6e1f1dab59b9cdbf4 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 04:14:34 +0100 Subject: [PATCH 69/99] rename leb128 func --- lvtrun/app/Leb128.hs | 45 ++++++++++++---------------- lvtrun/app/Parsing/Code.hs | 52 ++++++++++++++++----------------- lvtrun/app/Parsing/Exports.hs | 10 +++---- lvtrun/app/Parsing/FuncTypes.hs | 4 +-- lvtrun/app/Parsing/Functions.hs | 4 +-- lvtrun/app/Parsing/Global.hs | 36 +++++++++++------------ lvtrun/app/Parsing/Memory.hs | 10 +++---- lvtrun/app/Parsing/Sections.hs | 4 +-- 8 files changed, 78 insertions(+), 87 deletions(-) diff --git a/lvtrun/app/Leb128.hs b/lvtrun/app/Leb128.hs index 69e4400..fdbb51e 100644 --- a/lvtrun/app/Leb128.hs +++ b/lvtrun/app/Leb128.hs @@ -7,9 +7,8 @@ module Leb128 ( - getLEB128, - extractLEB128, - extractLEB1282, + getLEB128ToI64, + getLEB128ToI32, ) where @@ -18,44 +17,36 @@ import Data.Bits import Data.Int (Int64, Int32) import qualified Data.ByteString.Lazy as BS (ByteString, drop) -getLEB128 :: Get Int -getLEB128 = do - byte <- getWord8 - let value = fromIntegral (byte .&. 0x7F) - if byte `testBit` 7 - then do - next <- getLEB128 - return $ value .|. (next `shiftL` 7) - else - return value - -extractLEB128' :: Get (Int64, Int64) -extractLEB128' = do +--------------------- TO INT64 --------------------- + +getLEB128ToI64' :: Get (Int64, Int64) +getLEB128ToI64' = do byte <- getWord8 let value = fromIntegral (byte .&. 0x7F) case byte `testBit` 7 of True -> do - (next, size) <- extractLEB128' + (next, size) <- getLEB128ToI64' return (value .|. (next `shiftL` 7), size + 1) False -> return (value, 1) ---function that returns the value and the rest of the bytestring -extractLEB128 :: BS.ByteString -> (Int64, BS.ByteString) -extractLEB128 bytes = do - let (value, size) = runGet extractLEB128' bytes +getLEB128ToI64 :: BS.ByteString -> (Int64, BS.ByteString) +getLEB128ToI64 bytes = do + let (value, size) = runGet getLEB128ToI64' bytes (value, BS.drop size bytes) -extractLEB1282' :: Get (Int32, Int64) -extractLEB1282' = do +--------------------- TO INT32 --------------------- + +getLEB128ToI32' :: Get (Int32, Int64) +getLEB128ToI32' = do byte <- getWord8 let value = fromIntegral (byte .&. 0x7F) case byte `testBit` 7 of True -> do - (next, size) <- extractLEB1282' + (next, size) <- getLEB128ToI32' return (value .|. (next `shiftL` 7), size + 1) False -> return (value, 1) -extractLEB1282 :: BS.ByteString -> (Int32, BS.ByteString) -extractLEB1282 bytes = do - let (value, size) = runGet extractLEB1282' bytes +getLEB128ToI32 :: BS.ByteString -> (Int32, BS.ByteString) +getLEB128ToI32 bytes = do + let (value, size) = runGet getLEB128ToI32' bytes (value, BS.drop size bytes) diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/app/Parsing/Code.hs index b91a7a7..df63896 100644 --- a/lvtrun/app/Parsing/Code.hs +++ b/lvtrun/app/Parsing/Code.hs @@ -28,8 +28,8 @@ diviseBytes :: BSL.ByteString -> [BSL.ByteString] diviseBytes bytes | BSL.length bytes == 0 = [] | otherwise = do - let (size, rest) = extractLEB128 bytes - let (code, rest2) = BSL.splitAt (fromIntegral size) rest + let (size, rest) = getLEB128ToI64 bytes + let (code, rest2) = BSL.splitAt size rest code : diviseBytes rest2 createLocal :: LocalIdx -> TypeName -> Local @@ -39,9 +39,9 @@ extractLocal :: Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) extractLocal id bytes | BSL.length bytes == 0 = throw $ WasmError "extractLocal: bad section" | otherwise = do - let (nbOfThisType, rest) = extractLEB1282 bytes + let (nbOfThisType, rest) = getLEB128ToI64 bytes let typee = getTypeFromByte (head (BSL.unpack (BSL.take 1 rest))) - let locals = map (\x -> createLocal (fromIntegral id) typee) [0..(fromIntegral nbOfThisType - 1)] + let locals = map (\x -> createLocal (fromIntegral id) typee) [0..nbOfThisType - 1] (locals, BSL.drop 1 rest) extractLocals :: Int64 -> Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) @@ -125,56 +125,56 @@ createInstruction [0x4e] bytes = (I32Ges, bytes) createInstruction [0x4c] bytes = (I32Les, bytes) createInstruction [0x71] bytes = (I32And, bytes) createInstruction [0x0d] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (BrIf value, rest) createInstruction [0x0c] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (Br value, rest) createInstruction [0x22] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (LocalTee value, rest) createInstruction [0x10] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (Call value, rest) createInstruction [0x41] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (I32Const value, rest) createInstruction [0x42] bytes = do - let (value, rest) = extractLEB128 bytes + let (value, rest) = getLEB128ToI64 bytes (I64Const value, rest) createInstruction [0x43] bytes = do - let (value, rest) = extractLEB128 bytes + let (value, rest) = getLEB128ToI64 bytes (F32Const (fromIntegral value), rest) createInstruction [0x44] bytes = do - let (value, rest) = extractLEB128 bytes + let (value, rest) = getLEB128ToI64 bytes (F64Const (fromIntegral value), rest) createInstruction [0x28] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I32Load (MemArg offset align), rest2) createInstruction [0x29] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I64Load (MemArg offset align), rest2) createInstruction [0x36] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I32Store (MemArg offset align), rest2) createInstruction [0x37] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I64Store (MemArg offset align), rest2) createInstruction [0x20] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (GetLocal value, rest) createInstruction [0x24] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (SetGlobal value, rest) createInstruction [0x23] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (GetGlobal value, rest) createInstruction [0x21] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (SetLocal value, rest) createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) @@ -205,7 +205,7 @@ showBytes bytes = do parseFunction :: BSL.ByteString -> Function -> Function parseFunction bytes func = do - let (nbLocalsTypes, rest) = extractLEB128 bytes + let (nbLocalsTypes, rest) = getLEB128ToI64 bytes let (locals, rest2) = extractLocals 0 nbLocalsTypes rest func {locals = locals, body = extractCode rest2} @@ -217,7 +217,7 @@ parseFunctions (x:xs) (y:ys) = parseFunction x y : parseFunctions xs ys getFuncCode :: Section -> [Function] -> [Function] getFuncCode (Section CodeID _ content) functions = do - let (nbFunc, rest) = extractLEB128 content + let (nbFunc, rest) = getLEB128ToI64 content let funcCodes = diviseBytes rest if (fromIntegral nbFunc) /= length functions then throw $ WasmError "getFuncCode: bad section" diff --git a/lvtrun/app/Parsing/Exports.hs b/lvtrun/app/Parsing/Exports.hs index 85890fa..640aa2b 100644 --- a/lvtrun/app/Parsing/Exports.hs +++ b/lvtrun/app/Parsing/Exports.hs @@ -31,7 +31,7 @@ isExportValid 0x03 = True isExportValid _ = False getExportNb :: Bs.ByteString -> (Int64, Bs.ByteString) -getExportNb content = extractLEB128 content +getExportNb content = getLEB128ToI64 content word8ToString :: [Word8] -> String word8ToString = map (chr . fromIntegral) @@ -48,14 +48,14 @@ parseExports idx maxIdx content | idx >= (fromIntegral maxIdx) = [] | Bs.length content == 0 = [] | otherwise = do - let (nameLen, rest) = extractLEB128 content + let (nameLen, rest) = getLEB128ToI64 content when (nameLen == 0) (throw $ WasmError "parseExports: bad export") when (Bs.length rest == 0) (throw $ WasmError "parseExports: bad export") - let (name, rest2) = Bs.splitAt (fromIntegral nameLen) rest + let (name, rest2) = Bs.splitAt nameLen rest when (Bs.length rest2 == 0) (throw $ WasmError "parseExports: bad export") let exportType = head (Bs.unpack rest2) - let (exportValue, rest3) = extractLEB128 (Bs.drop 1 rest2) - let export = createExport (Bs.unpack name) exportType (fromIntegral exportValue) + let (exportValue, rest3) = getLEB128ToI32 (Bs.drop 1 rest2) + let export = createExport (Bs.unpack name) exportType exportValue export : parseExports (idx + 1) maxIdx rest3 printHex :: [Word8] -> String diff --git a/lvtrun/app/Parsing/FuncTypes.hs b/lvtrun/app/Parsing/FuncTypes.hs index a50b1e3..0ddf465 100644 --- a/lvtrun/app/Parsing/FuncTypes.hs +++ b/lvtrun/app/Parsing/FuncTypes.hs @@ -21,7 +21,7 @@ import Errors import Types getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) -getVectorSize content = extractLEB128 content +getVectorSize content = getLEB128ToI64 content extractTypes :: (Int64, Bs.ByteString) -> ([TypeName], Bs.ByteString) extractTypes (0, content) = ([], content) @@ -44,6 +44,6 @@ parseFuncTypes idx maxIdx content getFuncTypes :: Section -> [FuncType] getFuncTypes (Section TypeID _ content) = do - let (vecSize, rest) = extractLEB128 content + let (vecSize, rest) = getLEB128ToI64 content parseFuncTypes 0 vecSize rest getFuncTypes _ = throw $ WasmError "getFuncTypes: bad section" diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/app/Parsing/Functions.hs index efd0429..184c130 100644 --- a/lvtrun/app/Parsing/Functions.hs +++ b/lvtrun/app/Parsing/Functions.hs @@ -25,11 +25,11 @@ parseFunctionsIndex idx maxIdx content | idx > (fromIntegral maxIdx) = [] | BSL.length content == 0 = [] | otherwise = do - let (typeIdx, rest) = extractLEB1282 content + let (typeIdx, rest) = getLEB128ToI32 content Function {funcType = fromIntegral typeIdx, funcIdx = idx, body = []} : parseFunctionsIndex (idx + 1) maxIdx rest getFunctions :: Section -> [Function] getFunctions (Section FunctionID _ content) = do - let (vecSize, rest) = extractLEB128 content + let (vecSize, rest) = getLEB128ToI64 content parseFunctionsIndex 0 vecSize rest getFunctions _ = throw $ WasmError "getFunctions: bad section" diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/app/Parsing/Global.hs index 0a3fc7f..b28b820 100644 --- a/lvtrun/app/Parsing/Global.hs +++ b/lvtrun/app/Parsing/Global.hs @@ -69,47 +69,47 @@ createInstruction [0x4a] bytes = (I32Gts, bytes) createInstruction [0x46] bytes = (I32Eqz, bytes) createInstruction [0x47] bytes = (I32Ne, bytes) createInstruction [0x10] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (Call value, rest) createInstruction [0x41] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (I32Const value, rest) createInstruction [0x42] bytes = do - let (value, rest) = extractLEB128 bytes + let (value, rest) = getLEB128ToI64 bytes (I64Const value, rest) createInstruction [0x43] bytes = do - let (value, rest) = extractLEB128 bytes + let (value, rest) = getLEB128ToI64 bytes (F32Const (fromIntegral value), rest) createInstruction [0x44] bytes = do - let (value, rest) = extractLEB128 bytes + let (value, rest) = getLEB128ToI64 bytes (F64Const (fromIntegral value), rest) createInstruction [0x28] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I32Load (MemArg align offset), rest2) createInstruction [0x29] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I64Load (MemArg align offset), rest2) createInstruction [0x36] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I32Store (MemArg align offset), rest2) createInstruction [0x37] bytes = do - let (align, rest) = extractLEB1282 bytes - let (offset, rest2) = extractLEB1282 rest + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest (I64Store (MemArg align offset), rest2) createInstruction [0x20] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (GetLocal value, rest) createInstruction [0x24] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (SetGlobal value, rest) createInstruction [0x23] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (GetGlobal value, rest) createInstruction [0x21] bytes = do - let (value, rest) = extractLEB1282 bytes + let (value, rest) = getLEB128ToI32 bytes (SetLocal value, rest) createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) @@ -166,6 +166,6 @@ parseGlobals idx maxIdx content getGlobals :: Section -> [Global] getGlobals (Section GlobalID _ content) = do - let (vecSize, rest) = extractLEB128 content + let (vecSize, rest) = getLEB128ToI64 content parseGlobals 0 vecSize rest getGlobals _ = throw $ WasmError "getGlobals: bad section" diff --git a/lvtrun/app/Parsing/Memory.hs b/lvtrun/app/Parsing/Memory.hs index e567f10..5a42cc6 100644 --- a/lvtrun/app/Parsing/Memory.hs +++ b/lvtrun/app/Parsing/Memory.hs @@ -21,17 +21,17 @@ import Errors parseMinMax :: BS.ByteString -> Memory parseMinMax content | endBs /= BS.empty = throw $ WasmError "parseMinMax: bad memory section" - | otherwise = Limit {lMin = fromIntegral min, lMax = Just (fromIntegral max)} + | otherwise = Limit {lMin = min, lMax = Just max} where - (min, rest) = extractLEB128 content - (max, endBs) = extractLEB128 rest + (min, rest) = getLEB128ToI32 content + (max, endBs) = getLEB128ToI32 rest parseMin :: BS.ByteString -> Memory parseMin content | endBs /= BS.empty = throw $ WasmError "parseMin: bad memory section" - | otherwise = Limit {lMin = fromIntegral min, lMax = Nothing} + | otherwise = Limit {lMin = min, lMax = Nothing} where - (min, endBs) = extractLEB128 content + (min, endBs) = getLEB128ToI32 content parseMemory :: BS.ByteString -> Memory parseMemory content diff --git a/lvtrun/app/Parsing/Sections.hs b/lvtrun/app/Parsing/Sections.hs index d4ed7bc..b02daa5 100644 --- a/lvtrun/app/Parsing/Sections.hs +++ b/lvtrun/app/Parsing/Sections.hs @@ -43,8 +43,8 @@ getSectionId bytes = case head (BSL.unpack $ BSL.take 1 bytes) of extractSection :: BSL.ByteString -> (Section, BSL.ByteString) extractSection bytes = do let sectionId = getSectionId bytes - let (size, rest) = extractLEB128 (BSL.drop 1 bytes) - let (content, rest2) = BSL.splitAt (fromIntegral size) rest + let (size, rest) = getLEB128ToI64 (BSL.drop 1 bytes) + let (content, rest2) = BSL.splitAt size rest (Section sectionId (fromIntegral size) content, rest2) extractSections :: BSL.ByteString -> [Section] From 34cb9bdcd07580299fd034ce9adf428cbcaca743 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 05:27:25 +0100 Subject: [PATCH 70/99] clean code --- lvtrun/app/OpCodes.hs | 143 ++++++++++++++++++++++++++++++ lvtrun/app/Parsing/Code.hs | 149 ++------------------------------ lvtrun/app/Parsing/Exports.hs | 10 +-- lvtrun/app/Parsing/FuncTypes.hs | 19 ++-- lvtrun/app/Parsing/Functions.hs | 7 +- lvtrun/app/Parsing/Global.hs | 98 +-------------------- lvtrun/app/Parsing/Header.hs | 16 ++-- lvtrun/app/Parsing/Memory.hs | 15 ++-- lvtrun/app/Parsing/Parser.hs | 41 +++++---- lvtrun/app/Parsing/Sections.hs | 60 ++++++------- lvtrun/app/Run/Functions.hs | 19 ++-- lvtrun/app/Run/Locals.hs | 41 +++++---- lvtrun/app/Run/Stack.hs | 41 +++++---- lvtrun/app/Run/Start.hs | 14 +-- lvtrun/app/Run/Vm.hs | 44 ++++------ lvtrun/app/Types.hs | 46 +++------- lvtrun/lvtrun.cabal | 1 + 17 files changed, 331 insertions(+), 433 deletions(-) create mode 100644 lvtrun/app/OpCodes.hs diff --git a/lvtrun/app/OpCodes.hs b/lvtrun/app/OpCodes.hs new file mode 100644 index 0000000..8f35c18 --- /dev/null +++ b/lvtrun/app/OpCodes.hs @@ -0,0 +1,143 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- OpCodes +-} + +module OpCodes +( + extractOpCode, + createInstruction +) +where + +import qualified Data.ByteString.Lazy as BSL +import Control.Exception (throw) +import Data.Word (Word8) + +import Leb128 +import Types +import Errors + +extractOpCode :: BSL.ByteString -> ([Word8], BSL.ByteString) +extractOpCode bytes + | (head $ BSL.unpack bytes) == 0x03 = ([0x00], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x11 = ([0x00], BSL.drop 3 bytes) + | (head $ BSL.unpack bytes) == 0x00 = ([0x00], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0b = ([0x0b], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0d = ([0x0d], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0c = ([0x0c], BSL.drop 2 bytes) + | (head $ BSL.unpack bytes) == 0x02 = ([0x02], BSL.drop 2 bytes) + | (head $ BSL.unpack bytes) == 0x01 = ([0x01], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x0f = ([0x0f], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x10 = ([0x10], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x41 = ([0x41], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x42 = ([0x42], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6c = ([0x6c], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6d = ([0x6d], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x43 = ([0x43], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x44 = ([0x44], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x28 = ([0x28], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x29 = ([0x29], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x22 = ([0x22], BSL.drop 2 bytes) + | (head $ BSL.unpack bytes) == 0x36 = ([0x36], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x37 = ([0x37], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4b = ([0x4b], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x37 = ([0x37], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x20 = ([0x20], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4d = ([0x4d], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x21 = ([0x21], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x23 = ([0x23], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x24 = ([0x24], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x45 = ([0x45], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x46 = ([0x46], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x71 = ([0x00], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x48 = ([0x48], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4a = ([0x4a], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4c = ([0x4c], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x4e = ([0x4e], BSL.drop 1 bytes) + | (head $ BSL.unpack bytes) == 0x47 = ([0x47], BSL.drop 1 bytes) + | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], BSL.drop 2 bytes) + | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], BSL.drop 2 bytes) + | otherwise = throw $ WasmError "ExtractOpCode2: bad opcode" + +createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) +createInstruction [0x03] bytes = (Nop, bytes) +createInstruction [0x11] bytes = (Nop, bytes) +createInstruction [0x00] bytes = (Unreachable, bytes) +createInstruction [0x01] bytes = (Nop, bytes) +createInstruction [0x02] bytes = (Block EmptyType, bytes) +createInstruction [0x0b] bytes = (End, bytes) +createInstruction [0x48] bytes = (I32Lts, bytes) +createInstruction [0x0f] bytes = (Return, bytes) +createInstruction [0x4b] bytes = (I32Gtu, bytes) +createInstruction [0x6a] bytes = (I32Add, bytes) +createInstruction [0x6c] bytes = (I32Mul, bytes) +createInstruction [0x6d] bytes = (I32Divs, bytes) +createInstruction [0x47] bytes = (I32Ne, bytes) +createInstruction [0x6b] bytes = (I32Sub, bytes) +createInstruction [0x4a] bytes = (I32Gts, bytes) +createInstruction [0x46] bytes = (I32Eqz, bytes) +createInstruction [0x45] bytes = (I32Eqz, bytes) +createInstruction [0x4d] bytes = (I32Leu, bytes) +createInstruction [0x4e] bytes = (I32Ges, bytes) +createInstruction [0x4c] bytes = (I32Les, bytes) +createInstruction [0x71] bytes = (I32And, bytes) +createInstruction [0x0d] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (BrIf value, rest) +createInstruction [0x0c] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (Br value, rest) +createInstruction [0x22] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (LocalTee value, rest) +createInstruction [0x10] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (Call value, rest) +createInstruction [0x41] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (I32Const value, rest) +createInstruction [0x42] bytes = do + let (value, rest) = getLEB128ToI64 bytes + (I64Const value, rest) +createInstruction [0x43] bytes = do + let (value, rest) = getLEB128ToI64 bytes + (F32Const (fromIntegral value), rest) +createInstruction [0x44] bytes = do + let (value, rest) = getLEB128ToI64 bytes + (F64Const (fromIntegral value), rest) +createInstruction [0x28] bytes = do + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest + (I32Load (MemArg offset align), rest2) +createInstruction [0x29] bytes = do + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest + (I64Load (MemArg offset align), rest2) +createInstruction [0x36] bytes = do + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest + (I32Store (MemArg offset align), rest2) +createInstruction [0x37] bytes = do + let (align, rest) = getLEB128ToI32 bytes + let (offset, rest2) = getLEB128ToI32 rest + (I64Store (MemArg offset align), rest2) +createInstruction [0x20] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (GetLocal value, rest) +createInstruction [0x24] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (SetGlobal value, rest) +createInstruction [0x23] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (GetGlobal value, rest) +createInstruction [0x21] bytes = do + let (value, rest) = getLEB128ToI32 bytes + (SetLocal value, rest) +createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) +createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) +createInstruction _ _ = throw $ WasmError "createInstruction: bad instruction" diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/app/Parsing/Code.hs index df63896..d79411f 100644 --- a/lvtrun/app/Parsing/Code.hs +++ b/lvtrun/app/Parsing/Code.hs @@ -6,23 +6,19 @@ -} module Parsing.Code - ( - getFuncCode, - ) +( + getFuncCode, +) where import qualified Data.ByteString.Lazy as BSL import Control.Exception (throw) -import Control.Monad (when) -import Data.Word (Word8) -import Data.Int (Int64, Int32) -import Numeric (showHex) +import Data.Int (Int64) import Leb128 import Types import Errors - --- GET LOCALS +import OpCodes diviseBytes :: BSL.ByteString -> [BSL.ByteString] diviseBytes bytes @@ -55,136 +51,11 @@ extractLocals id idMax bytes ------------------------- -extractOpCode :: BSL.ByteString -> ([Word8], Int64, BSL.ByteString) -extractOpCode bytes - | (head $ BSL.unpack bytes) == 0x03 = ([0x00], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x11 = ([0x00], 1, BSL.drop 3 bytes) - - | (head $ BSL.unpack bytes) == 0x00 = ([0x00], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0b = ([0x0b], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0d = ([0x0d], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0c = ([0x0c], 1, BSL.drop 2 bytes) - | (head $ BSL.unpack bytes) == 0x02 = ([0x02], 1, BSL.drop 2 bytes) - - | (head $ BSL.unpack bytes) == 0x01 = ([0x01], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0f = ([0x0f], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x10 = ([0x10], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x41 = ([0x41], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x42 = ([0x42], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6c = ([0x6c], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6d = ([0x6d], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x43 = ([0x43], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x44 = ([0x44], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x28 = ([0x28], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x29 = ([0x29], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x22 = ([0x22], 1, BSL.drop 2 bytes) - | (head $ BSL.unpack bytes) == 0x36 = ([0x36], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4b = ([0x4b], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x20 = ([0x20], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4d = ([0x4d], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x21 = ([0x21], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x23 = ([0x23], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x24 = ([0x24], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x45 = ([0x45], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x46 = ([0x46], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x71 = ([0x00], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x48 = ([0x48], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4a = ([0x4a], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4c = ([0x4c], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4e = ([0x4e], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x47 = ([0x47], 1, BSL.drop 1 bytes) - | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) - | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) - | otherwise = throw $ WasmError "ExtractOpCode2: bad opcode" - -createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) -createInstruction [0x03] bytes = (Nop, bytes) -createInstruction [0x11] bytes = (Nop, bytes) - -createInstruction [0x00] bytes = (Unreachable, bytes) -createInstruction [0x01] bytes = (Nop, bytes) -createInstruction [0x02] bytes = (Block EmptyType, bytes) -createInstruction [0x0b] bytes = (End, bytes) -createInstruction [0x48] bytes = (I32Lts, bytes) -createInstruction [0x0f] bytes = (Return, bytes) -createInstruction [0x4b] bytes = (I32Gtu, bytes) -createInstruction [0x6a] bytes = (I32Add, bytes) -createInstruction [0x6c] bytes = (I32Mul, bytes) -createInstruction [0x6d] bytes = (I32Divs, bytes) -createInstruction [0x47] bytes = (I32Ne, bytes) -createInstruction [0x6b] bytes = (I32Sub, bytes) -createInstruction [0x4a] bytes = (I32Gts, bytes) -createInstruction [0x46] bytes = (I32Eqz, bytes) -createInstruction [0x45] bytes = (I32Eqz, bytes) -createInstruction [0x4d] bytes = (I32Leu, bytes) -createInstruction [0x4e] bytes = (I32Ges, bytes) -createInstruction [0x4c] bytes = (I32Les, bytes) -createInstruction [0x71] bytes = (I32And, bytes) -createInstruction [0x0d] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (BrIf value, rest) -createInstruction [0x0c] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (Br value, rest) -createInstruction [0x22] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (LocalTee value, rest) -createInstruction [0x10] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (Call value, rest) -createInstruction [0x41] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (I32Const value, rest) -createInstruction [0x42] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (I64Const value, rest) -createInstruction [0x43] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (F32Const (fromIntegral value), rest) -createInstruction [0x44] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (F64Const (fromIntegral value), rest) -createInstruction [0x28] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I32Load (MemArg offset align), rest2) -createInstruction [0x29] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I64Load (MemArg offset align), rest2) -createInstruction [0x36] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I32Store (MemArg offset align), rest2) -createInstruction [0x37] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I64Store (MemArg offset align), rest2) -createInstruction [0x20] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (GetLocal value, rest) -createInstruction [0x24] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (SetGlobal value, rest) -createInstruction [0x23] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (GetGlobal value, rest) -createInstruction [0x21] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (SetLocal value, rest) -createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) -createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) -createInstruction opCode _ = throw $ WasmError "createInstruction: bad instruction" - parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) parseInstruction bytes | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" | otherwise = do - let (opCode, nbParams, rest) = extractOpCode bytes + let (opCode, rest) = extractOpCode bytes let (instruction, rest2) = createInstruction opCode rest (instruction, rest2) @@ -195,14 +66,6 @@ extractCode bytes let (instruction, rest) = parseInstruction bytes instruction : extractCode rest ------------------------- - -showBytes :: BSL.ByteString -> String -showBytes bytes = do - let bytesList = BSL.unpack bytes - let hexList = map (\x -> showHex x " ") bytesList - foldl (\acc x -> acc ++ x) " " hexList - parseFunction :: BSL.ByteString -> Function -> Function parseFunction bytes func = do let (nbLocalsTypes, rest) = getLEB128ToI64 bytes diff --git a/lvtrun/app/Parsing/Exports.hs b/lvtrun/app/Parsing/Exports.hs index 640aa2b..ea4c375 100644 --- a/lvtrun/app/Parsing/Exports.hs +++ b/lvtrun/app/Parsing/Exports.hs @@ -6,9 +6,9 @@ -} module Parsing.Exports - ( - getExports - ) +( + getExports +) where import qualified Data.ByteString.Lazy as Bs @@ -58,10 +58,6 @@ parseExports idx maxIdx content let export = createExport (Bs.unpack name) exportType exportValue export : parseExports (idx + 1) maxIdx rest3 -printHex :: [Word8] -> String -printHex [] = [] -printHex (x:xs) = showHex x " " ++ printHex xs - getExports :: Section -> [Export] getExports (Section ExportID _ content) = do let (exprtsNb, rest) = getExportNb content diff --git a/lvtrun/app/Parsing/FuncTypes.hs b/lvtrun/app/Parsing/FuncTypes.hs index 0ddf465..18c69eb 100644 --- a/lvtrun/app/Parsing/FuncTypes.hs +++ b/lvtrun/app/Parsing/FuncTypes.hs @@ -6,19 +6,18 @@ -} module Parsing.FuncTypes - ( - getFuncTypes - ) +( + getFuncTypes +) where import qualified Data.ByteString.Lazy as Bs import Control.Exception (throw) import Data.Int (Int64, Int32) -import Data.Word (Word8) -import Leb128 -import Errors -import Types +import Leb128 (getLEB128ToI64) +import Errors (CustomException(..)) +import Types (TypeName(..), FuncType(..), Section(..), SectionID(..), getTypeFromByte) getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) getVectorSize content = getLEB128ToI64 content @@ -29,10 +28,10 @@ extractTypes (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : type where (types, rest) = extractTypes (idx - 1, Bs.drop 1 content) parseFuncType :: Int32 -> Bs.ByteString -> (FuncType, Bs.ByteString) -parseFuncType id content = do +parseFuncType id content = let (params, rest) = extractTypes (getVectorSize content) - let (results, rest2) = extractTypes (getVectorSize rest) - ((FuncType id params results), rest2) + (results, rest2) = extractTypes (getVectorSize rest) + in (FuncType id params results, rest2) parseFuncTypes :: Int32 -> Int64 -> Bs.ByteString -> [FuncType] parseFuncTypes idx maxIdx content diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/app/Parsing/Functions.hs index 184c130..beb429f 100644 --- a/lvtrun/app/Parsing/Functions.hs +++ b/lvtrun/app/Parsing/Functions.hs @@ -14,7 +14,6 @@ where import qualified Data.ByteString.Lazy as BSL import Control.Exception (throw) import Data.Int (Int64, Int32) -import Data.Word (Word8) import Types import Errors @@ -26,7 +25,11 @@ parseFunctionsIndex idx maxIdx content | BSL.length content == 0 = [] | otherwise = do let (typeIdx, rest) = getLEB128ToI32 content - Function {funcType = fromIntegral typeIdx, funcIdx = idx, body = []} : parseFunctionsIndex (idx + 1) maxIdx rest + Function { + funcType = fromIntegral typeIdx, + funcIdx = idx, + body = [] + } : parseFunctionsIndex (idx + 1) maxIdx rest getFunctions :: Section -> [Function] getFunctions (Section FunctionID _ content) = do diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/app/Parsing/Global.hs index b28b820..0d9cfe0 100644 --- a/lvtrun/app/Parsing/Global.hs +++ b/lvtrun/app/Parsing/Global.hs @@ -13,113 +13,19 @@ where import qualified Data.ByteString.Lazy as BSL import Control.Exception (throw) -import Control.Monad (when) import Data.Word (Word8) import Data.Int (Int64) import Leb128 import Types import Errors - -extractOpCode :: BSL.ByteString -> ([Word8], Int64, BSL.ByteString) -extractOpCode bytes - | (head $ BSL.unpack bytes) == 0x00 = ([0x00], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x01 = ([0x01], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0f = ([0x0f], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x10 = ([0x10], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x41 = ([0x41], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x42 = ([0x42], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x43 = ([0x43], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x44 = ([0x44], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x28 = ([0x28], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x29 = ([0x29], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x36 = ([0x36], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x37 = ([0x37], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x20 = ([0x20], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6c = ([0x6c], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6d = ([0x6d], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x21 = ([0x21], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x23 = ([0x23], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x24 = ([0x24], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x46 = ([0x46], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x48 = ([0x48], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4a = ([0x4a], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4c = ([0x4c], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4e = ([0x4e], 1, BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x47 = ([0x47], 1, BSL.drop 1 bytes) - | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], 2, BSL.drop 2 bytes) - | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], 2, BSL.drop 2 bytes) - | otherwise = throw $ WasmError "ExtractOpCode2: bad opcode" - -createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) -createInstruction [0x01] bytes = (Unreachable, bytes) -createInstruction [0x01] bytes = (Nop, bytes) -createInstruction [0x0f] bytes = (Return, bytes) -createInstruction [0x6a] bytes = (I32Add, bytes) -createInstruction [0x6b] bytes = (I32Sub, bytes) -createInstruction [0x48] bytes = (I32Lts, bytes) -createInstruction [0x6c] bytes = (I32Mul, bytes) -createInstruction [0x6d] bytes = (I32Divs, bytes) -createInstruction [0x4e] bytes = (I32Ges, bytes) -createInstruction [0x4c] bytes = (I32Les, bytes) -createInstruction [0x4a] bytes = (I32Gts, bytes) -createInstruction [0x46] bytes = (I32Eqz, bytes) -createInstruction [0x47] bytes = (I32Ne, bytes) -createInstruction [0x10] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (Call value, rest) -createInstruction [0x41] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (I32Const value, rest) -createInstruction [0x42] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (I64Const value, rest) -createInstruction [0x43] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (F32Const (fromIntegral value), rest) -createInstruction [0x44] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (F64Const (fromIntegral value), rest) -createInstruction [0x28] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I32Load (MemArg align offset), rest2) -createInstruction [0x29] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I64Load (MemArg align offset), rest2) -createInstruction [0x36] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I32Store (MemArg align offset), rest2) -createInstruction [0x37] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I64Store (MemArg align offset), rest2) -createInstruction [0x20] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (GetLocal value, rest) -createInstruction [0x24] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (SetGlobal value, rest) -createInstruction [0x23] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (GetGlobal value, rest) -createInstruction [0x21] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (SetLocal value, rest) -createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) -createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) -createInstruction _ _ = throw $ WasmError "CreateInstruction: bad instruction" +import OpCodes parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) parseInstruction bytes | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" | otherwise = do - let (opCode, nbParams, rest) = extractOpCode bytes + let (opCode, rest) = extractOpCode bytes let (instruction, rest2) = createInstruction opCode rest (instruction, rest2) diff --git a/lvtrun/app/Parsing/Header.hs b/lvtrun/app/Parsing/Header.hs index d6aeecc..15f1a63 100644 --- a/lvtrun/app/Parsing/Header.hs +++ b/lvtrun/app/Parsing/Header.hs @@ -6,18 +6,20 @@ -} module Parsing.Header - ( - getModHeader, - isHeaderValid - ) +( + getModHeader, + isHeaderValid +) where -import qualified Data.ByteString.Lazy as BSL (ByteString, take, drop, pack) +import qualified Data.ByteString.Lazy as BSL (take, drop, pack) -import Types +import Types (ModHeader(..), Section(..)) getModHeader :: Section -> ModHeader -getModHeader bytes = ModHeader (BSL.take 4 $ content bytes) (BSL.take 4 $ BSL.drop 4 $ content bytes) +getModHeader bytes = ModHeader + (BSL.take 4 $ content bytes) + (BSL.take 4 $ BSL.drop 4 $ content bytes) isHeaderValid :: ModHeader -> Bool isHeaderValid header = diff --git a/lvtrun/app/Parsing/Memory.hs b/lvtrun/app/Parsing/Memory.hs index 5a42cc6..455681f 100644 --- a/lvtrun/app/Parsing/Memory.hs +++ b/lvtrun/app/Parsing/Memory.hs @@ -6,17 +6,16 @@ -} module Parsing.Memory - ( - getMemories - ) where +( + getMemories +) where -import qualified Data.ByteString.Lazy as BS import Control.Exception (throw) -import Control.Monad (when) +import qualified Data.ByteString.Lazy as BS (ByteString, drop, unpack, empty) -import Leb128 import Types -import Errors +import Leb128 (getLEB128ToI32) +import Errors (CustomException(..)) parseMinMax :: BS.ByteString -> Memory parseMinMax content @@ -44,5 +43,3 @@ getMemories (Section MemoryID _ content) | head (BS.unpack content) == 0x01 = parseMemory (BS.drop 1 content) | otherwise = throw $ WasmError "getMemories: v1 allow 1 memory only" getMemories _ = throw $ WasmError "getMemories: bad memory section" - ---https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/app/Parsing/Parser.hs index b5e067b..bf0b226 100644 --- a/lvtrun/app/Parsing/Parser.hs +++ b/lvtrun/app/Parsing/Parser.hs @@ -12,23 +12,28 @@ module Parsing.Parser where import Types -import Parsing.Sections -import Parsing.Header -import Parsing.Memory -import Parsing.FuncTypes -import Parsing.Global -import Parsing.Exports -import Parsing.Functions -import Parsing.Code +import qualified Parsing.Header as PH +import qualified Parsing.FuncTypes as FT +import qualified Parsing.Functions as FN +import qualified Parsing.Memory as M +import qualified Parsing.Exports as E +import qualified Parsing.Sections as S +import qualified Parsing.Global as G +import qualified Parsing.Code as C parseModule :: FileContent -> WasmModule -parseModule bytes = do - let sections = getSections bytes - WasmModule (getModHeader (getSectionWithId sections CustomID)) - (getFuncTypes (getSectionWithId sections TypeID)) - [] - ((getFuncCode (getSectionWithId sections CodeID) (getFunctions (getSectionWithId sections FunctionID)))) - [] - (getMemories (getSectionWithId sections MemoryID)) - [] - (getExports (getSectionWithId sections ExportID)) +parseModule bytes = + WasmModule { + header = PH.getModHeader (S.getSectionWithId sections CustomID), + types = FT.getFuncTypes (S.getSectionWithId sections TypeID), + imports = [], + functions = C.getFuncCode codeSection funcs, + tables = [], + globals = G.getGlobals (S.getSectionWithId sections GlobalID), + memory = M.getMemories (S.getSectionWithId sections MemoryID), + exports = E.getExports (S.getSectionWithId sections ExportID) + } + where + sections = S.getSections bytes + codeSection = S.getSectionWithId sections CodeID + funcs = FN.getFunctions (S.getSectionWithId sections FunctionID) diff --git a/lvtrun/app/Parsing/Sections.hs b/lvtrun/app/Parsing/Sections.hs index b02daa5..9c333d4 100644 --- a/lvtrun/app/Parsing/Sections.hs +++ b/lvtrun/app/Parsing/Sections.hs @@ -12,12 +12,12 @@ module Parsing.Sections ) where -import qualified Data.ByteString.Lazy as BSL +import qualified Data.ByteString.Lazy as BSL (ByteString, length, unpack, take, drop, splitAt) import Control.Exception (throw) -import Types -import Errors -import Leb128 +import Types (FileContent, Section(..), SectionID(..)) +import Errors (CustomException(..)) +import Leb128 (getLEB128ToI64) extractHeader :: BSL.ByteString -> (Section, BSL.ByteString) extractHeader bytes @@ -26,39 +26,39 @@ extractHeader bytes getSectionId :: BSL.ByteString -> SectionID getSectionId bytes = case head (BSL.unpack $ BSL.take 1 bytes) of - 0 -> CustomID - 1 -> TypeID - 2 -> ImportID - 3 -> FunctionID - 4 -> TableID - 5 -> MemoryID - 6 -> GlobalID - 7 -> ExportID - 8 -> StartID - 9 -> ElementID - 10 -> CodeID - 11 -> DataID - _ -> throw (WasmError "Invalid section id") + 0 -> CustomID + 1 -> TypeID + 2 -> ImportID + 3 -> FunctionID + 4 -> TableID + 5 -> MemoryID + 6 -> GlobalID + 7 -> ExportID + 8 -> StartID + 9 -> ElementID + 10 -> CodeID + 11 -> DataID + _ -> throw (WasmError "Invalid section id") extractSection :: BSL.ByteString -> (Section, BSL.ByteString) -extractSection bytes = do - let sectionId = getSectionId bytes - let (size, rest) = getLEB128ToI64 (BSL.drop 1 bytes) - let (content, rest2) = BSL.splitAt size rest - (Section sectionId (fromIntegral size) content, rest2) +extractSection bytes = (Section sectionId (fromIntegral size) content, rest2) + where + sectionId = getSectionId bytes + (size, rest) = getLEB128ToI64 (BSL.drop 1 bytes) + (content, rest2) = BSL.splitAt size rest extractSections :: BSL.ByteString -> [Section] extractSections bytes - | BSL.null bytes = [] - | otherwise = do - let (section, rest) = extractSection bytes - section : extractSections rest + | BSL.length bytes == 0 = [] + | otherwise = section : extractSections rest + where + (section, rest) = extractSection bytes getSections :: FileContent -> [Section] -getSections bytes = do - let (header, rest) = extractHeader bytes - let sections = extractSections rest - header : sections +getSections bytes = header : sections + where + (header, rest) = extractHeader bytes + sections = extractSections rest getSectionWithId :: [Section] -> SectionID -> Section getSectionWithId [] _ = throw (WasmError "No section with this id") diff --git a/lvtrun/app/Run/Functions.hs b/lvtrun/app/Run/Functions.hs index ac52546..53631f4 100644 --- a/lvtrun/app/Run/Functions.hs +++ b/lvtrun/app/Run/Functions.hs @@ -6,12 +6,12 @@ -} module Run.Functions - ( - getStartFunctionId, - getFunctionFromId, - getStartFunction, - getFuncTypeFromId - ) +( + getStartFunctionId, + getFunctionFromId, + getStartFunction, + getFuncTypeFromId +) where import Data.Int (Int32) @@ -20,8 +20,6 @@ import Control.Exception (throw) import Types import Errors --------------------------------------- - getStartFunctionId :: [Export] -> Int32 getStartFunctionId [] = throw $ WasmError "No start function" getStartFunctionId (x:xs) @@ -30,10 +28,9 @@ getStartFunctionId (x:xs) ExportFunc idx -> idx _ -> throw $ WasmError "getStartFunctionId: bad export" | otherwise = getStartFunctionId xs -getStartFunctionId _ = throw $ WasmError "getStartFunctionId: bad export" getFunctionFromId :: Int32 -> [Function] -> Function -getFunctionFromId id [] = throw $ WasmError "getFunctionFromId: bad id" +getFunctionFromId _ [] = throw $ WasmError "getFunctionFromId: bad id" getFunctionFromId id (x:xs) | funcIdx x == id = x | otherwise = getFunctionFromId id xs @@ -43,7 +40,7 @@ getStartFunction exports functions = getFunctionFromId (getStartFunctionId exports) functions getFuncTypeFromId :: Int32 -> [FuncType] -> FuncType -getFuncTypeFromId id [] = throw $ WasmError "getFuncTypeFromId: bad id" +getFuncTypeFromId _ [] = throw $ WasmError "getFuncTypeFromId: bad id" getFuncTypeFromId id (x:xs) | typeId x == id = x | otherwise = getFuncTypeFromId id xs diff --git a/lvtrun/app/Run/Locals.hs b/lvtrun/app/Run/Locals.hs index 930f1a3..6b36957 100644 --- a/lvtrun/app/Run/Locals.hs +++ b/lvtrun/app/Run/Locals.hs @@ -15,8 +15,7 @@ module Run.Locals ) where -import Data.Int (Int32, Int64) -import Data.Word (Word8) +import Data.Int (Int32) import Control.Exception (throw) import Types @@ -42,21 +41,29 @@ setLocalWithId idx (x:xs) value id | idx == id = value : xs | otherwise = x : setLocalWithId (idx + 1) xs value id ---------------------------- +----------- INITIALISATION ---------------- initLocalsVar :: Locals -> [Local] -> Locals initLocalsVar newLocals [] = newLocals -initLocalsVar newLocals ((Local _ I32):xs) = initLocalsVar (I_32 0 : newLocals) xs -initLocalsVar newLocals ((Local _ I64):xs) = initLocalsVar (I_64 0 : newLocals) xs -initLocalsVar newLocals ((Local _ F32):xs) = initLocalsVar (F_32 0 : newLocals) xs -initLocalsVar newLocals ((Local _ F64):xs) = initLocalsVar (F_64 0 : newLocals) xs +initLocalsVar newLocals ((Local _ I32):xs) = + initLocalsVar (I_32 0 : newLocals) xs +initLocalsVar newLocals ((Local _ I64):xs) = + initLocalsVar (I_64 0 : newLocals) xs +initLocalsVar newLocals ((Local _ F32):xs) = + initLocalsVar (F_32 0 : newLocals) xs +initLocalsVar newLocals ((Local _ F64):xs) = + initLocalsVar (F_64 0 : newLocals) xs createLocalsParams :: [TypeName] -> [Value] -> Locals createLocalsParams [] [] = [] -createLocalsParams (I32:xs) (I_32 val:xs2) = (I_32 val : createLocalsParams xs xs2) -createLocalsParams (I64:xs) (I_64 val:xs2) = (I_64 val : createLocalsParams xs xs2) -createLocalsParams (F32:xs) (F_32 val:xs2) = (F_32 val : createLocalsParams xs xs2) -createLocalsParams (F64:xs) (F_64 val:xs2) = (F_64 val : createLocalsParams xs xs2) +createLocalsParams (I32:xs) (I_32 val:xs2) = + (I_32 val : createLocalsParams xs xs2) +createLocalsParams (I64:xs) (I_64 val:xs2) = + (I_64 val : createLocalsParams xs xs2) +createLocalsParams (F32:xs) (F_32 val:xs2) = + (F_32 val : createLocalsParams xs xs2) +createLocalsParams (F64:xs) (F_64 val:xs2) = + (F_64 val : createLocalsParams xs xs2) createLocalsParams _ _ = throw $ WasmError "createLocalsParams: bad type" initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) @@ -77,7 +84,11 @@ initLocals localVarTypes paramTypes stack = do createEmptyLocals :: Locals -> [Local] -> Locals createEmptyLocals newLocals [] = newLocals -createEmptyLocals newLocals ((Local _ I32):xs) = createEmptyLocals (I_32 0 : newLocals) xs -createEmptyLocals newLocals ((Local _ I64):xs) = createEmptyLocals (I_64 0 : newLocals) xs -createEmptyLocals newLocals ((Local _ F32):xs) = createEmptyLocals (F_32 0 : newLocals) xs -createEmptyLocals newLocals ((Local _ F64):xs) = createEmptyLocals (F_64 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ I32):xs) = + createEmptyLocals (I_32 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ I64):xs) = + createEmptyLocals (I_64 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ F32):xs) = + createEmptyLocals (F_32 0 : newLocals) xs +createEmptyLocals newLocals ((Local _ F64):xs) = + createEmptyLocals (F_64 0 : newLocals) xs diff --git a/lvtrun/app/Run/Stack.hs b/lvtrun/app/Run/Stack.hs index 325809f..f1a24c7 100644 --- a/lvtrun/app/Run/Stack.hs +++ b/lvtrun/app/Run/Stack.hs @@ -18,37 +18,40 @@ where import Control.Exception (throw) -import Types -import Errors +import Types (Value(..), TypeName(..)) +import Errors (CustomException(..)) type Stack = [Value] pushResults :: Stack -> Stack -> [TypeName] -> Stack -pushResults stack1 stack2 [] = stack1 -pushResults stack1 stack2 ((I32):xs) = case stackTop stack2 of - I_32 val -> pushResults (stackPush stack1 (I_32 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 ((I64):xs) = case stackTop stack2 of - I_64 val -> pushResults (stackPush stack1 (I_64 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 ((F32):xs) = case stackTop stack2 of - F_32 val -> pushResults (stackPush stack1 (F_32 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 ((F64):xs) = case stackTop stack2 of - F_64 val -> pushResults (stackPush stack1 (F_64 val)) (tail stack2) xs - _ -> throw $ WasmError "pushResults: bad type" -pushResults stack1 stack2 _ = throw $ WasmError "pushResults: bad type" +pushResults toStack _ [] = toStack +pushResults toStack fromStack ((I32):xs) = + case stackTop fromStack of + I_32 val -> pushResults (stackPush toStack (I_32 val)) (tail fromStack) xs + _ -> throw $ RuntimeError "pushResults: bad type" +pushResults toStack fromStack ((I64):xs) = + case stackTop fromStack of + I_64 val -> pushResults (stackPush toStack (I_64 val)) (tail fromStack) xs + _ -> throw $ RuntimeError "pushResults: bad type" +pushResults toStack fromStack ((F32):xs) = + case stackTop fromStack of + F_32 val -> pushResults (stackPush toStack (F_32 val)) (tail fromStack) xs + _ -> throw $ RuntimeError "pushResults: bad type" +pushResults toStack fromStack ((F64):xs) = + case stackTop fromStack of + F_64 val -> pushResults (stackPush toStack (F_64 val)) (tail fromStack) xs + _ -> throw $ RuntimeError "pushResults: bad type" stackPush :: Stack -> Value -> Stack stackPush stack value = value:stack stackPop :: Stack -> (Value, Stack) -stackPop [] = throw $ WasmError "stackPop: empty stack" +stackPop [] = throw $ RuntimeError "stackPop: empty stack" stackPop (x:xs) = (x, xs) stackTop :: Stack -> Value -stackTop [] = throw $ WasmError "stackTop: empty stack" -stackTop (x:xs) = x +stackTop [] = throw $ RuntimeError "stackTop: empty stack" +stackTop (x:_) = x stackPopN :: Stack -> Int -> ([Value], Stack) stackPopN stack 0 = ([], stack) diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/app/Run/Start.hs index 353a886..c8b3271 100644 --- a/lvtrun/app/Run/Start.hs +++ b/lvtrun/app/Run/Start.hs @@ -11,13 +11,17 @@ module Run.Start ) where -import Data.Int (Int32, Int64) -import Control.Exception (throw) - import Types -import Errors import Run.Vm import Run.Functions +import Run.Stack + +exitCorrectly :: Stack -> IO () +exitCorrectly [] = putStrLn "Exit correctly with code: 0" +exitCorrectly (x:_) = putStrLn $ "Exit correctly with code: " ++ show x startExecution :: WasmModule -> IO () -startExecution wasmMod = startExecution2 (createVm wasmMod) (getStartFunctionId (exports wasmMod)) +startExecution wasmMod = exitCorrectly $ vmAtEnd + where + vmAtEnd = runMain (createVm wasmMod) startFuncId + startFuncId = getStartFunctionId (exports wasmMod) diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/app/Run/Vm.hs index 668e053..fec8863 100644 --- a/lvtrun/app/Run/Vm.hs +++ b/lvtrun/app/Run/Vm.hs @@ -8,15 +8,13 @@ module Run.Vm ( VM(..), - startExecution2, + runMain, createVm ) where -import Data.Int (Int32, Int64) import Data.Word (Word8) import Control.Exception (throw) -import System.Exit import Types import Errors @@ -67,36 +65,33 @@ createVm wasmMod = VM { wasmModule = wasmMod } -addLabel :: CurrentExec -> CurrentExec -addLabel cEx = cEx { ceLabels = (ceLabels cEx) ++ [ceInstIdx cEx] } - incrementInstIdx :: CurrentExec -> CurrentExec incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } --------------------------- execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec -execOpCode vm cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } -execOpCode vm cEx (Block _) = cEx { crBlockIndents = (crBlockIndents cEx) + 1 } -execOpCode vm cEx (I32Eqz) = do +execOpCode _ cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } +execOpCode _ cEx (Block _) = cEx { crBlockIndents = (crBlockIndents cEx) + 1 } +execOpCode _ cEx (I32Eqz) = do let value = stackTop (ceStack cEx) case value of I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } _ -> throw $ WasmError "exec I32eqz: bad type" -execOpCode vm cEx (I32Add) = do +execOpCode _ cEx (I32Add) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } _ -> throw $ WasmError "exec I32Add: bad type" -execOpCode vm cEx (I32Sub) = do +execOpCode _ cEx (I32Sub) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } _ -> throw $ WasmError "exec I32Sub: bad type" -execOpCode vm cEx (BrIf labelIdx) = do +execOpCode _ cEx (BrIf labelIdx) = do let (value, newStack) = stackPop (ceStack cEx) case value of I_32 0 -> cEx @@ -106,17 +101,17 @@ execOpCode vm cEx (Call funcIdx) = do let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) cEx { ceStack = newStack } -execOpCode vm cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } -execOpCode vm cEx (Return) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } -execOpCode vm cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" -execOpCode vm cEx (GetLocal localIdx) = do +execOpCode _ cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode _ cEx (Return) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } +execOpCode _ cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" +execOpCode _ cEx (GetLocal localIdx) = do let value = getLocalFromId (ceLocals cEx) localIdx cEx { ceStack = stackPush (ceStack cEx) value } -execOpCode vm cEx (SetLocal localIdx) = do +execOpCode _ cEx (SetLocal localIdx) = do let (value, newStack) = stackPop (ceStack cEx) let newLocals = setLocalWithId 0 (ceLocals cEx) value localIdx cEx { ceStack = newStack, ceLocals = newLocals } -execOpCode vm cEx _ = cEx +execOpCode _ cEx _ = cEx execOpCodes :: VM -> [Instruction] -> CurrentExec execOpCodes vm [] = currentExec vm @@ -152,8 +147,8 @@ execFunctionWithIdx vm funcIdx currentStack = do } execFunction vm { currentExec = cexec } -startExecution2 :: VM -> FuncIdx -> IO () -startExecution2 vm funcIdx = do +runMain :: VM -> FuncIdx -> Stack +runMain vm funcIdx = do let function = getFunctionFromId funcIdx (functions (wasmModule vm)) let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) let cexec = CurrentExec { @@ -167,11 +162,4 @@ startExecution2 vm funcIdx = do crBlockIndents = 0 } let newVm = execFunction vm { currentExec = cexec } - let resStack = [] - let res = pushResults resStack (vmStack newVm) (ceResults (currentExec newVm)) - let exitCode = case res of - [] -> 0 - (x:xs) -> case x of - I_32 val -> val - _ -> 0 - putStrLn $ "Exit correctly with code: " ++ show exitCode + pushResults [] (vmStack newVm) (ceResults (currentExec newVm)) diff --git a/lvtrun/app/Types.hs b/lvtrun/app/Types.hs index e82eb49..f1daba1 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/app/Types.hs @@ -44,7 +44,6 @@ module Types import Data.Int (Int32, Int64) import Data.Word (Word8) -import Numeric (showHex) import Control.Exception (throw) import qualified Data.ByteString.Lazy as BSL @@ -187,7 +186,6 @@ instance Show Instruction where show (Br idx) = "\n\t\t\t\tbr " ++ (show idx) show End = "\n\t\t\t\tend" show (Block blockType) = "\n\t\t\t\tblock " ++ (show blockType) - show _ = throw $ WasmError "Show Instruction: bad instruction" -- Module section @@ -196,25 +194,24 @@ data Value = | I_64 Int64 | F_32 Float | F_64 Double - deriving (Show) + deriving (Eq) + +instance Show Value where + show (I_32 val) = show val + show (I_64 val) = show val + show (F_32 val) = show val + show (F_64 val) = show val data Local = Local { lcIdx :: LocalIdx, lcType :: TypeName -} - -instance Show Local where - show local = "\n\t\t(local idx:" ++ (show $ lcIdx local) ++ " type:" ++ (show $ lcType local) ++ ")" +} deriving (Show) data FuncType = FuncType { typeId :: TypeIdx, params :: [TypeName], results :: [TypeName] -} - -instance Show FuncType where - show funcType = "\n\t(type " ++ (show $ typeId funcType) ++ " (func " ++ - (show $ params funcType) ++ ") " ++ (show $ results funcType) ++ ")" +} deriving (Show) data Import = Import { mod :: String, @@ -232,10 +229,7 @@ data Function = Function { funcIdx :: FuncIdx, locals :: [Local], body :: [Instruction] -} - -instance Show Function where - show func = "\n\t(func idx:" ++ (show $ funcIdx func) ++ " typeId:" ++ (show $ funcType func) ++ " " ++ (show $ locals func) ++ "\nIntructions:\n" ++ (show $ body func) ++ ")" +} deriving (Show) type Memory = Limit @@ -245,12 +239,7 @@ data Global = Global { globalType :: TypeName, mutability :: Mutability, initExpr :: [Instruction] -} - -instance Show Global where - show global = "\n\t(global " ++ (show $ globalType global) ++ " " ++ - (show $ mutability global) ++ " " ++ (show $ initExpr global) ++ ")" - +} deriving (Show) data ExportDesc = ExportFunc FuncIdx @@ -262,10 +251,7 @@ data ExportDesc = data Export = Export { expName :: String, expDesc :: ExportDesc -} - -instance Show Export where - show export = "\n\t(export \"" ++ (expName export) ++ "\" " ++ (show $ expDesc export) ++ ")" +} deriving (Show) data Table = Table { notImpl :: String @@ -297,13 +283,7 @@ data Section = Section { identifier :: SectionID, size :: Int, content :: BSL.ByteString -} - -instance Show Section where - show section = - "\nSection " ++ (show $ identifier section) ++ - " Size: " ++ (show $ size section) ++ - " Content: " ++ (concat $ map (\x -> showHex x " ") (BSL.unpack $ content section)) +} deriving (Show) data WasmModule = WasmModule { header :: ModHeader, diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index 883926e..d6f248e 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -46,6 +46,7 @@ executable lvtrun-exe IO Leb128 Loader + OpCodes Parsing.Code Parsing.Exports Parsing.Functions From 5587c49521d20b4a4ca0a80a9bee4ef076bb37b2 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 11:39:16 +0100 Subject: [PATCH 71/99] Add lexeme --- lvtc/lvtc.cabal | 2 ++ lvtc/src/Lexeme.hs | 80 +++++++++++++++++++++++++++++++++++++++++ lvtc/src/ParseLvt.hs | 70 ++++++++++-------------------------- lvtc/test/Spec.hs | 4 ++- lvtc/test/UTLexeme.hs | 52 +++++++++++++++++++++++++++ lvtc/test/UTParseLvt.hs | 7 ++-- 6 files changed, 159 insertions(+), 56 deletions(-) create mode 100644 lvtc/src/Lexeme.hs create mode 100644 lvtc/test/UTLexeme.hs diff --git a/lvtc/lvtc.cabal b/lvtc/lvtc.cabal index dc745fa..275f994 100644 --- a/lvtc/lvtc.cabal +++ b/lvtc/lvtc.cabal @@ -30,6 +30,7 @@ library Builtins Expression Leb128Encode + Lexeme Lib LvtLibVersion ParseLvt @@ -78,6 +79,7 @@ test-suite lvtc-test type: exitcode-stdio-1.0 main-is: Spec.hs other-modules: + UTLexeme UTParseLvt UTShuntingYard UTWasm diff --git a/lvtc/src/Lexeme.hs b/lvtc/src/Lexeme.hs new file mode 100644 index 0000000..f102d87 --- /dev/null +++ b/lvtc/src/Lexeme.hs @@ -0,0 +1,80 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- ParseLvt +-} + +module Lexeme +( + lexeme1 +) where + +replaceN :: Int -> String -> String +replaceN _ [] = [] +replaceN 0 ('"':xs) = '"' : replaceN 1 xs +replaceN 1 ('\\':'n':xs) = '\n' : replaceN 1 xs +replaceN 1 ('\\':'t':xs) = '\t' : replaceN 1 xs +replaceN 1 ('\\':'v':xs) = '\v' : replaceN 1 xs +replaceN 1 ('\\':'a':xs) = '\a' : replaceN 1 xs +replaceN 1 ('\\':'f':xs) = '\f' : replaceN 1 xs +replaceN 1 ('\\':'r':xs) = '\r' : replaceN 1 xs +replaceN 1 ('\\':x:xs) = '\\':x : replaceN 1 xs +replaceN 1 ('"':xs) = '"' : replaceN 0 xs +replaceN 0 ('\n':xs) = ' ' : replaceN 0 xs +replaceN n (x:xs) = x : replaceN n xs + +lexeme :: Int -> String -> String +lexeme _ [] = [] +lexeme 0 (' ':')':xs) = lexeme 0 (')':xs) +lexeme 0 (' ':'(':xs) = lexeme 0 ('(':xs) +lexeme 0 (' ':'}':xs) = lexeme 0 ('}':xs) +lexeme 0 (' ':'{':xs) = lexeme 0 ('{':xs) +lexeme 0 (' ':']':xs) = lexeme 0 (']':xs) +lexeme 0 (' ':'[':xs) = lexeme 0 ('[':xs) +lexeme 0 (' ':'+':xs) = lexeme 0 ('+':xs) +lexeme 0 (' ':'-':xs) = lexeme 0 ('-':xs) +lexeme 0 (' ':'*':xs) = lexeme 0 ('*':xs) +lexeme 0 (' ':'/':xs) = lexeme 0 ('/':xs) +lexeme 0 (' ':'<':xs) = lexeme 0 ('<':xs) +lexeme 0 (' ':'>':xs) = lexeme 0 ('>':xs) +lexeme 0 (' ':'=':xs) = lexeme 0 ('=':xs) +lexeme 0 (' ':'!':xs) = lexeme 0 ('!':xs) +lexeme 0 (' ':':':xs) = lexeme 0 (':':xs) +lexeme 0 (' ':',':xs) = lexeme 0 (',':xs) +lexeme 0 (' ':'@':xs) = lexeme 0 ('@':xs) +lexeme 0 (' ':';':xs) = lexeme 0 (';':xs) +lexeme 0 ('(':' ':xs) = lexeme 0 ('(':xs) +lexeme 0 (')':' ':xs) = lexeme 0 (')':xs) +lexeme 0 ('}':' ':xs) = lexeme 0 ('}':xs) +lexeme 0 ('{':' ':xs) = lexeme 0 ('{':xs) +lexeme 0 (']':' ':xs) = lexeme 0 (']':xs) +lexeme 0 ('[':' ':xs) = lexeme 0 ('[':xs) +lexeme 0 ('+':' ':xs) = lexeme 0 ('+':xs) +lexeme 0 ('-':' ':xs) = lexeme 0 ('-':xs) +lexeme 0 ('*':' ':xs) = lexeme 0 ('*':xs) +lexeme 0 ('/':' ':xs) = lexeme 0 ('/':xs) +lexeme 0 ('<':' ':xs) = lexeme 0 ('<':xs) +lexeme 0 ('>':' ':xs) = lexeme 0 ('>':xs) +lexeme 0 ('=':' ':xs) = lexeme 0 ('=':xs) +lexeme 0 ('!':' ':xs) = lexeme 0 ('!':xs) +lexeme 0 (':':' ':xs) = lexeme 0 (':':xs) +lexeme 0 (',':' ':xs) = lexeme 0 (',':xs) +lexeme 0 ('@':' ':xs) = lexeme 0 ('@':xs) +lexeme 0 (';':' ':xs) = lexeme 0 (';':xs) +lexeme 0 ('i':'f':' ':xs) = lexeme 0 ('i':'f':xs) +lexeme 0 (' ':'i':'f':xs) = lexeme 0 ('i':'f':xs) +lexeme 0 ('e':'l':'s':'e':' ':xs) = lexeme 0 ('e':'l':'s':'e':xs) +lexeme 0 (' ':'e':'l':'s':'e':xs) = lexeme 0 ('e':'l':'s':'e':xs) +lexeme 0 ('\\':x:xs) = x : lexeme 0 xs +lexeme 1 ('\\':x:xs) = x : lexeme 1 xs +lexeme 0 (' ':' ':xs) = lexeme 0 (' ':xs) +lexeme 1 ('"':xs) = '"' : lexeme 0 xs +lexeme 0 ('"':xs) = '"' : lexeme 1 xs +lexeme n (x:xs) = x : lexeme n xs + +stripLastSpaces :: String -> String +stripLastSpaces = reverse . dropWhile (== ' ') . reverse + +lexeme1 :: String -> String +lexeme1 str = stripLastSpaces $ lexeme 0 (replaceN 0 str) diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 50800e3..76628ee 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -35,28 +35,7 @@ import AST import Parser import ParseUtil import ShuntingYard - -lexeme :: String -> String -lexeme [] = [] -lexeme (',':' ':xs) = lexeme (',':xs) -lexeme ('\n':' ':xs) = lexeme ('\n':xs) -lexeme ('e':'l':'s':'e':' ':xs) = lexeme ("else" ++ xs) -lexeme ('i':'f':' ':xs) = lexeme ("if" ++ xs) -lexeme (' ':'(':xs) = lexeme ("(" ++ xs) -lexeme (' ':')':xs) = lexeme (")" ++ xs) -lexeme (' ':'+':xs) = lexeme ("+" ++ xs) -lexeme (' ':'-':xs) = lexeme ("-" ++ xs) -lexeme (' ':'*':xs) = lexeme ("*" ++ xs) -lexeme (' ':'/':xs) = lexeme ("/" ++ xs) -lexeme ('+':' ':xs) = lexeme ("+" ++ xs) -lexeme ('-':' ':xs) = lexeme ("-" ++ xs) -lexeme ('*':' ':xs) = lexeme ("*" ++ xs) -lexeme ('/':' ':xs) = lexeme ("/" ++ xs) -lexeme ('(':' ':xs) = lexeme ("(" ++ xs) -lexeme (')':' ':xs) = lexeme (")" ++ xs) -lexeme (':':' ':xs) = lexeme (":" ++ xs) -lexeme (' ':':':xs) = lexeme (":" ++ xs) -lexeme (x:xs) = x : lexeme xs +import Lexeme parseBoolean :: Parser Value parseBoolean = @@ -108,11 +87,7 @@ parseVoid = f <$> parseString "Void" f _ = Void parseOperatorFstVal :: Parser Value -parseOperatorFstVal = Parser f - where - f str = case runParser parseValueWithoutOperator str of - Nothing -> Nothing - Just (fstVal, xs) -> Just (fstVal, xs) +parseOperatorFstVal = parseValueWithoutOperator parseOperatorOp :: Parser Value parseOperatorOp = @@ -133,9 +108,7 @@ parseOperator' sys = parseOperatorTransformOne' :: [Value] -> Maybe [Value] parseOperatorTransformOne' (x1:x2:(Var op):rest) | isOperator op = Just (FuncValue (op, [x1, x2]) : rest) - | otherwise = case parseOperatorTransformOne rest of - Nothing -> Nothing - Just ys -> Just (x1:x2:ys) + | otherwise = (\ys -> x1:x2:ys) <$> parseOperatorTransformOne rest parseOperatorTransformOne' _ = Nothing parseOperatorTransformOne :: [Value] -> Maybe [Value] @@ -147,9 +120,7 @@ parseOperatorTransformOne (x1:(Var op):rest) | otherwise = parseOperatorTransformOne' (x1 : Var op : rest) parseOperatorTransformOne (x1:x2:(Var op):rest) = parseOperatorTransformOne' (x1 : x2 : Var op : rest) -parseOperatorTransformOne (x:xs) = case parseOperatorTransformOne xs of - Nothing -> Nothing - Just ys -> Just (x:ys) +parseOperatorTransformOne (x:xs) = (x :) <$> parseOperatorTransformOne xs parseOperatorTransform :: [Value] -> Maybe Value parseOperatorTransform [] = Nothing @@ -172,7 +143,7 @@ parseOperatorS sys = Parser f parseOperator :: Parser Value parseOperator = Parser f where - f str = case runParser (parseOperatorS (SYS [] [])) (lexeme str) of + f str = case runParser (parseOperatorS (SYS [] [])) str of Nothing -> Nothing Just (x, xs) -> pat (shuntingYardEnd x) xs pat (SYS _ vals) str = case parseOperatorTransform vals of @@ -263,7 +234,7 @@ parseDeclaration = Parser f parseAssignation :: Parser Instruction parseAssignation = Parser f where - f str = case runParser (parseVar <* parseString " = ") str of + f str = case runParser (parseVar <* parseString "=") str of Nothing -> Nothing Just (Var x, xs) -> case runParser parseValue xs of @@ -272,26 +243,26 @@ parseAssignation = Parser f _notVar -> Nothing parseCondComp :: Parser Value -parseCondComp = parseString "if(" *> parseValue <* parseString ")\n" +parseCondComp = parseString "if(" *> parseValue <* parseString ")" parseCondIf :: Parser [Instruction] -parseCondIf = parseString "{\n" *> parseInstructions <* parseString "}" +parseCondIf = parseString "{" *> parseInstructions <* parseString "}" parseCondElse :: Parser [Instruction] -parseCondElse = parseString "else\n{\n" *> parseInstructions <* parseString "}" +parseCondElse = parseString "else{" *> parseInstructions <* parseString "}" parseCond' :: Value -> [Instruction] -> Parser Instruction parseCond' val ifBlock = Parser f where - f ('\n':xs) = case runParser parseCondElse xs of + f (';':str) = Just (Cond (val, ifBlock, []), ';':str) + f str = case runParser parseCondElse str of Nothing -> Nothing Just (elseBlock, ys) -> Just (Cond (val, ifBlock, elseBlock), ys) - f str = Just (Cond (val, ifBlock, []), str) parseCond :: Parser Instruction parseCond = Parser f where - f str = case runParser parseCondComp (lexeme str) of + f str = case runParser parseCondComp str of Nothing -> Nothing Just (val, xs) -> case runParser parseCondIf xs of @@ -305,17 +276,15 @@ parseInstruction = <|> parseDeclaration <|> parseAssignation <|> parseFunction - ) <* parseString ";\n" + ) <* parseString ";" parseInstructions :: Parser [Instruction] -parseInstructions = Parser f - where - f str = runParser (some parseInstruction) (lexeme str) +parseInstructions = some parseInstruction parseFuncVar :: Parser Var parseFuncVar = Parser f where - f str = case runParser (parseVar <* parseString ":") (lexeme str) of + f str = case runParser (parseVar <* parseString ":") str of Nothing -> Nothing Just (Var x, xs) -> runParser (lmbda x <$> parseType) xs _notVar -> Nothing @@ -336,10 +305,7 @@ parseFuncName = <|> ((\x -> (False, x)) <$> (parseString "fn " *> parseVarName)) parseFuncType :: Parser Type -parseFuncType = - (parseString " -> " - <|> parseString "-> " - <|> parseString "->") *> parseType <* parseString "\n{\n" +parseFuncType = parseString "->" *> parseType <* parseString "{" parseFuncPrototype :: Parser FuncPrototype parseFuncPrototype = @@ -355,9 +321,9 @@ parseFuncDeclaration' = (,) <$> parseFuncPrototype <*> parseInstructions - <* parseString "};\n" + <* parseString "};" parseFuncDeclaration :: Parser FuncDeclaration parseFuncDeclaration = Parser f where - f str = runParser parseFuncDeclaration' (lexeme str) + f str = runParser parseFuncDeclaration' (lexeme1 str) diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 9d03222..9e5229b 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -17,6 +17,7 @@ import UTShuntingYard import UTWatLike import UTWat import UTWasm +import UTLexeme main :: IO () main = defaultMain tests @@ -31,7 +32,8 @@ tests = testGroup "Leviator Tests - Compiler" utAlias, utWatLike, utWat, - utWasm + utWasm, + utLexeme ] testParserHelper :: String -> String -> Expression -> IO () diff --git a/lvtc/test/UTLexeme.hs b/lvtc/test/UTLexeme.hs new file mode 100644 index 0000000..bce0c52 --- /dev/null +++ b/lvtc/test/UTLexeme.hs @@ -0,0 +1,52 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator compiler +-- File description: +-- UTLexeme +-} + +module UTLexeme +( + utLexeme +) where + +import Test.Tasty +import Test.Tasty.HUnit + +import Lexeme + +utLexeme :: TestTree +utLexeme = testGroup "UTLexeme" + [ + testCase "lexeme1" $ + assertEqual "1" + l1_rep + (lexeme1 l1) + , testCase "lexeme2" $ + assertEqual "2" + l2_rep + (lexeme1 l2) + , testCase "lexeme3" $ + assertEqual "3" + l3_rep + (lexeme1 l3) + , testCase "lexeme4" $ + assertEqual "4" + l4_rep + (lexeme1 l4) + , testCase "lexeme5" $ + assertEqual "5" + l5_rep + (lexeme1 l5) + ] + where + l1 = "@Int a = 0;" + l1_rep = "@Int a=0;" + l2 = "if (a > b) {\n do(b);\n}\n" + l2_rep = "if(a>b){do(b);}" + l3 = "if (a)\n{\nb(0);\n}\nelse\n{\nc(0);\n};\n" + l3_rep = "if(a){b(0);}else{c(0);};" + l4 = "@Int a = 0;\n @Int c = b(a);\n if (c)\n {\n d(a);\n };\n" + l4_rep = "@Int a=0;@Int c=b(a);if(c){d(a);};" + l5 = "foo(a);\n foo(b);\n" + l5_rep = "foo(a);foo(b);" diff --git a/lvtc/test/UTParseLvt.hs b/lvtc/test/UTParseLvt.hs index 4d2b596..d0cf211 100644 --- a/lvtc/test/UTParseLvt.hs +++ b/lvtc/test/UTParseLvt.hs @@ -14,25 +14,26 @@ import Test.Tasty.HUnit import Parser import ParseLvt +import Lexeme import AST testParserHelper :: String -> String -> Instruction -> IO () testParserHelper str restExpected expressionExpected = - case runParser parseInstruction str of + case runParser parseInstruction (lexeme1 str) of Just (parsed, rest) -> assertEqual str restExpected rest >> assertEqual str expressionExpected parsed Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") testParserFunc :: String -> String -> FuncDeclaration -> IO () testParserFunc str restExpected expressionExpected = - case runParser parseFuncDeclaration str of + case runParser parseFuncDeclaration (lexeme1 str) of Just (parsed, rest) -> assertEqual str restExpected rest >> assertEqual str expressionExpected parsed Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") testParserHelpers :: String -> String -> [Instruction] -> IO () testParserHelpers str restExpected expressionExpected = - case runParser parseInstructions str of + case runParser parseInstructions (lexeme1 str) of Just (parsed, rest) -> assertEqual str restExpected rest >> assertEqual str expressionExpected parsed Nothing -> assertFailure ("Parsing failed for: `" ++ str ++ "`") From b7c8d850a0583017a98fd6f19f4223af8b62c98d Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 12:13:19 +0100 Subject: [PATCH 72/99] Add BNF docs --- README.md | 6 +++++ docs/BNF.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ docs/SUMMARY.md | 1 + 3 files changed, 68 insertions(+) create mode 100644 docs/BNF.md diff --git a/README.md b/README.md index 4f63a75..472dd43 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,12 @@ // This is a comment ``` +- **Alias** + +``` +alias A = Int; +``` + - **Variables Declaration** ```hs diff --git a/docs/BNF.md b/docs/BNF.md new file mode 100644 index 0000000..1434673 --- /dev/null +++ b/docs/BNF.md @@ -0,0 +1,61 @@ +# Leviator BNF + +```bnf + ::= * + + ::= | | + + ::= "alias " " " ";\n" + ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | + "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | + "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | + "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | + "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | + "t" | "u" | "v" | "w" | "x" | "y" | "z" | "0" | "1" | + "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "_" | + "." | "-" | ":" | "!" | "@" | "#" | "$" | "%" | "^" | + "&" | "*" | "(" | ")" | "[" | "]" | "{" | "}" | "|" | + "\\" | "+" | "=" | ";" | "<" | ">" | "?" | "/" | "`" | + "~" + ::= + + ::= "//" * "\n" + + ::= "fn " "(" * ") -> " "\n{\n" * "}\n" + ::= + ::= "," + ::= ": " + ::= + ::= ";\n" + ::= | | | | + ::= "@" " " " = " + ::= " = " + ::= "(" * ")" + ::= "," + ::= "<- " + ::= | | + ::= | | | + ::= | + ::= + ::= "if (" ")\n{\n" * "}\n" + ::= "else\n{\n" * "}\n" + + ::= "'" "'" + ::= "True" | "False" + ::= "\"" * "\"" + + ::= | | + ::= | "" | " " | + ::= | | | + ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | + "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | + "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" + ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | + "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | + "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" + ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" + ::= "_" + ::= | "!" | "@" | "#" | "$" | "%" | "^" | "&" | + "*" | "(" | ")" | "[" | "]" | "{" | "}" | "|" | "\\" | + "+" | "=" | ";" | "<" | ">" | "?" | "/" | "`" | "~" +``` diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index e503371..66ef4de 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -7,3 +7,4 @@ made in Haskell. [Byte Code Spec](ByteCodeSpec.md) [Byte Code Spec Ex](ByteCodeSpecEx.md) [Syntax Highlighting Extension](SyntaxHighlighting.md) +[BNF](BNF.md) From c08082d9f630bad5b12eef62d1377c1b04c98f02 Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 13:35:33 +0100 Subject: [PATCH 73/99] move to lib --- lvtrun/app/Loader.hs | 6 +- lvtrun/app/OpCodes.hs | 143 ----------------------- lvtrun/lvtrun.cabal | 35 +++--- lvtrun/{app => src}/Errors.hs | 0 lvtrun/{app => src}/IO.hs | 0 lvtrun/{app => src}/Leb128.hs | 0 lvtrun/src/Lib.hs | 13 --- lvtrun/src/OpCodes.hs | 106 +++++++++++++++++ lvtrun/{app => src}/Parsing/Code.hs | 0 lvtrun/{app => src}/Parsing/Exports.hs | 0 lvtrun/{app => src}/Parsing/FuncTypes.hs | 0 lvtrun/{app => src}/Parsing/Functions.hs | 4 +- lvtrun/{app => src}/Parsing/Global.hs | 0 lvtrun/{app => src}/Parsing/Header.hs | 0 lvtrun/{app => src}/Parsing/Memory.hs | 0 lvtrun/{app => src}/Parsing/Parser.hs | 0 lvtrun/{app => src}/Parsing/Sections.hs | 0 lvtrun/{app => src}/Run/Functions.hs | 0 lvtrun/{app => src}/Run/Locals.hs | 0 lvtrun/{app => src}/Run/Stack.hs | 0 lvtrun/{app => src}/Run/Start.hs | 0 lvtrun/{app => src}/Run/Vm.hs | 0 lvtrun/{app => src}/Types.hs | 80 ++++++------- lvtrun/test/facotial.wasm | Bin 0 -> 197 bytes 24 files changed, 161 insertions(+), 226 deletions(-) delete mode 100644 lvtrun/app/OpCodes.hs rename lvtrun/{app => src}/Errors.hs (100%) rename lvtrun/{app => src}/IO.hs (100%) rename lvtrun/{app => src}/Leb128.hs (100%) delete mode 100644 lvtrun/src/Lib.hs create mode 100644 lvtrun/src/OpCodes.hs rename lvtrun/{app => src}/Parsing/Code.hs (100%) rename lvtrun/{app => src}/Parsing/Exports.hs (100%) rename lvtrun/{app => src}/Parsing/FuncTypes.hs (100%) rename lvtrun/{app => src}/Parsing/Functions.hs (92%) rename lvtrun/{app => src}/Parsing/Global.hs (100%) rename lvtrun/{app => src}/Parsing/Header.hs (100%) rename lvtrun/{app => src}/Parsing/Memory.hs (100%) rename lvtrun/{app => src}/Parsing/Parser.hs (100%) rename lvtrun/{app => src}/Parsing/Sections.hs (100%) rename lvtrun/{app => src}/Run/Functions.hs (100%) rename lvtrun/{app => src}/Run/Locals.hs (100%) rename lvtrun/{app => src}/Run/Stack.hs (100%) rename lvtrun/{app => src}/Run/Start.hs (100%) rename lvtrun/{app => src}/Run/Vm.hs (100%) rename lvtrun/{app => src}/Types.hs (93%) create mode 100644 lvtrun/test/facotial.wasm diff --git a/lvtrun/app/Loader.hs b/lvtrun/app/Loader.hs index fe25ddd..f3ae24d 100644 --- a/lvtrun/app/Loader.hs +++ b/lvtrun/app/Loader.hs @@ -20,14 +20,12 @@ import IO import Errors getFilePath :: IO String -getFilePath = do - args <- getArgs +getFilePath = getArgs >>= \args -> case args of [path] -> return path _ -> throw $ UsageError "Usage: ./run " loadModule :: IO WasmModule -loadModule = do - filePath <- getFilePath +loadModule = getFilePath >>= \filePath -> getFileContent filePath >>= \bytes -> return $ parseModule bytes diff --git a/lvtrun/app/OpCodes.hs b/lvtrun/app/OpCodes.hs deleted file mode 100644 index 8f35c18..0000000 --- a/lvtrun/app/OpCodes.hs +++ /dev/null @@ -1,143 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- OpCodes --} - -module OpCodes -( - extractOpCode, - createInstruction -) -where - -import qualified Data.ByteString.Lazy as BSL -import Control.Exception (throw) -import Data.Word (Word8) - -import Leb128 -import Types -import Errors - -extractOpCode :: BSL.ByteString -> ([Word8], BSL.ByteString) -extractOpCode bytes - | (head $ BSL.unpack bytes) == 0x03 = ([0x00], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x11 = ([0x00], BSL.drop 3 bytes) - | (head $ BSL.unpack bytes) == 0x00 = ([0x00], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0b = ([0x0b], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0d = ([0x0d], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0c = ([0x0c], BSL.drop 2 bytes) - | (head $ BSL.unpack bytes) == 0x02 = ([0x02], BSL.drop 2 bytes) - | (head $ BSL.unpack bytes) == 0x01 = ([0x01], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x0f = ([0x0f], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x10 = ([0x10], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x41 = ([0x41], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x42 = ([0x42], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6c = ([0x6c], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6d = ([0x6d], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x43 = ([0x43], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x44 = ([0x44], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x28 = ([0x28], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x29 = ([0x29], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x22 = ([0x22], BSL.drop 2 bytes) - | (head $ BSL.unpack bytes) == 0x36 = ([0x36], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x37 = ([0x37], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4b = ([0x4b], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x37 = ([0x37], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x20 = ([0x20], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4d = ([0x4d], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x21 = ([0x21], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x23 = ([0x23], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x24 = ([0x24], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6a = ([0x6a], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x6b = ([0x6b], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x45 = ([0x45], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x46 = ([0x46], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x71 = ([0x00], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x48 = ([0x48], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4a = ([0x4a], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4c = ([0x4c], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x4e = ([0x4e], BSL.drop 1 bytes) - | (head $ BSL.unpack bytes) == 0x47 = ([0x47], BSL.drop 1 bytes) - | (BSL.unpack $ BSL.take 2 bytes) == [0x3f, 0x00] = ([0x3f, 0x00], BSL.drop 2 bytes) - | (BSL.unpack $ BSL.take 2 bytes) == [0x40, 0x00] = ([0x40, 0x00], BSL.drop 2 bytes) - | otherwise = throw $ WasmError "ExtractOpCode2: bad opcode" - -createInstruction :: OpCode -> BSL.ByteString -> (Instruction, BSL.ByteString) -createInstruction [0x03] bytes = (Nop, bytes) -createInstruction [0x11] bytes = (Nop, bytes) -createInstruction [0x00] bytes = (Unreachable, bytes) -createInstruction [0x01] bytes = (Nop, bytes) -createInstruction [0x02] bytes = (Block EmptyType, bytes) -createInstruction [0x0b] bytes = (End, bytes) -createInstruction [0x48] bytes = (I32Lts, bytes) -createInstruction [0x0f] bytes = (Return, bytes) -createInstruction [0x4b] bytes = (I32Gtu, bytes) -createInstruction [0x6a] bytes = (I32Add, bytes) -createInstruction [0x6c] bytes = (I32Mul, bytes) -createInstruction [0x6d] bytes = (I32Divs, bytes) -createInstruction [0x47] bytes = (I32Ne, bytes) -createInstruction [0x6b] bytes = (I32Sub, bytes) -createInstruction [0x4a] bytes = (I32Gts, bytes) -createInstruction [0x46] bytes = (I32Eqz, bytes) -createInstruction [0x45] bytes = (I32Eqz, bytes) -createInstruction [0x4d] bytes = (I32Leu, bytes) -createInstruction [0x4e] bytes = (I32Ges, bytes) -createInstruction [0x4c] bytes = (I32Les, bytes) -createInstruction [0x71] bytes = (I32And, bytes) -createInstruction [0x0d] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (BrIf value, rest) -createInstruction [0x0c] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (Br value, rest) -createInstruction [0x22] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (LocalTee value, rest) -createInstruction [0x10] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (Call value, rest) -createInstruction [0x41] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (I32Const value, rest) -createInstruction [0x42] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (I64Const value, rest) -createInstruction [0x43] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (F32Const (fromIntegral value), rest) -createInstruction [0x44] bytes = do - let (value, rest) = getLEB128ToI64 bytes - (F64Const (fromIntegral value), rest) -createInstruction [0x28] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I32Load (MemArg offset align), rest2) -createInstruction [0x29] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I64Load (MemArg offset align), rest2) -createInstruction [0x36] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I32Store (MemArg offset align), rest2) -createInstruction [0x37] bytes = do - let (align, rest) = getLEB128ToI32 bytes - let (offset, rest2) = getLEB128ToI32 rest - (I64Store (MemArg offset align), rest2) -createInstruction [0x20] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (GetLocal value, rest) -createInstruction [0x24] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (SetGlobal value, rest) -createInstruction [0x23] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (GetGlobal value, rest) -createInstruction [0x21] bytes = do - let (value, rest) = getLEB128ToI32 bytes - (SetLocal value, rest) -createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) -createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) -createInstruction _ _ = throw $ WasmError "createInstruction: bad instruction" diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index d6f248e..f1377ba 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -25,27 +25,9 @@ source-repository head library exposed-modules: - Lib - other-modules: - Paths_lvtrun - autogen-modules: - Paths_lvtrun - hs-source-dirs: - src - ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints - build-depends: - base >=4.7 && <5 - , binary - , bytestring - default-language: Haskell2010 - -executable lvtrun-exe - main-is: Main.hs - other-modules: Errors IO Leb128 - Loader OpCodes Parsing.Code Parsing.Exports @@ -62,6 +44,23 @@ executable lvtrun-exe Run.Start Run.Vm Types + other-modules: + Paths_lvtrun + autogen-modules: + Paths_lvtrun + hs-source-dirs: + src + ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints + build-depends: + base >=4.7 && <5 + , binary + , bytestring + default-language: Haskell2010 + +executable lvtrun-exe + main-is: Main.hs + other-modules: + Loader Paths_lvtrun autogen-modules: Paths_lvtrun diff --git a/lvtrun/app/Errors.hs b/lvtrun/src/Errors.hs similarity index 100% rename from lvtrun/app/Errors.hs rename to lvtrun/src/Errors.hs diff --git a/lvtrun/app/IO.hs b/lvtrun/src/IO.hs similarity index 100% rename from lvtrun/app/IO.hs rename to lvtrun/src/IO.hs diff --git a/lvtrun/app/Leb128.hs b/lvtrun/src/Leb128.hs similarity index 100% rename from lvtrun/app/Leb128.hs rename to lvtrun/src/Leb128.hs diff --git a/lvtrun/src/Lib.hs b/lvtrun/src/Lib.hs deleted file mode 100644 index 3f12ee2..0000000 --- a/lvtrun/src/Lib.hs +++ /dev/null @@ -1,13 +0,0 @@ -{- --- EPITECH PROJECT, 2023 --- Leviator Run --- File description: --- Lib --} - -module Lib - ( someFunc - ) where - -someFunc :: IO () -someFunc = putStrLn "someFunc" diff --git a/lvtrun/src/OpCodes.hs b/lvtrun/src/OpCodes.hs new file mode 100644 index 0000000..ca85328 --- /dev/null +++ b/lvtrun/src/OpCodes.hs @@ -0,0 +1,106 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- OpCodes +-} + +module OpCodes +( + extractOpCode, + createInstruction +) +where + +import qualified Data.ByteString.Lazy as BSL +import Control.Exception (throw) +import Data.Word (Word8) + +import Leb128 +import Types +import Errors + +extractOpCode :: BSL.ByteString -> ([Word8], BSL.ByteString) +extractOpCode bytes = case BSL.unpack bytes of + 0x03 : rest -> ([0x03], BSL.pack rest) + 0x11 : rest -> ([0x11], BSL.pack rest) + 0x00 : rest -> ([0x00], BSL.pack rest) + 0x0b : rest -> ([0x0b], BSL.pack rest) + 0x0d : rest -> ([0x0d], BSL.pack rest) + 0x0c : rest -> ([0x0c], BSL.pack rest) + 0x02 : rest -> ([0x02], BSL.pack rest) + 0x01 : rest -> ([0x01], BSL.pack rest) + 0x0f : rest -> ([0x0f], BSL.pack rest) + 0x10 : rest -> ([0x10], BSL.pack rest) + 0x41 : rest -> ([0x41], BSL.pack rest) + 0x42 : rest -> ([0x42], BSL.pack rest) + 0x6c : rest -> ([0x6c], BSL.pack rest) + 0x6d : rest -> ([0x6d], BSL.pack rest) + 0x43 : rest -> ([0x43], BSL.pack rest) + 0x44 : rest -> ([0x44], BSL.pack rest) + 0x28 : rest -> ([0x28], BSL.pack rest) + 0x29 : rest -> ([0x29], BSL.pack rest) + 0x22 : rest -> ([0x22], BSL.pack rest) + 0x36 : rest -> ([0x36], BSL.pack rest) + 0x37 : rest -> ([0x37], BSL.pack rest) + 0x4b : rest -> ([0x4b], BSL.pack rest) + 0x20 : rest -> ([0x20], BSL.pack rest) + 0x4d : rest -> ([0x4d], BSL.pack rest) + 0x21 : rest -> ([0x21], BSL.pack rest) + 0x23 : rest -> ([0x23], BSL.pack rest) + 0x24 : rest -> ([0x24], BSL.pack rest) + 0x6a : rest -> ([0x6a], BSL.pack rest) + 0x6b : rest -> ([0x6b], BSL.pack rest) + 0x45 : rest -> ([0x45], BSL.pack rest) + 0x46 : rest -> ([0x46], BSL.pack rest) + 0x71 : rest -> ([0x00], BSL.pack rest) + 0x48 : rest -> ([0x48], BSL.pack rest) + 0x4a : rest -> ([0x4a], BSL.pack rest) + 0x4c : rest -> ([0x4c], BSL.pack rest) + 0x4e : rest -> ([0x4e], BSL.pack rest) + 0x47 : rest -> ([0x47], BSL.pack rest) + 0x3f : 0x00 : rest -> ([0x3f, 0x00], BSL.pack rest) + 0x40 : 0x00 : rest -> ([0x40, 0x00], BSL.pack rest) + _ -> throw $ WasmError "ExtractOpCode: bad opcode" + +createInstruction :: [Word8] -> BSL.ByteString -> (Instruction, BSL.ByteString) +createInstruction [0x03] bytes = (Nop, bytes) +createInstruction [0x11] bytes = (Nop, bytes) +createInstruction [0x00] bytes = (Unreachable, bytes) +createInstruction [0x01] bytes = (Nop, bytes) +createInstruction [0x02] bytes = (Block EmptyType, bytes) +createInstruction [0x0b] bytes = (End, bytes) +createInstruction [0x48] bytes = (I32Lts, bytes) +createInstruction [0x0f] bytes = (Return, bytes) +createInstruction [0x4b] bytes = (I32Gtu, bytes) +createInstruction [0x6a] bytes = (I32Add, bytes) +createInstruction [0x6c] bytes = (I32Mul, bytes) +createInstruction [0x6d] bytes = (I32Divs, bytes) +createInstruction [0x47] bytes = (I32Ne, bytes) +createInstruction [0x6b] bytes = (I32Sub, bytes) +createInstruction [0x4a] bytes = (I32Gts, bytes) +createInstruction [0x46] bytes = (I32Eqz, bytes) +createInstruction [0x45] bytes = (I32Eqz, bytes) +createInstruction [0x4d] bytes = (I32Leu, bytes) +createInstruction [0x4e] bytes = (I32Ges, bytes) +createInstruction [0x4c] bytes = (I32Les, bytes) +createInstruction [0x71] bytes = (I32And, bytes) +createInstruction [0x0d] bytes = (\(value, rest) -> (BrIf value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x0c] bytes = (\(value, rest) -> (Br value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x22] bytes = (\(value, rest) -> (LocalTee value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x10] bytes = (\(value, rest) -> (Call value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x41] bytes = (\(value, rest) -> (I32Const value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x42] bytes = (\(value, rest) -> (I64Const value, rest)) (getLEB128ToI64 bytes) +createInstruction [0x43] bytes = (\(value, rest) -> (F32Const (fromIntegral value), rest)) (getLEB128ToI32 bytes) +createInstruction [0x20] bytes = (\(value, rest) -> (GetLocal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x24] bytes = (\(value, rest) -> (SetGlobal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x23] bytes = (\(value, rest) -> (GetGlobal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x21] bytes = (\(value, rest) -> (SetLocal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x44] bytes = (\(value, rest) -> (F64Const (fromIntegral value), rest)) (getLEB128ToI64 bytes) +createInstruction [0x28] bytes = (\(align, rest) -> (\(offset, rest2) -> (I32Load (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x29] bytes = (\(align, rest) -> (\(offset, rest2) -> (I64Load (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x36] bytes = (\(align, rest) -> (\(offset, rest2) -> (I32Store (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x37] bytes = (\(align, rest) -> (\(offset, rest2) -> (I64Store (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) +createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) +createInstruction _ _ = throw $ WasmError "createInstruction: bad instruction" diff --git a/lvtrun/app/Parsing/Code.hs b/lvtrun/src/Parsing/Code.hs similarity index 100% rename from lvtrun/app/Parsing/Code.hs rename to lvtrun/src/Parsing/Code.hs diff --git a/lvtrun/app/Parsing/Exports.hs b/lvtrun/src/Parsing/Exports.hs similarity index 100% rename from lvtrun/app/Parsing/Exports.hs rename to lvtrun/src/Parsing/Exports.hs diff --git a/lvtrun/app/Parsing/FuncTypes.hs b/lvtrun/src/Parsing/FuncTypes.hs similarity index 100% rename from lvtrun/app/Parsing/FuncTypes.hs rename to lvtrun/src/Parsing/FuncTypes.hs diff --git a/lvtrun/app/Parsing/Functions.hs b/lvtrun/src/Parsing/Functions.hs similarity index 92% rename from lvtrun/app/Parsing/Functions.hs rename to lvtrun/src/Parsing/Functions.hs index beb429f..15fa49f 100644 --- a/lvtrun/app/Parsing/Functions.hs +++ b/lvtrun/src/Parsing/Functions.hs @@ -23,13 +23,13 @@ parseFunctionsIndex :: Int32 -> Int64 -> BSL.ByteString -> [Function] parseFunctionsIndex idx maxIdx content | idx > (fromIntegral maxIdx) = [] | BSL.length content == 0 = [] - | otherwise = do - let (typeIdx, rest) = getLEB128ToI32 content + | otherwise = Function { funcType = fromIntegral typeIdx, funcIdx = idx, body = [] } : parseFunctionsIndex (idx + 1) maxIdx rest + where (typeIdx, rest) = getLEB128ToI32 content getFunctions :: Section -> [Function] getFunctions (Section FunctionID _ content) = do diff --git a/lvtrun/app/Parsing/Global.hs b/lvtrun/src/Parsing/Global.hs similarity index 100% rename from lvtrun/app/Parsing/Global.hs rename to lvtrun/src/Parsing/Global.hs diff --git a/lvtrun/app/Parsing/Header.hs b/lvtrun/src/Parsing/Header.hs similarity index 100% rename from lvtrun/app/Parsing/Header.hs rename to lvtrun/src/Parsing/Header.hs diff --git a/lvtrun/app/Parsing/Memory.hs b/lvtrun/src/Parsing/Memory.hs similarity index 100% rename from lvtrun/app/Parsing/Memory.hs rename to lvtrun/src/Parsing/Memory.hs diff --git a/lvtrun/app/Parsing/Parser.hs b/lvtrun/src/Parsing/Parser.hs similarity index 100% rename from lvtrun/app/Parsing/Parser.hs rename to lvtrun/src/Parsing/Parser.hs diff --git a/lvtrun/app/Parsing/Sections.hs b/lvtrun/src/Parsing/Sections.hs similarity index 100% rename from lvtrun/app/Parsing/Sections.hs rename to lvtrun/src/Parsing/Sections.hs diff --git a/lvtrun/app/Run/Functions.hs b/lvtrun/src/Run/Functions.hs similarity index 100% rename from lvtrun/app/Run/Functions.hs rename to lvtrun/src/Run/Functions.hs diff --git a/lvtrun/app/Run/Locals.hs b/lvtrun/src/Run/Locals.hs similarity index 100% rename from lvtrun/app/Run/Locals.hs rename to lvtrun/src/Run/Locals.hs diff --git a/lvtrun/app/Run/Stack.hs b/lvtrun/src/Run/Stack.hs similarity index 100% rename from lvtrun/app/Run/Stack.hs rename to lvtrun/src/Run/Stack.hs diff --git a/lvtrun/app/Run/Start.hs b/lvtrun/src/Run/Start.hs similarity index 100% rename from lvtrun/app/Run/Start.hs rename to lvtrun/src/Run/Start.hs diff --git a/lvtrun/app/Run/Vm.hs b/lvtrun/src/Run/Vm.hs similarity index 100% rename from lvtrun/app/Run/Vm.hs rename to lvtrun/src/Run/Vm.hs diff --git a/lvtrun/app/Types.hs b/lvtrun/src/Types.hs similarity index 93% rename from lvtrun/app/Types.hs rename to lvtrun/src/Types.hs index f1daba1..501dc21 100644 --- a/lvtrun/app/Types.hs +++ b/lvtrun/src/Types.hs @@ -36,7 +36,6 @@ module Types SectionID(..), Section(..), Memory(..), - OpCode, Local(..), BlockType(..), Value(..) @@ -60,46 +59,30 @@ type DataIdx = Int32 type LocalIdx = Int32 type LabelIdx = Int32 --- Common - type FileContent = BSL.ByteString +type Memory = Limit + data TypeName = - I32 | - I64 | - F32 | - F64 + I32 + | I64 + | F32 + | F64 deriving (Show, Eq, Enum) -getTypeFromByte :: Word8 -> TypeName -getTypeFromByte 0x7f = I32 -getTypeFromByte 0x7e = I64 -getTypeFromByte 0x7d = F32 -getTypeFromByte 0x7c = F64 -getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" - data Limit = Limit { lMin :: Int32, lMax :: Maybe Int32 -} - -instance Show Limit where - show limit = "[\n\tmin: " ++ (show $ lMin limit) ++ "\n\tmax: " ++ (show $ lMax limit) ++ "\n]" - ------------------------ +} deriving (Show, Eq) data MemArg = MemArg { offset :: Int32, align :: Int32 -} +} deriving (Show) instance Eq MemArg where - (==) memArg1 memArg2 = (offset memArg1) == (offset memArg2) && (align memArg1) == (align memArg2) - -instance Show MemArg where - show memArg = "[\n\toffset: " ++ (show $ offset memArg) ++ "\n\talign: " ++ (show $ align memArg) ++ "\n]" - -type OpCode = [Word8] + (==) memArg1 memArg2 = (offset memArg1) == (offset memArg2) + && (align memArg1) == (align memArg2) data BlockType = EmptyType @@ -196,6 +179,23 @@ data Value = | F_64 Double deriving (Eq) +data SectionID = + CustomID + | TypeID + | ImportID + | FunctionID + | TableID + | MemoryID + | GlobalID + | ExportID + | StartID + | ElementID + | CodeID + | DataID + | DataCountID + | InvalidID + deriving (Show, Eq) + instance Show Value where show (I_32 val) = show val show (I_64 val) = show val @@ -231,8 +231,6 @@ data Function = Function { body :: [Instruction] } deriving (Show) -type Memory = Limit - data Mutability = Const | Var deriving (Show) data Global = Global { @@ -262,23 +260,6 @@ data ModHeader = ModHeader { version :: BSL.ByteString } deriving (Show) -data SectionID = - CustomID - | TypeID - | ImportID - | FunctionID - | TableID - | MemoryID - | GlobalID - | ExportID - | StartID - | ElementID - | CodeID - | DataID - | DataCountID - | InvalidID - deriving (Show, Eq) - data Section = Section { identifier :: SectionID, size :: Int, @@ -306,3 +287,10 @@ instance Show WasmModule where "- Memory: " ++ (show $ memory wasmMod) ++ "\n" ++ "- Globals: " ++ (show $ globals wasmMod) ++ "\n" ++ "- Exports: " ++ (show $ exports wasmMod) ++ "\n" + +getTypeFromByte :: Word8 -> TypeName +getTypeFromByte 0x7f = I32 +getTypeFromByte 0x7e = I64 +getTypeFromByte 0x7d = F32 +getTypeFromByte 0x7c = F64 +getTypeFromByte _ = throw $ WasmError "GetTypeFromByte: bad type" diff --git a/lvtrun/test/facotial.wasm b/lvtrun/test/facotial.wasm new file mode 100644 index 0000000000000000000000000000000000000000..86c3dc67e1160d1054de1e25046bc8269950f50f GIT binary patch literal 197 zcmXxdF%H5o3Y+(53C}nNve5um}6emi%d$M-UN`^lS#} zu{MIqzODOzfrEgs*&)o!FfF9b8|{`dWjvz(@N~Q!qvPbbIIfPH|JwmMe6s-SK WQ@Bn}TqH}>1K7GyYIeOKBkC8?$P}0W literal 0 HcmV?d00001 From bb5fc933a9144193059a18275a6e93e8c694158c Mon Sep 17 00:00:00 2001 From: tenshi Date: Sun, 14 Jan 2024 13:52:38 +0100 Subject: [PATCH 74/99] add some operation --- lvtrun/src/Run/Vm.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index fec8863..f058a98 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -91,6 +91,19 @@ execOpCode _ cEx (I32Sub) = do case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } _ -> throw $ WasmError "exec I32Sub: bad type" +execOpCode _ cEx (I32Mul) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 * val2)) } + _ -> throw $ WasmError "exec I32Mul: bad type" +execOpCode _ cEx (I32Divs) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 _, I_32 0) -> throw $ WasmError "exec I32Divs: division by zero" + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 `div` val2)) } + _ -> throw $ WasmError "exec I32Divs: bad type" execOpCode _ cEx (BrIf labelIdx) = do let (value, newStack) = stackPop (ceStack cEx) case value of From 5b47c0ec0a2498f4492f33811bdac8658efa19ee Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 14:25:11 +0100 Subject: [PATCH 75/99] Add verbose flag --- lvtc/app/Args.hs | 11 ++-- lvtc/app/Main.hs | 6 +-- lvtc/app/Run.hs | 108 ++++++++++++++++++++++++------------- lvtc/src/Wasm.hs | 119 +++++++++++++++++++++++++++++++++++++---- lvtc/test/lvt/Test.lvt | 7 +-- 5 files changed, 195 insertions(+), 56 deletions(-) diff --git a/lvtc/app/Args.hs b/lvtc/app/Args.hs index e8d974e..5d40246 100644 --- a/lvtc/app/Args.hs +++ b/lvtc/app/Args.hs @@ -21,7 +21,8 @@ data Action = ShowHelp | ShowVersion | Run data Args = Args { action :: Action, folderPath :: String, - outFile :: String + outFile :: String, + verbose :: Bool } parseArgs' :: [String] -> Args -> Either Args String @@ -39,6 +40,8 @@ parseArgs' ("-o":x:xs) args = parseArgs' xs (args {outFile = x}) parseArgs' ["-o"] _ = Right "Missing argument for -o" +parseArgs' ("--verbose":xs) args = + parseArgs' xs (args {verbose = True}) parseArgs' (('-':xs):_) _ = Right ("Unknown option: " ++ xs) parseArgs' (x:xs) args = @@ -48,7 +51,7 @@ parseArgs :: [String] -> IO (Either Args String) parseArgs args = getCurrentDirectory >>= \path -> return (parseArgs' args (Args { - action = Run, folderPath = path, outFile = "out.wasm" + action = Run, folderPath = path, outFile = "out.wasm", verbose = False })) hLine1 :: String @@ -72,9 +75,11 @@ hLine9 = part1 ++ part2 where part1 = "\tFOLDER\n\t\tTake all Leviator" part2 = " source code recursively from FOLDER\n" +hLine10 :: String +hLine10 = "\t--verbose\n\t\tVerbose mode\n" printHelp :: IO () printHelp = putStr hLine1 >> putStr hLine2 >> putStr hLine3 >> putStr hLine4 >> putStr hLine5 >> putStr hLine6 >> putStr hLine7 >> putStr hLine8 - >> putStr hLine9 + >> putStr hLine9 >> putStr hLine10 diff --git a/lvtc/app/Main.hs b/lvtc/app/Main.hs index bc57794..cb24862 100644 --- a/lvtc/app/Main.hs +++ b/lvtc/app/Main.hs @@ -14,9 +14,9 @@ import Run (run) import Version (printVersion) dispatchArgs :: Args -> IO () -dispatchArgs (Args Run fPath oFile) = run (Args Run fPath oFile) -dispatchArgs (Args ShowHelp _ _) = printHelp -dispatchArgs (Args ShowVersion _ _) = printVersion +dispatchArgs (Args Run fPath oFile v) = run (Args Run fPath oFile v) +dispatchArgs (Args ShowHelp _ _ _) = printHelp +dispatchArgs (Args ShowVersion _ _ _) = printVersion dispatchIfOk :: Either Args String -> IO () dispatchIfOk (Left args) = dispatchArgs args diff --git a/lvtc/app/Run.hs b/lvtc/app/Run.hs index d3975df..1a454fe 100644 --- a/lvtc/app/Run.hs +++ b/lvtc/app/Run.hs @@ -32,65 +32,99 @@ getExpressionFromFile path = readFile path >>= (\str -> case runParser (proceedAlias <$> parseAllExpression) str of - Nothing -> fail "Invalid expression" + Nothing -> fail ("Invalid expression found in file: " ++ show path) Just (expression, _) -> return expression) -getFilesExpression :: [FilePath] -> IO [Expression] -getFilesExpression (file:files) = - getExpressionFromFile file - >>= (\expFile -> getFilesExpression files +getFilesExpression :: Bool -> [FilePath] -> IO [Expression] +getFilesExpression v (file:files) = + p v + >> getExpressionFromFile file + >>= (\expFile -> getFilesExpression v files >>= (\expFiles -> return (expFile ++ expFiles))) -getFilesExpression [] = return [] + where + p True = putStrLn ("Parsing expressions from: " ++ show file ++ "...") + p False = return () +getFilesExpression _ [] = return [] -selectGoodFiles :: FilePath -> [FilePath] -> IO [FilePath] -selectGoodFiles _ [] = return [] -selectGoodFiles folder (file:files) +selectGoodFiles :: Bool -> FilePath -> [FilePath] -> IO [FilePath] +selectGoodFiles _ _ [] = return [] +selectGoodFiles v folder (file:files) | ".lvt" `isSuffixOf` trueFile = - putStrLn ("- " ++ trueFile) - >> selectGoodFiles folder files + p v + >> selectGoodFiles v folder files >>= (\others -> return (trueFile : others)) - | otherwise = selectGoodFiles folder files + | otherwise = selectGoodFiles v folder files where trueFile = joinPath [folder, file] + p True = putStrLn ("- " ++ show trueFile) + p False = return () -listAllFiles :: FilePath -> IO [FilePath] -listAllFiles path = listDirectory path >>= selectGoodFiles path +listAllFiles :: Bool -> FilePath -> IO [FilePath] +listAllFiles v path = + p v + >> listDirectory path >>= selectGoodFiles v path + where + p True = putStrLn ("Compiling Folder: " ++ show path) + p False = return () -getAllFunc :: [Expression] -> IO [FuncDeclaration] -getAllFunc [] = return [] -getAllFunc ((Expression.Function str):expressions) = +getAllFunc :: Bool -> [Expression] -> IO [FuncDeclaration] +getAllFunc _ [] = return [] +getAllFunc v ((Expression.Function str):expressions) = case runParser parseFuncDeclaration str of - Nothing -> fail ("Parser Error: `" ++ str ++ "`") + Nothing -> fail ("Parser Error: " ++ show str) Just (func, _) -> - getAllFunc expressions >>= \funcs -> return (func:funcs) -getAllFunc (_ : expressions) = getAllFunc expressions + getAllFunc v expressions >>= \funcs -> return (func:funcs) +getAllFunc v (x : expressions) = p v >> getAllFunc v expressions + where + p True = putStrLn ("Ignoring" ++ show x) + p False = return () -- TODO: replace with the function of gui -checkAst :: IO [FuncDeclaration] -> IO [FuncDeclaration] -checkAst funcsIo = +checkAst :: Bool -> IO [FuncDeclaration] -> IO [FuncDeclaration] +checkAst _ funcsIo = funcsIo >>= (\funcs -> case Just funcs of Just f -> return f Nothing -> fail "Invalid Code") -transformToWatLike :: IO [FuncDeclaration] -> IO [FuncDeclare] -transformToWatLike funcsIo = - funcsIo - >>= (\funcs -> return (aSTToWatLike funcs)) +transformToWatLike :: Bool -> IO [FuncDeclaration] -> IO [FuncDeclare] +transformToWatLike v funcsIo = + p v + >> funcsIo + >>= return . aSTToWatLike + where + p True = putStrLn "Transforming Leviator AST to IR (WatLike)..." + p False = return () + +transformToWat :: Bool -> IO [FuncDeclare] -> IO [FuncDef] +transformToWat v funcsIo = + p v + >> funcsIo + >>= return . watsLikeToWat + where + p True = putStrLn "Transforming IR (WatLike) to IR (Wat)..." + p False = return () -transformToWat :: IO [FuncDeclare] -> IO [FuncDef] -transformToWat funcsIo = funcsIo >>= return . watsLikeToWat +transformToWasm :: Bool -> IO [FuncDef] -> IO Wasm +transformToWasm v funcsIo = + p v + >> funcsIo + >>= return . watToWasm + where + p True = putStrLn "Transforming IR (Wat) to Wasm..." + p False = return () -transformToWasm :: IO [FuncDef] -> IO Wasm -transformToWasm funcsIo = funcsIo >>= return . watToWasm +showDebug :: Bool -> Wasm -> IO () +showDebug True wasm = print wasm +showDebug False _ = return () run :: Args -> IO () -run (Args Run fPath oFile) = putStrLn ("Compiling from: " ++ fPath) >> - transformedWasm >>= \wasm -> writeWasm wasm oFile +run (Args Run fPath oFile v) = + transformedWasm >>= \wasm -> (showDebug v wasm >> writeWasm wasm oFile) where - expressions = listAllFiles fPath >>= getFilesExpression - funcs = expressions >>= getAllFunc - transformedWatLike = transformToWatLike (checkAst funcs) - transformedWat = transformToWat (transformedWatLike) - transformedWasm = transformToWasm (transformedWat) + expressions = listAllFiles v fPath >>= getFilesExpression v + funcs = expressions >>= getAllFunc v + transformedWatLike = transformToWatLike v (checkAst v funcs) + transformedWat = transformToWat v transformedWatLike + transformedWasm = transformToWasm v transformedWat run _ = fail "Invalid option called" diff --git a/lvtc/src/Wasm.hs b/lvtc/src/Wasm.hs index 7acf9c7..058dd2d 100644 --- a/lvtc/src/Wasm.hs +++ b/lvtc/src/Wasm.hs @@ -25,6 +25,11 @@ module Wasm import WatAST (OpCode (..)) import Data.Int (Int32) +pad :: String -> String +pad [] = [] +pad ('\n':xs) = '\n':' ':' ' : pad xs +pad (x:xs) = x : pad xs + data VariableType = I32 deriving (Show, Eq) @@ -37,7 +42,17 @@ data TypeSectionType = nbResults :: Int, results :: [VariableType] } - deriving (Show, Eq) + deriving (Eq) + +instance Show TypeSectionType where + show (Func hF nP p nR r) = + "Func {\n" + ++ " headerFunc: " ++ show hF ++ "\n" + ++ " nbParams: " ++ show nP ++ "\n" + ++ " params: " ++ show p ++ "\n" + ++ " nbResults: " ++ show nR ++ "\n" + ++ " results: " ++ show r ++ "\n" + ++ "}" data TypeSection = TS { @@ -46,7 +61,16 @@ data TypeSection = nbTypes :: Int, types :: [TypeSectionType] } - deriving (Show, Eq) + deriving (Eq) + +instance Show TypeSection where + show (TS hT sT nT t) = + "TS {\n" + ++ " headerTS: " ++ show hT ++ "\n" + ++ " sizeTS: " ++ show sT ++ "\n" + ++ " nbTypes: " ++ show nT ++ "\n" + ++ " types: " ++ pad (pad (show t)) ++ "\n" + ++ "}" data FunctionSection = FS { @@ -55,7 +79,16 @@ data FunctionSection = nbFuncs :: Int, funcs :: [Int] } - deriving (Show, Eq) + deriving (Eq) + +instance Show FunctionSection where + show (FS hF sF nF f) = + "FS {\n" + ++ " headerFS: " ++ show hF ++ "\n" + ++ " sizeFS: " ++ show sF ++ "\n" + ++ " nbFuncs: " ++ show nF ++ "\n" + ++ " funcs: " ++ pad (pad (show f)) ++ "\n" + ++ "}" data MemorySectionLimits = MSL { @@ -63,7 +96,15 @@ data MemorySectionLimits = minMS :: Int, maxMS :: Int } - deriving (Show, Eq) + deriving (Eq) + +instance Show MemorySectionLimits where + show (MSL hM mMi mMa) = + "MSL {\n" + ++ " hasMax: " ++ show hM ++ "\n" + ++ " minMS: " ++ show mMi ++ "\n" + ++ " maxMS: " ++ show mMa ++ "\n" + ++ "}" data MemorySection = MS { @@ -72,7 +113,16 @@ data MemorySection = nbLimits :: Int, limits :: [MemorySectionLimits] } - deriving (Show, Eq) + deriving (Eq) + +instance Show MemorySection where + show (MS hM sM nL l) = + "MS {\n" + ++ " headerMS: " ++ show hM ++ "\n" + ++ " sizeMS: " ++ show sM ++ "\n" + ++ " nbLimits: " ++ show nL ++ "\n" + ++ " limits: " ++ pad (pad (show l)) ++ "\n" + ++ "}" data ExportSectionExportType = FuncExport @@ -88,7 +138,16 @@ data ExportSectionExport = typeESE :: ExportSectionExportType, indexESE :: Int } - deriving (Show, Eq) + deriving (Eq) + +instance Show ExportSectionExport where + show (ESE nL n t i) = + "ESE {\n" + ++ " nameLength: " ++ show nL ++ "\n" + ++ " name: " ++ show n ++ "\n" + ++ " typeESE: " ++ show t ++ "\n" + ++ " indexESE: " ++ show i ++ "\n" + ++ "}" data ExportSection = ES { @@ -97,7 +156,16 @@ data ExportSection = nbExports :: Int, exports :: [ExportSectionExport] } - deriving (Show, Eq) + deriving (Eq) + +instance Show ExportSection where + show (ES hE sE nE e) = + "ES {\n" + ++ " headerES: " ++ show hE ++ "\n" + ++ " sizeES: " ++ show sE ++ "\n" + ++ " nbExports: " ++ show nE ++ "\n" + ++ " exports: " ++ pad (pad (show e)) ++ "\n" + ++ "}" type CodeSectionCodeLocals = (Int32, VariableType) @@ -109,7 +177,17 @@ data CodeSectionCode = bodyCSC :: [OpCode], endCSC :: Int } - deriving (Show, Eq) + deriving (Eq) + +instance Show CodeSectionCode where + show (CSC sL nL l b e) = + "CSC {\n" + ++ " sizeCSC: " ++ show sL ++ "\n" + ++ " nbLocals: " ++ show nL ++ "\n" + ++ " locals: " ++ pad (pad (show l)) ++ "\n" + ++ " bodyCSC: " ++ pad (pad (show b)) ++ "\n" + ++ " endCSC: " ++ show e ++ "\n" + ++ "}" data CodeSection = CS { @@ -118,7 +196,16 @@ data CodeSection = nbCodes :: Int, codes :: [CodeSectionCode] } - deriving (Show, Eq) + deriving (Eq) + +instance Show CodeSection where + show (CS hC sC nC c) = + "CS {\n" + ++ " headerCS: " ++ show hC ++ "\n" + ++ " sizeCS: " ++ show sC ++ "\n" + ++ " nbCodes: " ++ show nC ++ "\n" + ++ " codes: " ++ pad (pad (show c)) ++ "\n" + ++ "}" data Wasm = Wasm { @@ -130,4 +217,16 @@ data Wasm = exportSection :: ExportSection, codeSection :: CodeSection } - deriving (Show, Eq) + deriving (Eq) + +instance Show Wasm where + show (Wasm h v t f m e c) = + "Wasm {\n" + ++ " headerWasm: " ++ pad (show h) ++ "\n" + ++ " versionWasm: " ++ pad (show v) ++ "\n" + ++ " typeSection: " ++ pad (show t) ++ "\n" + ++ " functionSection: " ++ pad (show f) ++ "\n" + ++ " memorySection: " ++ pad (show m) ++ "\n" + ++ " exportSection: " ++ pad (show e) ++ "\n" + ++ " codeSection: " ++ pad (show c) ++ "\n" + ++ "}" diff --git a/lvtc/test/lvt/Test.lvt b/lvtc/test/lvt/Test.lvt index 4175791..d30bbe2 100644 --- a/lvtc/test/lvt/Test.lvt +++ b/lvtc/test/lvt/Test.lvt @@ -1,9 +1,10 @@ -fn abc(a: Int) -> Int +fn factorial(n: Int) -> Int { - <- a; + @Int a = n - 1; + <- (n * factorial(a)); }; export fn start() -> Int { - <- abc(1); + <- factorial(5); }; From 2a5515f6ecd57dc8cd9f3d111fda52fb9f5dcdc2 Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 14:29:00 +0100 Subject: [PATCH 76/99] Remove all not implemented --- README.md | 46 ++++++---------------------------------------- 1 file changed, 6 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 472dd43..970bfad 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ alias A = Int; ```hs @Int a = 1; -@String b = "hello"; +@StringView b = "hello"; ``` - **Variables Assignment** @@ -114,18 +114,11 @@ while (i < 10) }; ``` -- **Imports** - -```c -// Circular imports are not allowed -import "path/to/file.lvt" -``` - - **Entrypoint** ```rust // If you don't have this function, the program will not be run -fn start() -> Int +export fn start() -> Int { <- 0; }; @@ -140,35 +133,8 @@ a * b a / b a == b a != b -``` - -- **Structs** - -```c -struct Point -{ - x: Int, - y: Int, -}; -``` - -- **Structs Initialization** -``` -@Point p = {1, 2}; -``` - -- **Structs Access** -``` -p:x -``` - -- **Nested Structs** -``` -struct Rect -{ - Point size; - Point pos; -}; -@Rect r = {{1, 2}, {3, 4}}; -r:size:x +a < b +a <= b +a > b +a >= b ``` From fabc45fc4c2fa278fed598db2bd4e8f551f0b302 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 15:18:46 +0100 Subject: [PATCH 77/99] clean code --- lvtrun/lvtrun.cabal | 1 + lvtrun/src/Run/Functions.hs | 4 +- lvtrun/src/Run/Locals.hs | 15 +++--- lvtrun/src/Run/Stack.hs | 2 +- lvtrun/src/Run/Start.hs | 7 +-- lvtrun/src/Run/Types.hs | 68 ++++++++++++++++++++++++ lvtrun/src/Run/Vm.hs | 55 ++----------------- lvtrun/test/{out.wasm => addition.wasm} | Bin lvtrun/test/facotial.wasm | Bin 197 -> 0 bytes 9 files changed, 88 insertions(+), 64 deletions(-) create mode 100644 lvtrun/src/Run/Types.hs rename lvtrun/test/{out.wasm => addition.wasm} (100%) delete mode 100644 lvtrun/test/facotial.wasm diff --git a/lvtrun/lvtrun.cabal b/lvtrun/lvtrun.cabal index f1377ba..20bc188 100644 --- a/lvtrun/lvtrun.cabal +++ b/lvtrun/lvtrun.cabal @@ -42,6 +42,7 @@ library Run.Locals Run.Stack Run.Start + Run.Types Run.Vm Types other-modules: diff --git a/lvtrun/src/Run/Functions.hs b/lvtrun/src/Run/Functions.hs index 53631f4..293a968 100644 --- a/lvtrun/src/Run/Functions.hs +++ b/lvtrun/src/Run/Functions.hs @@ -17,8 +17,8 @@ where import Data.Int (Int32) import Control.Exception (throw) -import Types -import Errors +import Errors (CustomException(..)) +import Types (Export(..), ExportDesc(..), Function(..), FuncType(..)) getStartFunctionId :: [Export] -> Int32 getStartFunctionId [] = throw $ WasmError "No start function" diff --git a/lvtrun/src/Run/Locals.hs b/lvtrun/src/Run/Locals.hs index 6b36957..f03da07 100644 --- a/lvtrun/src/Run/Locals.hs +++ b/lvtrun/src/Run/Locals.hs @@ -19,8 +19,8 @@ import Data.Int (Int32) import Control.Exception (throw) import Types -import Errors -import Run.Stack +import Errors (CustomException(..)) +import Run.Stack (Stack, stackPop, stackPopN) type Locals = [Value] @@ -66,15 +66,16 @@ createLocalsParams (F64:xs) (F_64 val:xs2) = (F_64 val : createLocalsParams xs xs2) createLocalsParams _ _ = throw $ WasmError "createLocalsParams: bad type" +initLocalsParams' :: (Locals, Stack) -> [TypeName] -> (Locals, Stack) +initLocalsParams' ([], newStack) _ = ([], newStack) +initLocalsParams' (values, newStack) params = + (createLocalsParams params (reverse values), newStack) + initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) initLocalsParams [] stack = ([], stack) initLocalsParams params stack | length params > length stack = throw $ WasmError "initLocalsParam: bad nb" - | otherwise = do - let (values, newStack) = stackPopN stack (length params) - let reversedValues = reverse values - let newLocals = createLocalsParams params reversedValues - (newLocals, newStack) + | otherwise = initLocalsParams' (stackPopN stack (length params)) params initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) initLocals localVarTypes paramTypes stack = do diff --git a/lvtrun/src/Run/Stack.hs b/lvtrun/src/Run/Stack.hs index f1a24c7..ec1953b 100644 --- a/lvtrun/src/Run/Stack.hs +++ b/lvtrun/src/Run/Stack.hs @@ -18,8 +18,8 @@ where import Control.Exception (throw) -import Types (Value(..), TypeName(..)) import Errors (CustomException(..)) +import Types (Value(..), TypeName(..)) type Stack = [Value] diff --git a/lvtrun/src/Run/Start.hs b/lvtrun/src/Run/Start.hs index c8b3271..1204f72 100644 --- a/lvtrun/src/Run/Start.hs +++ b/lvtrun/src/Run/Start.hs @@ -12,9 +12,10 @@ module Run.Start where import Types -import Run.Vm -import Run.Functions -import Run.Stack +import Run.Vm (runMain) +import Run.Stack (Stack) +import Run.Types (createVm) +import Run.Functions (getStartFunctionId) exitCorrectly :: Stack -> IO () exitCorrectly [] = putStrLn "Exit correctly with code: 0" diff --git a/lvtrun/src/Run/Types.hs b/lvtrun/src/Run/Types.hs new file mode 100644 index 0000000..e444d2d --- /dev/null +++ b/lvtrun/src/Run/Types.hs @@ -0,0 +1,68 @@ +{- +-- EPITECH PROJECT, 2023 +-- Leviator Run +-- File description: +-- Types +-} + +module Run.Types +( + CurrentExec(..), + InstMemory(..), + VM(..), + createVm, + incrementInstIdx +) +where + +import Data.Word (Word8) + +import Types +import Run.Stack (Stack) +import Run.Locals (Locals) + +data CurrentExec = CurrentExec { + ceLocals :: Locals, + ceStack :: Stack, + ceInstructions :: [Instruction], + ceInstIdx :: Int, + ceLabels :: [Int], + ceParams :: [TypeName], + ceResults :: [TypeName], + crBlockIndents :: Int +} deriving (Show) + +data InstMemory = Memory { + memRange :: Limit, + memData :: [Word8] +} deriving (Show) + +data VM = VM { + vmStack :: Stack, + currentExec :: CurrentExec, + vmMemory :: InstMemory, + wasmModule :: WasmModule +} deriving (Show) + +createVm :: WasmModule -> VM +createVm wasmMod = VM { + vmStack = [], + currentExec = CurrentExec { + ceLocals = [], + ceStack = [], + ceInstructions = [], + ceParams = [], + ceResults = [], + ceInstIdx = 0, + ceLabels = [], + crBlockIndents = 0 + }, + vmMemory = Memory { + memRange = Limit 0 Nothing, + memData = [] + }, + wasmModule = wasmMod +} + +incrementInstIdx :: CurrentExec -> CurrentExec +incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index f058a98..4ba4cb2 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -17,58 +17,11 @@ import Data.Word (Word8) import Control.Exception (throw) import Types -import Errors -import Run.Functions -import Run.Stack +import Run.Types import Run.Locals - -data CurrentExec = CurrentExec { - ceLocals :: Locals, - ceStack :: Stack, - ceInstructions :: [Instruction], - ceInstIdx :: Int, - ceLabels :: [Int], - ceParams :: [TypeName], - ceResults :: [TypeName], - crBlockIndents :: Int -} deriving (Show) - -data InstMemory = Memory { - memRange :: Limit, - memData :: [Word8] -} deriving (Show) - -data VM = VM { - vmStack :: Stack, - currentExec :: CurrentExec, - vmMemory :: InstMemory, - wasmModule :: WasmModule -} - -instance Show VM where - show vm = "VM { vmStack = " ++ show (vmStack vm) ++ ", currentExec = " ++ show (currentExec vm) ++ " }" - -createVm :: WasmModule -> VM -createVm wasmMod = VM { - vmStack = [], - currentExec = CurrentExec { - ceLocals = [], - ceStack = [], - ceInstructions = [], - ceParams = [], - ceResults = [] - }, - vmMemory = Memory { - memRange = Limit 0 Nothing, - memData = [] - }, - wasmModule = wasmMod -} - -incrementInstIdx :: CurrentExec -> CurrentExec -incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } - ---------------------------- +import Errors (CustomException(..)) +import Run.Functions (getFunctionFromId, getFuncTypeFromId) +import Run.Stack (Stack, stackPush, stackPop, stackTop, pushResults) execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec execOpCode _ cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } diff --git a/lvtrun/test/out.wasm b/lvtrun/test/addition.wasm similarity index 100% rename from lvtrun/test/out.wasm rename to lvtrun/test/addition.wasm diff --git a/lvtrun/test/facotial.wasm b/lvtrun/test/facotial.wasm deleted file mode 100644 index 86c3dc67e1160d1054de1e25046bc8269950f50f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmXxdF%H5o3Y+(53C}nNve5um}6emi%d$M-UN`^lS#} zu{MIqzODOzfrEgs*&)o!FfF9b8|{`dWjvz(@N~Q!qvPbbIIfPH|JwmMe6s-SK WQ@Bn}TqH}>1K7GyYIeOKBkC8?$P}0W From 8efe9bf6bb72d2890f4bffd8d65aef3691762548 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 15:27:52 +0100 Subject: [PATCH 78/99] fix some warning --- lvtrun/src/Run/Locals.hs | 28 ++++++++++++++-------------- lvtrun/src/Types.hs | 3 +-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lvtrun/src/Run/Locals.hs b/lvtrun/src/Run/Locals.hs index f03da07..b9c367c 100644 --- a/lvtrun/src/Run/Locals.hs +++ b/lvtrun/src/Run/Locals.hs @@ -20,26 +20,26 @@ import Control.Exception (throw) import Types import Errors (CustomException(..)) -import Run.Stack (Stack, stackPop, stackPopN) +import Run.Stack (Stack, stackPopN) type Locals = [Value] getLocalFromId' :: Int32 -> LocalIdx -> Locals -> Value getLocalFromId' _ _ [] = throw $ WasmError "getLocalFromId: bad id" -getLocalFromId' idx id (x:xs) - | idx > id = throw $ WasmError "getLocalFromId: bad id" - | idx == id = x - | otherwise = getLocalFromId' (idx + 1) id xs +getLocalFromId' idx idntifier (x:xs) + | idx > idntifier = throw $ WasmError "getLocalFromId: bad id" + | idx == idntifier = x + | otherwise = getLocalFromId' (idx + 1) idntifier xs getLocalFromId :: Locals -> LocalIdx -> Value -getLocalFromId locals id = getLocalFromId' 0 id locals +getLocalFromId lcals idntifier = getLocalFromId' 0 idntifier lcals setLocalWithId :: Int32 -> Locals -> Value -> LocalIdx -> Locals setLocalWithId _ [] _ _ = throw $ WasmError "setLocalWithId: bad id" -setLocalWithId idx (x:xs) value id - | idx > id = throw $ WasmError "setLocalWithId: bad id" - | idx == id = value : xs - | otherwise = x : setLocalWithId (idx + 1) xs value id +setLocalWithId idx (x:xs) value idntifier + | idx > idntifier = throw $ WasmError "setLocalWithId: bad id" + | idx == idntifier = value : xs + | otherwise = x : setLocalWithId (idx + 1) xs value idntifier ----------- INITIALISATION ---------------- @@ -68,14 +68,14 @@ createLocalsParams _ _ = throw $ WasmError "createLocalsParams: bad type" initLocalsParams' :: (Locals, Stack) -> [TypeName] -> (Locals, Stack) initLocalsParams' ([], newStack) _ = ([], newStack) -initLocalsParams' (values, newStack) params = - (createLocalsParams params (reverse values), newStack) +initLocalsParams' (values, newStack) prms = + (createLocalsParams prms (reverse values), newStack) initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) initLocalsParams [] stack = ([], stack) -initLocalsParams params stack +initLocalsParams prms stack | length params > length stack = throw $ WasmError "initLocalsParam: bad nb" - | otherwise = initLocalsParams' (stackPopN stack (length params)) params + | otherwise = initLocalsParams' (stackPopN stack (length params)) prms initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) initLocals localVarTypes paramTypes stack = do diff --git a/lvtrun/src/Types.hs b/lvtrun/src/Types.hs index 501dc21..d50db7a 100644 --- a/lvtrun/src/Types.hs +++ b/lvtrun/src/Types.hs @@ -35,7 +35,7 @@ module Types FileContent, SectionID(..), Section(..), - Memory(..), + Memory, Local(..), BlockType(..), Value(..) @@ -96,7 +96,6 @@ data Instruction = | Return | Call FuncIdx | I32Const Int32 - | I64Const Int64 | F32Const Float | F64Const Double From 6b75cd5d73223b1c5f9c6c53365c8039a2879e60 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 15:28:27 +0100 Subject: [PATCH 79/99] fix compilation --- lvtrun/src/Run/Locals.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lvtrun/src/Run/Locals.hs b/lvtrun/src/Run/Locals.hs index b9c367c..9ab8a52 100644 --- a/lvtrun/src/Run/Locals.hs +++ b/lvtrun/src/Run/Locals.hs @@ -74,8 +74,8 @@ initLocalsParams' (values, newStack) prms = initLocalsParams :: [TypeName] -> Stack -> (Locals, Stack) initLocalsParams [] stack = ([], stack) initLocalsParams prms stack - | length params > length stack = throw $ WasmError "initLocalsParam: bad nb" - | otherwise = initLocalsParams' (stackPopN stack (length params)) prms + | length prms > length stack = throw $ WasmError "initLocalsParam: bad nb" + | otherwise = initLocalsParams' (stackPopN stack (length prms)) prms initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) initLocals localVarTypes paramTypes stack = do From a24f195f0480d574796a93dfb9f97487b84f438d Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 15:49:27 +0100 Subject: [PATCH 80/99] Fix if --- lvtc/src/Builtins.hs | 12 ++++++------ lvtc/src/WasmUtils.hs | 11 ++++++++--- lvtc/src/WatAST.hs | 7 ++++++- lvtc/src/WatLikeToWat.hs | 6 ++++-- lvtc/src/WriteWasm.hs | 2 ++ lvtc/test/UTLexeme.hs | 6 ++++++ lvtc/test/lvt/Test.lvt | 14 +++++++------- 7 files changed, 39 insertions(+), 19 deletions(-) diff --git a/lvtc/src/Builtins.hs b/lvtc/src/Builtins.hs index 680cc4c..36b5b82 100644 --- a/lvtc/src/Builtins.hs +++ b/lvtc/src/Builtins.hs @@ -30,12 +30,12 @@ getBuiltinsFuncOperator = getBuiltinsFuncComp :: [FuncDeclaration] getBuiltinsFuncComp = [ - ((False, "==", [("x", "Int"), ("y", "Int")], "Int"), []), - ((False, "<", [("x", "Int"), ("y", "Int")], "Int"), []), - ((False, ">", [("x", "Int"), ("y", "Int")], "Int"), []), - ((False, "<=", [("x", "Int"), ("y", "Int")], "Int"), []), - ((False, ">=", [("x", "Int"), ("y", "Int")], "Int"), []), - ((False, "!=", [("x", "Int"), ("y", "Int")], "Int"), []) + ((False, "==", [("x", "Int"), ("y", "Int")], "Bool"), []), + ((False, "<", [("x", "Int"), ("y", "Int")], "Bool"), []), + ((False, ">", [("x", "Int"), ("y", "Int")], "Bool"), []), + ((False, "<=", [("x", "Int"), ("y", "Int")], "Bool"), []), + ((False, ">=", [("x", "Int"), ("y", "Int")], "Bool"), []), + ((False, "!=", [("x", "Int"), ("y", "Int")], "Bool"), []) ] getBuiltinsFunc :: [FuncDeclaration] diff --git a/lvtc/src/WasmUtils.hs b/lvtc/src/WasmUtils.hs index b8064d1..07be5e2 100644 --- a/lvtc/src/WasmUtils.hs +++ b/lvtc/src/WasmUtils.hs @@ -28,11 +28,12 @@ module WasmUtils -- opCodeByte, variableTypeByte, - exportSectionExportTypeByte + exportSectionExportTypeByte, + ifTypeByte ) where import Wasm -import WatAST (OpCode (..)) +import WatAST (OpCode (..), IfType (..)) import Leb128Encode getDefaultTypeSectionType :: TypeSectionType @@ -179,6 +180,7 @@ getSizeOpCode (LocalGet _) = 2 getSizeOpCode (LocalSet _) = 2 getSizeOpCode (I32Const _) = 2 getSizeOpCode (Call _) = 2 +getSizeOpCode (If _) = 2 getSizeOpCode _ = 1 fillBlankCodeSectionCode :: CodeSectionCode -> CodeSectionCode @@ -249,10 +251,13 @@ opCodeByte I32Mul = 0x6c opCodeByte I32Div = 0x6d opCodeByte Return = 0x0f opCodeByte (Call _) = 0x10 -opCodeByte If = 0x04 +opCodeByte (If EmptyType) = 0x04 opCodeByte Else = 0x05 opCodeByte End = 0x0b +ifTypeByte :: IfType -> Int +ifTypeByte EmptyType = 0x40 + variableTypeByte :: VariableType -> Int variableTypeByte I32 = 0x7f diff --git a/lvtc/src/WatAST.hs b/lvtc/src/WatAST.hs index 056f2a4..91b353b 100644 --- a/lvtc/src/WatAST.hs +++ b/lvtc/src/WatAST.hs @@ -10,10 +10,15 @@ module WatAST OpCode (..) , Type (..) , FuncDef (..) + , IfType (..) ) where import Data.Int (Int32) +data IfType = + EmptyType + deriving (Show, Eq) + -- if opcode added, dont miss to add the right size in ./WasmUtils.hs data OpCode = LocalGet Int32 @@ -33,7 +38,7 @@ data OpCode = | I32Div | Return | Call Int32 - | If + | If IfType | Else | End deriving (Show, Eq) diff --git a/lvtc/src/WatLikeToWat.hs b/lvtc/src/WatLikeToWat.hs index ce3b172..5279a04 100644 --- a/lvtc/src/WatLikeToWat.hs +++ b/lvtc/src/WatLikeToWat.hs @@ -37,6 +37,8 @@ findTypeFromInstructions name [] = error ("Type not found for: " ++ name) findTypeFromInstructions name ((Declaration ((name', typ), _)):xs) | name == name' = typeStringToType typ | otherwise = findTypeFromInstructions name xs +findTypeFromInstructions name ((Cond (_, insIf, insElse)):xs) = + findTypeFromInstructions name (insIf ++ insElse ++ xs) findTypeFromInstructions name (_:xs) = findTypeFromInstructions name xs varsToDecl :: [Index] -> [Instruction] -> [Var] -> [(WatAST.Type, Int32)] @@ -98,12 +100,12 @@ instructionToWat (Function (indexName, values)) = ] instructionToWat (Cond (value, ifTrue, [])) = valueToWat value - ++ [ If ] + ++ [ If EmptyType ] ++ instructionsToWat ifTrue ++ [ End ] instructionToWat (Cond (value, ifTrue, ifFalse)) = valueToWat value - ++ [ If ] + ++ [ If EmptyType ] ++ instructionsToWat ifTrue ++ [ Else ] ++ instructionsToWat ifFalse diff --git a/lvtc/src/WriteWasm.hs b/lvtc/src/WriteWasm.hs index 58bb9c8..8182161 100644 --- a/lvtc/src/WriteWasm.hs +++ b/lvtc/src/WriteWasm.hs @@ -123,6 +123,8 @@ opCodeToByte (I32Const a) = B.pack [fromIntegral (opCodeByte (I32Const a)), fromIntegral a] opCodeToByte (Call a) = B.pack [fromIntegral (opCodeByte (Call a)), fromIntegral a] +opCodeToByte (If a) = + B.pack [fromIntegral (opCodeByte (If a)), fromIntegral (ifTypeByte a)] opCodeToByte op = B.pack [fromIntegral (opCodeByte op)] codeSectionCodeToByte :: CodeSectionCode -> B.ByteString diff --git a/lvtc/test/UTLexeme.hs b/lvtc/test/UTLexeme.hs index bce0c52..32ff876 100644 --- a/lvtc/test/UTLexeme.hs +++ b/lvtc/test/UTLexeme.hs @@ -38,6 +38,10 @@ utLexeme = testGroup "UTLexeme" assertEqual "5" l5_rep (lexeme1 l5) + , testCase "lexeme6" $ + assertEqual "6" + l6_rep + (lexeme1 l6) ] where l1 = "@Int a = 0;" @@ -50,3 +54,5 @@ utLexeme = testGroup "UTLexeme" l4_rep = "@Int a=0;@Int c=b(a);if(c){d(a);};" l5 = "foo(a);\n foo(b);\n" l5_rep = "foo(a);foo(b);" + l6 = "export fn start() -> Int\n{\n @Int one = 15;\n @Int two = 5;\n three = 0;\n if (one == 5)\n {\n three = 15;\n };\n if (two == 5)\n{\n three = 5;\n };\n <- three;\n};\n" + l6_rep = "export fn start()->Int{@Int one=15;@Int two=5;three=0;if(one==5){three=15;};if(two==5){three=5;};<-three;};" diff --git a/lvtc/test/lvt/Test.lvt b/lvtc/test/lvt/Test.lvt index d30bbe2..6787429 100644 --- a/lvtc/test/lvt/Test.lvt +++ b/lvtc/test/lvt/Test.lvt @@ -1,10 +1,10 @@ -fn factorial(n: Int) -> Int -{ - @Int a = n - 1; - <- (n * factorial(a)); -}; - export fn start() -> Int { - <- factorial(5); + @Int a = 5; + @Int b = 5; + if (a == b) + { + <- 0; + }; + <- 0; }; From 1559875dfcb09309de69af6a423e24c5bcbe037c Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 16:29:18 +0100 Subject: [PATCH 81/99] Fix priority --- README.md | 9 ++++++++- lvtc/src/ParseLvt.hs | 2 +- lvtc/src/ShuntingYard.hs | 12 ++++++------ lvtc/test/UTShuntingYard.hs | 8 ++++---- lvtc/test/lvt/Test.lvt | 16 ++++++++++------ 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 970bfad..d7bd166 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ export fn start() -> Int - **Operators** -``` +```python a + b a - b a * b @@ -138,3 +138,10 @@ a <= b a > b a >= b ``` + +- **Priority of Operators** + +```c +// realy peticuliar buut we use { for ( and } for ) +{a + B} * c +``` diff --git a/lvtc/src/ParseLvt.hs b/lvtc/src/ParseLvt.hs index 76628ee..c93fa17 100644 --- a/lvtc/src/ParseLvt.hs +++ b/lvtc/src/ParseLvt.hs @@ -93,7 +93,7 @@ parseOperatorOp :: Parser Value parseOperatorOp = Var <$> (parseString "+" <|> parseString "-" <|> parseString "*" - <|> parseString "/" <|> parseString "(" <|> parseString ")" + <|> parseString "/" <|> parseString "{" <|> parseString "}" <|> parseString "==" <|> parseString "!=" <|> parseString "<" <|> parseString ">" <|> parseString "<=" <|> parseString ">=") diff --git a/lvtc/src/ShuntingYard.hs b/lvtc/src/ShuntingYard.hs index d010d3e..b3cfca9 100644 --- a/lvtc/src/ShuntingYard.hs +++ b/lvtc/src/ShuntingYard.hs @@ -63,14 +63,14 @@ opOnStack (Var op1) (SYS ((Var op2):ops) out) opOnStack _ sys = sys shuntingYardOp :: Value -> ShuntingYardState -> ShuntingYardState -shuntingYardOp (Var "(") (SYS ops out) = - SYS (Var "(" : ops) out -shuntingYardOp (Var ")") (SYS [] _) = +shuntingYardOp (Var "{") (SYS ops out) = + SYS (Var "{" : ops) out +shuntingYardOp (Var "}") (SYS [] _) = SYS [] [] -shuntingYardOp (Var ")") (SYS ((Var "("):ops) out) = +shuntingYardOp (Var "}") (SYS ((Var "{"):ops) out) = SYS ops out -shuntingYardOp (Var ")") (SYS (op:ops) out) = - shuntingYardOp (Var ")") (SYS ops (out ++ [op])) +shuntingYardOp (Var "}") (SYS (op:ops) out) = + shuntingYardOp (Var "}") (SYS ops (out ++ [op])) shuntingYardOp (Var op) sys = SYS (Var op:ops') out' where diff --git a/lvtc/test/UTShuntingYard.hs b/lvtc/test/UTShuntingYard.hs index d8c15c3..3af9324 100644 --- a/lvtc/test/UTShuntingYard.hs +++ b/lvtc/test/UTShuntingYard.hs @@ -34,8 +34,8 @@ utShuntingYard = testGroup "ShuntingYard" assertEqual "3-4/5" (SYS [] [Integer 3, Integer 4, Integer 5, Var "/", Var "-"]) priority_div_end - , testCase "3+4*2/(1-5)" $ - assertEqual "3+4*2/(1-5)" + , testCase "3+4*2/{1-5}" $ + assertEqual "3+4*2/{1-5}" (SYS [] [Integer 3, Integer 4, Integer 2, Var "*", Integer 1, Integer 5, Var "-", Var "/", Var "+"]) priority_end ] @@ -72,9 +72,9 @@ utShuntingYard = testGroup "ShuntingYard" priority_4 = shuntingYardOp (Var "*") priority_3 priority_5 = shuntingYardValue (Integer 2) priority_4 priority_6 = shuntingYardOp (Var "/") priority_5 - priority_7 = shuntingYardOp (Var "(") priority_6 + priority_7 = shuntingYardOp (Var "{") priority_6 priority_8 = shuntingYardValue (Integer 1) priority_7 priority_9 = shuntingYardOp (Var "-") priority_8 priority_10 = shuntingYardValue (Integer 5) priority_9 - priority_11 = shuntingYardOp (Var ")") priority_10 + priority_11 = shuntingYardOp (Var "}") priority_10 priority_end = shuntingYardEnd priority_11 diff --git a/lvtc/test/lvt/Test.lvt b/lvtc/test/lvt/Test.lvt index 6787429..cb0a607 100644 --- a/lvtc/test/lvt/Test.lvt +++ b/lvtc/test/lvt/Test.lvt @@ -1,10 +1,14 @@ -export fn start() -> Int +fn factorial(n: Int) -> Int { - @Int a = 5; - @Int b = 5; - if (a == b) + @Int a = n - 1; + if (a == 0) { - <- 0; + <- 1; }; - <- 0; + <- n * factorial(a); +}; + +export fn start() -> Int +{ + <- factorial(5); }; From 1b63e16b3be769f78bddfc11cd3765f6517e5273 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 16:58:06 +0100 Subject: [PATCH 82/99] fix if and eq --- lvtrun/src/OpCodes.hs | 8 +++++--- lvtrun/src/Run/Vm.hs | 27 +++++++++++++++++++++++---- lvtrun/src/Types.hs | 4 +++- lvtrun/test/conditionReturn5.wasm | Bin 0 -> 227 bytes lvtrun/test/factorial.wasm | Bin 0 -> 235 bytes 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 lvtrun/test/conditionReturn5.wasm create mode 100644 lvtrun/test/factorial.wasm diff --git a/lvtrun/src/OpCodes.hs b/lvtrun/src/OpCodes.hs index ca85328..4ccd4ae 100644 --- a/lvtrun/src/OpCodes.hs +++ b/lvtrun/src/OpCodes.hs @@ -61,6 +61,7 @@ extractOpCode bytes = case BSL.unpack bytes of 0x47 : rest -> ([0x47], BSL.pack rest) 0x3f : 0x00 : rest -> ([0x3f, 0x00], BSL.pack rest) 0x40 : 0x00 : rest -> ([0x40, 0x00], BSL.pack rest) + 0x04 : 0x40 : rest -> ([0x04, 0x40], BSL.pack rest) _ -> throw $ WasmError "ExtractOpCode: bad opcode" createInstruction :: [Word8] -> BSL.ByteString -> (Instruction, BSL.ByteString) @@ -79,12 +80,15 @@ createInstruction [0x6d] bytes = (I32Divs, bytes) createInstruction [0x47] bytes = (I32Ne, bytes) createInstruction [0x6b] bytes = (I32Sub, bytes) createInstruction [0x4a] bytes = (I32Gts, bytes) -createInstruction [0x46] bytes = (I32Eqz, bytes) +createInstruction [0x46] bytes = (I32Eq, bytes) createInstruction [0x45] bytes = (I32Eqz, bytes) createInstruction [0x4d] bytes = (I32Leu, bytes) createInstruction [0x4e] bytes = (I32Ges, bytes) createInstruction [0x4c] bytes = (I32Les, bytes) createInstruction [0x71] bytes = (I32And, bytes) +createInstruction [0x04, 0x40] bytes = (If, bytes) +createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) +createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) createInstruction [0x0d] bytes = (\(value, rest) -> (BrIf value, rest)) (getLEB128ToI32 bytes) createInstruction [0x0c] bytes = (\(value, rest) -> (Br value, rest)) (getLEB128ToI32 bytes) createInstruction [0x22] bytes = (\(value, rest) -> (LocalTee value, rest)) (getLEB128ToI32 bytes) @@ -101,6 +105,4 @@ createInstruction [0x28] bytes = (\(align, rest) -> (\(offset, rest2) -> (I32Loa createInstruction [0x29] bytes = (\(align, rest) -> (\(offset, rest2) -> (I64Load (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) createInstruction [0x36] bytes = (\(align, rest) -> (\(offset, rest2) -> (I32Store (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) createInstruction [0x37] bytes = (\(align, rest) -> (\(offset, rest2) -> (I64Store (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) -createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) -createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) createInstruction _ _ = throw $ WasmError "createInstruction: bad instruction" diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index 4ba4cb2..75461af 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -23,6 +23,15 @@ import Errors (CustomException(..)) import Run.Functions (getFunctionFromId, getFuncTypeFromId) import Run.Stack (Stack, stackPush, stackPop, stackTop, pushResults) +goToEndInstruction :: CurrentExec -> CurrentExec +goToEndInstruction cexec + | ceInstIdx cexec >= length (ceInstructions cexec) = + throw $ WasmError "goToEndInstruction: missing end instruction" + | currentOpCode == End = cexec { ceInstIdx = (ceInstIdx cexec) } + | otherwise = goToEndInstruction (incrementInstIdx cexec) + where + currentOpCode = (ceInstructions cexec) !! (ceInstIdx cexec) + execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec execOpCode _ cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } execOpCode _ cEx (Block _) = cEx { crBlockIndents = (crBlockIndents cEx) + 1 } @@ -32,6 +41,12 @@ execOpCode _ cEx (I32Eqz) = do I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } _ -> throw $ WasmError "exec I32eqz: bad type" +execOpCode _ cEx (I32Eq) = do + let (value2, newStack1) = stackPop (ceStack cEx) + let (value1, newStack2) = stackPop newStack1 + case (value1, value2) of + (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (if val1 == val2 then 1 else 0)) } + _ -> throw $ WasmError "exec I32Eq: bad type" execOpCode _ cEx (I32Add) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 @@ -57,11 +72,9 @@ execOpCode _ cEx (I32Divs) = do (I_32 _, I_32 0) -> throw $ WasmError "exec I32Divs: division by zero" (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 `div` val2)) } _ -> throw $ WasmError "exec I32Divs: bad type" -execOpCode _ cEx (BrIf labelIdx) = do - let (value, newStack) = stackPop (ceStack cEx) - case value of +execOpCode _ cEx (BrIf labelIdx) = case stackTop (ceStack cEx) of I_32 0 -> cEx - I_32 _ -> cEx { ceStack = newStack, ceInstIdx = (fromIntegral labelIdx) } + I_32 _ -> cEx { ceInstIdx = (fromIntegral labelIdx) } _ -> throw $ WasmError "exec brIf: bad type" execOpCode vm cEx (Call funcIdx) = do let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) @@ -77,6 +90,11 @@ execOpCode _ cEx (SetLocal localIdx) = do let (value, newStack) = stackPop (ceStack cEx) let newLocals = setLocalWithId 0 (ceLocals cEx) value localIdx cEx { ceStack = newStack, ceLocals = newLocals } +execOpCode _ cEx (If) = case stackTop (ceStack cEx) of + I_32 0 -> goToEndInstruction cEx + I_32 1 -> cEx { crBlockIndents = (crBlockIndents cEx) + 1 } + I_32 _ -> throw $ WasmError "execOpCode: bad if statement" + _ -> throw $ WasmError "execOpCode: bad type" execOpCode _ cEx _ = cEx execOpCodes :: VM -> [Instruction] -> CurrentExec @@ -85,6 +103,7 @@ execOpCodes vm instructions | ceInstIdx cEx >= length instructions = cEx | ceInstIdx cEx < 0 = throw $ WasmError "execOpCodes: bad index" | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx + | (instructions !! ceInstIdx cEx) == Return = cEx { ceInstIdx = (length instructions) } | otherwise = do let newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) let newVm = vm { currentExec = (incrementInstIdx newCEx) } diff --git a/lvtrun/src/Types.hs b/lvtrun/src/Types.hs index d50db7a..6807b19 100644 --- a/lvtrun/src/Types.hs +++ b/lvtrun/src/Types.hs @@ -123,6 +123,7 @@ data Instruction = | I32Ne | LocalTee LocalIdx | BrIf LabelIdx + | If | Br LabelIdx | Block BlockType | End @@ -157,12 +158,13 @@ instance Show Instruction where show I32Eqz = "\n\t\t\t\ti32.eqz" show I32Gts = "\n\t\t\t\ti32.gt_s" show I32Les = "\n\t\t\t\ti32.le_s" - show I32Eq = "\n\t\t\t\ti32.eq" show I32Ne = "\n\t\t\t\ti32.ne" show I32Ges = "\n\t\t\t\ti32.ge_s" show I32Lts = "\n\t\t\t\ti32.lt_s" show I32Gtu = "\n\t\t\t\ti32.gt_u" show I32Leu = "\n\t\t\t\ti32.le_u" + show If = "\n\t\t\t\tif" + show I32Eq = "\n\t\t\t\ti32.eq" show (LocalTee idx) = "\n\t\t\t\tlocal.tee " ++ (show idx) show (BrIf idx) = "\n\t\t\t\tbr_if " ++ (show idx) show (Br idx) = "\n\t\t\t\tbr " ++ (show idx) diff --git a/lvtrun/test/conditionReturn5.wasm b/lvtrun/test/conditionReturn5.wasm new file mode 100644 index 0000000000000000000000000000000000000000..fc7866df77a5fd9c8b2495d4e555bd2dd8520991 GIT binary patch literal 227 zcmXxdI}XAy41i%fkEV$$g(KKEp$i~{khnp+0$tkfIT3fnL!Iffe@lURTMz({+~iur zHUTz2kgkr0(Ia5W7`J_1cPQnD)B^+KyB_!$zJ|qcG29Gy!^7}2Tr0hBXk!)6USNz8 oI0%j)k)t@BJN>si1xcL3S?_x8#gT^0$XP?-q9F<~X<%3B53T|h7ytkO literal 0 HcmV?d00001 diff --git a/lvtrun/test/factorial.wasm b/lvtrun/test/factorial.wasm new file mode 100644 index 0000000000000000000000000000000000000000..013c6a16d95150dcd1c8ec6f86427c49a687a86c GIT binary patch literal 235 zcmXxeNe;p=3AG_Q^@ZjTkoWP%|yJF)-2~T}^k%NY8x?dzg~F)DP Date: Sun, 14 Jan 2024 17:07:01 +0100 Subject: [PATCH 83/99] Add webrunner --- .github/workflows/documentation.yml | 4 ++++ docs/OnlineVm.md | 0 docs/SUMMARY.md | 1 + lvtext/webrunner/README.md | 5 +++++ lvtext/webrunner/index.html | 30 +++++++++++++++++++++++++++++ 5 files changed, 40 insertions(+) create mode 100644 docs/OnlineVm.md create mode 100644 lvtext/webrunner/README.md create mode 100644 lvtext/webrunner/index.html diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 017b93a..1e271e0 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -48,6 +48,10 @@ jobs: if: steps.filter.outputs.docs == 'true' || steps.filter.outputs.docs2 == 'true' || steps.filter.outputs.workflow == 'true' || github.ref == 'refs/heads/main' run: mdbook build + - name: Copy OnlineRunner + if: steps.filter.outputs.docs == 'true' || steps.filter.outputs.docs2 == 'true' || steps.filter.outputs.workflow == 'true' || github.ref == 'refs/heads/main' + run: cp ./lvtext/webrunner/index.html ./book/OnlineVm.html + - name: Setup Pages if: github.ref == 'refs/heads/main' uses: actions/configure-pages@v3 diff --git a/docs/OnlineVm.md b/docs/OnlineVm.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 66ef4de..5da47ff 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -8,3 +8,4 @@ made in Haskell. [Byte Code Spec Ex](ByteCodeSpecEx.md) [Syntax Highlighting Extension](SyntaxHighlighting.md) [BNF](BNF.md) +[Online VM](OnlineVM.md) diff --git a/lvtext/webrunner/README.md b/lvtext/webrunner/README.md new file mode 100644 index 0000000..eb878b7 --- /dev/null +++ b/lvtext/webrunner/README.md @@ -0,0 +1,5 @@ +# WebRunner + +A simple static site that load a wasm and call the `start` exported function. + + diff --git a/lvtext/webrunner/index.html b/lvtext/webrunner/index.html new file mode 100644 index 0000000..1b5252e --- /dev/null +++ b/lvtext/webrunner/index.html @@ -0,0 +1,30 @@ + + Leviator Web Runner + + +

    Leviator Web Runner

    + online docs

    + + + +

    Output:

    +
    + + + From 9c70d16f4aba84e04a862762663a35de725dee1e Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Sun, 14 Jan 2024 17:09:36 +0100 Subject: [PATCH 84/99] Fix docs --- .github/workflows/documentation.yml | 2 +- docs/{OnlineVm.md => OnlineVM.md} | 0 lvtext/webrunner/README.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/{OnlineVm.md => OnlineVM.md} (100%) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 1e271e0..278597a 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -50,7 +50,7 @@ jobs: - name: Copy OnlineRunner if: steps.filter.outputs.docs == 'true' || steps.filter.outputs.docs2 == 'true' || steps.filter.outputs.workflow == 'true' || github.ref == 'refs/heads/main' - run: cp ./lvtext/webrunner/index.html ./book/OnlineVm.html + run: cp ./lvtext/webrunner/index.html ./book/OnlineVM.html - name: Setup Pages if: github.ref == 'refs/heads/main' diff --git a/docs/OnlineVm.md b/docs/OnlineVM.md similarity index 100% rename from docs/OnlineVm.md rename to docs/OnlineVM.md diff --git a/lvtext/webrunner/README.md b/lvtext/webrunner/README.md index eb878b7..6b137da 100644 --- a/lvtext/webrunner/README.md +++ b/lvtext/webrunner/README.md @@ -2,4 +2,4 @@ A simple static site that load a wasm and call the `start` exported function. - + From cd28dee40999a65a3b95208148fa76da229baf00 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 17:25:45 +0100 Subject: [PATCH 85/99] clean code --- lvtrun/app/Loader.hs | 8 ++--- lvtrun/app/Main.hs | 7 +++-- lvtrun/src/IO.hs | 1 + lvtrun/src/Leb128.hs | 16 +++++----- lvtrun/src/OpCodes.hs | 10 +++--- lvtrun/src/Parsing/Code.hs | 64 +++++++++++++++++++------------------- lvtrun/src/Run/Vm.hs | 26 ++++++++-------- 7 files changed, 67 insertions(+), 65 deletions(-) diff --git a/lvtrun/app/Loader.hs b/lvtrun/app/Loader.hs index f3ae24d..728c60c 100644 --- a/lvtrun/app/Loader.hs +++ b/lvtrun/app/Loader.hs @@ -14,10 +14,10 @@ where import System.Environment (getArgs) import Control.Exception (throw) -import Parsing.Parser -import Types -import IO -import Errors +import Types (WasmModule) +import IO (getFileContent) +import Parsing.Parser (parseModule) +import Errors (CustomException(..)) getFilePath :: IO String getFilePath = getArgs >>= \args -> diff --git a/lvtrun/app/Main.hs b/lvtrun/app/Main.hs index a21b372..aff4e51 100644 --- a/lvtrun/app/Main.hs +++ b/lvtrun/app/Main.hs @@ -8,9 +8,10 @@ module Main (main) where import Control.Exception (try) -import Errors -import Loader -import Run.Start + +import Loader (loadModule) +import Errors (handleException) +import Run.Start (startExecution) main :: IO () main = try (startExecution =<< loadModule) >>= \result -> diff --git a/lvtrun/src/IO.hs b/lvtrun/src/IO.hs index be57a5c..e3edcd5 100644 --- a/lvtrun/src/IO.hs +++ b/lvtrun/src/IO.hs @@ -12,6 +12,7 @@ module IO where import qualified Data.ByteString.Lazy as BSL (readFile) + import Types getFileContent :: String -> IO FileContent diff --git a/lvtrun/src/Leb128.hs b/lvtrun/src/Leb128.hs index fdbb51e..a31bb45 100644 --- a/lvtrun/src/Leb128.hs +++ b/lvtrun/src/Leb128.hs @@ -12,9 +12,9 @@ module Leb128 ) where -import Data.Binary.Get -import Data.Bits import Data.Int (Int64, Int32) +import Data.Binary.Get (Get, getWord8, runGet) +import Data.Bits ((.&.), (.|.), shiftL, testBit) import qualified Data.ByteString.Lazy as BS (ByteString, drop) --------------------- TO INT64 --------------------- @@ -30,9 +30,9 @@ getLEB128ToI64' = do False -> return (value, 1) getLEB128ToI64 :: BS.ByteString -> (Int64, BS.ByteString) -getLEB128ToI64 bytes = do - let (value, size) = runGet getLEB128ToI64' bytes - (value, BS.drop size bytes) +getLEB128ToI64 bytes = (value, BS.drop size bytes) + where + (value, size) = runGet getLEB128ToI64' bytes --------------------- TO INT32 --------------------- @@ -47,6 +47,6 @@ getLEB128ToI32' = do False -> return (value, 1) getLEB128ToI32 :: BS.ByteString -> (Int32, BS.ByteString) -getLEB128ToI32 bytes = do - let (value, size) = runGet getLEB128ToI32' bytes - (value, BS.drop size bytes) +getLEB128ToI32 bytes = (value, BS.drop size bytes) + where + (value, size) = runGet getLEB128ToI32' bytes diff --git a/lvtrun/src/OpCodes.hs b/lvtrun/src/OpCodes.hs index 4ccd4ae..35a6428 100644 --- a/lvtrun/src/OpCodes.hs +++ b/lvtrun/src/OpCodes.hs @@ -12,13 +12,13 @@ module OpCodes ) where -import qualified Data.ByteString.Lazy as BSL -import Control.Exception (throw) import Data.Word (Word8) +import Control.Exception (throw) +import qualified Data.ByteString.Lazy as BSL -import Leb128 -import Types -import Errors +import Errors (CustomException(..)) +import Leb128 (getLEB128ToI32, getLEB128ToI64) +import Types (Instruction(..), MemArg(..), BlockType(..)) extractOpCode :: BSL.ByteString -> ([Word8], BSL.ByteString) extractOpCode bytes = case BSL.unpack bytes of diff --git a/lvtrun/src/Parsing/Code.hs b/lvtrun/src/Parsing/Code.hs index d79411f..21b1d5b 100644 --- a/lvtrun/src/Parsing/Code.hs +++ b/lvtrun/src/Parsing/Code.hs @@ -11,22 +11,23 @@ module Parsing.Code ) where -import qualified Data.ByteString.Lazy as BSL -import Control.Exception (throw) import Data.Int (Int64) +import Control.Exception (throw) +import Control.Monad (when) +import qualified Data.ByteString.Lazy as BSL -import Leb128 import Types -import Errors -import OpCodes +import Leb128 (getLEB128ToI64) +import Errors (CustomException(..)) +import OpCodes (extractOpCode, createInstruction) diviseBytes :: BSL.ByteString -> [BSL.ByteString] diviseBytes bytes | BSL.length bytes == 0 = [] - | otherwise = do - let (size, rest) = getLEB128ToI64 bytes - let (code, rest2) = BSL.splitAt size rest - code : diviseBytes rest2 + | otherwise = code : diviseBytes rest2 + where + (size, rest) = getLEB128ToI64 bytes + (code, rest2) = BSL.splitAt size rest createLocal :: LocalIdx -> TypeName -> Local createLocal idx typee = Local {lcIdx = idx, lcType = typee} @@ -34,43 +35,42 @@ createLocal idx typee = Local {lcIdx = idx, lcType = typee} extractLocal :: Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) extractLocal id bytes | BSL.length bytes == 0 = throw $ WasmError "extractLocal: bad section" - | otherwise = do - let (nbOfThisType, rest) = getLEB128ToI64 bytes - let typee = getTypeFromByte (head (BSL.unpack (BSL.take 1 rest))) - let locals = map (\x -> createLocal (fromIntegral id) typee) [0..nbOfThisType - 1] - (locals, BSL.drop 1 rest) + | otherwise = (locals, BSL.drop 1 rest) + where + (nbOfThisType, rest) = getLEB128ToI64 bytes + typee = getTypeFromByte (head (BSL.unpack (BSL.take 1 rest))) + locals = map (\x -> createLocal (fromIntegral id) typee) [0..nbOfThisType - 1] extractLocals :: Int64 -> Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) extractLocals id idMax bytes | id >= idMax = ([], bytes) | BSL.length bytes == 0 = ([], bytes) - | otherwise = do - let (local, rest) = extractLocal id bytes - let (locals, rest2) = extractLocals (id + 1) idMax rest - (local ++ locals, rest2) + | otherwise = (local ++ locals, rest2) + where + (local, rest) = extractLocal id bytes + (locals, rest2) = extractLocals (id + 1) idMax rest ------------------------- parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) parseInstruction bytes | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" - | otherwise = do - let (opCode, rest) = extractOpCode bytes - let (instruction, rest2) = createInstruction opCode rest - (instruction, rest2) + | otherwise = createInstruction opCode rest + where + (opCode, rest) = extractOpCode bytes extractCode :: BSL.ByteString -> [Instruction] extractCode bytes | BSL.length bytes == 0 = [] - | otherwise = do - let (instruction, rest) = parseInstruction bytes - instruction : extractCode rest + | otherwise = instruction : extractCode rest + where + (instruction, rest) = parseInstruction bytes parseFunction :: BSL.ByteString -> Function -> Function -parseFunction bytes func = do - let (nbLocalsTypes, rest) = getLEB128ToI64 bytes - let (locals, rest2) = extractLocals 0 nbLocalsTypes rest - func {locals = locals, body = extractCode rest2} +parseFunction bytes func = func {locals = lcals, body = extractCode rest2} + where + (nbLocalsTypes, rest) = getLEB128ToI64 bytes + (lcals, rest2) = extractLocals 0 nbLocalsTypes rest parseFunctions :: [BSL.ByteString] -> [Function] -> [Function] parseFunctions [] [] = [] @@ -82,7 +82,7 @@ getFuncCode :: Section -> [Function] -> [Function] getFuncCode (Section CodeID _ content) functions = do let (nbFunc, rest) = getLEB128ToI64 content let funcCodes = diviseBytes rest - if (fromIntegral nbFunc) /= length functions - then throw $ WasmError "getFuncCode: bad section" - else parseFunctions funcCodes functions + when (nbFunc /= fromIntegral (length funcCodes)) $ + throw $ WasmError "getFuncCode: bad section" + parseFunctions funcCodes functions getFuncCode _ _ = throw $ WasmError "getFuncCode: bad section" diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index 75461af..c7d1720 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -26,7 +26,7 @@ import Run.Stack (Stack, stackPush, stackPop, stackTop, pushResults) goToEndInstruction :: CurrentExec -> CurrentExec goToEndInstruction cexec | ceInstIdx cexec >= length (ceInstructions cexec) = - throw $ WasmError "goToEndInstruction: missing end instruction" + throw $ RuntimeError "goToEndInstruction: missing end instruction" | currentOpCode == End = cexec { ceInstIdx = (ceInstIdx cexec) } | otherwise = goToEndInstruction (incrementInstIdx cexec) where @@ -40,49 +40,49 @@ execOpCode _ cEx (I32Eqz) = do case value of I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } - _ -> throw $ WasmError "exec I32eqz: bad type" + _ -> throw $ RuntimeError "exec I32eqz: bad type" execOpCode _ cEx (I32Eq) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (if val1 == val2 then 1 else 0)) } - _ -> throw $ WasmError "exec I32Eq: bad type" + _ -> throw $ RuntimeError "exec I32Eq: bad type" execOpCode _ cEx (I32Add) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } - _ -> throw $ WasmError "exec I32Add: bad type" + _ -> throw $ RuntimeError "exec I32Add: bad type" execOpCode _ cEx (I32Sub) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } - _ -> throw $ WasmError "exec I32Sub: bad type" + _ -> throw $ RuntimeError "exec I32Sub: bad type" execOpCode _ cEx (I32Mul) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 * val2)) } - _ -> throw $ WasmError "exec I32Mul: bad type" + _ -> throw $ RuntimeError "exec I32Mul: bad type" execOpCode _ cEx (I32Divs) = do let (value2, newStack1) = stackPop (ceStack cEx) let (value1, newStack2) = stackPop newStack1 case (value1, value2) of - (I_32 _, I_32 0) -> throw $ WasmError "exec I32Divs: division by zero" + (I_32 _, I_32 0) -> throw $ RuntimeError "exec I32Divs: division by zero" (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 `div` val2)) } - _ -> throw $ WasmError "exec I32Divs: bad type" + _ -> throw $ RuntimeError "exec I32Divs: bad type" execOpCode _ cEx (BrIf labelIdx) = case stackTop (ceStack cEx) of I_32 0 -> cEx I_32 _ -> cEx { ceInstIdx = (fromIntegral labelIdx) } - _ -> throw $ WasmError "exec brIf: bad type" + _ -> throw $ RuntimeError "exec brIf: bad type" execOpCode vm cEx (Call funcIdx) = do let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) cEx { ceStack = newStack } execOpCode _ cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } execOpCode _ cEx (Return) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } -execOpCode _ cEx (Unreachable) = throw $ WasmError "execOpCode: unreachable" +execOpCode _ cEx (Unreachable) = throw $ RuntimeError "execOpCode: unreachable" execOpCode _ cEx (GetLocal localIdx) = do let value = getLocalFromId (ceLocals cEx) localIdx cEx { ceStack = stackPush (ceStack cEx) value } @@ -93,15 +93,15 @@ execOpCode _ cEx (SetLocal localIdx) = do execOpCode _ cEx (If) = case stackTop (ceStack cEx) of I_32 0 -> goToEndInstruction cEx I_32 1 -> cEx { crBlockIndents = (crBlockIndents cEx) + 1 } - I_32 _ -> throw $ WasmError "execOpCode: bad if statement" - _ -> throw $ WasmError "execOpCode: bad type" + I_32 _ -> throw $ RuntimeError "execOpCode: bad if statement" + _ -> throw $ RuntimeError "execOpCode: bad type" execOpCode _ cEx _ = cEx execOpCodes :: VM -> [Instruction] -> CurrentExec execOpCodes vm [] = currentExec vm execOpCodes vm instructions | ceInstIdx cEx >= length instructions = cEx - | ceInstIdx cEx < 0 = throw $ WasmError "execOpCodes: bad index" + | ceInstIdx cEx < 0 = throw $ RuntimeError "execOpCodes: bad index" | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx | (instructions !! ceInstIdx cEx) == Return = cEx { ceInstIdx = (length instructions) } | otherwise = do From 139245b8b2d94de06a95a0210b2d84699a94e80f Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 17:41:33 +0100 Subject: [PATCH 86/99] split opcode --- lvtrun/src/OpCodes.hs | 138 ++++++++++++++++++++-------------- lvtrun/src/Parsing/Exports.hs | 19 +++-- 2 files changed, 89 insertions(+), 68 deletions(-) diff --git a/lvtrun/src/OpCodes.hs b/lvtrun/src/OpCodes.hs index 35a6428..a8788da 100644 --- a/lvtrun/src/OpCodes.hs +++ b/lvtrun/src/OpCodes.hs @@ -20,49 +20,51 @@ import Errors (CustomException(..)) import Leb128 (getLEB128ToI32, getLEB128ToI64) import Types (Instruction(..), MemArg(..), BlockType(..)) +extractOpCode' :: [Word8] -> ([Word8], BSL.ByteString) +extractOpCode' (0x03:rest) = ([0x03], BSL.pack rest) +extractOpCode' (0x11:rest) = ([0x11], BSL.pack rest) +extractOpCode' (0x00:rest) = ([0x00], BSL.pack rest) +extractOpCode' (0x0b:rest) = ([0x0b], BSL.pack rest) +extractOpCode' (0x0d:rest) = ([0x0d], BSL.pack rest) +extractOpCode' (0x0c:rest) = ([0x0c], BSL.pack rest) +extractOpCode' (0x02:rest) = ([0x02], BSL.pack rest) +extractOpCode' (0x01:rest) = ([0x01], BSL.pack rest) +extractOpCode' (0x0f:rest) = ([0x0f], BSL.pack rest) +extractOpCode' (0x10:rest) = ([0x10], BSL.pack rest) +extractOpCode' (0x41:rest) = ([0x41], BSL.pack rest) +extractOpCode' (0x42:rest) = ([0x42], BSL.pack rest) +extractOpCode' (0x6c:rest) = ([0x6c], BSL.pack rest) +extractOpCode' (0x6d:rest) = ([0x6d], BSL.pack rest) +extractOpCode' (0x43:rest) = ([0x43], BSL.pack rest) +extractOpCode' (0x44:rest) = ([0x44], BSL.pack rest) +extractOpCode' (0x28:rest) = ([0x28], BSL.pack rest) +extractOpCode' (0x29:rest) = ([0x29], BSL.pack rest) +extractOpCode' (0x22:rest) = ([0x22], BSL.pack rest) +extractOpCode' (0x36:rest) = ([0x36], BSL.pack rest) +extractOpCode' (0x37:rest) = ([0x37], BSL.pack rest) +extractOpCode' (0x4b:rest) = ([0x4b], BSL.pack rest) +extractOpCode' (0x20:rest) = ([0x20], BSL.pack rest) +extractOpCode' (0x4d:rest) = ([0x4d], BSL.pack rest) +extractOpCode' (0x21:rest) = ([0x21], BSL.pack rest) +extractOpCode' (0x23:rest) = ([0x23], BSL.pack rest) +extractOpCode' (0x24:rest) = ([0x24], BSL.pack rest) +extractOpCode' (0x6a:rest) = ([0x6a], BSL.pack rest) +extractOpCode' (0x6b:rest) = ([0x6b], BSL.pack rest) +extractOpCode' (0x45:rest) = ([0x45], BSL.pack rest) +extractOpCode' (0x46:rest) = ([0x46], BSL.pack rest) +extractOpCode' (0x71:rest) = ([0x71], BSL.pack rest) +extractOpCode' (0x48:rest) = ([0x48], BSL.pack rest) +extractOpCode' (0x4a:rest) = ([0x4a], BSL.pack rest) +extractOpCode' (0x4c:rest) = ([0x4c], BSL.pack rest) +extractOpCode' (0x4e:rest) = ([0x4e], BSL.pack rest) +extractOpCode' (0x47:rest) = ([0x47], BSL.pack rest) +extractOpCode' (0x3f:0x00:rest) = ([0x3f, 0x00], BSL.pack rest) +extractOpCode' (0x40:0x00:rest) = ([0x40, 0x00], BSL.pack rest) +extractOpCode' (0x04:0x40:rest) = ([0x04, 0x40], BSL.pack rest) +extractOpCode' _ = throw $ WasmError "ExtractOpCode: bad opcode" + extractOpCode :: BSL.ByteString -> ([Word8], BSL.ByteString) -extractOpCode bytes = case BSL.unpack bytes of - 0x03 : rest -> ([0x03], BSL.pack rest) - 0x11 : rest -> ([0x11], BSL.pack rest) - 0x00 : rest -> ([0x00], BSL.pack rest) - 0x0b : rest -> ([0x0b], BSL.pack rest) - 0x0d : rest -> ([0x0d], BSL.pack rest) - 0x0c : rest -> ([0x0c], BSL.pack rest) - 0x02 : rest -> ([0x02], BSL.pack rest) - 0x01 : rest -> ([0x01], BSL.pack rest) - 0x0f : rest -> ([0x0f], BSL.pack rest) - 0x10 : rest -> ([0x10], BSL.pack rest) - 0x41 : rest -> ([0x41], BSL.pack rest) - 0x42 : rest -> ([0x42], BSL.pack rest) - 0x6c : rest -> ([0x6c], BSL.pack rest) - 0x6d : rest -> ([0x6d], BSL.pack rest) - 0x43 : rest -> ([0x43], BSL.pack rest) - 0x44 : rest -> ([0x44], BSL.pack rest) - 0x28 : rest -> ([0x28], BSL.pack rest) - 0x29 : rest -> ([0x29], BSL.pack rest) - 0x22 : rest -> ([0x22], BSL.pack rest) - 0x36 : rest -> ([0x36], BSL.pack rest) - 0x37 : rest -> ([0x37], BSL.pack rest) - 0x4b : rest -> ([0x4b], BSL.pack rest) - 0x20 : rest -> ([0x20], BSL.pack rest) - 0x4d : rest -> ([0x4d], BSL.pack rest) - 0x21 : rest -> ([0x21], BSL.pack rest) - 0x23 : rest -> ([0x23], BSL.pack rest) - 0x24 : rest -> ([0x24], BSL.pack rest) - 0x6a : rest -> ([0x6a], BSL.pack rest) - 0x6b : rest -> ([0x6b], BSL.pack rest) - 0x45 : rest -> ([0x45], BSL.pack rest) - 0x46 : rest -> ([0x46], BSL.pack rest) - 0x71 : rest -> ([0x00], BSL.pack rest) - 0x48 : rest -> ([0x48], BSL.pack rest) - 0x4a : rest -> ([0x4a], BSL.pack rest) - 0x4c : rest -> ([0x4c], BSL.pack rest) - 0x4e : rest -> ([0x4e], BSL.pack rest) - 0x47 : rest -> ([0x47], BSL.pack rest) - 0x3f : 0x00 : rest -> ([0x3f, 0x00], BSL.pack rest) - 0x40 : 0x00 : rest -> ([0x40, 0x00], BSL.pack rest) - 0x04 : 0x40 : rest -> ([0x04, 0x40], BSL.pack rest) - _ -> throw $ WasmError "ExtractOpCode: bad opcode" +extractOpCode bytes = extractOpCode' (BSL.unpack bytes) createInstruction :: [Word8] -> BSL.ByteString -> (Instruction, BSL.ByteString) createInstruction [0x03] bytes = (Nop, bytes) @@ -89,20 +91,40 @@ createInstruction [0x71] bytes = (I32And, bytes) createInstruction [0x04, 0x40] bytes = (If, bytes) createInstruction [0x3f, 0x00] bytes = (MemorySize, bytes) createInstruction [0x40, 0x00] bytes = (MemoryGrow, bytes) -createInstruction [0x0d] bytes = (\(value, rest) -> (BrIf value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x0c] bytes = (\(value, rest) -> (Br value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x22] bytes = (\(value, rest) -> (LocalTee value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x10] bytes = (\(value, rest) -> (Call value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x41] bytes = (\(value, rest) -> (I32Const value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x42] bytes = (\(value, rest) -> (I64Const value, rest)) (getLEB128ToI64 bytes) -createInstruction [0x43] bytes = (\(value, rest) -> (F32Const (fromIntegral value), rest)) (getLEB128ToI32 bytes) -createInstruction [0x20] bytes = (\(value, rest) -> (GetLocal value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x24] bytes = (\(value, rest) -> (SetGlobal value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x23] bytes = (\(value, rest) -> (GetGlobal value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x21] bytes = (\(value, rest) -> (SetLocal value, rest)) (getLEB128ToI32 bytes) -createInstruction [0x44] bytes = (\(value, rest) -> (F64Const (fromIntegral value), rest)) (getLEB128ToI64 bytes) -createInstruction [0x28] bytes = (\(align, rest) -> (\(offset, rest2) -> (I32Load (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) -createInstruction [0x29] bytes = (\(align, rest) -> (\(offset, rest2) -> (I64Load (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) -createInstruction [0x36] bytes = (\(align, rest) -> (\(offset, rest2) -> (I32Store (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) -createInstruction [0x37] bytes = (\(align, rest) -> (\(offset, rest2) -> (I64Store (MemArg offset align), rest2)) (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x0d] bytes = (\(value, rest) -> + (BrIf value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x0c] bytes = (\(value, rest) -> + (Br value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x22] bytes = (\(value, rest) -> + (LocalTee value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x10] bytes = (\(value, rest) -> + (Call value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x41] bytes = (\(value, rest) -> + (I32Const value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x42] bytes = (\(value, rest) -> + (I64Const value, rest)) (getLEB128ToI64 bytes) +createInstruction [0x43] bytes = (\(value, rest) -> + (F32Const (fromIntegral value), rest)) (getLEB128ToI32 bytes) +createInstruction [0x20] bytes = (\(value, rest) -> + (GetLocal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x24] bytes = (\(value, rest) -> + (SetGlobal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x23] bytes = (\(value, rest) -> + (GetGlobal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x21] bytes = (\(value, rest) -> + (SetLocal value, rest)) (getLEB128ToI32 bytes) +createInstruction [0x44] bytes = (\(value, rest) -> + (F64Const (fromIntegral value), rest)) (getLEB128ToI64 bytes) +createInstruction [0x28] bytes = (\(align, rest) -> + (\(offset, rest2) -> (I32Load (MemArg offset align), rest2)) + (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x29] bytes = (\(align, rest) -> + (\(offset, rest2) -> (I64Load (MemArg offset align), rest2)) + (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x36] bytes = (\(align, rest) -> + (\(offset, rest2) -> (I32Store (MemArg offset align), rest2)) + (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) +createInstruction [0x37] bytes = (\(align, rest) -> + (\(offset, rest2) -> (I64Store (MemArg offset align), rest2)) + (getLEB128ToI32 rest)) (getLEB128ToI32 bytes) createInstruction _ _ = throw $ WasmError "createInstruction: bad instruction" diff --git a/lvtrun/src/Parsing/Exports.hs b/lvtrun/src/Parsing/Exports.hs index ea4c375..a0d28df 100644 --- a/lvtrun/src/Parsing/Exports.hs +++ b/lvtrun/src/Parsing/Exports.hs @@ -11,17 +11,16 @@ module Parsing.Exports ) where -import qualified Data.ByteString.Lazy as Bs -import Control.Exception (throw) -import Data.Int (Int64, Int32) -import Data.Word (Word8) -import Numeric (showHex) import Data.Char (chr) +import Data.Word (Word8) import Control.Monad (when) +import Data.Int (Int64, Int32) +import Control.Exception (throw) +import qualified Data.ByteString.Lazy as Bs -import Leb128 -import Errors import Types +import Leb128 (getLEB128ToI64, getLEB128ToI32) +import Errors (CustomException(WasmError)) isExportValid :: Word8 -> Bool isExportValid 0x00 = True @@ -59,7 +58,7 @@ parseExports idx maxIdx content export : parseExports (idx + 1) maxIdx rest3 getExports :: Section -> [Export] -getExports (Section ExportID _ content) = do - let (exprtsNb, rest) = getExportNb content - parseExports 0 exprtsNb rest +getExports (Section ExportID _ content) = parseExports 0 exprtsNb rest + where + (exprtsNb, rest) = getExportNb content getExports _ = throw $ WasmError "getExports: bad section" From bbe24206cc9b58acdab1ce9ff0ab7c01cc56687c Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:03:18 +0100 Subject: [PATCH 87/99] clean code --- lvtrun/src/Parsing/Code.hs | 4 ++-- lvtrun/src/Parsing/FuncTypes.hs | 28 ++++++++++++------------- lvtrun/src/Parsing/Parser.hs | 12 ++++------- lvtrun/src/Parsing/Sections.hs | 37 ++++++++++++++++++--------------- lvtrun/src/Run/Locals.hs | 8 +++---- lvtrun/src/Run/Stack.hs | 8 +++---- lvtrun/src/Run/Types.hs | 20 ++++++------------ 7 files changed, 54 insertions(+), 63 deletions(-) diff --git a/lvtrun/src/Parsing/Code.hs b/lvtrun/src/Parsing/Code.hs index 21b1d5b..16b9e40 100644 --- a/lvtrun/src/Parsing/Code.hs +++ b/lvtrun/src/Parsing/Code.hs @@ -37,9 +37,9 @@ extractLocal id bytes | BSL.length bytes == 0 = throw $ WasmError "extractLocal: bad section" | otherwise = (locals, BSL.drop 1 rest) where - (nbOfThisType, rest) = getLEB128ToI64 bytes + (nb, rest) = getLEB128ToI64 bytes typee = getTypeFromByte (head (BSL.unpack (BSL.take 1 rest))) - locals = map (\x -> createLocal (fromIntegral id) typee) [0..nbOfThisType - 1] + locals = map (\x -> createLocal (fromIntegral id) typee) [0..nb - 1] extractLocals :: Int64 -> Int64 -> BSL.ByteString -> ([Local], BSL.ByteString) extractLocals id idMax bytes diff --git a/lvtrun/src/Parsing/FuncTypes.hs b/lvtrun/src/Parsing/FuncTypes.hs index 18c69eb..29110b5 100644 --- a/lvtrun/src/Parsing/FuncTypes.hs +++ b/lvtrun/src/Parsing/FuncTypes.hs @@ -11,38 +11,38 @@ module Parsing.FuncTypes ) where -import qualified Data.ByteString.Lazy as Bs -import Control.Exception (throw) import Data.Int (Int64, Int32) +import Control.Exception (throw) +import qualified Data.ByteString.Lazy as Bs +import Types import Leb128 (getLEB128ToI64) import Errors (CustomException(..)) -import Types (TypeName(..), FuncType(..), Section(..), SectionID(..), getTypeFromByte) getVectorSize :: Bs.ByteString -> (Int64, Bs.ByteString) getVectorSize content = getLEB128ToI64 content extractTypes :: (Int64, Bs.ByteString) -> ([TypeName], Bs.ByteString) extractTypes (0, content) = ([], content) -extractTypes (idx, content) = (getTypeFromByte (head $ Bs.unpack content) : types, rest) - where (types, rest) = extractTypes (idx - 1, Bs.drop 1 content) +extractTypes (idx, content) = + (getTypeFromByte (head $ Bs.unpack content) : types, rest) + where (types, rest) = extractTypes (idx - 1, Bs.drop 1 content) parseFuncType :: Int32 -> Bs.ByteString -> (FuncType, Bs.ByteString) -parseFuncType id content = - let (params, rest) = extractTypes (getVectorSize content) - (results, rest2) = extractTypes (getVectorSize rest) - in (FuncType id params results, rest2) +parseFuncType id content = (FuncType id params results, rest2) + where + (params, rest) = extractTypes (getVectorSize content) + (results, rest2) = extractTypes (getVectorSize rest) parseFuncTypes :: Int32 -> Int64 -> Bs.ByteString -> [FuncType] parseFuncTypes idx maxIdx content | idx >= (fromIntegral maxIdx) = [] - | head (Bs.unpack content) == 0x60 = do - let (funcType, rest) = parseFuncType idx (Bs.drop 1 content) + | head (Bs.unpack content) == 0x60 = funcType : parseFuncTypes (idx + 1) maxIdx rest | otherwise = throw $ WasmError "ParseFuncTypes: 0x60 expected for function" + where (funcType, rest) = parseFuncType idx (Bs.drop 1 content) getFuncTypes :: Section -> [FuncType] -getFuncTypes (Section TypeID _ content) = do - let (vecSize, rest) = getLEB128ToI64 content - parseFuncTypes 0 vecSize rest +getFuncTypes (Section TypeID _ content) = parseFuncTypes 0 vecSize rest + where (vecSize, rest) = getLEB128ToI64 content getFuncTypes _ = throw $ WasmError "getFuncTypes: bad section" diff --git a/lvtrun/src/Parsing/Parser.hs b/lvtrun/src/Parsing/Parser.hs index bf0b226..b379fd1 100644 --- a/lvtrun/src/Parsing/Parser.hs +++ b/lvtrun/src/Parsing/Parser.hs @@ -22,17 +22,13 @@ import qualified Parsing.Global as G import qualified Parsing.Code as C parseModule :: FileContent -> WasmModule -parseModule bytes = - WasmModule { +parseModule bytes = WasmModule { header = PH.getModHeader (S.getSectionWithId sections CustomID), types = FT.getFuncTypes (S.getSectionWithId sections TypeID), - imports = [], - functions = C.getFuncCode codeSection funcs, - tables = [], - globals = G.getGlobals (S.getSectionWithId sections GlobalID), + imports = [], functions = C.getFuncCode codeSection funcs, + tables = [], globals = G.getGlobals (S.getSectionWithId sections GlobalID), memory = M.getMemories (S.getSectionWithId sections MemoryID), - exports = E.getExports (S.getSectionWithId sections ExportID) - } + exports = E.getExports (S.getSectionWithId sections ExportID)} where sections = S.getSections bytes codeSection = S.getSectionWithId sections CodeID diff --git a/lvtrun/src/Parsing/Sections.hs b/lvtrun/src/Parsing/Sections.hs index 9c333d4..8fa167e 100644 --- a/lvtrun/src/Parsing/Sections.hs +++ b/lvtrun/src/Parsing/Sections.hs @@ -12,33 +12,36 @@ module Parsing.Sections ) where -import qualified Data.ByteString.Lazy as BSL (ByteString, length, unpack, take, drop, splitAt) +import Data.Word (Word8) import Control.Exception (throw) +import qualified Data.ByteString.Lazy as BSL -import Types (FileContent, Section(..), SectionID(..)) -import Errors (CustomException(..)) import Leb128 (getLEB128ToI64) +import Errors (CustomException(..)) +import Types (FileContent, Section(..), SectionID(..)) extractHeader :: BSL.ByteString -> (Section, BSL.ByteString) extractHeader bytes | (BSL.length bytes) < 8 = throw (WasmError "Invalid header") | otherwise = (Section CustomID 8 (BSL.take 8 bytes), BSL.drop 8 bytes) +getSectionId' :: Word8 -> SectionID +getSectionId' 0 = CustomID +getSectionId' 1 = TypeID +getSectionId' 2 = ImportID +getSectionId' 3 = FunctionID +getSectionId' 4 = TableID +getSectionId' 5 = MemoryID +getSectionId' 6 = GlobalID +getSectionId' 7 = ExportID +getSectionId' 8 = StartID +getSectionId' 9 = ElementID +getSectionId' 10 = CodeID +getSectionId' 11 = DataID +getSectionId' _ = throw (WasmError "Invalid section id") + getSectionId :: BSL.ByteString -> SectionID -getSectionId bytes = case head (BSL.unpack $ BSL.take 1 bytes) of - 0 -> CustomID - 1 -> TypeID - 2 -> ImportID - 3 -> FunctionID - 4 -> TableID - 5 -> MemoryID - 6 -> GlobalID - 7 -> ExportID - 8 -> StartID - 9 -> ElementID - 10 -> CodeID - 11 -> DataID - _ -> throw (WasmError "Invalid section id") +getSectionId bytes = getSectionId' (head (BSL.unpack bytes)) extractSection :: BSL.ByteString -> (Section, BSL.ByteString) extractSection bytes = (Section sectionId (fromIntegral size) content, rest2) diff --git a/lvtrun/src/Run/Locals.hs b/lvtrun/src/Run/Locals.hs index 9ab8a52..4c9c30f 100644 --- a/lvtrun/src/Run/Locals.hs +++ b/lvtrun/src/Run/Locals.hs @@ -78,10 +78,10 @@ initLocalsParams prms stack | otherwise = initLocalsParams' (stackPopN stack (length prms)) prms initLocals :: [Local] -> [TypeName] -> Stack -> (Locals, Stack) -initLocals localVarTypes paramTypes stack = do - let (newLocals, newStack) = initLocalsParams paramTypes stack - let localsVar = initLocalsVar newLocals localVarTypes - (newLocals ++ localsVar, newStack) +initLocals localVarTypes paramTypes stack = (newLocals ++ localsVar, newStack) + where + (newLocals, newStack) = initLocalsParams paramTypes stack + localsVar = initLocalsVar newLocals localVarTypes createEmptyLocals :: Locals -> [Local] -> Locals createEmptyLocals newLocals [] = newLocals diff --git a/lvtrun/src/Run/Stack.hs b/lvtrun/src/Run/Stack.hs index ec1953b..399b209 100644 --- a/lvtrun/src/Run/Stack.hs +++ b/lvtrun/src/Run/Stack.hs @@ -56,8 +56,8 @@ stackTop (x:_) = x stackPopN :: Stack -> Int -> ([Value], Stack) stackPopN stack 0 = ([], stack) stackPopN stack n - | n > 0 = do - let (value, newStack) = stackPop stack - let (values, finalStack) = stackPopN newStack (n - 1) - (value : values, finalStack) + | n > 0 = (value : values, finalStack) | otherwise = error "stackPopN: bad n" + where + (value, newStack) = stackPop stack + (values, finalStack) = stackPopN newStack (n - 1) diff --git a/lvtrun/src/Run/Types.hs b/lvtrun/src/Run/Types.hs index e444d2d..ddbb8da 100644 --- a/lvtrun/src/Run/Types.hs +++ b/lvtrun/src/Run/Types.hs @@ -45,21 +45,13 @@ data VM = VM { } deriving (Show) createVm :: WasmModule -> VM -createVm wasmMod = VM { - vmStack = [], - currentExec = CurrentExec { - ceLocals = [], - ceStack = [], - ceInstructions = [], - ceParams = [], - ceResults = [], - ceInstIdx = 0, - ceLabels = [], - crBlockIndents = 0 - }, +createVm wasmMod = VM { vmStack = [], + currentExec = CurrentExec { ceLocals = [], + ceStack = [], ceInstructions = [], + ceParams = [], ceResults = [], ceInstIdx = 0, + ceLabels = [], crBlockIndents = 0}, vmMemory = Memory { - memRange = Limit 0 Nothing, - memData = [] + memRange = Limit 0 Nothing, memData = [] }, wasmModule = wasmMod } From 2fa4b3af73bd527315126ab70834e78318384bfb Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:10:42 +0100 Subject: [PATCH 88/99] fix some norm error --- lvtrun/src/Parsing/Global.hs | 53 +++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/lvtrun/src/Parsing/Global.hs b/lvtrun/src/Parsing/Global.hs index 0d9cfe0..5842091 100644 --- a/lvtrun/src/Parsing/Global.hs +++ b/lvtrun/src/Parsing/Global.hs @@ -11,31 +11,32 @@ module Parsing.Global ) where -import qualified Data.ByteString.Lazy as BSL -import Control.Exception (throw) -import Data.Word (Word8) import Data.Int (Int64) +import Data.Word (Word8) +import Control.Exception (throw) +import qualified Data.ByteString.Lazy as BSL -import Leb128 import Types -import Errors -import OpCodes +import Errors (CustomException(..)) +import Leb128 (getLEB128ToI64) +import OpCodes (extractOpCode, createInstruction) parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) parseInstruction bytes - | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" - | otherwise = do - let (opCode, rest) = extractOpCode bytes - let (instruction, rest2) = createInstruction opCode rest - (instruction, rest2) + | BSL.length bytes == 0 = + throw $ WasmError "ParseInstruction: no instruction" + | otherwise = (instruction, rest2) + where + (opCode, rest) = extractOpCode bytes + (instruction, rest2) = createInstruction opCode rest parseInstructions :: BSL.ByteString -> [Instruction] parseInstructions bytes | BSL.length bytes == 0 = [] | head (BSL.unpack bytes) == 0x0b = [] - | otherwise = do - let (instruction, rest) = parseInstruction bytes - instruction : parseInstructions rest + | otherwise = instruction : parseInstructions rest + where + (instruction, rest) = parseInstruction bytes parseMutability :: Word8 -> Mutability parseMutability 0x00 = Const @@ -44,16 +45,17 @@ parseMutability _ = throw $ WasmError "ParseMutability: bad mutability" getHexaIndex :: BSL.ByteString -> Int64 -> Int64 getHexaIndex content idx - | idx >= (fromIntegral $ BSL.length content) = throw $ WasmError "GetHexaIndex: no 0x0b found" + | idx >= (fromIntegral $ BSL.length content) = + throw $ WasmError "GetHexaIndex: no 0x0b found" | (head $ BSL.unpack $ BSL.drop (fromIntegral idx) content) == 0x0b = idx | otherwise = getHexaIndex content (idx + 1) extractExpression :: BSL.ByteString -> (BSL.ByteString, BSL.ByteString) -extractExpression content = do - let idx = getHexaIndex content 0 - let expression = BSL.take (fromIntegral (idx + 1)) content - let rest = BSL.drop (fromIntegral (idx + 1)) content - (expression, rest) +extractExpression content = (expression, rest) + where + idx = getHexaIndex content 0 + expression = BSL.take (fromIntegral (idx + 1)) content + rest = BSL.drop (fromIntegral (idx + 1)) content parseGlobal :: BSL.ByteString -> (Global, BSL.ByteString) parseGlobal content = do @@ -66,12 +68,13 @@ parseGlobal content = do parseGlobals :: Int64 -> Int64 -> BSL.ByteString -> [Global] parseGlobals idx maxIdx content | idx >= maxIdx = [] - | otherwise = do - let (global, rest) = parseGlobal content - global : parseGlobals (idx + 1) maxIdx rest + | otherwise = global : parseGlobals (idx + 1) maxIdx rest + where + (global, rest) = parseGlobal content getGlobals :: Section -> [Global] -getGlobals (Section GlobalID _ content) = do - let (vecSize, rest) = getLEB128ToI64 content +getGlobals (Section GlobalID _ content) = parseGlobals 0 vecSize rest + where + (vecSize, rest) = getLEB128ToI64 content getGlobals _ = throw $ WasmError "getGlobals: bad section" From ab268b64fe6ded1bb29f8f0571ac671f56abfe24 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:18:17 +0100 Subject: [PATCH 89/99] fix some norm error --- lvtrun/src/Parsing/Code.hs | 3 ++- lvtrun/src/Parsing/Exports.hs | 17 +++++++---------- lvtrun/src/Parsing/Functions.hs | 5 ++--- lvtrun/src/Parsing/Parser.hs | 18 ++++++++---------- 4 files changed, 19 insertions(+), 24 deletions(-) diff --git a/lvtrun/src/Parsing/Code.hs b/lvtrun/src/Parsing/Code.hs index 16b9e40..ab9160b 100644 --- a/lvtrun/src/Parsing/Code.hs +++ b/lvtrun/src/Parsing/Code.hs @@ -54,7 +54,8 @@ extractLocals id idMax bytes parseInstruction :: BSL.ByteString -> (Instruction, BSL.ByteString) parseInstruction bytes - | BSL.length bytes == 0 = throw $ WasmError "ParseInstruction: no instruction" + | BSL.length bytes == 0 = + throw $ WasmError "ParseInstruction: no instruction" | otherwise = createInstruction opCode rest where (opCode, rest) = extractOpCode bytes diff --git a/lvtrun/src/Parsing/Exports.hs b/lvtrun/src/Parsing/Exports.hs index a0d28df..f2617d7 100644 --- a/lvtrun/src/Parsing/Exports.hs +++ b/lvtrun/src/Parsing/Exports.hs @@ -46,16 +46,13 @@ parseExports :: Int32 -> Int64 -> Bs.ByteString -> [Export] parseExports idx maxIdx content | idx >= (fromIntegral maxIdx) = [] | Bs.length content == 0 = [] - | otherwise = do - let (nameLen, rest) = getLEB128ToI64 content - when (nameLen == 0) (throw $ WasmError "parseExports: bad export") - when (Bs.length rest == 0) (throw $ WasmError "parseExports: bad export") - let (name, rest2) = Bs.splitAt nameLen rest - when (Bs.length rest2 == 0) (throw $ WasmError "parseExports: bad export") - let exportType = head (Bs.unpack rest2) - let (exportValue, rest3) = getLEB128ToI32 (Bs.drop 1 rest2) - let export = createExport (Bs.unpack name) exportType exportValue - export : parseExports (idx + 1) maxIdx rest3 + | otherwise = export : parseExports (idx + 1) maxIdx rest3 + where + (nameLen, rest) = getLEB128ToI64 content + (name, rest2) = Bs.splitAt nameLen rest + exportType = head (Bs.unpack rest2) + (exportValue, rest3) = getLEB128ToI32 (Bs.drop 1 rest2) + export = createExport (Bs.unpack name) exportType exportValue getExports :: Section -> [Export] getExports (Section ExportID _ content) = parseExports 0 exprtsNb rest diff --git a/lvtrun/src/Parsing/Functions.hs b/lvtrun/src/Parsing/Functions.hs index 15fa49f..f220956 100644 --- a/lvtrun/src/Parsing/Functions.hs +++ b/lvtrun/src/Parsing/Functions.hs @@ -32,7 +32,6 @@ parseFunctionsIndex idx maxIdx content where (typeIdx, rest) = getLEB128ToI32 content getFunctions :: Section -> [Function] -getFunctions (Section FunctionID _ content) = do - let (vecSize, rest) = getLEB128ToI64 content - parseFunctionsIndex 0 vecSize rest +getFunctions (Section FunctionID _ content) = parseFunctionsIndex 0 vecSize rest + where (vecSize, rest) = getLEB128ToI64 content getFunctions _ = throw $ WasmError "getFunctions: bad section" diff --git a/lvtrun/src/Parsing/Parser.hs b/lvtrun/src/Parsing/Parser.hs index b379fd1..cb81338 100644 --- a/lvtrun/src/Parsing/Parser.hs +++ b/lvtrun/src/Parsing/Parser.hs @@ -23,13 +23,11 @@ import qualified Parsing.Code as C parseModule :: FileContent -> WasmModule parseModule bytes = WasmModule { - header = PH.getModHeader (S.getSectionWithId sections CustomID), - types = FT.getFuncTypes (S.getSectionWithId sections TypeID), - imports = [], functions = C.getFuncCode codeSection funcs, - tables = [], globals = G.getGlobals (S.getSectionWithId sections GlobalID), - memory = M.getMemories (S.getSectionWithId sections MemoryID), - exports = E.getExports (S.getSectionWithId sections ExportID)} - where - sections = S.getSections bytes - codeSection = S.getSectionWithId sections CodeID - funcs = FN.getFunctions (S.getSectionWithId sections FunctionID) + header = PH.getModHeader (S.getSectionWithId sections CustomID), + types = FT.getFuncTypes (S.getSectionWithId sections TypeID), + imports = [], functions = C.getFuncCode (S.getSectionWithId sections CodeID) + (FN.getFunctions (S.getSectionWithId sections FunctionID)), + tables = [], globals = G.getGlobals (S.getSectionWithId sections GlobalID), + memory = M.getMemories (S.getSectionWithId sections MemoryID), + exports = E.getExports (S.getSectionWithId sections ExportID)} + where sections = S.getSections bytes From aacdacf520dcd80f7e4830d2367a398aab2b3de5 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:19:54 +0100 Subject: [PATCH 90/99] fix some norm error --- lvtrun/src/Parsing/Functions.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lvtrun/src/Parsing/Functions.hs b/lvtrun/src/Parsing/Functions.hs index f220956..1bb7c4b 100644 --- a/lvtrun/src/Parsing/Functions.hs +++ b/lvtrun/src/Parsing/Functions.hs @@ -32,6 +32,7 @@ parseFunctionsIndex idx maxIdx content where (typeIdx, rest) = getLEB128ToI32 content getFunctions :: Section -> [Function] -getFunctions (Section FunctionID _ content) = parseFunctionsIndex 0 vecSize rest +getFunctions (Section FunctionID _ content) = + parseFunctionsIndex 0 vecSize rest where (vecSize, rest) = getLEB128ToI64 content getFunctions _ = throw $ WasmError "getFunctions: bad section" From 905178f54e43840c85df225cb87d6221d89d4f8a Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:21:59 +0100 Subject: [PATCH 91/99] fix some norm error --- lvtrun/src/Parsing/Global.hs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lvtrun/src/Parsing/Global.hs b/lvtrun/src/Parsing/Global.hs index 5842091..81c6a76 100644 --- a/lvtrun/src/Parsing/Global.hs +++ b/lvtrun/src/Parsing/Global.hs @@ -58,12 +58,12 @@ extractExpression content = (expression, rest) rest = BSL.drop (fromIntegral (idx + 1)) content parseGlobal :: BSL.ByteString -> (Global, BSL.ByteString) -parseGlobal content = do - let globalType = getTypeFromByte (head $ BSL.unpack content) - let mutability = parseMutability (head $ BSL.unpack $ BSL.drop 1 content) - let (expression, rest) = extractExpression (BSL.drop 2 content) - let instructions = parseInstructions expression - (Global globalType mutability instructions, rest) +parseGlobal content = (Global globalType mutability instructions, rest) + where + globalType = getTypeFromByte (head $ BSL.unpack content) + mutability = parseMutability (head $ BSL.unpack $ BSL.drop 1 content) + (expression, rest) = extractExpression (BSL.drop 2 content) + instructions = parseInstructions expression parseGlobals :: Int64 -> Int64 -> BSL.ByteString -> [Global] parseGlobals idx maxIdx content From dd5b17a8768e5e9fdc7df3fe1718a004033bb212 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:24:21 +0100 Subject: [PATCH 92/99] fix some norm error --- lvtrun/src/Parsing/Code.hs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lvtrun/src/Parsing/Code.hs b/lvtrun/src/Parsing/Code.hs index ab9160b..12f992d 100644 --- a/lvtrun/src/Parsing/Code.hs +++ b/lvtrun/src/Parsing/Code.hs @@ -12,8 +12,8 @@ module Parsing.Code where import Data.Int (Int64) -import Control.Exception (throw) import Control.Monad (when) +import Control.Exception (throw) import qualified Data.ByteString.Lazy as BSL import Types @@ -80,10 +80,9 @@ parseFunctions _ [] = throw $ WasmError "parseFunctions: bad section" parseFunctions (x:xs) (y:ys) = parseFunction x y : parseFunctions xs ys getFuncCode :: Section -> [Function] -> [Function] -getFuncCode (Section CodeID _ content) functions = do - let (nbFunc, rest) = getLEB128ToI64 content - let funcCodes = diviseBytes rest - when (nbFunc /= fromIntegral (length funcCodes)) $ - throw $ WasmError "getFuncCode: bad section" +getFuncCode (Section CodeID _ content) functions = parseFunctions funcCodes functions + where + (nbFunc, rest) = getLEB128ToI64 content + funcCodes = diviseBytes rest getFuncCode _ _ = throw $ WasmError "getFuncCode: bad section" From 5be902296f8faa90650dce475f82a0b9b87ef8e6 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:39:21 +0100 Subject: [PATCH 93/99] fix some norm error --- lvtrun/src/Run/Types.hs | 15 ++++++++++- lvtrun/src/Run/Vm.hs | 56 ++++++++++++++++++----------------------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/lvtrun/src/Run/Types.hs b/lvtrun/src/Run/Types.hs index ddbb8da..8618365 100644 --- a/lvtrun/src/Run/Types.hs +++ b/lvtrun/src/Run/Types.hs @@ -11,7 +11,8 @@ module Run.Types InstMemory(..), VM(..), createVm, - incrementInstIdx + incrementInstIdx, + createEmptyExec ) where @@ -58,3 +59,15 @@ createVm wasmMod = VM { vmStack = [], incrementInstIdx :: CurrentExec -> CurrentExec incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } + +createEmptyExec :: CurrentExec +createEmptyExec = CurrentExec { + ceLocals = [], + ceStack = [], + ceInstructions = [], + ceInstIdx = 0, + ceLabels = [], + ceParams = [], + ceResults = [], + crBlockIndents = 0 +} diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index c7d1720..47811c5 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -111,40 +111,34 @@ execOpCodes vm instructions where cEx = currentExec vm execFunction :: VM -> VM -execFunction vm = do - let newCEx = execOpCodes vm (ceInstructions (currentExec vm)) - vm { currentExec = newCEx, vmStack = (pushResults (vmStack vm) (ceStack newCEx) (ceResults newCEx)) } +execFunction vm = vm { currentExec = newCEx, vmStack = stackWithRes } + where + newCEx = execOpCodes vm (ceInstructions (currentExec vm)) + stackWithRes = pushResults (vmStack vm) (ceStack newCEx) + (ceResults newCEx) execFunctionWithIdx :: VM -> FuncIdx -> Stack -> VM -execFunctionWithIdx vm funcIdx currentStack = do - let function = getFunctionFromId funcIdx (functions (wasmModule vm)) - let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) - let (newLocals, newStack) = initLocals (locals function) (params funcTypee) currentStack - let cexec = CurrentExec { - ceLocals = newLocals, - ceStack = newStack, - ceInstructions = body function, - ceInstIdx = 0, - ceLabels = [], - ceParams = params funcTypee, - ceResults = results funcTypee, - crBlockIndents = 0 - } +execFunctionWithIdx vm funcIdx currentStack = execFunction vm { currentExec = cexec } + where + function = getFunctionFromId funcIdx (functions (wasmModule vm)) + funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) + (newLocals, newStack) = + initLocals (locals function) (params funcTypee) currentStack + cexec = createEmptyExec { + ceLocals = newLocals, ceStack = newStack, ceInstructions = body function, + ceParams = params funcTypee, ceResults = results funcTypee} runMain :: VM -> FuncIdx -> Stack -runMain vm funcIdx = do - let function = getFunctionFromId funcIdx (functions (wasmModule vm)) - let funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) - let cexec = CurrentExec { - ceLocals = createEmptyLocals [] (locals function), - ceStack = [], - ceInstructions = body function, - ceInstIdx = 0, - ceLabels = [], - ceParams = params funcTypee, - ceResults = results funcTypee, - crBlockIndents = 0 - } - let newVm = execFunction vm { currentExec = cexec } +runMain vm funcIdx = pushResults [] (vmStack newVm) (ceResults (currentExec newVm)) + where + function = getFunctionFromId funcIdx (functions (wasmModule vm)) + funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) + cexec = createEmptyExec { + ceLocals = createEmptyLocals [] (locals function), + ceInstructions = body function, + ceParams = params funcTypee, + ceResults = results funcTypee + } + newVm = execFunction vm { currentExec = cexec } From 1c78d3374540fdad65691ed3f417409daf5be078 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:41:23 +0100 Subject: [PATCH 94/99] fix some norm error --- lvtrun/src/Run/Vm.hs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index 47811c5..d4cd9ac 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -104,11 +104,11 @@ execOpCodes vm instructions | ceInstIdx cEx < 0 = throw $ RuntimeError "execOpCodes: bad index" | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx | (instructions !! ceInstIdx cEx) == Return = cEx { ceInstIdx = (length instructions) } - | otherwise = do - let newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) - let newVm = vm { currentExec = (incrementInstIdx newCEx) } - execOpCodes newVm instructions - where cEx = currentExec vm + | otherwise = execOpCodes newVm instructions + where + cEx = currentExec vm + newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) + newVm = vm { currentExec = (incrementInstIdx newCEx) } execFunction :: VM -> VM execFunction vm = vm { currentExec = newCEx, vmStack = stackWithRes } From b33e6bd9c30ca547bd7c882c7751d3005262f81d Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:43:50 +0100 Subject: [PATCH 95/99] fix some norm error --- lvtrun/src/Run/Vm.hs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index d4cd9ac..fbb3d53 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -130,15 +130,12 @@ execFunctionWithIdx vm funcIdx currentStack = ceParams = params funcTypee, ceResults = results funcTypee} runMain :: VM -> FuncIdx -> Stack -runMain vm funcIdx = - pushResults [] (vmStack newVm) (ceResults (currentExec newVm)) +runMain vm funcIdx = pushResults[](vmStack newVm)(ceResults(currentExec newVm)) where function = getFunctionFromId funcIdx (functions (wasmModule vm)) funcTypee = getFuncTypeFromId (funcType function) (types (wasmModule vm)) cexec = createEmptyExec { ceLocals = createEmptyLocals [] (locals function), ceInstructions = body function, - ceParams = params funcTypee, - ceResults = results funcTypee - } + ceParams = params funcTypee, ceResults = results funcTypee} newVm = execFunction vm { currentExec = cexec } From 15175f9bff25248ffa08b054a32eb5888b65f609 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 18:49:00 +0100 Subject: [PATCH 96/99] fix some norm error --- lvtrun/src/Run/Vm.hs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index fbb3d53..c92b27b 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -102,13 +102,13 @@ execOpCodes vm [] = currentExec vm execOpCodes vm instructions | ceInstIdx cEx >= length instructions = cEx | ceInstIdx cEx < 0 = throw $ RuntimeError "execOpCodes: bad index" - | (instructions !! ceInstIdx cEx) == End && crBlockIndents cEx == 0 = cEx - | (instructions !! ceInstIdx cEx) == Return = cEx { ceInstIdx = (length instructions) } + | currentInst == End && crBlockIndents cEx == 0 = cEx + | currentInst == Return = cEx { ceInstIdx = (length instructions) } | otherwise = execOpCodes newVm instructions - where - cEx = currentExec vm - newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) - newVm = vm { currentExec = (incrementInstIdx newCEx) } + where cEx = currentExec vm + newCEx = execOpCode vm cEx (instructions !! ceInstIdx cEx) + newVm = vm { currentExec = (incrementInstIdx newCEx) } + currentInst = instructions !! ceInstIdx cEx execFunction :: VM -> VM execFunction vm = vm { currentExec = newCEx, vmStack = stackWithRes } From 663d44f3999a06905171b0c956e85b883110eef4 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 19:38:54 +0100 Subject: [PATCH 97/99] fix some norm error --- lvtrun/src/Run/Types.hs | 6 ++- lvtrun/src/Run/Vm.hs | 101 +++++++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 44 deletions(-) diff --git a/lvtrun/src/Run/Types.hs b/lvtrun/src/Run/Types.hs index 8618365..e3f8de6 100644 --- a/lvtrun/src/Run/Types.hs +++ b/lvtrun/src/Run/Types.hs @@ -12,7 +12,8 @@ module Run.Types VM(..), createVm, incrementInstIdx, - createEmptyExec + createEmptyExec, + decrementBlockIdx ) where @@ -60,6 +61,9 @@ createVm wasmMod = VM { vmStack = [], incrementInstIdx :: CurrentExec -> CurrentExec incrementInstIdx cEx = cEx { ceInstIdx = ceInstIdx cEx + 1 } +decrementBlockIdx :: CurrentExec -> CurrentExec +decrementBlockIdx cEx = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } + createEmptyExec :: CurrentExec createEmptyExec = CurrentExec { ceLocals = [], diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index c92b27b..d33140b 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -13,7 +13,7 @@ module Run.Vm ) where -import Data.Word (Word8) +import Data.Int (Int32) import Control.Exception (throw) import Types @@ -21,7 +21,7 @@ import Run.Types import Run.Locals import Errors (CustomException(..)) import Run.Functions (getFunctionFromId, getFuncTypeFromId) -import Run.Stack (Stack, stackPush, stackPop, stackTop, pushResults) +import Run.Stack (Stack, stackPush, stackPop, stackTop, pushResults, stackPopN) goToEndInstruction :: CurrentExec -> CurrentExec goToEndInstruction cexec @@ -32,46 +32,64 @@ goToEndInstruction cexec where currentOpCode = (ceInstructions cexec) !! (ceInstIdx cexec) -execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec -execOpCode _ cEx (I32Const val) = cEx { ceStack = stackPush (ceStack cEx) (I_32 val) } -execOpCode _ cEx (Block _) = cEx { crBlockIndents = (crBlockIndents cEx) + 1 } -execOpCode _ cEx (I32Eqz) = do - let value = stackTop (ceStack cEx) - case value of - I_32 0 -> cEx { ceStack = stackPush (ceStack cEx) (I_32 1) } - I_32 _ -> cEx { ceStack = stackPush (ceStack cEx) (I_32 0) } +execI32Const :: CurrentExec -> Int32 -> CurrentExec +execI32Const cEx val = cEx {ceStack = stackPush (ceStack cEx) (I_32 val)} + +execI32Eqz :: CurrentExec -> CurrentExec +execI32Eqz cEx@(CurrentExec {ceStack = stack}) = + case (stackTop stack) of + I_32 0 -> cEx { ceStack = stackPush stack (I_32 1) } + I_32 _ -> cEx { ceStack = stackPush stack (I_32 0) } _ -> throw $ RuntimeError "exec I32eqz: bad type" -execOpCode _ cEx (I32Eq) = do - let (value2, newStack1) = stackPop (ceStack cEx) - let (value1, newStack2) = stackPop newStack1 - case (value1, value2) of - (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (if val1 == val2 then 1 else 0)) } + +execI32Add :: CurrentExec -> CurrentExec +execI32Add cEx@(CurrentExec {ceStack = stack}) = + case (stackPopN stack 2) of + ([I_32 val2, I_32 val1], newStack) -> + cEx { ceStack = stackPush newStack (I_32 (val1 + val2)) } + _ -> throw $ RuntimeError "exec I32add: bad type" + +execI32Eq :: CurrentExec -> CurrentExec +execI32Eq cEx@(CurrentExec {ceStack = stack}) = + case (stackPopN stack 2) of + ([I_32 value2, I_32 value1], newStack) -> case (value1 == value2) of + True -> cEx { ceStack = stackPush newStack (I_32 1) } + False -> cEx { ceStack = stackPush newStack (I_32 0) } _ -> throw $ RuntimeError "exec I32Eq: bad type" -execOpCode _ cEx (I32Add) = do - let (value2, newStack1) = stackPop (ceStack cEx) - let (value1, newStack2) = stackPop newStack1 - case (value1, value2) of - (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 + val2)) } - _ -> throw $ RuntimeError "exec I32Add: bad type" -execOpCode _ cEx (I32Sub) = do - let (value2, newStack1) = stackPop (ceStack cEx) - let (value1, newStack2) = stackPop newStack1 - case (value1, value2) of - (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 - val2)) } - _ -> throw $ RuntimeError "exec I32Sub: bad type" -execOpCode _ cEx (I32Mul) = do - let (value2, newStack1) = stackPop (ceStack cEx) - let (value1, newStack2) = stackPop newStack1 - case (value1, value2) of - (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 * val2)) } - _ -> throw $ RuntimeError "exec I32Mul: bad type" -execOpCode _ cEx (I32Divs) = do - let (value2, newStack1) = stackPop (ceStack cEx) - let (value1, newStack2) = stackPop newStack1 - case (value1, value2) of - (I_32 _, I_32 0) -> throw $ RuntimeError "exec I32Divs: division by zero" - (I_32 val1, I_32 val2) -> cEx { ceStack = stackPush newStack2 (I_32 (val1 `div` val2)) } - _ -> throw $ RuntimeError "exec I32Divs: bad type" + +execI32Sub :: CurrentExec -> CurrentExec +execI32Sub cEx@(CurrentExec {ceStack = stack}) = + case (stackPopN stack 2) of + ([I_32 val2, I_32 val1], newStack) -> + cEx { ceStack = stackPush newStack (I_32 (val1 - val2)) } + _ -> throw $ RuntimeError "exec I32sub: bad type" + +execI32Mul :: CurrentExec -> CurrentExec +execI32Mul cEx@(CurrentExec {ceStack = stack}) = + case (stackPopN stack 2) of + ([I_32 val2, I_32 val1], newStack) -> + cEx { ceStack = stackPush newStack (I_32 (val1 * val2)) } + _ -> throw $ RuntimeError "exec I32mul: bad type" + +execI32Divs :: CurrentExec -> CurrentExec +execI32Divs cEx@(CurrentExec {ceStack = stack}) = + case (stackPopN stack 2) of + ([I_32 val2, I_32 val1], newStack) -> + cEx { ceStack = stackPush newStack (I_32 (val1 `div` val2)) } + _ -> throw $ RuntimeError "exec I32divs: bad type" + +execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec +execOpCode _ cEx (Unreachable) = throw $ RuntimeError "execOpCode: unreachable" +execOpCode _ cEx (End) = decrementBlockIdx cEx +execOpCode _ cEx (Return) = decrementBlockIdx cEx +execOpCode _ cEx (I32Const val) = execI32Const cEx val +execOpCode _ cEx (I32Eqz) = execI32Eqz cEx +execOpCode _ cEx (Block _) = cEx { crBlockIndents = (crBlockIndents cEx) + 1 } +execOpCode _ cEx (I32Eq) = execI32Eq cEx +execOpCode _ cEx (I32Add) = execI32Add cEx +execOpCode _ cEx (I32Sub) = execI32Sub cEx +execOpCode _ cEx (I32Mul) = execI32Mul cEx +execOpCode _ cEx (I32Divs) = execI32Divs cEx execOpCode _ cEx (BrIf labelIdx) = case stackTop (ceStack cEx) of I_32 0 -> cEx I_32 _ -> cEx { ceInstIdx = (fromIntegral labelIdx) } @@ -80,9 +98,6 @@ execOpCode vm cEx (Call funcIdx) = do let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) cEx { ceStack = newStack } -execOpCode _ cEx (End) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } -execOpCode _ cEx (Return) = cEx { crBlockIndents = (crBlockIndents cEx) - 1 } -execOpCode _ cEx (Unreachable) = throw $ RuntimeError "execOpCode: unreachable" execOpCode _ cEx (GetLocal localIdx) = do let value = getLocalFromId (ceLocals cEx) localIdx cEx { ceStack = stackPush (ceStack cEx) value } From 26f3ac18320dacd94519b59a7f11ab04480beb81 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 19:47:14 +0100 Subject: [PATCH 98/99] fix some norm error --- lvtrun/src/Run/Vm.hs | 54 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index d33140b..db2f8b7 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -78,6 +78,35 @@ execI32Divs cEx@(CurrentExec {ceStack = stack}) = cEx { ceStack = stackPush newStack (I_32 (val1 `div` val2)) } _ -> throw $ RuntimeError "exec I32divs: bad type" +execGetLocal :: CurrentExec -> LocalIdx -> CurrentExec +execGetLocal cEx localIdx = cEx { ceStack = + stackPush (ceStack cEx) (getLocalFromId (ceLocals cEx) localIdx)} + +execSetLocal :: CurrentExec -> LocalIdx -> CurrentExec +execSetLocal cEx localIdx = cEx { ceStack = newStack, + ceLocals = setLocalWithId 0 (ceLocals cEx) value localIdx} + where (value, newStack) = stackPop (ceStack cEx) + +execBrIf :: CurrentExec -> CurrentExec +execBrIf cEx@(CurrentExec {ceStack = stack}) = + case (stackTop stack) of + I_32 0 -> cEx + I_32 _ -> cEx { ceInstIdx = (ceInstIdx cEx) } + _ -> throw $ RuntimeError "exec brIf: bad type" + +execCall :: VM -> CurrentExec -> FuncIdx -> CurrentExec +execCall vm cEx funcIdx = do + let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) + let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) + cEx { ceStack = newStack } + +execIf :: CurrentExec -> CurrentExec +execIf cEx@(CurrentExec {ceStack = stack}) = case stackTop stack of + I_32 0 -> goToEndInstruction cEx + I_32 1 -> cEx { crBlockIndents = (crBlockIndents cEx) + 1 } + I_32 _ -> throw $ RuntimeError "execIf: bad if statement" + _ -> throw $ RuntimeError "execIf: bad type" + execOpCode :: VM -> CurrentExec -> Instruction -> CurrentExec execOpCode _ cEx (Unreachable) = throw $ RuntimeError "execOpCode: unreachable" execOpCode _ cEx (End) = decrementBlockIdx cEx @@ -90,26 +119,11 @@ execOpCode _ cEx (I32Add) = execI32Add cEx execOpCode _ cEx (I32Sub) = execI32Sub cEx execOpCode _ cEx (I32Mul) = execI32Mul cEx execOpCode _ cEx (I32Divs) = execI32Divs cEx -execOpCode _ cEx (BrIf labelIdx) = case stackTop (ceStack cEx) of - I_32 0 -> cEx - I_32 _ -> cEx { ceInstIdx = (fromIntegral labelIdx) } - _ -> throw $ RuntimeError "exec brIf: bad type" -execOpCode vm cEx (Call funcIdx) = do - let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) - let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) - cEx { ceStack = newStack } -execOpCode _ cEx (GetLocal localIdx) = do - let value = getLocalFromId (ceLocals cEx) localIdx - cEx { ceStack = stackPush (ceStack cEx) value } -execOpCode _ cEx (SetLocal localIdx) = do - let (value, newStack) = stackPop (ceStack cEx) - let newLocals = setLocalWithId 0 (ceLocals cEx) value localIdx - cEx { ceStack = newStack, ceLocals = newLocals } -execOpCode _ cEx (If) = case stackTop (ceStack cEx) of - I_32 0 -> goToEndInstruction cEx - I_32 1 -> cEx { crBlockIndents = (crBlockIndents cEx) + 1 } - I_32 _ -> throw $ RuntimeError "execOpCode: bad if statement" - _ -> throw $ RuntimeError "execOpCode: bad type" +execOpCode _ cEx (GetLocal localIdx) = execGetLocal cEx localIdx +execOpCode _ cEx (SetLocal localIdx) = execSetLocal cEx localIdx +execOpCode _ cEx (BrIf labelIdx) = execBrIf cEx +execOpCode vm cEx (Call funcIdx) = execCall vm cEx funcIdx +execOpCode _ cEx (If) = execIf cEx execOpCode _ cEx _ = cEx execOpCodes :: VM -> [Instruction] -> CurrentExec From 86b9607839a9c3bc8db014ace19dfe3585c5fc05 Mon Sep 17 00:00:00 2001 From: Tenshi Date: Sun, 14 Jan 2024 19:49:05 +0100 Subject: [PATCH 99/99] fix some norm error --- lvtrun/src/Run/Vm.hs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lvtrun/src/Run/Vm.hs b/lvtrun/src/Run/Vm.hs index db2f8b7..6bee410 100644 --- a/lvtrun/src/Run/Vm.hs +++ b/lvtrun/src/Run/Vm.hs @@ -95,10 +95,12 @@ execBrIf cEx@(CurrentExec {ceStack = stack}) = _ -> throw $ RuntimeError "exec brIf: bad type" execCall :: VM -> CurrentExec -> FuncIdx -> CurrentExec -execCall vm cEx funcIdx = do - let newVm = execFunctionWithIdx vm funcIdx (ceStack cEx) - let newStack = pushResults (ceStack cEx) (vmStack newVm) (ceResults (currentExec newVm)) - cEx { ceStack = newStack } +execCall vm cEx funcIdx = cEx { ceStack = newStack } + where + newVm = execFunctionWithIdx vm funcIdx currentStack + newStack = pushResults currentStack (vmStack newVm) res + currentStack = ceStack cEx + res = ceResults (currentExec newVm) execIf :: CurrentExec -> CurrentExec execIf cEx@(CurrentExec {ceStack = stack}) = case stackTop stack of

    gXwail{ip|Z9 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