diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj
index ee1a3c701..9999f8303 100644
--- a/src/runtime/Python.Runtime.csproj
+++ b/src/runtime/Python.Runtime.csproj
@@ -136,6 +136,7 @@
+
@@ -164,4 +165,4 @@
-
+
\ No newline at end of file
diff --git a/src/runtime/Util.cs b/src/runtime/Util.cs
new file mode 100644
index 000000000..dd4418cc9
--- /dev/null
+++ b/src/runtime/Util.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Python.Runtime
+{
+ internal class Util
+ {
+ internal static Int64 ReadCLong(IntPtr tp, int offset)
+ {
+ // On Windows, a C long is always 32 bits.
+ if (Runtime.IsWindows || Runtime.Is32Bit)
+ {
+ return Marshal.ReadInt32(tp, offset);
+ }
+ else
+ {
+ return Marshal.ReadInt64(tp, offset);
+ }
+ }
+
+ internal static void WriteCLong(IntPtr type, int offset, Int64 flags)
+ {
+ if (Runtime.IsWindows || Runtime.Is32Bit)
+ {
+ Marshal.WriteInt32(type, offset, (Int32)(flags & 0xffffffffL));
+ }
+ else
+ {
+ Marshal.WriteInt64(type, offset, flags);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/runtime/clrobject.cs b/src/runtime/clrobject.cs
index 472e5dcbb..fb3d0e0d7 100644
--- a/src/runtime/clrobject.cs
+++ b/src/runtime/clrobject.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Runtime.InteropServices;
namespace Python.Runtime
@@ -11,7 +11,7 @@ internal CLRObject(object ob, IntPtr tp)
{
IntPtr py = Runtime.PyType_GenericAlloc(tp, 0);
- var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
+ long flags = Util.ReadCLong(tp, TypeOffset.tp_flags);
if ((flags & TypeFlags.Subclass) != 0)
{
IntPtr dict = Marshal.ReadIntPtr(py, ObjectOffset.DictOffset(tp));
diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs
index 9ee8d223b..562b2e5f8 100644
--- a/src/runtime/managedtype.cs
+++ b/src/runtime/managedtype.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Runtime.InteropServices;
namespace Python.Runtime
@@ -28,7 +28,7 @@ internal static ManagedType GetManagedObject(IntPtr ob)
tp = ob;
}
- var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
+ var flags = Util.ReadCLong(tp, TypeOffset.tp_flags);
if ((flags & TypeFlags.Managed) != 0)
{
IntPtr op = tp == ob
@@ -63,7 +63,7 @@ internal static bool IsManagedType(IntPtr ob)
tp = ob;
}
- var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
+ var flags = Util.ReadCLong(tp, TypeOffset.tp_flags);
if ((flags & TypeFlags.Managed) != 0)
{
return true;
diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs
index bfb71e26d..7ae6a73d4 100644
--- a/src/runtime/metatype.cs
+++ b/src/runtime/metatype.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Runtime.InteropServices;
namespace Python.Runtime
@@ -105,7 +105,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw)
flags |= TypeFlags.BaseType;
flags |= TypeFlags.Subclass;
flags |= TypeFlags.HaveGC;
- Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags);
+ Util.WriteCLong(type, TypeOffset.tp_flags, flags);
TypeManager.CopySlot(base_type, type, TypeOffset.tp_dealloc);
@@ -247,7 +247,7 @@ public static void tp_dealloc(IntPtr tp)
{
// Fix this when we dont cheat on the handle for subclasses!
- var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags);
+ var flags = Util.ReadCLong(tp, TypeOffset.tp_flags);
if ((flags & TypeFlags.Subclass) == 0)
{
IntPtr gc = Marshal.ReadIntPtr(tp, TypeOffset.magic());
diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs
index 73caeb854..7ff217823 100644
--- a/src/runtime/runtime.cs
+++ b/src/runtime/runtime.cs
@@ -152,6 +152,10 @@ public class Runtime
internal static bool IsFinalizing;
internal static bool Is32Bit = IntPtr.Size == 4;
+
+ // .NET core: System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
+ internal static bool IsWindows = Environment.OSVersion.Platform == PlatformID.Win32NT;
+
internal static bool IsPython2 = pyversionnumber < 30;
internal static bool IsPython3 = pyversionnumber >= 30;
@@ -785,7 +789,7 @@ internal static bool PyObject_IsIterable(IntPtr pointer)
{
var ob_type = Marshal.ReadIntPtr(pointer, ObjectOffset.ob_type);
#if PYTHON2
- long tp_flags = Marshal.ReadInt64(ob_type, TypeOffset.tp_flags);
+ long tp_flags = Util.ReadCLong(ob_type, TypeOffset.tp_flags);
if ((tp_flags & TypeFlags.HaveIter) == 0)
return false;
#endif
@@ -1442,7 +1446,7 @@ internal static bool PyIter_Check(IntPtr pointer)
{
var ob_type = Marshal.ReadIntPtr(pointer, ObjectOffset.ob_type);
#if PYTHON2
- long tp_flags = Marshal.ReadInt64(ob_type, TypeOffset.tp_flags);
+ long tp_flags = Util.ReadCLong(ob_type, TypeOffset.tp_flags);
if ((tp_flags & TypeFlags.HaveIter) == 0)
return false;
#endif
diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs
index ad0fddcc1..6570ee083 100644
--- a/src/runtime/typemanager.cs
+++ b/src/runtime/typemanager.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
@@ -86,7 +86,7 @@ internal static IntPtr CreateType(Type impl)
int flags = TypeFlags.Default | TypeFlags.Managed |
TypeFlags.HeapType | TypeFlags.HaveGC;
- Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags);
+ Util.WriteCLong(type, TypeOffset.tp_flags, flags);
Runtime.PyType_Ready(type);
@@ -160,7 +160,7 @@ internal static IntPtr CreateType(ManagedType impl, Type clrType)
flags |= TypeFlags.HeapType;
flags |= TypeFlags.BaseType;
flags |= TypeFlags.HaveGC;
- Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags);
+ Util.WriteCLong(type, TypeOffset.tp_flags, flags);
// Leverage followup initialization from the Python runtime. Note
// that the type of the new type must PyType_Type at the time we
@@ -323,7 +323,7 @@ internal static IntPtr CreateMetaType(Type impl)
flags |= TypeFlags.Managed;
flags |= TypeFlags.HeapType;
flags |= TypeFlags.HaveGC;
- Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags);
+ Util.WriteCLong(type, TypeOffset.tp_flags, flags);
// We need space for 3 PyMethodDef structs, each of them
// 4 int-ptrs in size.
@@ -380,7 +380,7 @@ internal static IntPtr BasicSubType(string name, IntPtr base_, Type impl)
flags |= TypeFlags.Managed;
flags |= TypeFlags.HeapType;
flags |= TypeFlags.HaveGC;
- Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags);
+ Util.WriteCLong(type, TypeOffset.tp_flags, flags);
CopySlot(base_, type, TypeOffset.tp_traverse);
CopySlot(base_, type, TypeOffset.tp_clear);