Revert "Call directly the low-level subtree_elements function instead of"
authorKim Nguyễn <kn@lri.fr>
Tue, 24 Apr 2012 14:24:39 +0000 (16:24 +0200)
committerKim Nguyễn <kn@lri.fr>
Tue, 24 Apr 2012 14:24:39 +0000 (16:24 +0200)
This reverts commit d6c57f01eabebe2b11e1c701835562c2efc2fd92.
The tentative fix for performance regression is buggy and make things slower.

src/tree.ml

index af2ec3f..df72de7 100644 (file)
@@ -337,8 +337,16 @@ 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
 
-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
+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_closing : tree -> [`Tree] Node.t -> [`Tree] Node.t = "caml_xml_tree_closing" "noalloc"
 let closing t n = tree_closing t.doc n