@@ -47,7 +47,10 @@ class XPathParser
4747 include XMLTokens
4848 LITERAL = /^'([^']*)'|^"([^"]*)"/u
4949
50+ DEBUG = ( ENV [ "REXML_XPATH_PARSER_DEBUG" ] == "true" )
51+
5052 def initialize ( strict : false )
53+ @debug = DEBUG
5154 @parser = REXML ::Parsers ::XPathParser . new
5255 @namespaces = nil
5356 @variables = { }
@@ -162,10 +165,10 @@ def get_namespace( node, prefix )
162165 # Expr takes a stack of path elements and a set of nodes (either a Parent
163166 # or an Array and returns an Array of matching nodes
164167 def expr ( path_stack , nodeset , context = nil )
165- # enter(:expr, path_stack, nodeset)
168+ enter ( :expr , path_stack , nodeset ) if @debug
166169 return nodeset if path_stack . length == 0 || nodeset . length == 0
167170 while path_stack . length > 0
168- # trace(:while, path_stack, nodeset)
171+ trace ( :while , path_stack , nodeset ) if @debug
169172 if nodeset . length == 0
170173 path_stack . clear
171174 return [ ]
@@ -184,7 +187,7 @@ def expr( path_stack, nodeset, context=nil )
184187 child ( nodeset )
185188 end
186189 when :literal
187- # trace(:literal, path_stack, nodeset)
190+ trace ( :literal , path_stack , nodeset ) if @debug
188191 return path_stack . shift
189192 when :attribute
190193 nodeset = step ( path_stack , any_type : :attribute ) do
@@ -343,7 +346,7 @@ def expr( path_stack, nodeset, context=nil )
343346 left = expr ( path_stack . shift , nodeset . dup , context )
344347 right = expr ( path_stack . shift , nodeset . dup , context )
345348 res = equality_relational_compare ( left , op , right )
346- # trace(op, left, right, res)
349+ trace ( op , left , right , res ) if @debug
347350 return res
348351
349352 when :and
@@ -422,14 +425,14 @@ def expr( path_stack, nodeset, context=nil )
422425 end
423426 end # while
424427 return nodeset
425- # ensure
426- # leave(:expr, path_stack, nodeset)
428+ ensure
429+ leave ( :expr , path_stack , nodeset ) if @debug
427430 end
428431
429432 def step ( path_stack , any_type : :element , order : :forward )
430433 nodesets = yield
431434 begin
432- # enter(:step, path_stack, nodesets)
435+ enter ( :step , path_stack , nodesets ) if @debug
433436 nodesets = node_test ( path_stack , nodesets , any_type : any_type )
434437 while path_stack [ 0 ] == :predicate
435438 path_stack . shift # :predicate
@@ -457,13 +460,13 @@ def step(path_stack, any_type: :element, order: :forward)
457460 new_nodeset << XPathNode . new ( node , position : new_nodeset . size + 1 )
458461 end
459462 new_nodeset
460- # ensure
461- # leave(:step, path_stack, new_nodeset)
463+ ensure
464+ leave ( :step , path_stack , new_nodeset ) if @debug
462465 end
463466 end
464467
465468 def node_test ( path_stack , nodesets , any_type : :element )
466- # enter(:node_test, path_stack, nodesets)
469+ enter ( :node_test , path_stack , nodesets ) if @debug
467470 operator = path_stack . shift
468471 case operator
469472 when :qname
@@ -563,8 +566,8 @@ def node_test(path_stack, nodesets, any_type: :element)
563566 raise message
564567 end
565568 new_nodesets
566- # ensure
567- # leave(:node_test, path_stack, new_nodesets)
569+ ensure
570+ leave ( :node_test , path_stack , new_nodesets ) if @debug
568571 end
569572
570573 def filter_nodeset ( nodeset )
@@ -577,7 +580,7 @@ def filter_nodeset(nodeset)
577580 end
578581
579582 def evaluate_predicate ( expression , nodesets )
580- # enter(:predicate, expression, nodesets)
583+ enter ( :predicate , expression , nodesets ) if @debug
581584 new_nodesets = nodesets . collect do |nodeset |
582585 new_nodeset = [ ]
583586 subcontext = { :size => nodeset . size }
@@ -590,7 +593,7 @@ def evaluate_predicate(expression, nodesets)
590593 subcontext [ :index ] = index + 1
591594 end
592595 result = expr ( expression . dclone , [ node ] , subcontext )
593- # trace(:predicate_evaluate, expression, node, subcontext, result)
596+ trace ( :predicate_evaluate , expression , node , subcontext , result ) if @debug
594597 result = result [ 0 ] if result . kind_of? Array and result . length == 1
595598 if result . kind_of? Numeric
596599 if result == node . position
@@ -611,8 +614,8 @@ def evaluate_predicate(expression, nodesets)
611614 new_nodeset
612615 end
613616 new_nodesets
614- # ensure
615- # leave(:predicate, new_nodesets)
617+ ensure
618+ leave ( :predicate , new_nodesets ) if @debug
616619 end
617620
618621 def trace ( *args )
0 commit comments