Skip to content

Commit e384013

Browse files
author
rocky
committed
Improve support for GraalPython...
Store Python version triple inside each non-native code type!
1 parent e11a03d commit e384013

File tree

11 files changed

+377
-112
lines changed

11 files changed

+377
-112
lines changed

xdis/codetype/__init__.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
__docformat__ = "restructuredtext"
3232

33-
def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
33+
def codeType2Portable(code, version_triple=PYTHON_VERSION_TRIPLE):
3434
"""Converts a native types.CodeType code object into a
3535
corresponding more flexible xdis Code type.
3636
"""
@@ -42,8 +42,8 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
4242
)
4343
line_table_field = "co_lnotab" if hasattr(code, "co_lnotab") else "co_linetable"
4444
line_table = getattr(code, line_table_field)
45-
if version_tuple >= (3, 0):
46-
if version_tuple < (3, 8):
45+
if version_triple >= (3, 0):
46+
if version_triple < (3, 8):
4747
return Code3(
4848
code.co_argcount,
4949
code.co_kwonlyargcount,
@@ -65,8 +65,9 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
6565
# type, should we try to extract it?
6666
code.collection_order if hasattr(code, "collection_order") else {},
6767
code.reference_objects if hasattr(code, "reference_objects") else set(),
68+
version_triple=version_triple,
6869
)
69-
elif version_tuple < (3, 10):
70+
elif version_triple < (3, 10):
7071
return Code38(
7172
co_argcount=code.co_argcount,
7273
co_posonlyargcount=code.co_posonlyargcount,
@@ -85,7 +86,7 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
8586
co_firstlineno=code.co_firstlineno,
8687
co_lnotab=line_table,
8788
)
88-
elif version_tuple[:2] == (3, 10) or IS_PYPY and version_tuple[:2] == (3, 11):
89+
elif version_triple[:2] == (3, 10) or IS_PYPY and version_triple[:2] == (3, 11):
8990
return Code310(
9091
co_argcount=code.co_argcount,
9192
co_posonlyargcount=code.co_posonlyargcount,
@@ -104,7 +105,7 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
104105
co_firstlineno=code.co_firstlineno,
105106
co_linetable=line_table,
106107
)
107-
elif version_tuple[:2] >= (3, 11):
108+
elif version_triple[:2] >= (3, 11):
108109
return Code311(
109110
co_argcount=code.co_argcount,
110111
co_posonlyargcount=code.co_posonlyargcount,
@@ -125,7 +126,7 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
125126
co_linetable=line_table,
126127
co_exceptiontable=code.co_exceptiontable,
127128
)
128-
elif version_tuple > (2, 0):
129+
elif version_triple > (2, 0):
129130
# 2.0 .. 2.7
130131
return Code2(
131132
co_argcount=code.co_argcount,
@@ -151,7 +152,7 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
151152
)
152153
else:
153154
# 1.0 .. 1.5
154-
if version_tuple < (1, 5):
155+
if version_triple < (1, 5):
155156
# 1.0 .. 1.3
156157
return Code13(
157158
code.co_argcount,
@@ -181,31 +182,31 @@ def codeType2Portable(code, version_tuple=PYTHON_VERSION_TRIPLE):
181182
)
182183

183184

