From f6f80f68c890813522fabe5787181d0eaab8695e Mon Sep 17 00:00:00 2001 From: Pierre-Marie Pédrot Date: Wed, 22 Nov 2017 18:31:45 +0100 Subject: Implement a tail-recursive traversal of the object in votour. --- checker/votour.ml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/checker/votour.ml b/checker/votour.ml index 0998bb94b1..7fb7aee941 100644 --- a/checker/votour.ml +++ b/checker/votour.ml @@ -81,22 +81,25 @@ struct let ws = Sys.word_size / 8 - let rec init_size seen = function - | Int _ | Atm _ | Fun _ -> 0 + let rec init_size seen k = function + | Int _ | Atm _ | Fun _ -> k 0 | Ptr p -> - if seen.(p) then 0 + if seen.(p) then k 0 else let () = seen.(p) <- true in match (!memory).(p) with | Struct (tag, os) -> - let fold accu o = accu + 1 + init_size seen o in - let size = Array.fold_left fold 1 os in - let () = (!sizes).(p) <- size in - size + let len = Array.length os in + let rec fold i accu k = + if i == len then k accu + else + init_size seen (fun n -> fold (succ i) (accu + 1 + n) k) os.(i) + in + fold 0 1 (fun size -> let () = (!sizes).(p) <- size in k size) | String s -> let size = 2 + (String.length s / ws) in let () = (!sizes).(p) <- size in - size + k size let size = function | Int _ | Atm _ | Fun _ -> 0 @@ -116,7 +119,7 @@ struct let () = memory := mem in let () = sizes := Array.make (Array.length mem) (-1) in let seen = Array.make (Array.length mem) false in - let _ = init_size seen obj in + let () = init_size seen ignore obj in obj let oid = function -- cgit v1.2.3 From e5b128c7d4c2fd28a4ad7c5df8e48d485cd703f3 Mon Sep 17 00:00:00 2001 From: Pierre-Marie Pédrot Date: Thu, 23 Nov 2017 10:31:53 +0100 Subject: Tail-recursive list traversal in votour. --- checker/votour.ml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/checker/votour.ml b/checker/votour.ml index 7fb7aee941..38f1ff9bc7 100644 --- a/checker/votour.ml +++ b/checker/votour.ml @@ -195,13 +195,13 @@ let access_children vs os pos = else raise Exit let access_list v o pos = - let rec loop o pos = match Repr.repr o with - | INT 0 -> [] + let rec loop o pos accu = match Repr.repr o with + | INT 0 -> List.rev accu | BLOCK (0, [|hd; tl|]) -> - (v, hd, 0 :: pos) :: loop tl (1 :: pos) + loop tl (1 :: pos) ((v, hd, 0 :: pos) :: accu) | _ -> raise Exit in - Array.of_list (loop o pos) + Array.of_list (loop o pos []) let access_block o = match Repr.repr o with | BLOCK (tag, os) -> (tag, os) -- cgit v1.2.3 From 7d541f25751838e1cde2a292a71afaa28879b753 Mon Sep 17 00:00:00 2001 From: Pierre-Marie Pédrot Date: Thu, 23 Nov 2017 10:34:25 +0100 Subject: Bypass int and string representation in votour when it's incorrect. --- checker/votour.ml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/checker/votour.ml b/checker/votour.ml index 38f1ff9bc7..95b9f23321 100644 --- a/checker/votour.ml +++ b/checker/votour.ml @@ -230,7 +230,16 @@ let rec get_children v o pos = match v with | BLOCK (0, [|x|]) -> [|(v, x, 0 :: pos)|] | _ -> raise Exit end - |String | Int -> [||] + | String -> + begin match Repr.repr o with + | STRING _ -> [||] + | _ -> raise Exit + end + | Int -> + begin match Repr.repr o with + | INT _ -> [||] + | _ -> raise Exit + end |Annot (s,v) -> get_children v o pos |Any -> raise Exit |Dyn -> -- cgit v1.2.3 From 7b3caccd054b6c912d4ded5c93d6b603c94904d2 Mon Sep 17 00:00:00 2001 From: Pierre-Marie Pédrot Date: Thu, 23 Nov 2017 10:55:32 +0100 Subject: Truncate strings in votour to 1024 characters. Making it bigger is kind of useless, takes time and clutters the output for no real advantage. --- checker/votour.ml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/checker/votour.ml b/checker/votour.ml index 95b9f23321..b7c898232b 100644 --- a/checker/votour.ml +++ b/checker/votour.ml @@ -10,6 +10,8 @@ open Values (** {6 Interactive visit of a vo} *) +let max_string_length = 1024 + let rec read_num max = let quit () = Printf.printf "\nGoodbye!\n%!"; @@ -158,7 +160,8 @@ let get_string_in_tuple o = for i = 0 to Array.length o - 1 do match Repr.repr o.(i) with | STRING s -> - raise (TupleString (Printf.sprintf " [..%s..]" s)) + let len = min max_string_length (String.length s) in + raise (TupleString (Printf.sprintf " [..%s..]" (String.sub s 0 len))) | _ -> () done; "" @@ -168,7 +171,8 @@ let get_string_in_tuple o = let rec get_details v o = match v, Repr.repr o with | (String | Any), STRING s -> - Printf.sprintf " [%s]" (String.escaped s) + let len = min max_string_length (String.length s) in + Printf.sprintf " [%s]" (String.escaped (String.sub s 0 len)) |Tuple (_,v), BLOCK (_, o) -> get_string_in_tuple o |(Sum _|Any), BLOCK (tag, _) -> Printf.sprintf " [tag=%i]" tag -- cgit v1.2.3