File tree Expand file tree Collapse file tree 4 files changed +31
-11
lines changed Expand file tree Collapse file tree 4 files changed +31
-11
lines changed Original file line number Diff line number Diff line change @@ -362,19 +362,31 @@ public static int tp_clear(IntPtr ob)
362
362
{
363
363
ManagedType self = GetManagedObject ( ob ) ;
364
364
365
- bool isTypeObject = Runtime . PyObject_TYPE ( ob ) == Runtime . PyCLRMetaType ;
366
- if ( ! isTypeObject )
367
- {
368
- ClearObjectDict ( ob ) ;
365
+ if ( self . clearReentryGuard ) return 0 ;
366
+
367
+ // workaround for https://bugs.python.org/issue45266
368
+ self . clearReentryGuard = true ;
369
369
370
- int baseClearResult = BaseUnmanagedClear ( ob ) ;
371
- if ( baseClearResult != 0 )
370
+ try
371
+ {
372
+ bool isTypeObject = Runtime . PyObject_TYPE ( ob ) == Runtime . PyCLRMetaType ;
373
+ if ( ! isTypeObject )
372
374
{
373
- return baseClearResult ;
375
+ int baseClearResult = BaseUnmanagedClear ( ob ) ;
376
+ if ( baseClearResult != 0 )
377
+ {
378
+ return baseClearResult ;
379
+ }
380
+
381
+ ClearObjectDict ( ob ) ;
374
382
}
383
+ if ( self is not null ) self . tpHandle = IntPtr . Zero ;
384
+ return 0 ;
385
+ }
386
+ finally
387
+ {
388
+ self . clearReentryGuard = false ;
375
389
}
376
- if ( self is not null ) self . tpHandle = IntPtr . Zero ;
377
- return 0 ;
378
390
}
379
391
380
392
static unsafe int BaseUnmanagedClear ( IntPtr ob )
Original file line number Diff line number Diff line change @@ -12,7 +12,7 @@ internal class CLRObject : ManagedType
12
12
13
13
internal CLRObject ( object ob , IntPtr tp )
14
14
{
15
- System . Diagnostics . Debug . Assert ( tp != IntPtr . Zero ) ;
15
+ Debug . Assert ( tp != IntPtr . Zero ) ;
16
16
IntPtr py = Runtime . PyType_GenericAlloc ( tp , 0 ) ;
17
17
18
18
tpHandle = tp ;
Original file line number Diff line number Diff line change @@ -28,6 +28,8 @@ internal enum TrackTypes
28
28
internal IntPtr pyHandle ; // PyObject *
29
29
internal IntPtr tpHandle ; // PyType *
30
30
31
+ internal bool clearReentryGuard ;
32
+
31
33
internal BorrowedReference ObjectReference => new ( pyHandle ) ;
32
34
internal BorrowedReference TypeReference => new ( tpHandle ) ;
33
35
@@ -145,7 +147,7 @@ internal static bool IsInstanceOfManagedType(IntPtr ob)
145
147
146
148
internal static bool IsManagedType ( BorrowedReference type )
147
149
{
148
- var flags = ( TypeFlags ) Util . ReadCLong ( type . DangerousGetAddress ( ) , TypeOffset . tp_flags ) ;
150
+ var flags = PyType . GetFlags ( type ) ;
149
151
return ( flags & TypeFlags . HasClrInstance ) != 0 ;
150
152
}
151
153
Original file line number Diff line number Diff line change @@ -103,6 +103,12 @@ internal IntPtr GetSlot(TypeSlotID slot)
103
103
return Exceptions . ErrorCheckIfNull ( result ) ;
104
104
}
105
105
106
+ internal static TypeFlags GetFlags ( BorrowedReference type )
107
+ {
108
+ Debug . Assert ( TypeOffset . tp_flags > 0 ) ;
109
+ return ( TypeFlags ) Util . ReadCLong ( type . DangerousGetAddress ( ) , TypeOffset . tp_flags ) ;
110
+ }
111
+
106
112
internal static BorrowedReference GetBase ( BorrowedReference type )
107
113
{
108
114
Debug . Assert ( IsType ( type ) ) ;
You can’t perform that action at this time.
0 commit comments