Skip to content

Commit 28adf46

Browse files
authored
Merge pull request rails#54505 from byroot/opt-gtg-explicit-case
Optimize String visitor by hand
2 parents 0209bf4 + e09199c commit 28adf46

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

actionpack/lib/action_dispatch/journey/nodes/node.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def each(&block)
8181
end
8282

8383
def to_s
84-
Visitors::String::INSTANCE.accept(self, "")
84+
Visitors::String::INSTANCE.accept(self, "".dup)
8585
end
8686

8787
def to_dot

actionpack/lib/action_dispatch/journey/visitors.rb

Lines changed: 55 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ def visit_SLASH(n, seed); terminal(n, seed); end
128128
def visit_DOT(n, seed); terminal(n, seed); end
129129

130130
instance_methods(false).each do |pim|
131-
next unless pim =~ /^visit_(.*)$/
132-
DISPATCH_CACHE[$1.to_sym] = pim
131+
next unless pim.start_with?("visit_")
132+
DISPATCH_CACHE[pim.name.delete_prefix("visit_").to_sym] = pim
133133
end
134134
end
135135

@@ -167,32 +167,64 @@ def visit(node, block)
167167
INSTANCE = new
168168
end
169169

170-
class String < FunctionalVisitor # :nodoc:
171-
private
172-
def binary(node, seed)
173-
visit(node.right, visit(node.left, seed))
174-
end
175-
176-
def nary(node, seed)
170+
class String # :nodoc:
171+
def accept(node, seed)
172+
case node.type
173+
when :DOT
174+
seed << node.left
175+
when :LITERAL
176+
seed << node.left
177+
when :SYMBOL
178+
seed << node.left
179+
when :SLASH
180+
seed << node.left
181+
when :CAT
182+
accept(node.right, accept(node.left, seed))
183+
when :STAR
184+
accept(node.left, seed)
185+
when :OR
177186
last_child = node.children.last
178-
node.children.inject(seed) { |s, c|
179-
string = visit(c, s)
180-
string << "|" unless last_child == c
181-
string
182-
}
183-
end
184-
185-
def terminal(node, seed)
186-
seed + node.left
187-
end
188-
189-
def visit_GROUP(node, seed)
190-
visit(node.left, seed.dup << "(") << ")"
187+
node.children.each do |c|
188+
accept(c, seed)
189+
seed << "|" unless last_child == c
190+
end
191+
seed
192+
when :GROUP
193+
accept(node.left, seed << "(") << ")"
194+
else
195+
raise "Unknown node type: #{node.type}"
191196
end
197+
end
192198

193-
INSTANCE = new
199+
INSTANCE = new
194200
end
195201

202+
# class String < FunctionalVisitor # :nodoc:
203+
# private
204+
# def binary(node, seed)
205+
# visit(node.right, visit(node.left, seed))
206+
# end
207+
#
208+
# def nary(node, seed)
209+
# last_child = node.children.last
210+
# node.children.inject(seed) { |s, c|
211+
# string = visit(c, s)
212+
# string << "|" unless last_child == c
213+
# string
214+
# }
215+
# end
216+
#
217+
# def terminal(node, seed)
218+
# seed + node.left
219+
# end
220+
#
221+
# def visit_GROUP(node, seed)
222+
# visit(node.left, seed.dup << "(") << ")"
223+
# end
224+
#
225+
# INSTANCE = new
226+
# end
227+
196228
class Dot < FunctionalVisitor # :nodoc:
197229
def initialize
198230
@nodes = []

0 commit comments

Comments
 (0)