Skip to content

Commit 6819e7b

Browse files
committed
improved handling of dict offset in object instances
1 parent e5bce06 commit 6819e7b

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

src/runtime/interop.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,10 @@ public static int magic(IntPtr type)
185185

186186
public static int TypeDictOffset(IntPtr type)
187187
{
188-
return ManagedDataOffsets.DictOffset(type);
188+
Debug.Assert(TypeOffset.tp_dictoffset > 0);
189+
int dictOffset = Marshal.ReadInt32(type, TypeOffset.tp_dictoffset);
190+
Debug.Assert(dictOffset > 0);
191+
return dictOffset;
189192
}
190193

191194
public static int Size(IntPtr pyType)

src/runtime/managedtype.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,17 @@ protected static void ClearObjectDict(IntPtr ob)
260260
protected static IntPtr GetObjectDict(IntPtr ob)
261261
{
262262
IntPtr type = Runtime.PyObject_TYPE(ob);
263-
return Marshal.ReadIntPtr(ob, ObjectOffset.TypeDictOffset(type));
263+
int dictOffset = ObjectOffset.TypeDictOffset(type);
264+
if (dictOffset == 0) return IntPtr.Zero;
265+
return Marshal.ReadIntPtr(ob, dictOffset);
264266
}
265267

266268
protected static void SetObjectDict(IntPtr ob, IntPtr value)
267269
{
268270
IntPtr type = Runtime.PyObject_TYPE(ob);
269-
Marshal.WriteIntPtr(ob, ObjectOffset.TypeDictOffset(type), value);
271+
int dictOffset = ObjectOffset.TypeDictOffset(type);
272+
Debug.Assert(dictOffset > 0);
273+
Marshal.WriteIntPtr(ob, dictOffset, value);
270274
}
271275
}
272276
}

src/runtime/typemanager.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ internal static IntPtr CreateType(Type impl)
165165
// Set tp_basicsize to the size of our managed instance objects.
166166
Marshal.WriteIntPtr(type, TypeOffset.tp_basicsize, (IntPtr)ob_size);
167167

168-
var offset = (IntPtr)ObjectOffset.TypeDictOffset(type);
168+
var offset = (IntPtr)ManagedDataOffsets.DictOffset(type);
169169
Marshal.WriteIntPtr(type, TypeOffset.tp_dictoffset, offset);
170170

171171
SlotsHolder slotsHolder = CreateSolotsHolder(type);

0 commit comments

Comments
 (0)