module Lua.Bytecode5_1.Chunk where
import Debug.Trace
import Data.Word
import Data.Int
import Data.Bits
import Data.ByteString
import Data.Serialize.Get
import Data.Serialize.IEEE754
import Data.Vector as Vector
import Lua.Bytecode5_1.Header
import Lua.Bytecode5_1.Types hiding (Function)
hasArg :: Chunk -> Bool
hasArg c =
(varArg c .&. 1) /= 0
isVarArg :: Chunk -> Bool
isVarArg c =
(varArg c .&. 2) /= 0
needsArg :: Chunk -> Bool
needsArg c =
(varArg c .&. 4) /= 0
data Chunk = Chunk {
source :: ByteString
, line :: Int32
, lastLine :: Int32
, upValueCount :: Word8
, parameters :: Word8
, varArg :: Word8
, maxStackSize :: Word8
, instructions :: Vector Operation
, constants :: Vector Constant
, prototypes :: Vector Chunk
, sourcePositions :: Vector Int32
, locals :: Vector Local
, upValues :: Vector ByteString
}
deriving (Show)
instance LuaGet Chunk where
luaGet = getChunk
getChunk :: Get Chunk
getChunk = do
source <- luaGet
line <- luaGet
lastLine <- luaGet
upValueCount <- luaGet
parameters <- luaGet
varArg <- luaGet
maxStackSize <- luaGet
instructions <- luaGet
constants <- luaGet
prototypes <- luaGet
sourcePositions <- luaGet
locals <- luaGet
upValues <- luaGet
return $ Chunk {..}
data Function = Function { header :: Header, chunk :: Chunk }
deriving (Show)
instance LuaGet Function where
luaGet = do
header <- luaGet
chunk <- luaGet
return $ Function {..}