@@ -294,7 +294,7 @@ module Preserve : Strategy = struct
294294
295295 let uniq_var = Debug. find " var"
296296
297- let allocate_variables t ~count : _ =
297+ let allocate_variables t ~count =
298298 let names = Array. make t.size " " in
299299 let uniq_var = uniq_var () in
300300 let unamed = ref 0 in
@@ -317,16 +317,16 @@ module Preserve : Strategy = struct
317317 all
318318 StringSet. empty
319319 in
320- if not uniq_var then unamed := 0 ;
321- let _reserved =
320+ (* We first allocate variable that have a name *)
321+ let reserved, others =
322322 S. fold
323- (fun var reserved ->
323+ (fun var ( reserved , others ) ->
324324 assert (String. is_empty names.(Var. idx var));
325- let name =
326- match Var. get_name var with
327- | Some expected_name ->
328- assert (not (String. is_empty expected_name));
329- assert ( not ( StringSet. mem expected_name Reserved. keyword));
325+ match Var. get_name var with
326+ | Some expected_name ->
327+ assert ( not ( String. is_empty expected_name));
328+ assert (not (StringSet. mem expected_name Reserved. keyword ));
329+ let name =
330330 if not (StringSet. mem expected_name reserved)
331331 then expected_name
332332 else
@@ -342,19 +342,33 @@ module Preserve : Strategy = struct
342342 incr i
343343 done ;
344344 Printf. sprintf " %s%d" expected_name ! i
345- | None ->
346- while
347- let name = create_unamed ! unamed in
348- StringSet. mem name reserved || StringSet. mem name Reserved. keyword
349- do
350- incr unamed
351- done ;
352- create_unamed ! unamed
353- in
354- names.(Var. idx var) < - name;
355- StringSet. add name reserved)
345+ in
346+ names.(Var. idx var) < - name;
347+ StringSet. add name reserved, others
348+ | None -> reserved, var :: others)
356349 defs
357- reserved
350+ (reserved, [] )
351+ in
352+ (* We then allocate variables without names *)
353+ if not uniq_var then unamed := 0 ;
354+ let _reserved =
355+ let weight v = IdentMap. find (V v) count in
356+ List. stable_sort others ~cmp: (fun i j ->
357+ match compare (weight j) (weight i) with
358+ | 0 -> Var. compare i j
359+ | c -> c)
360+ |> List. fold_left ~init: reserved ~f: (fun reserved var ->
361+ let name =
362+ while
363+ let name = create_unamed ! unamed in
364+ StringSet. mem name reserved || StringSet. mem name Reserved. keyword
365+ do
366+ incr unamed
367+ done ;
368+ create_unamed ! unamed
369+ in
370+ names.(Var. idx var) < - name;
371+ StringSet. add name reserved)
358372 in
359373 () );
360374 names
0 commit comments