diff options
Diffstat (limited to 'src/lem_interp/interp_lib.lem')
| -rw-r--r-- | src/lem_interp/interp_lib.lem | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem index cd656f1e..483253b6 100644 --- a/src/lem_interp/interp_lib.lem +++ b/src/lem_interp/interp_lib.lem @@ -333,7 +333,18 @@ let rec arith_op_vec_no0 op size (V_tuple args) = match args with | [V_unknown;_] -> V_unknown | [_;V_unknown] -> V_unknown end ;; - +let rec arith_op_vec_range_no0 op size (V_tuple args) = match args with + | [V_track v1 r1;V_track v2 r2] -> + taint (arith_op_vec_range_no0 op size (V_tuple [v1;v2])) (r1++r2) + | [V_track v1 r1; v2] -> + taint (arith_op_vec_range_no0 op size (V_tuple [v1;v2])) r1 + | [v1;V_track v2 r2] -> + taint (arith_op_vec_range_no0 op size (V_tuple [v1;v2])) r2 + | [V_unknown;_] -> V_unknown + | [_;V_unknown] -> V_unknown + | [(V_vector _ ord cs as l1);n] -> + arith_op_vec_no0 op size (V_tuple [l1;(to_vec ord (List.length cs) n)]) +end ;; let rec compare_op op (V_tuple args) = match args with | [V_track v1 r1;V_track v2 r2] -> @@ -435,7 +446,7 @@ let function_map = [ ("mult_overload_vec", arith_op_overflow_vec ( * ) 2); ("mod", arith_op_no0 (mod)); ("mod_vec", arith_op_vec_no0 (mod) 1); - ("mod_vec_range", arith_op_vec_range (mod) 1); + ("mod_vec_range", arith_op_vec_range_no0 (mod) 1); ("quot", arith_op_no0 (/)); ("quot_vec", arith_op_vec_no0 (/) 1); ("eq", eq); |
