Skip to content

Commit d6541a3

Browse files
committed
implemented NativeTypeOffset for installation with setup.py
1 parent fe1fb3b commit d6541a3

File tree

7 files changed

+30
-18
lines changed

7 files changed

+30
-18
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/src/runtime/interopNative.cs
2+
3+
# VS Code
4+
.vscode/
5+
16
# General binaries and Build results
27
*.dll
38
*.exe

src/runtime/interop36.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Auto-generated by geninterop.py.
33
// DO NOT MODIFY BY HAND.
44

5+
// Python 3.6: ABI flags: ''
6+
57
// ReSharper disable InconsistentNaming
68
// ReSharper disable IdentifierTypo
79

src/runtime/interop37.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Auto-generated by geninterop.py.
33
// DO NOT MODIFY BY HAND.
44

5+
// Python 3.7: ABI flags: ''
6+
57
// ReSharper disable InconsistentNaming
68
// ReSharper disable IdentifierTypo
79

src/runtime/interop38.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Auto-generated by geninterop.py.
33
// DO NOT MODIFY BY HAND.
44

5+
// Python 3.8: ABI flags: ''
6+
57
// ReSharper disable InconsistentNaming
68
// ReSharper disable IdentifierTypo
79

src/runtime/interop39.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Auto-generated by geninterop.py.
33
// DO NOT MODIFY BY HAND.
44

5+
// Python 3.9: ABI flags: ''
6+
57
// ReSharper disable InconsistentNaming
68
// ReSharper disable IdentifierTypo
79

src/runtime/native/ABI.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ internal static void Initialize(Version version, BorrowedReference pyType)
1515

1616
var thisAssembly = Assembly.GetExecutingAssembly();
1717

18+
const string nativeTypeOffsetClassName = "Python.Runtime.NativeTypeOffset";
1819
string className = "Python.Runtime.TypeOffset" + offsetsClassSuffix;
19-
Type typeOffsetsClass = thisAssembly.GetType(className, throwOnError: false);
20+
Type typeOffsetsClass =
21+
// Try platform native offsets first. It is only present when generated by setup.py
22+
thisAssembly.GetType(nativeTypeOffsetClassName, throwOnError: false)
23+
?? thisAssembly.GetType(className, throwOnError: false);
2024
if (typeOffsetsClass is null)
2125
throw new NotSupportedException($"Python ABI v{version} is not supported");
2226
var typeOffsets = (ITypeOffsets)Activator.CreateInstance(typeOffsetsClass);

tools/geninterop/geninterop.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -244,22 +244,15 @@ def preprocess_python_headers():
244244

245245

246246
def gen_interop_head(writer):
247-
if hasattr(sys, "abiflags"):
248-
if "d" in sys.abiflags:
249-
defines.append("PYTHON_WITH_PYDEBUG")
250-
raise NotImplementedError
251-
if "m" in sys.abiflags:
252-
defines.append("PYTHON_WITH_PYMALLOC")
253-
raise NotImplementedError
254-
if "u" in sys.abiflags:
255-
defines.append("PYTHON_WITH_WIDE_UNICODE")
256-
raise NotImplementedError
257-
258247
filename = os.path.basename(__file__)
248+
abi_flags = sys.abiflags if hasattr(sys, "abiflags") else ''
249+
py_ver = "{0}.{1}".format(PY_MAJOR, PY_MINOR)
259250
class_definition = """
260251
// Auto-generated by %s.
261252
// DO NOT MODIFY BY HAND.
262253
254+
// Python %s: ABI flags: '%s'
255+
263256
// ReSharper disable InconsistentNaming
264257
// ReSharper disable IdentifierTypo
265258
@@ -270,7 +263,7 @@ def gen_interop_head(writer):
270263
using Python.Runtime.Native;
271264
272265
namespace Python.Runtime
273-
{""" % filename
266+
{""" % (filename, py_ver, abi_flags)
274267
writer.extend(class_definition)
275268

276269

@@ -281,20 +274,21 @@ def gen_interop_tail(writer):
281274
writer.extend(tail)
282275

283276

284-
def gen_heap_type_members(parser, writer):
277+
def gen_heap_type_members(parser, writer, type_name = None):
285278
"""Generate the TypeOffset C# class"""
286279
members = parser.get_struct_members("PyHeapTypeObject")
280+
type_name = type_name or "TypeOffset{0}{1}".format(PY_MAJOR, PY_MINOR)
287281
class_definition = """
288282
[SuppressMessage("Style", "IDE1006:Naming Styles",
289283
Justification = "Following CPython",
290284
Scope = "type")]
291285
292286
[StructLayout(LayoutKind.Sequential)]
293-
internal class TypeOffset{0}{1} : GeneratedTypeOffsets, ITypeOffsets
287+
internal class {0} : GeneratedTypeOffsets, ITypeOffsets
294288
{{
295-
public TypeOffset{0}{1}() {{ }}
289+
public {0}() {{ }}
296290
// Auto-generated from PyHeapTypeObject in Python.h
297-
""".format(PY_MAJOR, PY_MINOR)
291+
""".format(type_name)
298292

299293
# All the members are sizeof(void*) so we don't need to do any
300294
# extra work to determine the size based on the type.
@@ -347,9 +341,10 @@ def main():
347341

348342
writer = Writer()
349343
# generate the C# code
344+
offsets_type_name = "NativeTypeOffset" if len(sys.argv) > 1 else None
350345
gen_interop_head(writer)
351346

352-
gen_heap_type_members(ast_parser, writer)
347+
gen_heap_type_members(ast_parser, writer, type_name = offsets_type_name)
353348

354349
ver_define = "PYTHON{0}{1}".format(PY_MAJOR, PY_MINOR)
355350
writer.append(code="#if " + ver_define)

0 commit comments

Comments
 (0)