Module Main__.Redir

val redir2addr : 'a array -> (int * int) -> 'a * 'a

レジスタからリダイレクトされるアトムへの参照を求める

val redir2addrs : 'a array -> (int * int) list -> ('a * 'a) list

レジスタからリダイレクトされるアトムへの参照のリストを求める

val traverse_ind : ('a * 'a) list -> 'a list -> 'a -> 'a * bool

順方向に間接ノードを辿る

val rev_redir : ('a * 'b list) list -> ('b * 'a) -> ('a * 'b list) list

間接参照の辺を逆にする

val rev_redirs_of : ('a * 'b) list -> ('b * 'a list) list
val rev_ind_redirs : ('a * 'b) list -> ('a * 'c) list -> ('a * 'c) list

間接参照の逆辺のうち,間接参照ノードを指している辺のみを抽出

val check_zero : ('a * int) list -> ('a * 'a list) list -> 'a -> 'a list -> 'a -> 'a list option

ループを検出した場合は逆方向に間接ノードを辿って参照カウンタの値が全てゼロであることを確認する

  • ダメだったら None を返す
  • 大丈夫だったら訪れたノードの集合を Some に包んで返す
val rdfs : ('a * int) list -> ('a * 'a list) list -> 'a -> ('a * int) list * int

ループを検出しなかった場合は,逆辺を深さ優先探索して,帰りがけ順に被参照数を加算してゆく

  • 帰り値はノードと被参照数の連想リストと被参照数のタプル (この連想リストから訪れたノードの集合も導出できる)
val ref_count_redir : ('a * int) list -> ('a * 'a) list -> ('a * 'a list) list -> ('a * 'a list) list -> 'a list -> 'a -> ('a * int) list option

node_ref からの redirection をチェックする

  • 不正な間接循環参照を検出した場合は None を返す
  • そうでない場合はノードと被参照数の連想リストを Some に包んで返す
val ref_count_redirs : ('a * int) list -> ('a * 'a) list -> ('a * 'a list) list -> ('a * 'a list) list -> ('a * int) list option

node_ref のリストについて,redirection をチェックする

val update_free_indeg : (int * 'a) Stdlib.ref array -> (int * int) -> unit

自由リンクの参照カウンタの値を free_indeg_diff で加算する

val update_free_indegs : (int * 'a) Stdlib.ref array -> (int * int) list -> unit

リダイレクトのリストのそれぞれについて,始点の自由リンクの参照カウンタの値を free_indeg_diffs で加算する

val check_redirs : (int * 'a) Stdlib.ref array -> ((int * int) list * (int * int) list) -> bool

リダイレクションのチェックのトップレベル