Skip to content

Commit 760b2b1

Browse files
committed
Cast IntPtr to int on 32bit, float on 64
Similar operation is done in runtime.cs xDecref
1 parent be28d3c commit 760b2b1

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

src/embed_tests/pyinitialize.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ public static void LoadSpecificArgs()
5353
/// More complex version of StartAndStopTwice test
5454
/// </summary>
5555
[Test]
56-
[Ignore("GH#376: System.OverflowException : Arithmetic operation resulted in an overflow")]
57-
//[Ignore("System.ArgumentException : Cannot pass a GCHandle across AppDomains")]
56+
[Ignore("System.ArgumentException : Cannot pass a GCHandle across AppDomains")]
5857
public void ReInitialize()
5958
{
6059
var code = "from System import Int32\n";

src/runtime/clrobject.cs

+13-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,19 @@ internal CLRObject(object ob, IntPtr tp)
1111
{
1212
IntPtr py = Runtime.PyType_GenericAlloc(tp, 0);
1313

14-
var flags = (long)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
15-
if ((flags & TypeFlags.Subclass) != 0)
14+
bool bFlag;
15+
if (Runtime.Is32Bit)
16+
{
17+
var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
18+
bFlag = (flags & TypeFlags.Subclass) != 0;
19+
}
20+
else
21+
{
22+
var flags = (float)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
23+
bFlag = (flags & TypeFlags.Subclass) != 0;
24+
}
25+
26+
if (bFlag)
1627
{
1728
IntPtr dict = Marshal.ReadIntPtr(py, ObjectOffset.DictOffset(tp));
1829
if (dict == IntPtr.Zero)

src/runtime/managedtype.cs

+26-4
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,19 @@ internal static ManagedType GetManagedObject(IntPtr ob)
2828
tp = ob;
2929
}
3030

31-
var flags = (long)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
32-
if ((flags & TypeFlags.Managed) != 0)
31+
bool bFlag;
32+
if (Runtime.Is32Bit)
33+
{
34+
var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
35+
bFlag = (flags & TypeFlags.Managed) != 0;
36+
}
37+
else
38+
{
39+
var flags = (float)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
40+
bFlag = (flags & TypeFlags.Managed) != 0;
41+
}
42+
43+
if (bFlag)
3344
{
3445
IntPtr op = tp == ob
3546
? Marshal.ReadIntPtr(tp, TypeOffset.magic())
@@ -63,8 +74,19 @@ internal static bool IsManagedType(IntPtr ob)
6374
tp = ob;
6475
}
6576

66-
var flags = (long)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
67-
if ((flags & TypeFlags.Managed) != 0)
77+
bool bFlag;
78+
if (Runtime.Is32Bit)
79+
{
80+
var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
81+
bFlag = (flags & TypeFlags.Managed) != 0;
82+
}
83+
else
84+
{
85+
var flags = (float)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
86+
bFlag = (flags & TypeFlags.Managed) != 0;
87+
}
88+
89+
if (bFlag)
6890
{
6991
return true;
7092
}

0 commit comments

Comments
 (0)