184-
def portableCodeType(version_tuple=PYTHON_VERSION_TRIPLE):
185+
def portableCodeType(version_triple=PYTHON_VERSION_TRIPLE):
185186
"""
186187
Return the portable CodeType version for the supplied Python release version.
187188
`version` is a floating-point number, like 2.7, or 3.9. If no version
188189
number is supplied we'll use the current interpreter version.
189190
"""
190-
if version_tuple >= (3, 0):
191-
if version_tuple < (3, 8):
191+
if version_triple >= (3, 0):
192+
if version_triple < (3, 8):
192193
# 3.0 .. 3.7
193194
return Code3
194-
elif version_tuple < (3, 10):
195+
elif version_triple < (3, 10):
195196
# 3.8 ... 3.9
196197
return Code38
197-
elif version_tuple[:2] == (3, 10) or IS_PYPY and version_tuple[:2] == (3, 11):
198+
elif version_triple[:2] == (3, 10) or IS_PYPY and version_triple[:2] == (3, 11):
198199
# 3.10
199200
return Code310
200-
elif version_tuple[:2] >= (3, 11):
201+
elif version_triple[:2] >= (3, 11):
201202
# 3.11 ...
202203
return Code311
203-
elif version_tuple > (2, 0):
204+
elif version_triple > (2, 0):
204205
# 2.0 .. 2.7
205206
return Code2
206207
else:
207208
# 1.0 .. 1.5
208-
if version_tuple <= (1, 3):
209+
if version_triple <= (1, 3):
209210
return Code13
210211
else:
211212
return Code15
@@ -214,7 +215,7 @@ def portableCodeType(version_tuple=PYTHON_VERSION_TRIPLE):
214215
# In contrast to Code3, Code2, etc. you can use CodeTypeUnint for building
215216
# an incomplete code type, which might be converted to another code type
216217
# later.
217-
CodeTypeUnionFields = tuple(Code311FieldNames.split() + ["collection_order", "reference_objects"])
218+
CodeTypeUnionFields = tuple(Code311FieldNames.split() + ["collection_order", "reference_objects", "version_triple"])
218219
CodeTypeUnion = namedtuple("CodeTypeUnion", CodeTypeUnionFields)
219220

220221

@@ -265,6 +266,7 @@ def to_portable(
265266
co_exceptiontable=co_exceptiontable,
266267
collection_order=collection_order,
267268
reference_objects=reference_objects,
269+
version_triple=version_triple,
268270
)
269271
return codeType2Portable(code, version_triple)
270272

xdis/codetype/code13.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# (C) Copyright 2020-2021, 2023 by Rocky Bernstein
1+
# (C) Copyright 2020-2021, 2023, 2025 by Rocky Bernstein
22
#
33
# This program is free software; you can redistribute it and/or
44
# modify it under the terms of the GNU General Public License
@@ -15,6 +15,7 @@
1515
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1616

1717
from copy import deepcopy
18+
from typing import Tuple
1819

1920
from xdis.codetype.base import CodeBase
2021
from xdis.cross_types import UnicodeForPython3
@@ -47,15 +48,16 @@ class Code13(CodeBase):
4748

