From fbadde5c3acc7ce5b127971aaea94c993f07abbc Mon Sep 17 00:00:00 2001 From: Ilya Rezvov Date: Mon, 16 Apr 2018 21:02:26 -0700 Subject: [PATCH] improve alignment parsing --- src/Language/Wasm/Parser.y | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Language/Wasm/Parser.y b/src/Language/Wasm/Parser.y index 6d7153d..6f67b1c 100644 --- a/src/Language/Wasm/Parser.y +++ b/src/Language/Wasm/Parser.y @@ -1178,9 +1178,12 @@ asAlign str = do fromIntegral . fst <$> eitherToMaybe (TLRead.decimal num) parseMemArg :: Natural -> Maybe Natural -> Maybe Natural -> Either String MemArg -parseMemArg defAlign optOffset optAlign = - let offset = fromMaybe 0 optOffset in - let align = fromIntegral $ round $ logBase 2 $ fromIntegral $ fromMaybe defAlign optAlign in +parseMemArg defAlign optOffset optAlign = do + let offset = fromMaybe 0 optOffset + let parsedAlign = fromIntegral $ fromMaybe defAlign optAlign + if parsedAlign == 0 then Left "alignment" else return () + let align = fromIntegral $ round $ logBase 2 parsedAlign + if 2 ^ align /= parsedAlign then Left "alignment" else return () if offset >= 2 ^ 32 || align >= 2 ^ 32 then Left "u32 is out of boundaries" else return $ MemArg offset align