From c1e5622abfed190fbafd420516cd09aaa6fa3790 Mon Sep 17 00:00:00 2001 From: Victor Nova Date: Wed, 7 Jul 2021 16:11:43 -0700 Subject: [PATCH] It was incorrect to call `PyType_Ready` on a type returned by `PyType.tp_new`. It should have not been allowed in the first place, but we accidentally cleared `Ready` from `tp_flags`. Instead, we will extend `tp_flags` and call `PyType_Modified` at the end of CLR MetaType.tp_new --- src/runtime/metatype.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 014c5917c..6c268dbcb 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -145,7 +145,9 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) return IntPtr.Zero; } - var flags = TypeFlags.Default; + var flags = (TypeFlags)Util.ReadCLong(type, TypeOffset.tp_flags); + if (!flags.HasFlag(TypeFlags.Ready)) + throw new NotSupportedException("PyType.tp_new returned an incomplete type"); flags |= TypeFlags.HasClrInstance; flags |= TypeFlags.HeapType; flags |= TypeFlags.BaseType; @@ -170,8 +172,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) IntPtr gc = Marshal.ReadIntPtr(base_type, Offsets.tp_clr_inst); Marshal.WriteIntPtr(type, Offsets.tp_clr_inst, gc); - if (Runtime.PyType_Ready(type) != 0) - throw PythonException.ThrowLastAsClrException(); + Runtime.PyType_Modified(new BorrowedReference(type)); return type; }