Skip to content

Commit 0d84c65

Browse files
hhugovouillon
authored andcommitted
Compiler: change how we allocate variables with the Preserve strat
1 parent 629d18c commit 0d84c65

File tree

1 file changed

+35
-21
lines changed

1 file changed

+35
-21
lines changed

compiler/lib/js_assign.ml

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)