@@ -194,6 +194,9 @@ type ctxt =
194
194
ctxt_type_is_structured_cache : (Ast .ty ,bool ) Hashtbl .t ;
195
195
ctxt_type_contains_chan_cache : (Ast .ty ,bool ) Hashtbl .t ;
196
196
ctxt_n_used_type_parameters_cache : (Ast .ty ,int ) Hashtbl .t ;
197
+ mutable ctxt_tag_cache :
198
+ ((Ast .ty_tag option * Ast .ty_tag * int ,
199
+ Ast .ty_tup ) Hashtbl .t ) option ;
197
200
}
198
201
;;
199
202
@@ -290,6 +293,7 @@ let new_ctxt sess abi crate =
290
293
ctxt_type_is_structured_cache = Hashtbl. create 0 ;
291
294
ctxt_type_contains_chan_cache = Hashtbl. create 0 ;
292
295
ctxt_n_used_type_parameters_cache = Hashtbl. create 0 ;
296
+ ctxt_tag_cache = None ;
293
297
}
294
298
;;
295
299
@@ -797,13 +801,18 @@ let get_nth_tag_tup_full
797
801
(ttag :Ast.ty_tag )
798
802
(i :int )
799
803
: Ast.ty_tup =
800
- let tinfo = Hashtbl. find cx.ctxt_all_tag_info ttag.Ast. tag_id in
801
- let (_, node_id, ttup) = Hashtbl. find tinfo.tag_nums i in
802
- let ctor = get_item cx node_id in
803
- let params = Array. map (fun p -> p.node) ctor.Ast. decl_params in
804
- Array. map
805
- (fun ty -> rebuilder src_tag ty params ttag.Ast. tag_args)
806
- ttup
804
+ let calculate _ =
805
+ let tinfo = Hashtbl. find cx.ctxt_all_tag_info ttag.Ast. tag_id in
806
+ let (_, node_id, ttup) = Hashtbl. find tinfo.tag_nums i in
807
+ let ctor = get_item cx node_id in
808
+ let params = Array. map (fun p -> p.node) ctor.Ast. decl_params in
809
+ Array. map
810
+ (fun ty -> rebuilder src_tag ty params ttag.Ast. tag_args)
811
+ ttup
812
+ in
813
+ match cx.ctxt_tag_cache with
814
+ None -> calculate()
815
+ | Some cache -> htab_search_or_add cache (src_tag,ttag,i) calculate
807
816
;;
808
817
809
818
let rec fold_ty_full
0 commit comments