@@ -329,11 +329,48 @@ class traverse record_block =
329329 super#record_block b
330330 end
331331
332+ class traverse_labels h =
333+ object
334+ inherit Js_traverse. iter as super
335+
336+ val ldepth = 0
337+
338+ method fun_decl (_k , _params , body , _loc ) =
339+ let m = {< ldepth = 0 > } in
340+ m#function_body body
341+
342+ method statement =
343+ function
344+ | Labelled_statement (L l , (s , _ )) ->
345+ let m = {< ldepth = ldepth + 1 > } in
346+ Hashtbl. add h l ldepth;
347+ m#statement s
348+ | s -> super#statement s
349+ end
350+
351+ class name ident label =
352+ object (m )
353+ inherit Js_traverse. subst ident as super
354+
355+ method statement =
356+ function
357+ | Labelled_statement (l , (s , loc )) ->
358+ Labelled_statement (label l, (m#statement s, loc))
359+ | Break_statement (Some l ) -> Break_statement (Some (label l))
360+ | Continue_statement (Some l ) -> Continue_statement (Some (label l))
361+ | s -> super#statement s
362+ end
363+
332364let program' (module Strategy : Strategy ) p =
333365 let nv = Var. count () in
334366 let state = Strategy. create nv in
367+ let labels = Hashtbl. create 20 in
335368 let mapper = new traverse (Strategy. record_block state) in
336369 let p = mapper#program p in
370+ let () =
371+ let o = new traverse_labels labels in
372+ o#program p
373+ in
337374 mapper#record_block Normal ;
338375 let free =
339376 IdentSet. filter
@@ -350,7 +387,7 @@ let program' (module Strategy : Strategy) p =
350387 | S _ -> ()
351388 | V x -> names.(Var. idx x) < - " " )
352389 free;
353- let color = function
390+ let ident = function
354391 | V v -> (
355392 let name = names.(Var. idx v) in
356393 match name, has_free_var with
@@ -359,7 +396,18 @@ let program' (module Strategy : Strategy) p =
359396 | _ , (true | false ) -> ident ~var: v (Utf8_string. of_string_exn name))
360397 | x -> x
361398 in
362- let p = (new Js_traverse. subst color)#program p in
399+ let label_printer = Var_printer. create Var_printer.Alphabet. javascript in
400+ let max_label_depth = Hashtbl. fold (fun _ d acc -> max d acc) labels 0 in
401+ let lname_per_depth =
402+ Array. init (max_label_depth + 1 ) ~f: (fun i -> Var_printer. to_string label_printer i)
403+ in
404+ let label = function
405+ | Label. S _ as l -> l
406+ | L v ->
407+ let i = Hashtbl. find labels v in
408+ S (Utf8_string. of_string_exn lname_per_depth.(i))
409+ in
410+ let p = (new name ident label)#program p in
363411 (if has_free_var
364412 then
365413 let () =
0 commit comments