Add command line option to disable caching and jumping
[SXSI/xpathcomp.git] / src / l2JIT.ml
index efe7854..a1f1ac4 100644 (file)
@@ -207,26 +207,43 @@ let rec translate_jump tree tag (jkind:Ata.jump_kind) dir s =
     else assert false
   | _ -> assert false
 
+let count = ref 0
+let () = at_exit (fun () -> Printf.eprintf "Compute jump called %i times\n" !count)
+module Memo = Hashtbl.Make(struct
+  type t = Tag.t * StateSet.t * dir
+  let equal (a,b,c) (d,e,f) = a == d && b == e && c == f
+  let hash (a, b, c) = HASHINT3(a, Uid.to_int b.StateSet.Node.id, (Obj.magic c))
+end)
+
+let memo = Memo.create 1024
+let init () = Memo.clear memo
+
 let compute_jump auto tree tag states dir =
   if !Options.no_jump then
     if dir == DIR_LEFT then FIRST_CHILD states
     else NEXT_SIBLING states
   else
-    let jkind = Ata.top_down_approx auto states tree in
-    let jump = translate_jump tree tag jkind dir states in
-    LOG(__ "level2-jit" 2
-          "Computed jumps for %s %a %s, from %a : %a%!"
-          (Tag.to_string tag)
-          StateSet.print states
-          (if dir == DIR_LEFT then "left" else "right")
-          Ata.print_kind jkind
-          print_jump jump
-    );
-    jump
+    try
+      Memo.find memo (tag, states, dir)
+    with
+      Not_found -> begin
+       incr count;
+       let jkind = Ata.top_down_approx auto states tree in
+       let jump = translate_jump tree tag jkind dir states in
+       LOG(__ "level2-jit" 2
+              "Computed jumps for %s %a %s, from %a : %a%!"
+              (Tag.to_string tag)
+              StateSet.print states
+              (if dir == DIR_LEFT then "left" else "right")
+              Ata.print_kind jkind
+              print_jump jump
+       );
+       Memo.add memo (tag, states, dir) jump; jump
+      end
 
 let compile cache2 auto tree tag states =
   let tr_list, states1, states2 =
-    Ata.get_trans ~attributes:(TagSet.inj_positive (Tree.attribute_tags tree)) auto states tag
+    Ata.get_trans (*~attributes:(TagSet.inj_positive (Tree.attribute_tags tree))*) auto states tag
   in
   let op =
     let empty_s1 = StateSet.is_empty states1 in
@@ -250,7 +267,7 @@ let compile cache2 auto tree tag states =
     | BOTH(tr, NOP _, r) -> RIGHT (tr, r)
     | _ -> op
   in
-  add cache2 tag states op;
+  if not !Options.no_cache then add cache2 tag states op;
   op
 
 let get_transitions = function