@@ -378,7 +378,18 @@ let main () =
378
378
begin let open EcUserMessages in register () end ;
379
379
380
380
(* Initialize I/O + interaction module *)
381
- let (prvopts, input, terminal, interactive, eco) =
381
+ let module State = struct
382
+ type t = {
383
+ prvopts : prv_options ;
384
+ input : string option ;
385
+ terminal : T .terminal lazy_t ;
386
+ interactive : bool ;
387
+ eco : bool ;
388
+ gccompact : int option ;
389
+ }
390
+ end in
391
+
392
+ let state : State.t =
382
393
match options.o_command with
383
394
| `Config ->
384
395
let config = {
@@ -422,7 +433,15 @@ let main () =
422
433
then lazy (T. from_emacs () )
423
434
else lazy (T. from_tty () )
424
435
425
- in (cliopts.clio_provers, None , terminal, true , false )
436
+ in
437
+
438
+ { prvopts = cliopts.clio_provers
439
+ ; input = None
440
+ ; terminal = terminal
441
+ ; interactive = true
442
+ ; eco = false
443
+ ; gccompact = None }
444
+
426
445
end
427
446
428
447
| `Compile cmpopts -> begin
@@ -442,8 +461,13 @@ let main () =
442
461
let terminal =
443
462
lazy (T. from_channel ~name ~gcstats ~progress (open_in name))
444
463
in
445
- ({cmpopts.cmpo_provers with prvo_iterate = true },
446
- Some name, terminal, false , cmpopts.cmpo_noeco)
464
+
465
+ { prvopts = {cmpopts.cmpo_provers with prvo_iterate = true }
466
+ ; input = Some name
467
+ ; terminal = terminal
468
+ ; interactive = false
469
+ ; eco = cmpopts.cmpo_noeco
470
+ ; gccompact = cmpopts.cmpo_compact }
447
471
448
472
end
449
473
@@ -452,7 +476,7 @@ let main () =
452
476
assert false
453
477
in
454
478
455
- (match input with
479
+ (match state. input with
456
480
| Some input -> EcCommands. addidir (Filename. dirname input)
457
481
| None ->
458
482
match relocdir with
@@ -462,7 +486,7 @@ let main () =
462
486
(* Check if the .eco is up-to-date and exit if so *)
463
487
oiter
464
488
(fun input -> if EcCommands. check_eco input then exit 0 )
465
- input;
489
+ state. input;
466
490
467
491
let finalize_input input scope =
468
492
match input with
@@ -512,13 +536,13 @@ let main () =
512
536
| _ -> fun _ _ -> () in
513
537
514
538
(* Instantiate terminal *)
515
- let lazy terminal = terminal in
539
+ let lazy terminal = state. terminal in
516
540
517
541
(* Initialize PRNG *)
518
542
Random. self_init () ;
519
543
520
544
(* Connect to external Why3 server if requested *)
521
- prvopts.prvo_why3server |> oiter (fun server ->
545
+ state. prvopts.prvo_why3server |> oiter (fun server ->
522
546
try
523
547
Why3.Prove_client. connect_external server
524
548
with Why3.Prove_client. ConnectionError e ->
@@ -534,6 +558,7 @@ let main () =
534
558
535
559
(* Interaction loop *)
536
560
let first = ref `Init in
561
+ let cmdcounter = ref 0 in
537
562
538
563
while true do
539
564
let terminate = ref false in
@@ -545,19 +570,19 @@ let main () =
545
570
546
571
(* Initialize global scope *)
547
572
let checkmode = {
548
- EcCommands. cm_checkall = prvopts.prvo_checkall;
549
- EcCommands. cm_timeout = odfl 3 (prvopts.prvo_timeout);
550
- EcCommands. cm_cpufactor = odfl 1 (prvopts.prvo_cpufactor);
551
- EcCommands. cm_nprovers = odfl 4 (prvopts.prvo_maxjobs);
552
- EcCommands. cm_provers = prvopts.prvo_provers;
553
- EcCommands. cm_profile = prvopts.prvo_profile;
554
- EcCommands. cm_iterate = prvopts.prvo_iterate;
573
+ EcCommands. cm_checkall = state. prvopts.prvo_checkall;
574
+ EcCommands. cm_timeout = odfl 3 (state. prvopts.prvo_timeout);
575
+ EcCommands. cm_cpufactor = odfl 1 (state. prvopts.prvo_cpufactor);
576
+ EcCommands. cm_nprovers = odfl 4 (state. prvopts.prvo_maxjobs);
577
+ EcCommands. cm_provers = state. prvopts.prvo_provers;
578
+ EcCommands. cm_profile = state. prvopts.prvo_profile;
579
+ EcCommands. cm_iterate = state. prvopts.prvo_iterate;
555
580
} in
556
581
557
582
EcCommands. initialize ~restart
558
- ~undo: interactive ~boot: ldropts.ldro_boot ~checkmode ;
583
+ ~undo: state. interactive ~boot: ldropts.ldro_boot ~checkmode ;
559
584
(try
560
- List. iter EcCommands. apply_pragma prvopts.prvo_pragmas
585
+ List. iter EcCommands. apply_pragma state. prvopts.prvo_pragmas
561
586
with EcCommands. InvalidPragma x ->
562
587
EcScope. hierror " invalid pragma: `%s'\n %!" x);
563
588
@@ -569,7 +594,7 @@ let main () =
569
594
oiter (fun ppwidth ->
570
595
let gs = EcEnv. gstate (EcScope. env (EcCommands. current () )) in
571
596
EcGState. setvalue " PP:width" (`Int ppwidth) gs)
572
- prvopts.prvo_ppwidth;
597
+ state. prvopts.prvo_ppwidth;
573
598
first := `Loop
574
599
575
600
| `Loop -> ()
@@ -624,10 +649,19 @@ let main () =
624
649
terminate := true
625
650
end ;
626
651
T. finish `ST_Ok terminal;
652
+
653
+ state.gccompact |> Option. iter (fun i ->
654
+ incr cmdcounter;
655
+ if i = ! cmdcounter then begin
656
+ cmdcounter := 0 ;
657
+ Gc. compact ()
658
+ end
659
+ );
660
+
627
661
if ! terminate then begin
628
662
T. finalize terminal;
629
- if not eco then
630
- finalize_input input (EcCommands. current () );
663
+ if not state. eco then
664
+ finalize_input state. input (EcCommands. current () );
631
665
exit 0
632
666
end ;
633
667
with
0 commit comments