Improve call instruction interpreter
This commit is contained in:
@@ -93,13 +93,17 @@ instructions = [ Simple { _op = Nop, _noParams = 0, _noPops = 0, _sAction = (\
|
|||||||
]
|
]
|
||||||
|
|
||||||
call :: VM -> Params -> Pops -> ExceptT String IO VM
|
call :: VM -> Params -> Pops -> ExceptT String IO VM
|
||||||
call vm (addr:_) _ = except $ return $ vm { _pc = addr, _fp = fp', _stack = stack' }
|
call vm (addr:_) _ = except $ return $ flip execState vm $ do
|
||||||
where
|
fp <- getFp
|
||||||
fp = _fp vm
|
fp' <- getStackSize
|
||||||
stack = _stack vm
|
retAddr <- getPc >>= return . (+2)
|
||||||
fp' = length stack
|
|
||||||
retAddr = _pc vm + 2
|
push [retAddr, fp]
|
||||||
stack' = S.fromList [retAddr, fp] <> stack
|
setPc addr
|
||||||
|
setFp fp'
|
||||||
|
|
||||||
|
return ()
|
||||||
|
|
||||||
call _ [] _ = except $ Left $ "Address excepted"
|
call _ [] _ = except $ Left $ "Address excepted"
|
||||||
|
|
||||||
ret :: VM -> Params -> Pops -> ExceptT String IO VM
|
ret :: VM -> Params -> Pops -> ExceptT String IO VM
|
||||||
@@ -157,15 +161,31 @@ getAt index err = do
|
|||||||
(Just i) -> return i
|
(Just i) -> return i
|
||||||
Nothing -> except $ Left err
|
Nothing -> except $ Left err
|
||||||
|
|
||||||
|
getPc :: State VM Int
|
||||||
|
getPc = get >>= (return . _pc)
|
||||||
|
|
||||||
|
getFp :: State VM Int
|
||||||
|
getFp = get >>= (return . _fp)
|
||||||
|
|
||||||
|
getStackSize :: State VM Int
|
||||||
|
getStackSize = get >>= (return . length . _stack)
|
||||||
|
|
||||||
|
setPc :: Int -> State VM ()
|
||||||
|
setPc pc' = do
|
||||||
|
vm <- get
|
||||||
|
put vm { _pc = pc' }
|
||||||
|
|
||||||
|
setFp :: Int -> State VM ()
|
||||||
|
setFp fp' = do
|
||||||
|
vm <- get
|
||||||
|
put vm { _fp = fp' }
|
||||||
|
|
||||||
forward :: Int -> State VM ()
|
forward :: Int -> State VM ()
|
||||||
forward offset = do
|
forward offset = do
|
||||||
vm <- get
|
vm <- get
|
||||||
put vm { _pc = _pc vm + offset }
|
put vm { _pc = _pc vm + offset }
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
getPc :: State VM Int
|
|
||||||
getPc = get >>= (return . _pc)
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
instructionByOp :: M.Map Op Instruction
|
instructionByOp :: M.Map Op Instruction
|
||||||
|
|||||||
Reference in New Issue
Block a user