handle functions with empty body
This commit is contained in:
+22
-10
@@ -296,13 +296,6 @@ EOF { Lexeme _ EOF }
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
functype :: { FuncType }
|
|
||||||
: '(' 'func' params_results { $3 }
|
|
||||||
|
|
||||||
params_results :: { FuncType }
|
|
||||||
: ')' { FuncType [] [] }
|
|
||||||
| '(' paramsresultstypeuse ')' { $2 }
|
|
||||||
|
|
||||||
name :: { TL.Text }
|
name :: { TL.Text }
|
||||||
: string { $1 }
|
: string { $1 }
|
||||||
|
|
||||||
@@ -538,9 +531,6 @@ plaininstr :: { PlainInstr }
|
|||||||
| 'f32.reinterpret/i32' { FReinterpretI BS32 }
|
| 'f32.reinterpret/i32' { FReinterpretI BS32 }
|
||||||
| 'f64.reinterpret/i64' { FReinterpretI BS64 }
|
| 'f64.reinterpret/i64' { FReinterpretI BS64 }
|
||||||
|
|
||||||
typedef :: { TypeDef }
|
|
||||||
: 'type' opt(ident) functype ')' { TypeDef $2 $3 }
|
|
||||||
|
|
||||||
typeuse :: { TypeUse }
|
typeuse :: { TypeUse }
|
||||||
: '(' typeuse1 { $2 }
|
: '(' typeuse1 { $2 }
|
||||||
| {- empty -} { AnonimousTypeUse $ FuncType [] [] }
|
| {- empty -} { AnonimousTypeUse $ FuncType [] [] }
|
||||||
@@ -553,6 +543,28 @@ typedtypeuse :: { Maybe FuncType }
|
|||||||
: '(' paramsresultstypeuse { Just $2 }
|
: '(' paramsresultstypeuse { Just $2 }
|
||||||
| {- empty -} { Nothing }
|
| {- empty -} { Nothing }
|
||||||
|
|
||||||
|
typedef :: { TypeDef }
|
||||||
|
: 'type' opt(ident) functype ')' { TypeDef $2 $3 }
|
||||||
|
|
||||||
|
functype :: { FuncType }
|
||||||
|
: '(' 'func' params_results { $3 }
|
||||||
|
|
||||||
|
params_results :: { FuncType }
|
||||||
|
: ')' { emptyFuncType }
|
||||||
|
| '(' params_results1 { $2 }
|
||||||
|
|
||||||
|
params_results1 :: { FuncType }
|
||||||
|
: 'param' list(valtype) ')' params_results { mergeFuncType (FuncType (map (ParamType Nothing) $2) []) $4 }
|
||||||
|
| 'param' ident valtype ')' params_results { mergeFuncType (FuncType [ParamType (Just $2) $3] []) $5 }
|
||||||
|
| results1 { $1 }
|
||||||
|
|
||||||
|
results :: { FuncType }
|
||||||
|
: ')' { emptyFuncType }
|
||||||
|
| '(' results1 { $2 }
|
||||||
|
|
||||||
|
results1 :: { FuncType }
|
||||||
|
: 'result' list(valtype) ')' results { mergeFuncType (FuncType [] $2) $4 }
|
||||||
|
|
||||||
paramsresultstypeuse :: { FuncType }
|
paramsresultstypeuse :: { FuncType }
|
||||||
: paramsresultstypeuse '(' paramsresulttypeuse { mergeFuncType $1 $3 }
|
: paramsresultstypeuse '(' paramsresulttypeuse { mergeFuncType $1 $3 }
|
||||||
| paramsresulttypeuse { $1 }
|
| paramsresulttypeuse { $1 }
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ isFunctionValid Function {funcType, locals, body} mod@Module {types} =
|
|||||||
let ctx = ctxFromModule (params ++ locals) [r] r mod in
|
let ctx = ctxFromModule (params ++ locals) [r] r mod in
|
||||||
case runChecker ctx $ getExpressionType body of
|
case runChecker ctx $ getExpressionType body of
|
||||||
Left err -> err
|
Left err -> err
|
||||||
Right arr -> if arr == (empty ==> results) then Valid else TypeMismatch
|
Right arr -> if arr == (empty ==> results) || arr == (Any ==> Any) then Valid else TypeMismatch
|
||||||
|
|
||||||
functionsShouldBeValid :: Validator
|
functionsShouldBeValid :: Validator
|
||||||
functionsShouldBeValid mod@Module {functions} =
|
functionsShouldBeValid mod@Module {functions} =
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@ compile file = do
|
|||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
files <- Directory.listDirectory "tests/samples"
|
files <- Directory.listDirectory "tests/samples"
|
||||||
-- let files = ["endianess.wast"]
|
-- let files = ["func.wast"]
|
||||||
-- compile "fact.wast"
|
-- compile "fact.wast"
|
||||||
syntaxTestCases <- (`mapM` files) $ \file -> do
|
syntaxTestCases <- (`mapM` files) $ \file -> do
|
||||||
content <- LBS.readFile $ "tests/samples/" ++ file
|
content <- LBS.readFile $ "tests/samples/" ++ file
|
||||||
|
|||||||
Reference in New Issue
Block a user