Skip to content

Commit 18c4b57

Browse files
box/unbox empty tuple
1 parent d29dfb9 commit 18c4b57

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

mypyc/codegen/emit.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,17 +1036,21 @@ def emit_box(
10361036
self.emit_line(f"{declaration}{dest} = PyFloat_FromDouble({src});")
10371037
elif isinstance(typ, RTuple):
10381038
self.declare_tuple_struct(typ)
1039-
self.emit_line(f"{declaration}{dest} = PyTuple_New({len(typ.types)});")
1040-
self.emit_line(f"if (unlikely({dest} == NULL))")
1041-
self.emit_line(" CPyError_OutOfMemory();")
1042-
# TODO: Fail if dest is None
1043-
for i in range(len(typ.types)):
1044-
if not typ.is_unboxed:
1045-
self.emit_line(f"PyTuple_SET_ITEM({dest}, {i}, {src}.f{i}")
1046-
else:
1047-
inner_name = self.temp_name()
1048-
self.emit_box(f"{src}.f{i}", inner_name, typ.types[i], declare_dest=True)
1049-
self.emit_line(f"PyTuple_SET_ITEM({dest}, {i}, {inner_name});")
1039+
if not typ.types:
1040+
self.emit_line(f"{declaration}{dest} = CPyTuple_LoadEmptyTupleConstant();")
1041+
else:
1042+
self.emit_line(f"{declaration}{dest} = PyTuple_New({len(typ.types)});")
1043+
self.emit_line(f"if (unlikely({dest} == NULL))")
1044+
self.emit_line(" CPyError_OutOfMemory();")
1045+
1046+
# TODO: Fail if dest is None
1047+
for i in range(len(typ.types)):
1048+
if not typ.is_unboxed:
1049+
self.emit_line(f"PyTuple_SET_ITEM({dest}, {i}, {src}.f{i}")
1050+
else:
1051+
inner_name = self.temp_name()
1052+
self.emit_box(f"{src}.f{i}", inner_name, typ.types[i], declare_dest=True)
1053+
self.emit_line(f"PyTuple_SET_ITEM({dest}, {i}, {inner_name});")
10501054
else:
10511055
assert not typ.is_unboxed
10521056
# Type is boxed -- trivially just assign.

0 commit comments

Comments
 (0)