From 35e3f39bf967c4ed2ba3390b488604554306065d Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Mon, 9 Nov 2015 17:03:47 +0100 Subject: Handle large static initializers for global arrays Use tail-recursive operations to implement transformations on initializers for global arrays. This way, very large static initializers no longer cause stack overflows at compile-time. --- cparser/Bitfields.ml | 2 +- cparser/PackedStructs.ml | 2 +- cparser/Rename.ml | 2 +- cparser/StructReturn.ml | 2 +- cparser/Unblock.ml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) (limited to 'cparser') diff --git a/cparser/Bitfields.ml b/cparser/Bitfields.ml index 223ee3ca..bbc39456 100644 --- a/cparser/Bitfields.ml +++ b/cparser/Bitfields.ml @@ -502,7 +502,7 @@ and transf_post env ctx op e1 bf tyfield = and transf_init env i = match i with | Init_single e -> Init_single (transf_exp env Val e) - | Init_array il -> Init_array (List.map (transf_init env) il) + | Init_array il -> Init_array (List.rev (List.rev_map (transf_init env) il)) | Init_struct(id, fld_init_list) -> let fld_init_list' = List.map (fun (f, i) -> (f, transf_init env i)) fld_init_list in diff --git a/cparser/PackedStructs.ml b/cparser/PackedStructs.ml index c163989e..6ea5d121 100644 --- a/cparser/PackedStructs.ml +++ b/cparser/PackedStructs.ml @@ -360,7 +360,7 @@ let transf_init loc env i = match unroll env ty with | TArray(ty_elt, _, _) -> Some ty_elt | _ -> assert false in - Init_array (List.map (trinit swap_elt) il) + Init_array (List.rev (List.rev_map (trinit swap_elt) il)) | Init_struct(id, fld_init_list) -> let trinit_field (f, i) = let swap_f = diff --git a/cparser/Rename.ml b/cparser/Rename.ml index 4b387b0d..664f6a28 100644 --- a/cparser/Rename.ml +++ b/cparser/Rename.ml @@ -142,7 +142,7 @@ and exp_desc env = function and init env = function | Init_single e -> Init_single(exp env e) - | Init_array il -> Init_array (List.map (init env) il) + | Init_array il -> Init_array (List.rev (List.rev_map (init env) il)) | Init_struct(id, il) -> Init_struct(ident env id, List.map (fun (f, i) -> (field env f, init env i)) il) diff --git a/cparser/StructReturn.ml b/cparser/StructReturn.ml index 2c6fd1d2..82c0a04c 100644 --- a/cparser/StructReturn.ml +++ b/cparser/StructReturn.ml @@ -412,7 +412,7 @@ and transf_init env = function | Init_single e -> Init_single (transf_expr env Val e) | Init_array il -> - Init_array (List.map (transf_init env) il) + Init_array (List.rev (List.rev_map (transf_init env) il)) | Init_struct(id, fil) -> Init_struct (id, List.map (fun (fld, i) -> (fld, transf_init env i)) fil) | Init_union(id, fld, i) -> diff --git a/cparser/Unblock.ml b/cparser/Unblock.ml index 405cf755..ef8bc91c 100644 --- a/cparser/Unblock.ml +++ b/cparser/Unblock.ml @@ -169,7 +169,7 @@ and expand_init islocal env i = | Init_single e -> Init_single (expand_expr islocal env e) | Init_array il -> - Init_array (List.map expand il) + Init_array (List.rev (List.rev_map expand il)) | Init_struct(id, flds) -> Init_struct(id, List.map (fun (f, i) -> (f, expand i)) flds) | Init_union(id, fld, i) -> -- cgit