[fix] fix the bug that not collect struct in calli and extern method signature in generating MethodBridge.

main
walon 2025-06-30 12:12:02 +08:00
parent 59a3c3974a
commit ab41cd0144
1 changed files with 33 additions and 0 deletions

View File

@ -287,6 +287,7 @@ namespace HybridCLR.Editor.MethodBridge
CollectStructDefs(_managed2NativeMethodList0, structTypeSet); CollectStructDefs(_managed2NativeMethodList0, structTypeSet);
CollectStructDefs(_native2ManagedMethodList0, structTypeSet); CollectStructDefs(_native2ManagedMethodList0, structTypeSet);
CollectStructDefs(_adjustThunkMethodList0, structTypeSet); CollectStructDefs(_adjustThunkMethodList0, structTypeSet);
CollectStructDefs(_originalCalliMethodSignatures.Select(m => m.MethodSig).ToList(), structTypeSet);
_structTypes0 = structTypeSet.ToList(); _structTypes0 = structTypeSet.ToList();
_structTypes0.Sort((a, b) => a.TypeId - b.TypeId); _structTypes0.Sort((a, b) => a.TypeId - b.TypeId);
@ -829,6 +830,38 @@ const ReversePInvokeMethodData hybridclr::interpreter::g_reversePInvokeMethodStu
} }
private void CollectStructDefs(List<MethodSig> methods, HashSet<TypeInfo> structTypes)
{
ICorLibTypes corLibTypes = _genericMethods[0].Method.Module.CorLibTypes;
foreach (var method in methods)
{
foreach (var paramInfo in method.Params)
{
var paramType = GetSharedTypeInfo(MetaUtil.ToShareTypeSig(corLibTypes, paramInfo));
if (paramType.IsStruct)
{
structTypes.Add(paramType);
if (paramType.Klass.ContainsGenericParameter)
{
throw new Exception($"[CollectStructDefs] method:{method} type:{paramType.Klass} contains generic parameter");
}
}
}
var returnType = GetSharedTypeInfo(MetaUtil.ToShareTypeSig(corLibTypes, method.RetType));
if (returnType.IsStruct)
{
structTypes.Add(returnType);
if (returnType.Klass.ContainsGenericParameter)
{
throw new Exception($"[CollectStructDefs] method:{method} type:{returnType.Klass} contains generic parameter");
}
}
}
}
class FieldInfo class FieldInfo
{ {
public FieldDef field; public FieldDef field;