Skip to content

Commit 3e29586

Browse files
authored
Merge pull request #3862 from Earlopain/optimize-ripper
Optimize ripper translator
2 parents 16d763b + bdde165 commit 3e29586

2 files changed

Lines changed: 10 additions & 3 deletions

File tree

lib/prism/lex_compat.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ def result
667667

668668
event = RIPPER.fetch(token.type)
669669
value = token.value
670-
lex_state = Translation::Ripper::Lexer::State.new(lex_state)
670+
lex_state = Translation::Ripper::Lexer::State.cached(lex_state)
671671

672672
token =
673673
case event
@@ -734,7 +734,7 @@ def result
734734
counter += { on_embexpr_beg: -1, on_embexpr_end: 1 }[current_event] || 0
735735
end
736736

737-
Translation::Ripper::Lexer::State.new(result_value[current_index][1])
737+
Translation::Ripper::Lexer::State.cached(result_value[current_index][1])
738738
else
739739
previous_state
740740
end

lib/prism/translation/ripper/lexer.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ def |(i) self.class.new(to_int | i) end
3838
def allbits?(i) to_int.allbits?(i) end
3939
def anybits?(i) to_int.anybits?(i) end
4040
def nobits?(i) to_int.nobits?(i) end
41+
42+
# Instances are frozen and there are only a handful of them so we cache them here.
43+
STATES = Hash.new { |h,k| h[k] = State.new(k) }
44+
45+
def self.cached(i)
46+
STATES[i]
47+
end
4148
end
4249

4350
class Elem
@@ -47,7 +54,7 @@ def initialize(pos, event, tok, state, message = nil)
4754
@pos = pos
4855
@event = event
4956
@tok = tok
50-
@state = State.new(state)
57+
@state = State.cached(state)
5158
@message = message
5259
end
5360

0 commit comments

Comments
 (0)