Skip to content

Commit 4e984cb

Browse files
williamwen42pytorchmergebot
authored andcommitted
1 parent 021d267 commit 4e984cb

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

torch/_dynamo/bytecode_transformation.py

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -332,26 +332,42 @@ def fix_vars(instructions: List[Instruction], code_options):
332332

333333

334334
def transform_code_object(code, transformations, safe=False):
335-
keys = [
336-
"co_argcount",
337-
"co_posonlyargcount", # python 3.8+
338-
"co_kwonlyargcount",
339-
"co_nlocals",
340-
"co_stacksize",
341-
"co_flags",
342-
"co_code",
343-
"co_consts",
344-
"co_names",
345-
"co_varnames",
346-
"co_filename",
347-
"co_name",
348-
"co_firstlineno",
349-
"co_lnotab", # changed to "co_linetable" if python 3.10+
350-
"co_freevars",
351-
"co_cellvars",
352-
]
335+
# Python 3.11 changes to code keys are not fully documented.
336+
# See https://github.com/python/cpython/blob/3.11/Objects/clinic/codeobject.c.h#L24
337+
# for new format.
338+
keys = ["co_argcount"]
339+
if sys.version_info >= (3, 8):
340+
keys.append("co_posonlyargcount")
341+
keys.extend(
342+
[
343+
"co_kwonlyargcount",
344+
"co_nlocals",
345+
"co_stacksize",
346+
"co_flags",
347+
"co_code",
348+
"co_consts",
349+
"co_names",
350+
"co_varnames",
351+
"co_filename",
352+
"co_name",
353+
]
354+
)
355+
if sys.version_info >= (3, 11):
356+
keys.append("co_qualname")
357+
keys.append("co_firstlineno")
353358
if sys.version_info >= (3, 10):
354-
keys = list(map(lambda x: x.replace("co_lnotab", "co_linetable"), keys))
359+
keys.append("co_linetable")
360+
else:
361+
keys.append("co_lnotab")
362+
if sys.version_info >= (3, 11):
363+
# not documented, but introduced in https://github.com/python/cpython/issues/84403
364+
keys.append("co_exceptiontable")
365+
keys.extend(
366+
[
367+
"co_freevars",
368+
"co_cellvars",
369+
]
370+
)
355371
code_options = {k: getattr(code, k) for k in keys}
356372
assert len(code_options["co_varnames"]) == code_options["co_nlocals"]
357373

@@ -382,6 +398,9 @@ def transform_code_object(code, transformations, safe=False):
382398
assert set(keys) - {"co_posonlyargcount"} == set(code_options.keys()) - {
383399
"co_posonlyargcount"
384400
}
401+
if sys.version_info >= (3, 11):
402+
# generated code doesn't contain exceptions, so leave exception table empty
403+
code_options["co_exceptiontable"] = b""
385404
return types.CodeType(*[code_options[k] for k in keys])
386405

387406

torch/_dynamo/resume_execution.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ def update(instructions: List[Instruction], code_options: Dict[str, Any]):
134134
code_options["co_freevars"] or []
135135
)
136136
code_options["co_name"] = f"<graph break in {code_options['co_name']}>"
137+
if sys.version_info >= (3, 11):
138+
code_options[
139+
"co_qualname"
140+
] = f"<graph break in {code_options['co_qualname']}>"
137141
code_options["co_firstlineno"] = lineno
138142
code_options["co_cellvars"] = tuple()
139143
code_options["co_freevars"] = freevars
@@ -146,6 +150,7 @@ def update(instructions: List[Instruction], code_options: Dict[str, Any]):
146150
code_options["co_flags"] = code_options["co_flags"] & ~(
147151
CO_VARARGS | CO_VARKEYWORDS
148152
)
153+
# TODO probably need to update co_exceptiontable for python 3.11
149154
(target,) = [i for i in instructions if i.offset == offset]
150155

151156
prefix = []

0 commit comments

Comments
 (0)