Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/prism/lex_compat.rb
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ def result

event = RIPPER.fetch(token.type)
value = token.value
lex_state = Translation::Ripper::Lexer::State.new(lex_state)
lex_state = Translation::Ripper::Lexer::State.cached(lex_state)

token =
case event
Expand Down Expand Up @@ -734,7 +734,7 @@ def result
counter += { on_embexpr_beg: -1, on_embexpr_end: 1 }[current_event] || 0
end

Translation::Ripper::Lexer::State.new(result_value[current_index][1])
Translation::Ripper::Lexer::State.cached(result_value[current_index][1])
else
previous_state
end
Expand Down
9 changes: 8 additions & 1 deletion lib/prism/translation/ripper/lexer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ def |(i) self.class.new(to_int | i) end
def allbits?(i) to_int.allbits?(i) end
def anybits?(i) to_int.anybits?(i) end
def nobits?(i) to_int.nobits?(i) end

# Instances are frozen and there are only a handful of them so we cache them here.
STATES = Hash.new { |h,k| h[k] = State.new(k) }

def self.cached(i)
STATES[i]
end
end

class Elem
Expand All @@ -47,7 +54,7 @@ def initialize(pos, event, tok, state, message = nil)
@pos = pos
@event = event
@tok = tok
@state = State.new(state)
@state = State.cached(state)
@message = message
end

Expand Down