Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Objects/locations.md
12 views

Locations table

For versions up to 3.10 see ./lnotab_notes.txt

In version 3.11 the co_linetable bytes object of code objects contains a compact representation of the positions returned by the co_positions() iterator.

The co_linetable consists of a sequence of location entries. Each entry starts with a byte with the most significant bit set, followed by zero or more bytes with most significant bit unset.

Each entry contains the following information:

  • The number of code units covered by this entry (length)

  • The start line

  • The end line

  • The start column

  • The end column

The first byte has the following format:

Bit 7Bits 3-6Bits 0-2
1CodeLength (in code units) - 1

The codes are enumerated in the _PyCodeLocationInfoKind enum.

Variable length integer encodings

Integers are often encoded using a variable length integer encoding

Unsigned integers (varint)

Unsigned integers are encoded in 6 bit chunks, least significant first. Each chunk but the last has bit 6 set. For example:

  • 63 is encoded as 0x3f

  • 200 is encoded as 0x48, 0x03

Signed integers (svarint)

Signed integers are encoded by converting them to unsigned integers, using the following function:

def convert(s): if s < 0: return ((-s)<<1) | 1 else: return (s<<1)

Location entries

The meaning of the codes and the following bytes are as follows:

CodeMeaningStart lineEnd lineStart columnEnd column
0-9Short formΔ 0Δ 0See belowSee below
10-12One line formΔ (code - 10)Δ 0unsigned byteunsigned byte
13No column infoΔ svarintΔ 0NoneNone
14Long formΔ svarintΔ varintvarintvarint
15No locationNoneNoneNoneNone

The Δ means the value is encoded as a delta from another value:

  • Start line: Delta from the previous start line, or co_firstlineno for the first entry.

  • End line: Delta from the start line

The short forms

Codes 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).

  • Start column: (code*8) + ((second_byte>>4)&7)

  • End column: start_column + (second_byte&15)