class Rsec::Cached

parse result is cached in ctx. may improve performance

Public Class Methods

[](parser) click to toggle source
# File lib/rsec/parsers/misc.rb, line 173
def self.[] parser
  self.new parser
end
new(parser) click to toggle source
# File lib/rsec/parsers/misc.rb, line 177
def initialize parser
  @parser = parser
  @salt = object_id() << 32
end

Public Instance Methods

_parse(ctx) click to toggle source
# File lib/rsec/parsers/misc.rb, line 182
def _parse ctx
  key = ctx.pos | @salt
  cache = ctx.cache
  # result maybe nil, so don't use ||=

  if cache.has_key? key
    ret, pos = cache[key]
    ctx.pos = pos
    ret
  else
    ret = @parser._parse ctx
    pos = ctx.pos
    cache[key] = [ret, pos]
    ret
  end
end