improve alignment parsing

This commit is contained in:
Ilya Rezvov
2018-04-16 21:02:26 -07:00
parent 7dfbe2775e
commit fbadde5c3a
+6 -3
View File
@@ -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