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