17db96d56Sopenharmony_ci# Locations table
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciFor versions up to 3.10 see ./lnotab_notes.txt
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciIn version 3.11 the `co_linetable` bytes object of code objects contains a compact representation of the positions returned by the `co_positions()` iterator.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciThe `co_linetable` consists of a sequence of location entries.
87db96d56Sopenharmony_ciEach entry starts with a byte with the most significant bit set, followed by zero or more bytes with most significant bit unset.
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciEach entry contains the following information:
117db96d56Sopenharmony_ci* The number of code units covered by this entry (length)
127db96d56Sopenharmony_ci* The start line
137db96d56Sopenharmony_ci* The end line
147db96d56Sopenharmony_ci* The start column
157db96d56Sopenharmony_ci* The end column
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciThe first byte has the following format:
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciBit 7 | Bits 3-6 | Bits 0-2
207db96d56Sopenharmony_ci ---- | ---- | ----
217db96d56Sopenharmony_ci 1 | Code | Length (in code units) - 1
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciThe codes are enumerated in the `_PyCodeLocationInfoKind` enum.
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci## Variable length integer encodings
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciIntegers are often encoded using a variable length integer encoding
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci### Unsigned integers (varint)
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ciUnsigned integers are encoded in 6 bit chunks, least significant first.
327db96d56Sopenharmony_ciEach chunk but the last has bit 6 set.
337db96d56Sopenharmony_ciFor example:
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci* 63 is encoded as `0x3f`
367db96d56Sopenharmony_ci* 200 is encoded as `0x48`, `0x03`
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci### Signed integers (svarint)
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ciSigned integers are encoded by converting them to unsigned integers, using the following function:
417db96d56Sopenharmony_ci```Python
427db96d56Sopenharmony_cidef convert(s):
437db96d56Sopenharmony_ci    if s < 0:
447db96d56Sopenharmony_ci        return ((-s)<<1) | 1
457db96d56Sopenharmony_ci    else:
467db96d56Sopenharmony_ci        return (s<<1)
477db96d56Sopenharmony_ci```
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci## Location entries
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ciThe meaning of the codes and the following bytes are as follows:
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciCode | Meaning | Start line | End line | Start column | End column
547db96d56Sopenharmony_ci ---- | ---- | ---- | ---- | ---- | ----
557db96d56Sopenharmony_ci 0-9 | Short form | Δ 0 | Δ 0 | See below | See below
567db96d56Sopenharmony_ci 10-12 | One line form | Δ (code - 10) | Δ 0 | unsigned byte | unsigned byte
577db96d56Sopenharmony_ci 13 | No column info | Δ svarint | Δ 0 | None | None
587db96d56Sopenharmony_ci 14   | Long form | Δ svarint | Δ varint | varint | varint
597db96d56Sopenharmony_ci 15   | No location |  None | None | None | None
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ciThe Δ means the value is encoded as a delta from another value:
627db96d56Sopenharmony_ci* Start line: Delta from the previous start line, or `co_firstlineno` for the first entry.
637db96d56Sopenharmony_ci* End line: Delta from the start line
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci### The short forms
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ciCodes 0-9 are the short forms. The short form consists of two bytes, the second byte holding additional column information. The code is the start column divided by 8 (and rounded down).
687db96d56Sopenharmony_ci* Start column: `(code*8) + ((second_byte>>4)&7)`
697db96d56Sopenharmony_ci* End column: `start_column + (second_byte&15)`
70