From e7978b8d484f94a66f26f2aac080493239152e80 Mon Sep 17 00:00:00 2001 From: Ilya Rezvov Date: Fri, 23 Feb 2018 17:01:22 -0800 Subject: [PATCH] properly handle order of params and result types in function type in call_indirect instruction --- src/Language/Wasm/Parser.y | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Language/Wasm/Parser.y b/src/Language/Wasm/Parser.y index 7eaad2b..84eddf5 100644 --- a/src/Language/Wasm/Parser.y +++ b/src/Language/Wasm/Parser.y @@ -649,8 +649,24 @@ raw_call_indirect_functype :: { (Maybe FuncType, [Instruction]) } | {- empty -} { (Nothing, []) } raw_call_indirect_functype1 :: { (Maybe FuncType, [Instruction]) } - : paramsresulttypeuse raw_call_indirect_functype { - (Just $ mergeFuncType $1 $ fromMaybe emptyFuncType $ fst $2, snd $2) + : 'param' list(valtype) ')' raw_call_indirect_functype { + let ft = fromMaybe emptyFuncType $ fst $4 in + (Just $ ft { params = map (ParamType Nothing) $2 ++ params ft }, snd $4) + } + | 'param' ident valtype ')' raw_call_indirect_functype { + let ft = fromMaybe emptyFuncType $ fst $5 in + (Just $ ft { params = (ParamType (Just $2) $3) : params ft }, snd $5) + } + | raw_call_indirect_return_functype1 { $1 } + +raw_call_indirect_return_functype :: { (Maybe FuncType, [Instruction]) } + : '(' raw_call_indirect_return_functype1 { $2 } + | {- empty -} { (Nothing, []) } + +raw_call_indirect_return_functype1 :: { (Maybe FuncType, [Instruction]) } + : 'result' list(valtype) ')' raw_call_indirect_return_functype { + let ft = fromMaybe emptyFuncType $ fst $4 in + (Just $ ft { results = $2 ++ results ft }, snd $4) } | foldedinstr1 { (Nothing, $1) }