Shave a couple of allocations off Journey scan & parse

This commit is contained in:
Matthew Draper 2016-12-25 01:03:02 +10:30
parent fc2aa53f87
commit 4273ab34c4
4 changed files with 170 additions and 165 deletions

@ -6,6 +6,7 @@ AllCops:
Exclude:
- '**/templates/**/*'
- '**/vendor/**/*'
- 'actionpack/lib/action_dispatch/journey/parser.rb'
# Prefer &&/|| over and/or.
Style/AndOr:

@ -1,198 +1,199 @@
#
# DO NOT MODIFY!!!!
# This file is automatically generated by Racc 1.4.11
# This file is automatically generated by Racc 1.4.14
# from Racc grammer file "".
#
require "racc/parser.rb"
require 'racc/parser.rb'
# :stopdoc:
require "action_dispatch/journey/parser_extras"
module ActionDispatch
# :stopdoc:
module Journey
class Parser < Racc::Parser
##### State transition tables begin ###
##### State transition tables begin ###
racc_action_table = [
13, 15, 14, 7, 21, 16, 8, 19, 13, 15,
14, 7, 17, 16, 8, 13, 15, 14, 7, 24,
16, 8, 13, 15, 14, 7, 19, 16, 8 ]
racc_action_table = [
13, 15, 14, 7, 19, 16, 8, 19, 13, 15,
14, 7, 17, 16, 8, 13, 15, 14, 7, 21,
16, 8, 13, 15, 14, 7, 24, 16, 8 ]
racc_action_check = [
2, 2, 2, 2, 17, 2, 2, 2, 0, 0,
0, 0, 1, 0, 0, 19, 19, 19, 19, 20,
19, 19, 7, 7, 7, 7, 22, 7, 7 ]
racc_action_check = [
2, 2, 2, 2, 22, 2, 2, 2, 19, 19,
19, 19, 1, 19, 19, 7, 7, 7, 7, 17,
7, 7, 0, 0, 0, 0, 20, 0, 0 ]
racc_action_pointer = [
6, 12, -2, nil, nil, nil, nil, 20, nil, nil,
nil, nil, nil, nil, nil, nil, nil, 4, nil, 13,
13, nil, 17, nil, nil ]
racc_action_pointer = [
20, 12, -2, nil, nil, nil, nil, 13, nil, nil,
nil, nil, nil, nil, nil, nil, nil, 19, nil, 6,
20, nil, -5, nil, nil ]
racc_action_default = [
-19, -19, -2, -3, -4, -5, -6, -19, -10, -11,
-12, -13, -14, -15, -16, -17, -18, -19, -1, -19,
-19, 25, -8, -9, -7 ]
racc_action_default = [
-19, -19, -2, -3, -4, -5, -6, -19, -10, -11,
-12, -13, -14, -15, -16, -17, -18, -19, -1, -19,
-19, 25, -8, -9, -7 ]
racc_goto_table = [
1, 22, 18, 23, nil, nil, nil, 20 ]
racc_goto_table = [
1, 22, 18, 23, nil, nil, nil, 20 ]
racc_goto_check = [
1, 2, 1, 3, nil, nil, nil, 1 ]
racc_goto_check = [
1, 2, 1, 3, nil, nil, nil, 1 ]
racc_goto_pointer = [
nil, 0, -18, -16, nil, nil, nil, nil, nil, nil,
nil ]
racc_goto_pointer = [
nil, 0, -18, -16, nil, nil, nil, nil, nil, nil,
nil ]
racc_goto_default = [
nil, nil, 2, 3, 4, 5, 6, 9, 10, 11,
12 ]
racc_goto_default = [
nil, nil, 2, 3, 4, 5, 6, 9, 10, 11,
12 ]
racc_reduce_table = [
0, 0, :racc_error,
2, 11, :_reduce_1,
1, 11, :_reduce_2,
1, 11, :_reduce_none,
1, 12, :_reduce_none,
1, 12, :_reduce_none,
1, 12, :_reduce_none,
3, 15, :_reduce_7,
3, 13, :_reduce_8,
3, 13, :_reduce_9,
1, 16, :_reduce_10,
1, 14, :_reduce_none,
1, 14, :_reduce_none,
1, 14, :_reduce_none,
1, 14, :_reduce_none,
1, 19, :_reduce_15,
1, 17, :_reduce_16,
1, 18, :_reduce_17,
1, 20, :_reduce_18 ]
racc_reduce_table = [
0, 0, :racc_error,
2, 11, :_reduce_1,
1, 11, :_reduce_2,
1, 11, :_reduce_none,
1, 12, :_reduce_none,
1, 12, :_reduce_none,
1, 12, :_reduce_none,
3, 15, :_reduce_7,
3, 13, :_reduce_8,
3, 13, :_reduce_9,
1, 16, :_reduce_10,
1, 14, :_reduce_none,
1, 14, :_reduce_none,
1, 14, :_reduce_none,
1, 14, :_reduce_none,
1, 19, :_reduce_15,
1, 17, :_reduce_16,
1, 18, :_reduce_17,
1, 20, :_reduce_18 ]
racc_reduce_n = 19
racc_reduce_n = 19
racc_shift_n = 25
racc_shift_n = 25
racc_token_table = {
false => 0,
:error => 1,
:SLASH => 2,
:LITERAL => 3,
:SYMBOL => 4,
:LPAREN => 5,
:RPAREN => 6,
:DOT => 7,
:STAR => 8,
:OR => 9 }
racc_token_table = {
false => 0,
:error => 1,
:SLASH => 2,
:LITERAL => 3,
:SYMBOL => 4,
:LPAREN => 5,
:RPAREN => 6,
:DOT => 7,
:STAR => 8,
:OR => 9 }
racc_nt_base = 10
racc_nt_base = 10
racc_use_result_var = false
racc_use_result_var = false
Racc_arg = [
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_arg = [
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_token_to_s_table = [
"$end",
"error",
"SLASH",
"LITERAL",
"SYMBOL",
"LPAREN",
"RPAREN",
"DOT",
"STAR",
"OR",
"$start",
"expressions",
"expression",
"or",
"terminal",
"group",
"star",
"symbol",
"literal",
"slash",
"dot" ]
Racc_token_to_s_table = [
"$end",
"error",
"SLASH",
"LITERAL",
"SYMBOL",
"LPAREN",
"RPAREN",
"DOT",
"STAR",
"OR",
"$start",
"expressions",
"expression",
"or",
"terminal",
"group",
"star",
"symbol",
"literal",
"slash",
"dot" ]
Racc_debug_parser = false
Racc_debug_parser = false
##### State transition tables end #####
##### State transition tables end #####
# reduce 0 omitted
# reduce 0 omitted
def _reduce_1(val, _values)
Cat.new(val.first, val.last)
end
def _reduce_1(val, _values)
Cat.new(val.first, val.last)
end
def _reduce_2(val, _values)
val.first
end
def _reduce_2(val, _values)
val.first
end
# reduce 3 omitted
# reduce 3 omitted
# reduce 4 omitted
# reduce 4 omitted
# reduce 5 omitted
# reduce 5 omitted
# reduce 6 omitted
# reduce 6 omitted
def _reduce_7(val, _values)
Group.new(val[1])
end
def _reduce_7(val, _values)
Group.new(val[1])
end
def _reduce_8(val, _values)
Or.new([val.first, val.last])
end
def _reduce_8(val, _values)
Or.new([val.first, val.last])
end
def _reduce_9(val, _values)
Or.new([val.first, val.last])
end
def _reduce_9(val, _values)
Or.new([val.first, val.last])
end
def _reduce_10(val, _values)
Star.new(Symbol.new(val.last))
end
def _reduce_10(val, _values)
Star.new(Symbol.new(val.last))
end
# reduce 11 omitted
# reduce 11 omitted
# reduce 12 omitted
# reduce 12 omitted
# reduce 13 omitted
# reduce 13 omitted
# reduce 14 omitted
# reduce 14 omitted
def _reduce_15(val, _values)
Slash.new("/")
end
def _reduce_15(val, _values)
Slash.new(val.first)
end
def _reduce_16(val, _values)
Symbol.new(val.first)
end
def _reduce_16(val, _values)
Symbol.new(val.first)
end
def _reduce_17(val, _values)
Literal.new(val.first)
end
def _reduce_17(val, _values)
Literal.new(val.first)
end
def _reduce_18(val, _values)
Dot.new(val.first)
end
def _reduce_18(val, _values)
Dot.new(val.first)
end
def _reduce_none(val, _values)
val[0]
end
def _reduce_none(val, _values)
val[0]
end
end # class Parser
end # module Journey
# :startdoc:
end # module ActionDispatch
end # module Journey
end # module ActionDispatch

@ -30,7 +30,7 @@ rule
| dot
;
slash
: SLASH { Slash.new('/') }
: SLASH { Slash.new(val.first) }
;
symbol
: SYMBOL { Symbol.new(val.first) }
@ -45,5 +45,6 @@ rule
end
---- header
# :stopdoc:
require 'action_dispatch/journey/parser_extras'
require "action_dispatch/journey/parser_extras"

@ -1,3 +1,4 @@
# frozen_string_literal: true
require "strscan"
module ActionDispatch
@ -35,22 +36,23 @@ def next_token
def scan
case
# /
when text = @ss.scan(/\//)
[:SLASH, text]
when @ss.skip(/\//)
[:SLASH, "/"]
when @ss.skip(/\(/)
[:LPAREN, "("]
when @ss.skip(/\)/)
[:RPAREN, ")"]
when @ss.skip(/\|/)
[:OR, "|"]
when @ss.skip(/\./)
[:DOT, "."]
when text = @ss.scan(/:\w+/)
[:SYMBOL, text]
when text = @ss.scan(/\*\w+/)
[:STAR, text]
when text = @ss.scan(/(?<!\\)\(/)
[:LPAREN, text]
when text = @ss.scan(/(?<!\\)\)/)
[:RPAREN, text]
when text = @ss.scan(/\|/)
[:OR, text]
when text = @ss.scan(/\./)
[:DOT, text]
when text = @ss.scan(/(?<!\\):\w+/)
[:SYMBOL, text]
when text = @ss.scan(/(?:[\w%\-~!$&'*+,;=@]|\\:|\\\(|\\\))+/)
[:LITERAL, text.tr('\\', "")]
when text = @ss.scan(/(?:[\w%\-~!$&'*+,;=@]|\\[:()])+/)
text.tr! "\\", ""
[:LITERAL, text]
# any char
when text = @ss.scan(/./)
[:LITERAL, text]