Skip to content

Commit a8f0377

Browse files
mos9527K0lb3
authored andcommitted
NativeAPI: Expose TypeTreeGenerator_getMonoBehaviorDefinitions
1 parent 2a517c1 commit a8f0377

3 files changed

Lines changed: 62 additions & 8 deletions

File tree

.gitignore

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,4 +397,9 @@ FodyWeavers.xsd
397397
*.msp
398398

399399
# JetBrains Rider
400-
*.sln.iml
400+
*.sln.iml
401+
402+
# Built binaries
403+
*.dll
404+
*.so
405+
*.dylib

TypeTreeGeneratorAPI/NativeAPI.cs

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ unsafe public static int TypeTreeGenerator_generateTypeTreeNodesJson(IntPtr type
144144

145145
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_generateTreeNodesRaw")]
146146
unsafe public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeTreeGeneratorPtr, IntPtr assemblyNamePtr, IntPtr fullNamePtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
147-
{
147+
{
148148
string? assemblyName = Marshal.PtrToStringUTF8(assemblyNamePtr);
149149
string? fullName = Marshal.PtrToStringUTF8(fullNamePtr);
150150

@@ -154,19 +154,15 @@ unsafe public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeT
154154
}
155155
try
156156
{
157-
var typeTreeGenerator = (TypeTreeGenerator)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
158-
157+
var typeTreeGenerator = (TypeTreeGenerator)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
159158
var typeTreeNodes = typeTreeGenerator.GenerateTreeNodes(assemblyName, fullName);
160159
if (typeTreeNodes == null)
161160
{
162161
return -1;
163162
}
164163
var (arrayPtr, arrayLength) = TypeTreeNodeSerializer.ToRaw(typeTreeNodes!);
165164

166-
// Write the JSON pointer to the address specified by `jsonAddr`
167165
Marshal.WriteIntPtr(arrAddrPtr, arrayPtr);
168-
169-
// Write the JSON length to the address specified by `jsonLength`
170166
Marshal.WriteInt32(arrLengthPtr, arrayLength);
171167

172168
return 0;
@@ -177,6 +173,39 @@ unsafe public static int TypeTreeGenerator_generateTypeTreeNodesRaw(IntPtr typeT
177173
}
178174
}
179175

176+
[UnmanagedCallersOnly(EntryPoint = "TypeTreeGenerator_getMonoBehaviorDefinitions")]
177+
unsafe public static int TypeTreeGenerator_getMonoBehaviorDefinitions(IntPtr typeTreeGeneratorPtr, IntPtr arrAddrPtr, IntPtr arrLengthPtr)
178+
{
179+
if (typeTreeGeneratorPtr == IntPtr.Zero )
180+
{
181+
return -1;
182+
}
183+
try
184+
{
185+
var typeTreeGenerator = (TypeTreeGenerator)GCHandle.FromIntPtr(typeTreeGeneratorPtr).Target!;
186+
187+
var typeNames = typeTreeGenerator.GetMonoBehaviourDefinitions();
188+
189+
var arrayLength = typeNames.Count;
190+
var arrayPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf<IntPtr>() * arrayLength * 2);
191+
for (int i = 0; i < arrayLength; i++)
192+
{
193+
string module = typeNames[i].Module.Name;
194+
string fullName = typeNames[i].FullName;
195+
Marshal.WriteIntPtr(arrayPtr, (i * 2) * Marshal.SizeOf<IntPtr>(), Marshal.StringToCoTaskMemAnsi(module));
196+
Marshal.WriteIntPtr(arrayPtr, (i * 2 + 1) * Marshal.SizeOf<IntPtr>(), Marshal.StringToCoTaskMemAnsi(fullName));
197+
}
198+
199+
Marshal.WriteIntPtr(arrAddrPtr, arrayPtr);
200+
Marshal.WriteInt32(arrLengthPtr, arrayLength);
201+
202+
return 0;
203+
}
204+
catch
205+
{
206+
return -1;
207+
}
208+
}
180209
[UnmanagedCallersOnly(EntryPoint = "FreeCoTaskMem")]
181210
public static void FreeCoTaskMem(IntPtr ptr)
182211
{

bindings/python/TypeTreeGeneratorAPI/TypeTreeGenerator.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os
22
import platform
33
import ctypes
4-
from typing import List
4+
from typing import List, Tuple
55

66

77
class TypeTreeNodeNative(ctypes.Structure):
@@ -78,6 +78,11 @@ def init_dll():
7878
ctypes.POINTER(ctypes.POINTER(TypeTreeNodeNative)),
7979
ctypes.POINTER(ctypes.c_int),
8080
]
81+
dll.TypeTreeGenerator_getMonoBehaviorDefinitions.argtypes = [
82+
ctypes.c_void_p,
83+
ctypes.POINTER(ctypes.POINTER(ctypes.c_char_p)),
84+
ctypes.POINTER(ctypes.c_int),
85+
]
8186
dll.TypeTreeGenerator_del.argtypes = [ctypes.c_void_p]
8287
dll.FreeCoTaskMem.argtypes = [ctypes.c_void_p]
8388
DLL = dll # type: ignore
@@ -146,5 +151,20 @@ def get_nodes(self, assembly: str, fullname: str) -> List[TypeTreeNode]:
146151
DLL.FreeCoTaskMem(nodes_ptr)
147152
return nodes
148153

154+
def get_monobehavior_definitions(self) -> List[Tuple[str, str]]:
155+
names_ptr = ctypes.POINTER(ctypes.c_char_p)()
156+
names_cnt = ctypes.c_int()
157+
assert not DLL.TypeTreeGenerator_getMonoBehaviorDefinitions(
158+
self.ptr,
159+
ctypes.byref(names_ptr),
160+
ctypes.byref(names_cnt),
161+
), "failed to get module exports"
162+
names_array = ctypes.cast(
163+
names_ptr, ctypes.POINTER(ctypes.c_char_p * names_cnt.value)
164+
).contents
165+
names = [name.decode("ascii") for name in names_array]
166+
DLL.FreeCoTaskMem(names_ptr)
167+
return [(module, fullname) for module, fullname in zip(names[::2], names[1::2])]
168+
149169

150170
__all__ = ("TypeTreeGenerator", "TypeTreeNode", "TypeTreeNodeNative")

0 commit comments

Comments
 (0)