|
|
@@ -12,22 +12,27 @@ let call node args depth =
|
|
|
FunUse (dec, args, [Type ctype; Depth depth])
|
|
|
| _ -> raise InvalidNode
|
|
|
|
|
|
+let generate_name name postfix = "_" ^ name ^ "_" ^ postfix
|
|
|
+let getname name = generate_name name "get"
|
|
|
+let setname name = generate_name name "set"
|
|
|
+
|
|
|
let create_getset globals = function
|
|
|
| GlobalDef (true, ArrayDims (ctype, _), name, None, ann) as dec ->
|
|
|
(* Getters for array variable: create getter for given index Note that
|
|
|
* getters and setters for dimensions are automatically generated,
|
|
|
* because they have been put into new global variables during the
|
|
|
* desugaring phase *)
|
|
|
- let (param, index) = create_param Int (fresh_var "index") in
|
|
|
+ let (param, index) = create_param Int (fresh_id "index") in
|
|
|
let var = VarUse (dec, Some [index], [Type ctype; Depth 1]) in
|
|
|
let body = Block [Return (var, [])] in
|
|
|
- let getter = FunDef (true, ctype, name ^ "$get", [param], body, []) in
|
|
|
+ let getter = FunDef (true, ctype, getname name, [param], body, []) in
|
|
|
|
|
|
(* Setters for array variable: create setter for given index *)
|
|
|
- let (param1, index) = create_param Int (fresh_var "index") in
|
|
|
- let (param2, value) = create_param ctype (fresh_var "value") in
|
|
|
+ let (param1, index) = create_param Int (fresh_id "index") in
|
|
|
+ let (param2, value) = create_param ctype (fresh_id "value") in
|
|
|
+ let params = [param1; param2] in
|
|
|
let body = Block [VarLet (dec, Some [index], value, [])] in
|
|
|
- let setter = FunDef (true, Void, name ^ "$set", [param1; param2], body, []) in
|
|
|
+ let setter = FunDef (true, Void, setname name, params, body, []) in
|
|
|
|
|
|
[getter; setter]
|
|
|
|
|
|
@@ -35,12 +40,12 @@ let create_getset globals = function
|
|
|
(* Getter for basic variable type: return the variable *)
|
|
|
let var = VarUse (dec, None, [Type ctype; Depth 1]) in
|
|
|
let body = [Return (var, [])] in
|
|
|
- let getter = FunDef (true, ctype, name ^ "$get", [], Block body, []) in
|
|
|
+ let getter = FunDef (true, ctype, getname name, [], Block body, []) in
|
|
|
|
|
|
(* Setter for basic variable type: assign the variable *)
|
|
|
- let (param, value) = create_param ctype (fresh_var "value") in
|
|
|
+ let (param, value) = create_param ctype (fresh_id "value") in
|
|
|
let body = [VarLet (dec, None, value, [])] in
|
|
|
- let setter = FunDef (true, Void, name ^ "$set", [param], Block body, []) in
|
|
|
+ let setter = FunDef (true, Void, setname name, [param], Block body, []) in
|
|
|
|
|
|
[getter; setter]
|
|
|
|
|
|
@@ -51,12 +56,12 @@ let create_getset globals = function
|
|
|
let rec add_dims i = function
|
|
|
| [] -> []
|
|
|
| Dim (dimname, ann) :: tl ->
|
|
|
- let newname = name ^ "$" ^ string_of_int i in
|
|
|
+ let newname = generate_id name i in
|
|
|
|
|
|
- let getter = FunDec (ctype, newname ^ "$get", [], []) in
|
|
|
+ let getter = FunDec (ctype, getname newname, [], []) in
|
|
|
|
|
|
let (param, _) = create_param ctype "value" in
|
|
|
- let setter = FunDec (Void, newname ^ "$set", [param], []) in
|
|
|
+ let setter = FunDec (Void, setname newname, [param], []) in
|
|
|
|
|
|
Hashtbl.add globals dimname (call getter, call setter);
|
|
|
getter :: setter :: (add_dims (i + 1) tl)
|
|
|
@@ -65,21 +70,21 @@ let create_getset globals = function
|
|
|
let dimfuncs = add_dims 1 dims in
|
|
|
|
|
|
let (param, _) = create_param Int "index" in
|
|
|
- let getter = FunDec (ctype, name ^ "$get", [param], []) in
|
|
|
+ let getter = FunDec (ctype, getname name, [param], []) in
|
|
|
|
|
|
let (param1, index) = create_param Int "index" in
|
|
|
let (param2, value) = create_param ctype "value" in
|
|
|
- let setter = FunDec (Void, name ^ "$set", [param1; param2], []) in
|
|
|
+ let setter = FunDec (Void, setname name, [param1; param2], []) in
|
|
|
|
|
|
Hashtbl.add globals name (call getter, call setter);
|
|
|
getter :: setter :: dimfuncs
|
|
|
|
|
|
(* Getter for basic variable type: return the variable *)
|
|
|
| GlobalDec (ctype, name, ann) ->
|
|
|
- let getter = FunDec (ctype, name ^ "$get", [], []) in
|
|
|
+ let getter = FunDec (ctype, getname name, [], []) in
|
|
|
|
|
|
let (param, _) = create_param ctype "value" in
|
|
|
- let setter = FunDec (Void, name ^ "$set", [param], []) in
|
|
|
+ let setter = FunDec (Void, setname name, [param], []) in
|
|
|
|
|
|
Hashtbl.add globals name (call getter, call setter);
|
|
|
[getter; setter]
|