|
@@ -63,14 +63,14 @@ let rec array_dims node =
|
|
|
let (decs, dims) = make_dims make_dimname values make_dec in
|
|
let (decs, dims) = make_dims make_dimname values make_dec in
|
|
|
Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
|
|
Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
|
|
|
|
|
|
|
|
- | GlobalDef (export, ArrayDims (ctype, values), name, None, ann) ->
|
|
|
|
|
|
|
+ | GlobalDef (export, ArrayDims (ctype, values), name, init, ann) ->
|
|
|
(* For global decs, the name must also be unique, but not constant (no $$in
|
|
(* For global decs, the name must also be unique, but not constant (no $$in
|
|
|
* the name) since the variable must exist for exporting *)
|
|
* the name) since the variable must exist for exporting *)
|
|
|
let make_dimname i _ = fresh_var (name ^ "$" ^ string_of_int (i + 1)) in
|
|
let make_dimname i _ = fresh_var (name ^ "$" ^ string_of_int (i + 1)) in
|
|
|
|
|
|
|
|
let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
|
|
let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
|
|
|
let (decs, dims) = make_dims make_dimname values make_dec in
|
|
let (decs, dims) = make_dims make_dimname values make_dec in
|
|
|
- Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, None, ann)])
|
|
|
|
|
|
|
+ Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, init, ann)])
|
|
|
|
|
|
|
|
(* DISABLED, this is also done in extern.ml
|
|
(* DISABLED, this is also done in extern.ml
|
|
|
| GlobalDec (ArrayDims (ctype, values), name, ann) ->
|
|
| GlobalDec (ArrayDims (ctype, values), name, ann) ->
|
|
@@ -100,6 +100,12 @@ let rec split_inits = function
|
|
|
Assign (name, None, ArrayInit (value, dims), ann);
|
|
Assign (name, None, ArrayInit (value, dims), ann);
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
|
|
+ | GlobalDef (export, (ArrayDims (_, dims) as ctype), name, Some value, ann) ->
|
|
|
|
|
+ Block [
|
|
|
|
|
+ GlobalDef (export, ctype, name, None, ann);
|
|
|
|
|
+ Assign (name, None, ArrayInit (value, dims), ann);
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
| VarDec (ctype, name, Some init, ann) ->
|
|
| VarDec (ctype, name, Some init, ann) ->
|
|
|
Block [
|
|
Block [
|
|
|
VarDec (ctype, name, None, ann);
|
|
VarDec (ctype, name, None, ann);
|
|
@@ -234,9 +240,9 @@ let for_to_while node =
|
|
|
|
|
|
|
|
let rec sublist n = function
|
|
let rec sublist n = function
|
|
|
| [] when n > 0 -> raise (Invalid_argument "n")
|
|
| [] when n > 0 -> raise (Invalid_argument "n")
|
|
|
- | [] -> []
|
|
|
|
|
|
|
+ | [] -> []
|
|
|
| lst when n = 0 -> lst
|
|
| lst when n = 0 -> lst
|
|
|
- | _ :: tl -> sublist (n - 1) tl
|
|
|
|
|
|
|
+ | _ :: tl -> sublist (n - 1) tl
|
|
|
|
|
|
|
|
let rec array_init = function
|
|
let rec array_init = function
|
|
|
(* Transform array constant initialisation into separate assign statements
|
|
(* Transform array constant initialisation into separate assign statements
|