From be4066d598edbc4cd692e12d3cb314da25c0ee39 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Sun, 14 Mar 2021 15:49:27 -0500 Subject: [PATCH] Minor edits to new line number format description I need to understand this for my VM changes, so started reading. I initially wanted to just correct a typo (first change), but got a little carried away and edited a bit more. --- Objects/lnotab_notes.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Objects/lnotab_notes.txt b/Objects/lnotab_notes.txt index 046f753ed3232f..59c65257082ccb 100644 --- a/Objects/lnotab_notes.txt +++ b/Objects/lnotab_notes.txt @@ -3,16 +3,16 @@ Description of the internal format of the line number table Conceptually, the line number table consists of a sequence of triples: start-offset (inclusive), end-offset (exclusive), line-number. -Note that note all byte codes have a line number so we need handle `None` for the line-number. +Note that not all byte codes have a line number so we need handle `None` for the line-number. However, storing the above sequence directly would be very inefficient as we would need 12 bytes per entry. -First of all, we can note that the end of one entry is the same as the start of the next, so we can overlap entries. -Secondly we also note that we don't really need arbitrary access to the sequence, so we can store deltas. +First, note that the end of one entry is the same as the start of the next, so we can overlap entries. +Second, we don't really need arbitrary access to the sequence, so we can store deltas. We just need to store (end - start, line delta) pairs. The start offset of the first entry is always zero. -Thirdly, most deltas are small, so we can use a single byte for each value, as long we allow several entries for the same line. +Third, most deltas are small, so we can use a single byte for each value, as long we allow several entries for the same line. Consider the following table Start End Line @@ -36,12 +36,12 @@ Stripping the redundant ends gives: Note that the end - start value is always positive. -Finally in order, to fit into a single byte we need to convert start deltas to the range 0 <= delta <= 254, +Finally, in order to fit into a single byte we need to convert start deltas to the range 0 <= delta <= 254, and line deltas to the range -127 <= delta <= 127. A line delta of -128 is used to indicate no line number. A start delta of 255 is used as a sentinel to mark the end of the table. Also note that a delta of zero indicates that there are no bytecodes in the given range, -which means can use an invalidate line number for that range. +which means we can use an invalid line number for that range. Final form: