expand_dims.ml 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. open Types
  2. open Util
  3. let rec expand_dims = function
  4. (* Flatten Block nodes returned by transformations below *)
  5. | FunDef (export, ret_type, name, params, body, loc) ->
  6. let params = flatten_blocks (List.map expand_dims params) in
  7. FunDef (export, ret_type, name, params, expand_dims body, loc)
  8. | FunDec (ret_type, name, params, loc) ->
  9. let params = flatten_blocks (List.map expand_dims params) in
  10. FunDec (ret_type, name, params, loc)
  11. | FunUse (dec, params, loc) ->
  12. FunUse (dec, flatten_blocks (List.map expand_dims params), loc)
  13. (* Add additional parameters for array dimensions *)
  14. | Param (Array (_,dims) as ctype, name, loc) ->
  15. let rec do_expand = function
  16. | [] ->
  17. [Param (ctype, name, loc)]
  18. | Dim (name, loc) :: tail ->
  19. Param (Int, name, loc) :: (do_expand tail)
  20. | _ -> raise InvalidNode
  21. in
  22. Block (do_expand dims)
  23. (* Add additional function arguments for array dimensions *)
  24. | Arg (VarUse (VarDec (Array (_, dims), _, _, _), None, _)) as node ->
  25. let rec do_expand = function
  26. | [] -> [node]
  27. | hd :: tl -> Arg (VarUse (hd, None, [])) :: (do_expand tl)
  28. in
  29. Block (do_expand dims)
  30. | node -> transform_children expand_dims node
  31. let rec phase input =
  32. log_line 2 "- Expand array dimensions";
  33. match input with
  34. | Types node -> Types (expand_dims node)
  35. | _ -> raise (InvalidInput "expand dimensions")