class Prism::CodeUnitsCache
Ein Cache, der verwendet werden kann, um schnell Codeeinheiten-Offsets aus Byte-Offsets zu berechnen. Er bietet absichtlich nur eine einzige Methode [] für den Zugriff auf den Cache, um die Angriffsfläche zu minimieren.
Beachten Sie, dass es hier einige bekannte Probleme gibt, die möglicherweise in Zukunft behoben werden oder auch nicht.
-
Das erste ist, dass es Probleme gibt, wenn der Cache Werte berechnet, die nicht an Zeichengrenzen liegen. Dies kann dazu führen, dass nachfolgende Berechnungen um ein oder mehrere Codeeinheiten abweichen.
-
Das zweite ist, dass dieser Cache derzeit unbegrenzt ist. Theoretisch könnten wir eine Art LRU-Cache einführen, um die Anzahl der Einträge zu begrenzen, dies wurde jedoch noch nicht implementiert.
Öffentliche Klassenmethoden
Source
# File lib/prism/parse_result.rb, line 203 def initialize(source, encoding) @source = source @counter = if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE UTF16Counter.new(source, encoding) else LengthCounter.new(source, encoding) end @cache = {} #: Hash[Integer, Integer] @offsets = [] #: Array[Integer] end
Initialisiert einen neuen Cache mit der gegebenen Quelle und Kodierung.
Öffentliche Instanzmethoden
Source
# File lib/prism/parse_result.rb, line 217 def [](byte_offset) @cache[byte_offset] ||= if (index = @offsets.bsearch_index { |offset| offset > byte_offset }).nil? @offsets << byte_offset @counter.count(0, byte_offset) elsif index == 0 @offsets.unshift(byte_offset) @counter.count(0, byte_offset) else @offsets.insert(index, byte_offset) offset = @offsets[index - 1] @cache[offset] + @counter.count(offset, byte_offset - offset) end end
Ruft den Codeeinheiten-Offset aus dem gegebenen Byte-Offset ab.