Add CALL definition
This commit is contained in:
parent
4a588e982b
commit
7f9fa7758e
31
Project2.fst
31
Project2.fst
@ -118,32 +118,41 @@ let step te cs =
|
||||
if gas < 1 then Next (Ter ExcState ps)
|
||||
else
|
||||
match (getOpcode code pc, stack) with
|
||||
| (ADD, a::b::stack') -> Next (Exec(((gas-1, pc+1, mem, (a+b):: stack'), (actor, input, code), gs) :: ps))
|
||||
| (ADD, a::b::stack') -> Next (Exec(((gas-1, pc+1, mem, (a+b):: stack'), (actor, input, code), gs)::ps))
|
||||
| (AND, a::b::stack') -> let c = (if a > 0 && b > 0 then 1 else 0) in
|
||||
Next (Exec(((gas-1, pc+1, mem, c::stack'), (actor, input, code), gs) :: ps))
|
||||
Next (Exec(((gas-1, pc+1, mem, c::stack'), (actor, input, code), gs)::ps))
|
||||
| (LE, a::b::stack') -> let c = (if a <= b then 1 else 0) in
|
||||
Next (Exec(((gas-1, pc+1, mem, c::stack'), (actor, input, code), gs) :: ps))
|
||||
Next (Exec(((gas-1, pc+1, mem, c::stack'), (actor, input, code), gs)::ps))
|
||||
| (PUSH x, stack') -> Next (Exec(((gas-1, pc+1, mem, x::stack'), (actor, input, code), gs)::ps))
|
||||
| (POP, x::stack') -> Next (Exec(((gas-1, pc+1, mem, stack') (actor, input, code), gs) :: ps))
|
||||
| (POP, x::stack') -> Next (Exec(((gas-1, pc+1, mem, stack') (actor, input, code), gs)::ps))
|
||||
| (MSTORE, p::v::stack') -> Next (Exec(((gas-1, pc+1, update mem p v, stack'), (actor, input, code), gs)::ps))
|
||||
| (MLOAD, p::stack') -> let v = (mem p) in
|
||||
Next (Exec(((gas-1, pc+1, mem, v::stack'), (actor, input, code), gs') :: ps))
|
||||
Next (Exec(((gas-1, pc+1, mem, v::stack'), (actor, input, code), gs')::ps))
|
||||
| (SSTORE, p::v::stack') -> let acc = (let (bal, stor, code) = gs actor in (bal, update stor p v, code)) in
|
||||
let gs' = update gs actor acc in
|
||||
Next (Exec(((gas-1, pc+1, mem, stack'), (actor, input, code), gs') :: ps))
|
||||
Next (Exec(((gas-1, pc+1, mem, stack'), (actor, input, code), gs')::ps))
|
||||
| (SLOAD, v::stack') -> Next (Exec(((gas-1, pc+1, mem, (let (bal, stor, code) = gs actor in stor v)::stack'), (actor, input, code), gs)::ps))
|
||||
| (BALANCE, a::stack') -> let (bal, _, _) = (gs a) in
|
||||
Next (Exec(((gas-1, pc+1, mem, bal::stack'), (actor, input, code), gs') :: ps))
|
||||
Next (Exec(((gas-1, pc+1, mem, bal::stack'), (actor, input, code), gs')::ps))
|
||||
| (ADDRESS, stack') -> Next (Exec(((gas-1, pc+1, mem, actor::stack'), (actor, input, code), gs)::ps))
|
||||
| (INPUT, stack') -> Next (Exec(((gas-1, pc+1, mem, input::stack'), (actor, input, code), gs) :: ps))
|
||||
| (INPUT, stack') -> Next (Exec(((gas-1, pc+1, mem, input::stack'), (actor, input, code), gs)::ps))
|
||||
| (GAS, stack') -> Next (Exec(((gas-1, pc+1, mem, gas::stack'), (actor, input, code), gs)::ps))
|
||||
| (JUMP i, stack') -> Next (Exec((((gas-1, i, mem, stack'), (actor, input, code), gs))::ps))
|
||||
| (JUMPI i, b::stack') -> let j = (if b = 0 then pc+1 else i) in
|
||||
Next (Exec((((gas-1, j, mem, stack'), (actor, input, code), gs)) :: ps))
|
||||
Next (Exec((((gas-1, j, mem, stack'), (actor, input, code), gs))::ps))
|
||||
| (RETURN, v::stack') -> Next (Ter (HaltState gs v (gas-1)) ps)
|
||||
| (STOP, stack') -> Next (Ter (HaltState gs 0 (gas-1)) ps)
|
||||
| (TIMESTAMP, stack') -> magic ()
|
||||
| (CALL, to::v::inp::resaddr::stack') -> magic ()
|
||||
| (TIMESTAMP, stack') -> Next (Exec(((gas-1, pc+1, mem, te::stack'), (actor, input, code), gs)::ps))
|
||||
| (CALL, to::v::inp::resaddr::stack') -> let (bal, _, _) = gs actor in
|
||||
if bal < v then Next (Ter ExcState ps) else
|
||||
if v < 0 then Next (Ter ExcState ps) else
|
||||
let to_acc = (let (bal, stor, code) = gs to in (bal+v, stor, code)) in
|
||||
let actor_acc = (let (bal, stor, code) = gs actor in (bal-v, stor, code)) in
|
||||
let gs' = update (update gs to to_acc) actor actor_acc in
|
||||
let mu' = (gas-1, 0, (fun x -> 0), []) in
|
||||
let env' = (to, inp, (let (_, _, code) = (gs to) in code)) in
|
||||
let old_ex_state = ((gas, pc, mem, to::v::inp::resaddr::stack'), (actor, input, code), gs) in
|
||||
Next (Exec((mu', env', gs')::(old_ex_state::ps)))
|
||||
| _ -> Next (Ter ExcState ps)
|
||||
|
||||
(* A simple wrapper for the step function that removes the execution outcome *)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user