Complete the shift over to language-rust.

This commit is contained in:
2019-10-22 22:06:34 -07:00
parent 2400b10fbc
commit 620048bce6
8 changed files with 103 additions and 196 deletions

View File

@@ -4,13 +4,11 @@ module CryptoNum(
)
where
import Control.Monad(forM_)
import File
import Gen
import Language.Rust.Data.Ident
import Language.Rust.Data.Position
import Language.Rust.Quote
import Language.Rust.Pretty
import Language.Rust.Syntax
cryptoNum :: File
@@ -20,24 +18,22 @@ cryptoNum = File {
generator = declareCryptoNumInstance
}
declareCryptoNumInstance :: Word -> Gen ()
declareCryptoNumInstance :: Word -> SourceFile Span
declareCryptoNumInstance bitsize =
do let sname = mkIdent ("U" ++ show bitsize)
entries = bitsize `div` 64
entlit = Lit [] (Int Dec (fromIntegral entries) Unsuffixed mempty) mempty
top = entries - 1
zeroTests = generateZeroTests 0 entries
bitlength = toLit bitsize
bytelen = bitsize `div` 8
bytelenlit = toLit bytelen
bytebuffer = Delimited mempty Brace (Stream [
Tree (Token mempty (LiteralTok (IntegerTok "0") Nothing)),
Tree (Token mempty Semicolon),
Tree (Token mempty (LiteralTok (IntegerTok (show bytelen)) Nothing))
])
entrieslit = toLit entries
packerLines = generatePackerLines 0 (bitsize `div` 8)
out $ show $ pretty' $ [sourceFile|
let sname = mkIdent ("U" ++ show bitsize)
entries = bitsize `div` 64
entlit = Lit [] (Int Dec (fromIntegral entries) Unsuffixed mempty) mempty
zeroTests = generateZeroTests 0 entries
bitlength = toLit bitsize
bytelen = bitsize `div` 8
bytelenlit = toLit bytelen
bytebuffer = Delimited mempty Brace (Stream [
Tree (Token mempty (LiteralTok (IntegerTok "0") Nothing)),
Tree (Token mempty Semicolon),
Tree (Token mempty (LiteralTok (IntegerTok (show bytelen)) Nothing))
])
entrieslit = toLit entries
in [sourceFile|
use core::cmp::min;
use crate::CryptoNum;
#[cfg(test)]
@@ -142,32 +138,10 @@ declareCryptoNumInstance bitsize =
}
|]
byteShiftInfo :: Word -> (Word, Word)
byteShiftInfo idx =
(idx `div` 8, (idx `mod` 8) * 8)
pad :: Int -> Char -> String -> String
pad len c str
| length str >= len = str
| otherwise = pad len c (c:str)
generateZeroTests :: Word -> Word -> [Stmt Span]
generateZeroTests i max
| i == max = []
generateZeroTests i entries
| i == entries = []
| otherwise =
let ilit = toLit i
in [stmt| result = self.values[$$(ilit)] == 0; |] :
generateZeroTests (i + 1) max
generatePackerLines :: Word -> Word -> [Stmt Span]
generatePackerLines i max
| i == max = []
| otherwise =
let ilit = toLit i
nextLit = toLit (i + 1)
validx = toLit (i `div` 8)
shiftx = toLit ((i `mod` 8) * 8)
writeLine = [stmt| bytes[$$(ilit)] = (self.values[$$(validx)] >> $$(shiftx)) as u8; |]
ifLine = [stmt| if bytes.len() == $$(nextLit) { return; } |]
in writeLine : ifLine : generatePackerLines (i + 1) max
generateZeroTests (i + 1) entries