Rough frame allocations
[tiger.ml.git] / compiler / src / lib / tiger / tiger_translate.ml
index 7f71711..f07ec68 100644 (file)
@@ -1 +1,56 @@
+module List = ListLabels
+
+module Frame = Tiger_frame
+module Temp  = Tiger_temp
+
+module Level = struct
+  type t =
+    { parent  : t option
+    ; name    : Temp.Label.t
+    ; formals : bool list
+    ; frame   : Frame.t
+    }
+
+  let init =
+    let name    = Temp.Label.gen () in
+    let formals = [] in
+    { parent  = None
+    ; name
+    ; formals
+    ; frame   = Frame.make ~name ~formals
+    }
+
+  let next t ~name  ~formals =
+    (* Adding the extra parameter for the static link. See p. 142 *)
+    let formals = true :: formals in
+    { parent = Some t
+    ; name
+    ; formals
+    ; frame = Frame.make ~name ~formals
+    }
+
+  let formals = function {formals; _} ->
+    formals
+
+  let frame = function {frame; _} ->
+    frame
+end
+
 type exp = unit
+
+type access =
+  (* must know about static links *)
+  { level        : Level.t
+  ; frame_access : Frame.access
+  }
+
+let alloc_local ~level ~escapes =
+  { level
+  ; frame_access = Frame.alloc_local (Level.frame level) ~escapes
+  }
+
+let formals ~level =
+  (* FIXME: This seems wrong. Should we call Frame.formals? *)
+  List.map (Level.formals level) ~f:(fun escapes ->
+    alloc_local ~level ~escapes
+  )
This page took 0.019828 seconds and 4 git commands to generate.