Buildtins, arrays, string (no X86 yet), tests

This commit is contained in:
Dmitry Boulytchev 2018-04-27 01:27:10 +03:00 committed by danyaberezun
parent 25eff5c282
commit 25b4a79832
10 changed files with 94 additions and 32 deletions

View file

@ -220,7 +220,7 @@ let compile env code =
push_args env ((Push x)::acc) (n-1)
in
let env, pushs = push_args env [] n in
env, pushr @ pushs @ [Call f; Binop ("+", L (n*4), esp)] @ (List.rev popr)
env, pushr @ (List.rev pushs) @ [Call f; Binop ("+", L (n*4), esp)] @ (List.rev popr)
in
(if p then env, code else let y, env = env#allocate in env, code @ [Mov (eax, y)])
in
@ -253,14 +253,14 @@ class env =
(* allocates a fresh position on a symbolic stack *)
method allocate =
let x, n =
let rec allocate' = function
| [] -> ebx , 0
| (S n)::_ -> S (n+1) , n+2
| (R n)::_ when n < num_of_regs -> R (n+1) , stack_slots
let rec allocate' = function
| [] -> R 0 , 0
| (S n)::_ -> S (n+1) , n+2
| (R n)::_ when n < num_of_regs -> R (n+1) , stack_slots
| (M _)::s -> allocate' s
| _ -> S 0 , 1
in
allocate' stack
| _ -> let n = List.length locals in S n, n+1
in
allocate' stack
in
x, {< stack_slots = max n stack_slots; stack = x::stack >}