Skip to content

[3.14] Improve format of InternalDocs/exception_handling.md (GH-134969) #134975

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 31, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions InternalDocs/exception_handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The cost of raising an exception is increased, but not by much.

The following code:

```
```python
try:
g(0)
except:
Expand All @@ -18,7 +18,7 @@ except:

compiles into intermediate code like the following:

```
```python
RESUME 0

1 SETUP_FINALLY 8 (to L1)
Expand Down Expand Up @@ -118,13 +118,13 @@ All offsets and lengths are in code units, not bytes.

We want the format to be compact, but quickly searchable.
For it to be compact, it needs to have variable sized entries so that we can store common (small) offsets compactly, but handle large offsets if needed.
For it to be searchable quickly, we need to support binary search giving us log(n) performance in all cases.
For it to be searchable quickly, we need to support binary search giving us `log(n)` performance in all cases.
Binary search typically assumes fixed size entries, but that is not necessary, as long as we can identify the start of an entry.

It is worth noting that the size (end-start) is always smaller than the end, so we encode the entries as:
`start, size, target, depth, push-lasti`.

Also, sizes are limited to 2**30 as the code length cannot exceed 2**31 and each code unit takes 2 bytes.
Also, sizes are limited to `2**30` as the code length cannot exceed `2**31` and each code unit takes 2 bytes.
It also happens that depth is generally quite small.

So, we need to encode:
Expand All @@ -140,7 +140,7 @@ lasti (1 bit)
We need a marker for the start of the entry, so the first byte of entry will have the most significant bit set.
Since the most significant bit is reserved for marking the start of an entry, we have 7 bits per byte to encode offsets.
Encoding uses a standard varint encoding, but with only 7 bits instead of the usual 8.
The 8 bits of a byte are (msb left) SXdddddd where S is the start bit. X is the extend bit meaning that the next byte is required to extend the offset.
The 8 bits of a byte are (msb left) `SXdddddd` where `S` is the start bit. `X` is the extend bit meaning that the next byte is required to extend the offset.

In addition, we combine `depth` and `lasti` into a single value, `((depth<<1)+lasti)`, before encoding.

Expand Down
Loading