4849
def __init__(
4950
self,
50-
co_argcount,
51-
co_nlocals,
52-
co_flags,
51+
co_argcount: int,
52+
co_nlocals: int,
53+
co_flags: int,
5354
co_code,
5455
co_consts,
5556
co_names,
5657
co_varnames,
5758
co_filename,
58-
co_name,
59+
co_name: str,
60+
version_triple: Tuple[int, int, int] = (0, 0, 0)
5961
) -> None:
6062
self.co_argcount = co_argcount
6163
self.co_nlocals = co_nlocals
@@ -67,6 +69,7 @@ def __init__(
6769
self.co_filename = co_filename
6870
self.co_name = co_name
6971
self.fieldtypes = Code13FieldTypes
72+
self.version_triple = version_triple
7073
if type(self) is Code13:
7174
self.check()
7275
return

xdis/codetype/code15.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1616

1717
from copy import deepcopy
18+
from typing import Tuple
1819

1920
from xdis.codetype.code13 import Code13, Code13FieldTypes
2021

@@ -42,20 +43,21 @@ class Code15(Code13):
4243

4344
def __init__(
4445
self,
45-
co_argcount,
46-
co_nlocals,
47-
co_stacksize,
48-
co_flags,
46+
co_argcount: int,
47+
co_nlocals: int,
48+
co_stacksize: int,
49+
co_flags: int,
4950
co_code,
5051
co_consts,
5152
co_names,
5253
co_varnames,
53-
co_filename,
54-
co_name,
54+
co_filename: str,
55+
co_name: str,
5556
co_firstlineno,
5657
co_lnotab,
58+
version_triple: Tuple[int, int, int] = (0, 0, 0)
5759
) -> None:
58-
super(Code15, self).__init__(
60+
super().__init__(
5961
co_argcount=co_argcount,
6062
co_nlocals=co_nlocals,
6163
co_flags=co_flags,
@@ -65,6 +67,7 @@ def __init__(
6567
co_varnames=co_varnames,
6668
co_filename=co_filename,
6769
co_name=co_name,
70+
version_triple=version_triple,
6871
)
6972
self.co_stacksize = co_stacksize
7073
self.co_firstlineno = co_firstlineno

xdis/codetype/code20.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ def __init__(
7272
co_cellvars,
7373
collection_order: Dict[Union[set, frozenset, dict], Tuple[Any]] = {},
7474
reference_objects: Set[Any] = set(),
75+
version_triple: Tuple[int, int, int] = (0, 0, 0)
7576
) -> None:
7677
# Keyword argument parameters in the call below is more robust.
7778
# Since things change around, robustness is good.
@@ -88,6 +89,7 @@ def __init__(
8889
co_name=co_name,
8990
co_firstlineno=co_firstlineno,
9091
co_lnotab=co_lnotab,
92+
version_triple=version_triple,
9193
)
9294
self.co_freevars = co_freevars
9395
self.co_cellvars = co_cellvars

xdis/codetype/code30.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def __init__(
6363
co_cellvars,
6464
collection_order: Dict[Union[set, frozenset, dict], Tuple[Any]] = {},
6565
reference_objects: Set[Any] = set(),
66+
version_triple: Tuple[int, int, int] = (0, 0, 0),
6667
) -> None:
6768
# Keyword argument parameters in the call below is more robust.
6869
# Since things change around, robustness is good.
@@ -83,6 +84,7 @@ def __init__(
8384
co_cellvars=co_cellvars,
8485
collection_order=collection_order,
8586
reference_objects=reference_objects,
87+
version_triple=version_triple,
8688
)
8789
self.co_kwonlyargcount = co_kwonlyargcount
8890
self.fieldtypes = Code3FieldTypes

xdis/codetype/code310.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import struct
1818
import types
1919
from copy import deepcopy
20-
from typing import Any, Dict, Tuple, Union
20+
from typing import Any, Dict, Set, Tuple, Union
2121

2222
from xdis.codetype.code38 import Code38
2323
from xdis.cross_types import UnicodeForPython3
@@ -97,7 +97,9 @@ def __init__(
9797
co_linetable,
9898
co_freevars,
9999
co_cellvars,
100-
collection_order: Dict[Union[set, frozenset, dict], Tuple[Any]] = {}
100+
collection_order: Dict[Union[set, frozenset, dict], Tuple[Any]] = {},
101+
reference_objects: Set[Any] = set(),
102+
version_triple: Tuple[int, int, int] = (0, 0, 0),
101103
) -> None:
102104
# Keyword argument parameters in the call below is more robust.
103105
# Since things change around, robustness is good.
@@ -118,6 +120,9 @@ def __init__(
118120
self.co_stacksize = co_stacksize
119121
self.co_varnames = co_varnames
120122
self.fieldtypes = Code310FieldTypes
123+
self.collection_order = collection_order
124+
self.reference_objects: Set = reference_objects
125+
self.version_triple = version_triple
121126

122127
# It is helpful to save the order in sets, frozensets and dictionary keys,
123128
# so that on writing a bytecode file we can duplicate this order.

xdis/codetype/code311.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from copy import deepcopy
1919
from dataclasses import dataclass
2020
from types import CodeType
21-
from typing import Iterable, Iterator, Optional
21+
from typing import Any, Iterable, Iterator, Optional, Set, Tuple
2222

2323
from xdis.codetype.code310 import Code310, Code310FieldTypes
2424
from xdis.version_info import PYTHON_VERSION_TRIPLE, version_tuple_to_str
@@ -408,10 +408,12 @@ def __init__(
408408
co_firstlineno,
409409
co_linetable,
410410
co_exceptiontable,
411+
reference_objects: Set[Any] = set(),
412+
version_triple: Tuple[int, int, int] = (0, 0, 0),
411413
) -> None:
412414
# Keyword argument parameters in the call below is more robust.
413415
# Since things change around, robustness is good.
414-
super(Code311, self).__init__(
416+
super().__init__(
415417
co_argcount=co_argcount,
416418
co_posonlyargcount=co_posonlyargcount,
417419
co_kwonlyargcount=co_kwonlyargcount,
@@ -428,6 +430,8 @@ def __init__(
428430
co_linetable=co_linetable,
429431
co_freevars=co_freevars,
430432
co_cellvars=co_cellvars,
433+
reference_objects = set(),
434+
version_triple = (0, 0, 0),
431435
)
432436
self.co_qualname = co_qualname
433437
self.co_exceptiontable = co_exceptiontable

xdis/codetype/code38.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import types
1818
from copy import deepcopy
19-
from typing import Any, Dict, Tuple, Union
19+
from typing import Any, Dict, Set, Tuple, Union
2020

2121
from xdis.codetype.code30 import Code3, Code3FieldTypes
2222
from xdis.version_info import PYTHON_VERSION_TRIPLE, version_tuple_to_str
@@ -84,7 +84,9 @@ def __init__(
8484
co_lnotab,
8585
co_freevars,
8686
co_cellvars,
87-
collection_order: Dict[Union[set, frozenset, dict], Tuple[Any]] = {}
87+
collection_order: Dict[Union[set, frozenset, dict], Tuple[Any]] = {},
88+
reference_objects: Set[Any] = set(),
89+
version_triple: Tuple[int, int, int] = (0, 0, 0),
8890
) -> None:
8991
# Keyword argument parameters in the call below is more robust.
9092
# Since things change around, robustness is good.
@@ -105,6 +107,8 @@ def __init__(
105107
co_freevars=co_freevars,
106108
co_cellvars=co_cellvars,
107109
collection_order = collection_order,
110+
reference_objects = set(),
111+
version_triple = (0, 0, 0),
108112
)
109113
self.co_posonlyargcount = co_posonlyargcount
110114
self.fieldtypes = Code38FieldTypes

xdis/cross_dis.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -288,25 +288,21 @@ def format_code_info(
288288
if file_offset:
289289
lines.append("# Offset in file: 0x%x" % file_offset[0])
290290

291-
if not is_graal:
292-
if version_tuple >= (1, 3):
293-
lines.append("# Argument count: %s" % co.co_argcount)
291+
if version_tuple >= (1, 3):
292+
lines.append("# Argument count: %s" % co.co_argcount)
294293

295-
if version_tuple >= (3, 8) and hasattr(co, "co_posonlyargcount"):
296-
lines.append("# Position-only argument count: %s" % co.co_posonlyargcount)
294+
if version_tuple >= (3, 8) and hasattr(co, "co_posonlyargcount"):
295+
lines.append("# Position-only argument count: %s" % co.co_posonlyargcount)
297296

298-
if version_tuple >= (3, 0) and hasattr(co, "co_kwonlyargcount"):
299-
lines.append("# Keyword-only arguments: %s" % co.co_kwonlyargcount)
297+
if version_tuple >= (3, 0) and hasattr(co, "co_kwonlyargcount"):
298+
lines.append("# Keyword-only arguments: %s" % co.co_kwonlyargcount)
300299

301-
pos_argc = co.co_argcount
302-
if version_tuple >= (1, 3):
303-
lines.append("# Number of locals: %s" % co.co_nlocals)
304-
if version_tuple >= (1, 5):
305-
lines.append("# Stack size: %s" % co.co_stacksize)
306-
pass
300+
pos_argc = co.co_argcount
301+
if version_tuple >= (1, 3):
302+
lines.append("# Number of locals: %s" % co.co_nlocals)
303+
if version_tuple >= (1, 5):
304+
lines.append("# Stack size: %s" % co.co_stacksize)
307305
pass
308-
else:
309-
pos_argc = 0
310306

311307
if version_tuple >= (1, 3):
312308
lines.append(

0 commit comments

Comments
 (0)