@@ -21,10 +21,68 @@ exception Stop_instruction of Com.stop_kind
2121
2222let exit_on_rte = ref true
2323
24- let repl_debug = ref false
24+ let empty_ctx (p : Mir.program ) : 'a ctx =
25+ let dummy_var = Com.Var. new_ref ~name: (Pos. without " " ) in
26+ let init_tmp_var _i = { var = dummy_var; value = Undefined } in
27+ let init_ref _i =
28+ {
29+ var = dummy_var;
30+ var_space = p.program_var_space_def;
31+ ref_var = dummy_var;
32+ org = - 1 ;
33+ }
34+ in
35+ let ctx_tab_map =
36+ let init i = IntMap. find i p.program_stats.table_map in
37+ Array. init (IntMap. cardinal p.program_stats.table_map) init
38+ in
39+ let ctx_var_spaces =
40+ let init i =
41+ let vsd = IntMap. find i p.program_var_spaces_idx in
42+ let input =
43+ if Com.CatVar.LocMap. mem Com.CatVar. LocInput vsd.vs_cats then
44+ Array. make p.program_stats.sz_input Undefined
45+ else Array. make 0 Undefined
46+ in
47+ let computed =
48+ if Com.CatVar.LocMap. mem Com.CatVar. LocComputed vsd.vs_cats then
49+ Array. make p.program_stats.sz_computed Undefined
50+ else Array. make 0 Undefined
51+ in
52+ let base =
53+ if Com.CatVar.LocMap. mem Com.CatVar. LocBase vsd.vs_cats then
54+ Array. make p.program_stats.sz_base Undefined
55+ else Array. make 0 Undefined
56+ in
57+ { input; computed; base }
58+ in
59+ Array. init (IntMap. cardinal p.program_var_spaces_idx) init
60+ in
61+ {
62+ ctx_prog = p;
63+ ctx_target = snd (StrMap. min_binding p.program_targets);
64+ ctx_var_space = p.program_var_space_def.vs_id;
65+ ctx_var_spaces;
66+ ctx_tmps = Array. init p.program_stats.sz_all_tmps init_tmp_var;
67+ ctx_tmps_org = 0 ;
68+ ctx_ref = Array. init p.program_stats.nb_all_refs init_ref;
69+ ctx_ref_org = 0 ;
70+ ctx_tab_map;
71+ ctx_pr_out = { indent = 0 ; is_newline = true };
72+ ctx_pr_err = { indent = 0 ; is_newline = true };
73+ ctx_anos = [] ;
74+ ctx_nb_anos = 0 ;
75+ ctx_nb_discos = 0 ;
76+ ctx_nb_infos = 0 ;
77+ ctx_nb_bloquantes = 0 ;
78+ ctx_archived_anos = StrSet. empty;
79+ ctx_finalized_anos = [] ;
80+ ctx_exported_anos = [] ;
81+ ctx_events = [] ;
82+ }
2583
2684module Make (N : Mir_number.NumberInterface ) (RF : Mir_roundops.RoundOpsFunctor ) :
27- S = struct
85+ S with type custom_float = N. t = struct
2886 (* Careful : this behavior mimics the one imposed by the original Mlang
2987 compiler... *)
3088
@@ -34,16 +92,9 @@ module Make (N : Mir_number.NumberInterface) (RF : Mir_roundops.RoundOpsFunctor)
3492
3593 type nonrec value = custom_float value
3694
37- type nonrec ctx_tmp_var = custom_float ctx_tmp_var
38-
3995 type nonrec ctx = custom_float ctx
4096
41- type pctx = {
42- std : Com .print_std ;
43- ctx : ctx ;
44- std_fmt : Format .formatter ;
45- ctx_pr : print_ctx ;
46- }
97+ type nonrec pctx = custom_float pctx
4798
4899 exception RuntimeError of run_error * ctx
49100
@@ -66,66 +117,6 @@ module Make (N : Mir_number.NumberInterface) (RF : Mir_roundops.RoundOpsFunctor)
66117 | Undefined -> Com. format_literal fmt Com. Undefined
67118 | Number x -> N. format_prec_t mi ma fmt x
68119
69- let empty_ctx (p : Mir.program ) : ctx =
70- let dummy_var = Com.Var. new_ref ~name: (Pos. without " " ) in
71- let init_tmp_var _i = { var = dummy_var; value = Undefined } in
72- let init_ref _i =
73- {
74- var = dummy_var;
75- var_space = p.program_var_space_def;
76- ref_var = dummy_var;
77- org = - 1 ;
78- }
79- in
80- let ctx_tab_map =
81- let init i = IntMap. find i p.program_stats.table_map in
82- Array. init (IntMap. cardinal p.program_stats.table_map) init
83- in
84- let ctx_var_spaces =
85- let init i =
86- let vsd = IntMap. find i p.program_var_spaces_idx in
87- let input =
88- if Com.CatVar.LocMap. mem Com.CatVar. LocInput vsd.vs_cats then
89- Array. make p.program_stats.sz_input Undefined
90- else Array. make 0 Undefined
91- in
92- let computed =
93- if Com.CatVar.LocMap. mem Com.CatVar. LocComputed vsd.vs_cats then
94- Array. make p.program_stats.sz_computed Undefined
95- else Array. make 0 Undefined
96- in
97- let base =
98- if Com.CatVar.LocMap. mem Com.CatVar. LocBase vsd.vs_cats then
99- Array. make p.program_stats.sz_base Undefined
100- else Array. make 0 Undefined
101- in
102- { input; computed; base }
103- in
104- Array. init (IntMap. cardinal p.program_var_spaces_idx) init
105- in
106- {
107- ctx_prog = p;
108- ctx_target = snd (StrMap. min_binding p.program_targets);
109- ctx_var_space = p.program_var_space_def.vs_id;
110- ctx_var_spaces;
111- ctx_tmps = Array. init p.program_stats.sz_all_tmps init_tmp_var;
112- ctx_tmps_org = 0 ;
113- ctx_ref = Array. init p.program_stats.nb_all_refs init_ref;
114- ctx_ref_org = 0 ;
115- ctx_tab_map;
116- ctx_pr_out = { indent = 0 ; is_newline = true };
117- ctx_pr_err = { indent = 0 ; is_newline = true };
118- ctx_anos = [] ;
119- ctx_nb_anos = 0 ;
120- ctx_nb_discos = 0 ;
121- ctx_nb_infos = 0 ;
122- ctx_nb_bloquantes = 0 ;
123- ctx_archived_anos = StrSet. empty;
124- ctx_finalized_anos = [] ;
125- ctx_exported_anos = [] ;
126- ctx_events = [] ;
127- }
128-
129120 let literal_to_value (l : Com.literal ) : value =
130121 match l with
131122 | Com. Undefined -> Undefined
@@ -306,6 +297,45 @@ module Make (N : Mir_number.NumberInterface) (RF : Mir_roundops.RoundOpsFunctor)
306297 | Number n -> N. compare Eq n (N. one () ))
307298 | None -> false
308299
300+ let comparison op new_e1 new_e2 =
301+ match (op, new_e1, new_e2) with
302+ | Com. (Gt | Gte | Lt | Lte | Eq | Neq ), _, Undefined
303+ | Com. (Gt | Gte | Lt | Lte | Eq | Neq ), Undefined , _ ->
304+ Undefined
305+ | op , Number i1 , Number i2 -> Number (real_of_bool @@ N. compare op i1 i2)
306+
307+ let unop op new_e1 =
308+ match (op, new_e1) with
309+ | Com. Not , Number b1 -> Number (real_of_bool (not (bool_of_real b1)))
310+ | Minus , Number f1 -> Number N. (zero () -. f1)
311+ | (Not | Minus ), Undefined -> Undefined
312+
313+ let binop (op : Com.binop ) new_e1 new_e2 =
314+ match (op, new_e1, new_e2) with
315+ | Add , Number i1 , Number i2 -> Number N. (i1 +. i2)
316+ | Add , Number i1 , Undefined -> Number N. (i1 +. zero () )
317+ | Add , Undefined , Number i2 -> Number N. (zero () +. i2)
318+ | Add , Undefined , Undefined -> Undefined
319+ | Sub , Number i1 , Number i2 -> Number N. (i1 -. i2)
320+ | Sub , Number i1 , Undefined -> Number N. (i1 -. zero () )
321+ | Sub , Undefined , Number i2 -> Number N. (zero () -. i2)
322+ | Sub , Undefined , Undefined -> Undefined
323+ | Mul , _ , Undefined | Mul , Undefined , _ -> Undefined
324+ | Mul , Number i1 , Number i2 -> Number N. (i1 *. i2)
325+ | Div , Undefined , _ | Div , _ , Undefined -> Undefined
326+ | Div , _ , l2 when is_zero l2 -> Number (N. zero () ) (* yes... *)
327+ | Div , Number i1 , Number i2 -> Number N. (i1 /. i2)
328+ | Mod , Undefined , _ | Mod , _ , Undefined -> Undefined
329+ | Mod , _ , l2 when is_zero l2 -> Number (N. zero () ) (* yes... *)
330+ | Mod , Number i1 , Number i2 -> Number N. (i1 %. i2)
331+ | And , Undefined , _ | And , _ , Undefined -> Undefined
332+ | Or , Undefined , Undefined -> Undefined
333+ | Or , Undefined , Number i | Or , Number i , Undefined -> Number i
334+ | And , Number i1 , Number i2 ->
335+ Number (real_of_bool (bool_of_real i1 && bool_of_real i2))
336+ | Or , Number i1 , Number i2 ->
337+ Number (real_of_bool (bool_of_real i1 || bool_of_real i2))
338+
309339 exception BlockingError
310340
311341 let rec get_access_value ctx access =
@@ -494,46 +524,6 @@ module Make (N : Mir_number.NumberInterface) (RF : Mir_roundops.RoundOpsFunctor)
494524 (* interpret *)
495525
496526 and evaluate_expr (ctx : ctx ) (e : Mir.expression Pos.marked ) : value =
497- let comparison op new_e1 new_e2 =
498- match (op, new_e1, new_e2) with
499- | Com. (Gt | Gte | Lt | Lte | Eq | Neq ), _, Undefined
500- | Com. (Gt | Gte | Lt | Lte | Eq | Neq ), Undefined , _ ->
501- Undefined
502- | op , Number i1 , Number i2 -> Number (real_of_bool @@ N. compare op i1 i2)
503- in
504- let unop op new_e1 =
505- match (op, new_e1) with
506- | Com. Not , Number b1 -> Number (real_of_bool (not (bool_of_real b1)))
507- | Com. Minus , Number f1 -> Number N. (zero () -. f1)
508- | Com. (Not | Minus ), Undefined -> Undefined
509- in
510- let binop op new_e1 new_e2 =
511- let open Com in
512- match (op, new_e1, new_e2) with
513- | Add , Number i1 , Number i2 -> Number N. (i1 +. i2)
514- | Add , Number i1 , Undefined -> Number N. (i1 +. zero () )
515- | Add , Undefined , Number i2 -> Number N. (zero () +. i2)
516- | Add , Undefined , Undefined -> Undefined
517- | Sub , Number i1 , Number i2 -> Number N. (i1 -. i2)
518- | Sub , Number i1 , Undefined -> Number N. (i1 -. zero () )
519- | Sub , Undefined , Number i2 -> Number N. (zero () -. i2)
520- | Sub , Undefined , Undefined -> Undefined
521- | Mul , _ , Undefined | Mul , Undefined , _ -> Undefined
522- | Mul , Number i1 , Number i2 -> Number N. (i1 *. i2)
523- | Div , Undefined , _ | Div , _ , Undefined -> Undefined (* yes... *)
524- | Div , _ , l2 when is_zero l2 -> Number (N. zero () )
525- | Div , Number i1 , Number i2 -> Number N. (i1 /. i2)
526- | Mod , Undefined , _ | Mod , _ , Undefined -> Undefined (* yes... *)
527- | Mod , _ , l2 when is_zero l2 -> Number (N. zero () )
528- | Mod , Number i1 , Number i2 -> Number N. (i1 %. i2)
529- | And , Undefined , _ | And , _ , Undefined -> Undefined
530- | Or , Undefined , Undefined -> Undefined
531- | Or , Undefined , Number i | Or , Number i , Undefined -> Number i
532- | And , Number i1 , Number i2 ->
533- Number (real_of_bool (bool_of_real i1 && bool_of_real i2))
534- | Or , Number i1 , Number i2 ->
535- Number (real_of_bool (bool_of_real i1 || bool_of_real i2))
536- in
537527 let out =
538528 try
539529 match Pos. unmark e with
@@ -1297,13 +1287,13 @@ let prepare_interp (sort : Config.value_sort) (roundops : Config.round_ops) :
12971287 MainframeLongSize. max_long := max_long
12981288 | _ -> ()
12991289
1300- let evaluate_program (p : Mir.program ) (inputs : Com.literal Com.Var.Map.t )
1301- (events : (Com.literal, Com.Var.t) Com.event_value StrMap.t list )
1302- (sort : Config.value_sort ) ( roundops : Config.round_ops ) :
1290+ let evaluate_program ~ (p : Mir.program ) ~ (inputs : Com.literal Com.Var.Map.t )
1291+ ~ (events : (Com.literal, Com.Var.t) Com.event_value StrMap.t list )
1292+ ~ (sort : Config.value_sort ) ~( round_ops : Config.round_ops ) :
13031293 Com. literal Com.Var.Map. t * Com.Error.Set. t =
1304- prepare_interp sort roundops ;
1305- let module Interp = (val get_interp sort roundops : S ) in
1306- let ctx = Interp. empty_ctx p in
1294+ prepare_interp sort round_ops ;
1295+ let module Interp = (val get_interp sort round_ops : S ) in
1296+ let ctx = empty_ctx p in
13071297 Interp. evaluate_program ~inputs ~events ctx;
13081298 Format. pp_print_flush Format. std_formatter () ;
13091299 Format. pp_print_flush Format. err_formatter () ;
@@ -1331,8 +1321,8 @@ let evaluate_program (p : Mir.program) (inputs : Com.literal Com.Var.Map.t)
13311321 in
13321322 (varMap, anoSet)
13331323
1334- let evaluate_expr (p : Mir.program ) (e : Mir.expression Pos.marked )
1335- (sort : Config.value_sort ) ( roundops : Config.round_ops ) : Com.literal =
1336- let module Interp = (val get_interp sort roundops : S ) in
1337- try Interp. value_to_literal (Interp. evaluate_expr (Interp. empty_ctx p) e)
1324+ let evaluate_expr ~ (p : Mir.program ) ~ (e : Mir.expression Pos.marked )
1325+ ~ (sort : Config.value_sort ) ~( round_ops : Config.round_ops ) : Com.literal =
1326+ let module Interp = (val get_interp sort round_ops : S ) in
1327+ try Interp. value_to_literal (Interp. evaluate_expr (empty_ctx p) e)
13381328 with Stop_instruction _ -> Undefined
0 commit comments