| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- open Types
- open Util
- let rec expand_dims = function
- (* Flatten Block nodes returned by transformations below *)
- | FunDef (export, ret_type, name, params, body, loc) ->
- let params = flatten_blocks (List.map expand_dims params) in
- FunDef (export, ret_type, name, params, expand_dims body, loc)
- | FunDec (ret_type, name, params, loc) ->
- let params = flatten_blocks (List.map expand_dims params) in
- FunDec (ret_type, name, params, loc)
- | FunUse (dec, params, loc) ->
- FunUse (dec, flatten_blocks (List.map expand_dims params), loc)
- (* Add additional parameters for array dimensions *)
- | Param (Array (_,dims) as ctype, name, loc) ->
- let rec do_expand = function
- | [] ->
- [Param (ctype, name, loc)]
- | Dim (name, loc) :: tail ->
- Param (Int, name, loc) :: (do_expand tail)
- | _ -> raise InvalidNode
- in
- Block (do_expand dims)
- (* Add additional function arguments for array dimensions *)
- | Arg (VarUse (VarDec (Array (_, dims), _, _, _), None, _)) as node ->
- let rec do_expand = function
- | [] -> [node]
- | hd :: tl -> Arg (VarUse (hd, None, [])) :: (do_expand tl)
- in
- Block (do_expand dims)
- | node -> transform_children expand_dims node
- let rec phase input =
- log_line 1 "- Expand array dimensions";
- match input with
- | Ast node -> Ast (expand_dims node)
- | _ -> raise (InvalidInput "expand dimensions")
|