Avoid `exc=None; del exc` in bytecode where unnecessary
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 36k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
See https://github.com/faster-cpython/ideas/issues/490.
To break reference cycles, the compiler has an implicit del e at the end of an exception handler. To make UnboundLocalErrors impossible during that deletion, the compiler adds e=None; del e instead.
However, the e=None part is unnecessary in many situations, namely, when we can prove that e is guaranteed to be bound (almost always!).
This can reduce the size of some bytecode objects. For example, the four <---- lines below can be deleted:
>>> def f():
... try: pass
... except Exception as e: pass
...
>>> dis(f)
1 0 RESUME 0
2 2 LOAD_CONST 0 (None)
4 RETURN_VALUE
6 PUSH_EXC_INFO
3 8 LOAD_GLOBAL 0 (Exception)
20 CHECK_EXC_MATCH
22 POP_JUMP_IF_FALSE 11 (to 46)
24 STORE_FAST 0 (e)
26 POP_EXCEPT
28 LOAD_CONST 0 (None) <---------
30 STORE_FAST 0 (e) <---------
32 DELETE_FAST 0 (e)
34 LOAD_CONST 0 (None)
36 RETURN_VALUE
38 LOAD_CONST 0 (None) <---------
40 STORE_FAST 0 (e) <---------
42 DELETE_FAST 0 (e)
44 RERAISE 1
>> 46 RERAISE 0
>> 48 COPY 3
50 POP_EXCEPT
52 RERAISE 1
ExceptionTable:
6 to 24 -> 48 [1] lasti
38 to 46 -> 48 [1] lasti
- PR: gh-99361
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem verknüpften faster-cpython/ideas Issue 490 und PR gh-99361 und untersuche anschließend den Python-Compilerpfad, der Bytecode zur Bereinigung von Exception-Handlern erzeugt. Verwende das Beispiel dis(f) als Ausgangspunkt; als abgeschlossen gilt die Änderung, wenn die unnötige Sequenz exc=None; del exc weggelassen wird, sofern garantiert ist, dass die Ausnahmevariable gebunden ist, ohne die Semantik von Ausnahmen zu ändern.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Refactoring
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 25/100