Fix bug where the Lvl2 Cache got corrupted upon resizing.
[SXSI/xpathcomp.git] / src / cache.ml
index 59ff1fb..dac1dbc 100644 (file)
@@ -1,5 +1,3 @@
-INCLUDE "trace.ml"
-
 let realloc l old_size new_size dummy =
   let l' = Array.create new_size dummy in
   for i = 0 to (min old_size new_size) - 1 do
@@ -20,6 +18,14 @@ struct
 
   }
 
+  let print fmt a =
+    Format.fprintf fmt "{ offset=%i;\n dummy=_;line=%a \n}\n%!"
+      a.offset
+      (Pretty.print_array ~sep:", " (fun fmt x ->
+       if x==a.dummy then
+         Format.fprintf fmt "%s" "D"
+       else
+         Format.fprintf fmt "%s" "E")) a.line
 
   let add a i v =
     if a.offset == ~-1 then a.offset <- i;
@@ -45,7 +51,7 @@ struct
        for j = 0 to len - 1 do
          narray.(j) <- a.line.(j);
        done;
-       narray.(i - offset + 1) <- v;
+       narray.(i - offset) <- v;
        a.line <- narray
       end
 
@@ -56,15 +62,15 @@ struct
     else a.dummy
 
   let dummy a = a.dummy
-(*
+
   let iteri f a =
     let line = a.line in
     if a.offset == ~-1 then () else
       for i = 0 to Array.length line - 1 do
-       let v = a.(i)
+       let v = line.(i) in
          f (i+a.offset) v (v==a.dummy)
       done
-*)
+
 
 end
 
@@ -84,12 +90,13 @@ struct
   let add a i j v =
     let line = Lvl1.find a i in
     if line == a.Lvl1.dummy then
-      let nline =  { line with Lvl1.offset = ~-1 } in
-      Lvl1.add nline j v;
-      Lvl1.add a i nline
+      let nline = Lvl1.create 0 line.Lvl1.dummy in
+      Lvl1.add a i nline;
+      Lvl1.add nline j v
     else
       Lvl1.add line j v
 
+
   let find a i j =
     let v = Lvl1.find a i in
     if v == a.Lvl1.dummy then a.Lvl1.dummy.Lvl1.dummy
@@ -98,6 +105,14 @@ struct
 
   let dummy c = c.Lvl1.dummy.Lvl1.dummy
 
+  let iteri f a =
+    let line = a.Lvl1.line in
+    if a.Lvl1.offset == ~-1 then () else
+      for i = 0 to Array.length line - 1 do
+       Lvl1.iteri (f i) line.(i)
+      done
+
+
 end
 
 module Lvl3 =
@@ -105,7 +120,7 @@ struct
   type 'a t = 'a Lvl2.t Lvl1.t
 
   let create n a =
-  let dummy1 = Lvl2.create 0 a in
+  let dummy1 = Lvl2.create 512 a in
     { Lvl1.line = Array.create n dummy1;
       Lvl1.offset = ~-1;
       Lvl1.dummy = dummy1;
@@ -114,9 +129,9 @@ struct
   let add a i j k v =
     let line = Lvl1.find a i in
     if line == a.Lvl1.dummy then
-      let nline =  { line with Lvl1.offset = ~-1 } in
-      Lvl2.add nline j k v;
-      Lvl1.add a i nline
+      let nline =  Lvl1.create 0 line.Lvl1.dummy in
+      Lvl1.add a i nline;
+      Lvl2.add nline j k v
     else
       Lvl2.add line j k v
 
@@ -127,5 +142,11 @@ struct
 
 
   let dummy a = Lvl2.dummy a.Lvl1.dummy
+  let iteri f a =
+    let line = a.Lvl1.line in
+    if a.Lvl1.offset == ~-1 then () else
+      for i = 0 to Array.length line - 1 do
+       Lvl2.iteri (f i) line.(i)
+      done
 
 end