summaryrefslogtreecommitdiff
path: root/lib/rexml
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-04 06:51:07 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-04 06:51:07 +0000
commit478d3dffa24a200dd595a7f50a58bb8ff3e1e0c0 (patch)
tree46b83e95f3bbc5f2bc8f787e43c200b5e2ee67db /lib/rexml
parent1d6ca665f5df248c6c838129c62fe67e040c209c (diff)
rexml: Add codes for debugging XPath logic
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rexml')
-rw-r--r--lib/rexml/xpath_parser.rb26
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/rexml/xpath_parser.rb b/lib/rexml/xpath_parser.rb
index cab32b3a37..f663215b07 100644
--- a/lib/rexml/xpath_parser.rb
+++ b/lib/rexml/xpath_parser.rb
@@ -51,6 +51,7 @@ module REXML
@parser = REXML::Parsers::XPathParser.new
@namespaces = nil
@variables = {}
+ @nest = 0
end
def namespaces=( namespaces={} )
@@ -151,9 +152,11 @@ module REXML
ALL = [ :attribute, :element, :text, :processing_instruction, :comment ]
ELEMENTS = [ :element ]
def expr( path_stack, nodeset, context=nil )
+ # enter(:expr, path_stack, nodeset)
node_types = ELEMENTS
return nodeset if path_stack.length == 0 || nodeset.length == 0
while path_stack.length > 0
+ # trace(:while, path_stack, nodeset)
if nodeset.length == 0
path_stack.clear
return []
@@ -165,6 +168,7 @@ module REXML
when :qname
prefix = path_stack.shift
name = path_stack.shift
+ # enter(:qname, path_stack, prefix, name, nodeset)
nodeset.delete_if do |node|
# FIXME: This DOUBLES the time XPath searches take
ns = get_namespace( node, prefix )
@@ -176,6 +180,7 @@ module REXML
node.name == name and
node.namespace == ns )
end
+ # leave(:qname, path_stack, nodeset)
node_types = ELEMENTS
when :any
@@ -206,12 +211,14 @@ module REXML
nt = nil
nodeset.each do |node|
nt = node.node_type
+ # trace(:child, nt, node)
new_nodeset += node.children if nt == :element or nt == :document
end
nodeset = new_nodeset
node_types = ELEMENTS
when :literal
+ # trace(:literal, path_stack, nodeset)
return path_stack.shift
when :attribute
@@ -277,6 +284,7 @@ module REXML
new_nodeset = []
subcontext = { :size => nodeset.size }
pred = path_stack.shift
+ # enter(:predicate, pred, nodeset)
nodeset.each_with_index { |node, index|
subcontext[ :node ] = node
subcontext[ :index ] = index+1
@@ -294,6 +302,7 @@ module REXML
end
}
nodeset = new_nodeset
+ # leave(:predicate_return, nodeset)
=begin
predicate = path_stack.shift
ns = nodeset.clone
@@ -393,6 +402,7 @@ module REXML
left = expr( path_stack.shift, nodeset.dup, context )
right = expr( path_stack.shift, nodeset.dup, context )
res = equality_relational_compare( left, op, right )
+ # trace(op, left, right, res)
return res
when :and
@@ -465,8 +475,24 @@ module REXML
end
end # while
return nodeset
+ # ensure
+ # leave(:expr, path_stack, nodeset)
end
+ def trace(*args)
+ indent = " " * @nest
+ puts("#{indent}#{args.inspect}")
+ end
+
+ def enter(tag, *args)
+ trace(:enter, tag, *args)
+ @nest += 1
+ end
+
+ def leave(tag, *args)
+ @nest -= 1
+ trace(:leave, tag, *args)
+ end
##########################################################
# FIXME