@@ -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