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
| 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
let time = ref false
let bottom_up = ref false
let no_jump = ref false
+let no_cache = ref false
let verbose = ref false
let text_index_type = ref 0
let do_perf = ref false
"-nj", Arg.Set(no_jump), " disable jumping";
+ "-nc", Arg.Set(no_cache), " disable caching";
+
+
"-p", Arg.Set(do_perf), " dump perf counters (Linux only)";
"-index-type", Arg.Symbol ([ "default"; "swcsa"; "rlcsa" ],
let f = gen_code auto tlist s1 s2 in
LOG(__ "grammar" 2 "Inserting: %i, %a, %a\n%!"
(Uid.to_int tlist.Translist.Node.id) StateSet.print s1 StateSet.print s2);
- add cache tlist s1 s2 f; f
+ if not !Options.no_cache then add cache tlist s1 s2 f;
+ f
end
DEFINE LOOP (t, states, ctx) = (
let top_down_run auto tree root =
Ata.init ();
+ L2JIT.init();
let res, slot = full_top_down_run auto auto.init tree root in
slot.(StateSet.min_elt auto.topdown_marking_states)