Skip to content

Commit 5ac75ba

Browse files
committed
Remove dependency on importing platform. #891
1 parent ff5edc3 commit 5ac75ba

File tree

3 files changed

+173
-5
lines changed

3 files changed

+173
-5
lines changed

src/embed_tests/TestRuntime.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public void SetUp()
2323
///
2424
/// Test fails on platforms we haven't implemented yet.
2525
/// </summary>
26-
[Ignore("Temparary test")]
2726
[Test]
2827
public static void PlatformCache()
2928
{

src/runtime/platform/NativeCodePage.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class NativeCodePageHelper
1515
/// Gets the operating system as reported by python's platform.system().
1616
/// </summary>
1717
[Obsolete]
18-
public static string OperatingSystemName { get; private set; }
18+
public static string OperatingSystemName => PythonEngine.Platform;
1919

2020
/// <summary>
2121
/// Gets the machine architecture as reported by python's platform.machine().
@@ -246,9 +246,9 @@ public void SetReadExec(IntPtr mappedMemory, int numBytes)
246246
/// </summary>
247247
public static void InitializePlatformData()
248248
{
249-
// FIXME: arch, non-windows
250-
Machine = Runtime.Is32Bit ? MachineType.i386 : MachineType.x86_64;
251-
OperatingSystem = Runtime.IsWindows ? OperatingSystemType.Windows : OperatingSystemType.Linux;
249+
MachineName = SystemInfo.GetArchitecture();
250+
Machine = SystemInfo.GetMachineType();
251+
OperatingSystem = SystemInfo.GetSystemType();
252252
}
253253

254254
internal static IMemoryMapper CreateMemoryMapper()

src/runtime/platform/Types.cs

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
14
namespace Python.Runtime.Platform
25
{
36
public enum MachineType
@@ -20,4 +23,170 @@ public enum OperatingSystemType
2023
Linux,
2124
Other
2225
}
26+
27+
28+
static class SystemInfo
29+
{
30+
public static MachineType GetMachineType()
31+
{
32+
return Runtime.IsWindows ? GetMachineType_Windows() : GetMachineType_Unix();
33+
}
34+
35+
public static string GetArchitecture()
36+
{
37+
return Runtime.IsWindows ? GetArchName_Windows() : GetArchName_Unix();
38+
}
39+
40+
public static OperatingSystemType GetSystemType()
41+
{
42+
if (Runtime.IsWindows)
43+
{
44+
return OperatingSystemType.Windows;
45+
}
46+
switch (PythonEngine.Platform)
47+
{
48+
case "linux":
49+
return OperatingSystemType.Linux;
50+
51+
case "darwin":
52+
return OperatingSystemType.Darwin;
53+
54+
default:
55+
return OperatingSystemType.Other;
56+
}
57+
}
58+
59+
#region WINDOWS
60+
61+
static string GetArchName_Windows()
62+
{
63+
// https://docs.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details
64+
return Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
65+
}
66+
67+
static MachineType GetMachineType_Windows()
68+
{
69+
if (Runtime.Is32Bit)
70+
{
71+
return MachineType.i386;
72+
}
73+
switch (GetArchName_Windows())
74+
{
75+
case "AMD64":
76+
return MachineType.x86_64;
77+
case "ARM64":
78+
return MachineType.aarch64;
79+
default:
80+
return MachineType.Other;
81+
}
82+
}
83+
84+
#endregion
85+
86+
#region UNIX
87+
88+
89+
[StructLayout(LayoutKind.Sequential)]
90+
unsafe struct utsname_linux
91+
{
92+
const int NameLength = 65;
93+
94+
/* Name of the implementation of the operating system. */
95+
public fixed byte sysname[NameLength];
96+
97+
/* Name of this node on the network. */
98+
public fixed byte nodename[NameLength];
99+
100+
/* Current release level of this implementation. */
101+
public fixed byte release[NameLength];
102+
103+
/* Current version level of this release. */
104+
public fixed byte version[NameLength];
105+
106+
/* Name of the hardware type the system is running on. */
107+
public fixed byte machine[NameLength];
108+
109+
// GNU extension
110+
fixed byte domainname[NameLength]; /* NIS or YP domain name */
111+
}
112+
113+
[StructLayout(LayoutKind.Sequential)]
114+
unsafe struct utsname_darwin
115+
{
116+
const int NameLength = 256;
117+
118+
/* Name of the implementation of the operating system. */
119+
public fixed byte sysname[NameLength];
120+
121+
/* Name of this node on the network. */
122+
public fixed byte nodename[NameLength];
123+
124+
/* Current release level of this implementation. */
125+
public fixed byte release[NameLength];
126+
127+
/* Current version level of this release. */
128+
public fixed byte version[NameLength];
129+
130+
/* Name of the hardware type the system is running on. */
131+
public fixed byte machine[NameLength];
132+
}
133+
134+
[DllImport("libc")]
135+
static extern int uname(IntPtr buf);
136+
137+
138+
static unsafe string GetArchName_Unix()
139+
{
140+
switch (GetSystemType())
141+
{
142+
case OperatingSystemType.Linux:
143+
{
144+
var buf = stackalloc utsname_linux[1];
145+
if (uname((IntPtr)buf) != 0)
146+
{
147+
return null;
148+
}
149+
return Marshal.PtrToStringAnsi((IntPtr)buf->machine);
150+
}
151+
152+
case OperatingSystemType.Darwin:
153+
{
154+
var buf = stackalloc utsname_darwin[1];
155+
if (uname((IntPtr)buf) != 0)
156+
{
157+
return null;
158+
}
159+
return Marshal.PtrToStringAnsi((IntPtr)buf->machine);
160+
}
161+
162+
default:
163+
return null;
164+
}
165+
}
166+
167+
static unsafe MachineType GetMachineType_Unix()
168+
{
169+
switch (GetArchName_Unix())
170+
{
171+
case "x86_64":
172+
case "em64t":
173+
return Runtime.Is32Bit ? MachineType.i386 : MachineType.x86_64;
174+
case "i386":
175+
case "i686":
176+
return MachineType.i386;
177+
178+
case "armv7l":
179+
return MachineType.armv7l;
180+
case "armv8":
181+
return Runtime.Is32Bit ? MachineType.armv7l : MachineType.armv8;
182+
case "aarch64":
183+
return Runtime.Is32Bit ? MachineType.armv7l : MachineType.aarch64;
184+
185+
default:
186+
return MachineType.Other;
187+
}
188+
}
189+
190+
#endregion
191+
}
23192
}

0 commit comments

Comments
 (0)