Call directly the low-level subtree_elements function instead of
authorKim Nguyễn <kn@lri.fr>
Tue, 24 Apr 2012 13:50:38 +0000 (15:50 +0200)
committerKim Nguyễn <kn@lri.fr>
Tue, 24 Apr 2012 13:50:38 +0000 (15:50 +0200)
re-implementing it in ocaml.
Fixes bug: a3fdf1a5  Performance regression

src/tree.ml

index df72de7..af2ec3f 100644 (file)
@@ -337,16 +337,8 @@ let subtree_tags t n tag = tree_subtree_tags t.doc n tag
 external tree_subtree_size : tree -> [`Tree] Node.t -> int = "caml_xml_tree_subtree_size" "noalloc"
 let subtree_size t n = tree_subtree_size t.doc n
 
-let subtree_elements t node =
-  let size = tree_subtree_size t.doc node - 1 in
-  if size == 0 then 0
-  else let size = size - (tree_subtree_tags t.doc node Tag.pcdata) in
-       if size < 2 then size else
-        let acc = ref size in
-        for i = 0 to Array.length t.attribute_array - 1 do
-          acc := !acc - tree_subtree_tags t.doc node t.attribute_array.(i)
-        done;
-        !acc
+external tree_subtree_elements : tree -> [`Tree] Node.t -> int = "caml_xml_tree_subtree_elements" "noalloc"
+let subtree_elements t n = tree_subtree_elements t.doc n
 
 external tree_closing : tree -> [`Tree] Node.t -> [`Tree] Node.t = "caml_xml_tree_closing" "noalloc"
 let closing t n = tree_closing t.doc n