1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
Index: ocaml/vine_cfg.mli
===================================================================
--- ocaml/vine_cfg.mli (old version)
+++ ocaml/vine_cfg.mli (new version)
@@ -86,6 +86,11 @@
(** [cfg#iter_edges f] calls [f a b] forall [(a,b)] where there is an edge
vine-1.0-from [a] to [b] in the CFG. *)
+ method fold_edges : 'b. ('a bb -> 'a bb -> 'b -> 'b) -> 'b -> 'b
+ (** [cfg#fold_edges f init] computes [f uN uN (... (f u1 v1
+init)...)] where [(u1, v1) ... (uN, vN)] is an enumeration of all
+the edges in the graph, in an unspecified order. *)
+
method get_info : 'a bb -> 'a
(** Returns the info associated with the given bb. *)
@@ -225,6 +230,7 @@
val iter_vertex : (bbid -> unit) -> t -> unit
val fold_vertex : (vertex -> 'a -> 'a) -> t -> 'a -> 'a
val iter_edges_e : (E.t -> unit) -> t -> unit
+ val fold_edges_e : (E.t -> 'a -> 'a) -> t -> 'a -> 'a
val iter_succ : (vertex -> unit) -> t -> vertex -> unit
val iter_pred : (vertex -> unit) -> t -> vertex -> unit
val in_degree : t -> vertex -> int
Index: ocaml/vine_cfg.ml
===================================================================
--- ocaml/vine_cfg.ml (old version)
+++ ocaml/vine_cfg.ml (new version)
@@ -115,6 +115,7 @@
method iter_bb : ('a bb -> unit) -> unit
method fold_bb : 'b. ('a bb -> 'b -> 'b) -> 'b -> 'b
method iter_edges : ('a bb -> 'a bb -> unit) -> unit
+ method fold_edges : 'b. ('a bb -> 'a bb -> 'b -> 'b) -> 'b -> 'b
method get_info : 'a bb -> 'a
method set_info : 'a bb -> 'a -> unit
method get_id : 'a bb -> bbid
@@ -306,6 +307,14 @@
self#iter_bb (fun b -> List.iter (f b) (self#succ b));
self#check_graph;
+ method fold_edges f a =
+ self#check_graph;
+ let res = self#fold_bb
+ (fun b a2 -> List.fold_left (fun a3 b2 -> f b b2 a3) a2 (self#succ b)) a
+ in
+ self#check_graph;
+ res
+
method length = Hashtbl.length blktbl
method get_info b =
@@ -1122,6 +1131,7 @@
val iter_vertex : (bbid -> unit) -> t -> unit
val fold_vertex : (bbid -> 'a -> 'a) -> t -> 'a -> 'a
val iter_edges_e : (E.t -> unit) -> t -> unit
+ val fold_edges_e : (E.t -> 'a -> 'a) -> t -> 'a -> 'a
val iter_succ : (vertex -> unit) -> t -> vertex -> unit
val iter_pred : (vertex -> unit) -> t -> vertex -> unit
val in_degree : t -> vertex -> int
@@ -1170,6 +1180,8 @@
let fold_vertex f (g:t) a = g#fold_bb (fun b -> f b.id) a
let iter_edges_e f (g:t) =
g#iter_edges (fun x y -> f (g#get_id x, g#get_id y))
+ let fold_edges_e f (g:t) a =
+ g#fold_edges (fun x y a -> f (g#get_id x, g#get_id y) a) a
let iter_succ f g v = List.iter f (bb_succ g v)
let iter_pred f g v = List.iter f (bb_pred g v)
let in_degree g v = List.length (bb_pred g v)
|