[fix] 修复计算桥接函数未考虑到泛型类的成员函数中可能包含Native2Manager调用
parent
52bab856ed
commit
679c21da43
|
@ -93,6 +93,8 @@ namespace HybridCLR.Editor.Meta
|
||||||
case ElementType.SZArray: return corTypes.Object;
|
case ElementType.SZArray: return corTypes.Object;
|
||||||
case ElementType.Array: return corTypes.Object;
|
case ElementType.Array: return corTypes.Object;
|
||||||
case ElementType.ValueType: return typeSig;
|
case ElementType.ValueType: return typeSig;
|
||||||
|
case ElementType.Var:
|
||||||
|
case ElementType.MVar:
|
||||||
case ElementType.Class: return corTypes.Object;
|
case ElementType.Class: return corTypes.Object;
|
||||||
case ElementType.GenericInst:
|
case ElementType.GenericInst:
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,15 +22,6 @@ namespace HybridCLR.Editor.Meta
|
||||||
|
|
||||||
public void WalkMethod(MethodDef method, List<TypeSig> klassGenericInst, List<TypeSig> methodGenericInst)
|
public void WalkMethod(MethodDef method, List<TypeSig> klassGenericInst, List<TypeSig> methodGenericInst)
|
||||||
{
|
{
|
||||||
if (klassGenericInst != null || methodGenericInst != null)
|
|
||||||
{
|
|
||||||
//var typeSig = klassGenericInst != null ? new GenericInstSig(method.DeclaringType.ToTypeSig().ToClassOrValueTypeSig(), klassGenericInst) : method.DeclaringType?.ToTypeSig();
|
|
||||||
//Debug.Log($"== walk generic method {typeSig}::{method.Name} {method.MethodSig}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Debug.Log($"== walk not geneeric method:{method}");
|
|
||||||
}
|
|
||||||
var ctx = new GenericArgumentContext(klassGenericInst, methodGenericInst);
|
var ctx = new GenericArgumentContext(klassGenericInst, methodGenericInst);
|
||||||
|
|
||||||
if (_methodEffectInsts.TryGetValue(method, out var effectInsts))
|
if (_methodEffectInsts.TryGetValue(method, out var effectInsts))
|
||||||
|
|
|
@ -149,23 +149,16 @@ namespace HybridCLR.Editor.MethodBridge
|
||||||
for (uint rid = 1, n = ass.Metadata.TablesStream.TypeSpecTable.Rows; rid <= n; rid++)
|
for (uint rid = 1, n = ass.Metadata.TablesStream.TypeSpecTable.Rows; rid <= n; rid++)
|
||||||
{
|
{
|
||||||
var ts = ass.ResolveTypeSpec(rid);
|
var ts = ass.ResolveTypeSpec(rid);
|
||||||
if (!ts.ContainsGenericParameter)
|
|
||||||
{
|
|
||||||
var cs = GenericClass.ResolveClass(ts, null)?.ToGenericShare();
|
var cs = GenericClass.ResolveClass(ts, null)?.ToGenericShare();
|
||||||
if (cs != null)
|
if (cs != null)
|
||||||
{
|
{
|
||||||
TryAddAndWalkGenericType(cs);
|
TryAddAndWalkGenericType(cs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (uint rid = 1, n = ass.Metadata.TablesStream.MethodSpecTable.Rows; rid <= n; rid++)
|
for (uint rid = 1, n = ass.Metadata.TablesStream.MethodSpecTable.Rows; rid <= n; rid++)
|
||||||
{
|
{
|
||||||
var ms = ass.ResolveMethodSpec(rid);
|
var ms = ass.ResolveMethodSpec(rid);
|
||||||
if(ms.DeclaringType.ContainsGenericParameter || ms.GenericInstMethodSig.ContainsGenericParameter)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var gm = GenericMethod.ResolveMethod(ms, null)?.ToGenericShare();
|
var gm = GenericMethod.ResolveMethod(ms, null)?.ToGenericShare();
|
||||||
if (gm == null)
|
if (gm == null)
|
||||||
{
|
{
|
||||||
|
@ -176,10 +169,6 @@ namespace HybridCLR.Editor.MethodBridge
|
||||||
{
|
{
|
||||||
_newMethods.Add(gm);
|
_newMethods.Add(gm);
|
||||||
}
|
}
|
||||||
//if (gm.KlassInst != null)
|
|
||||||
//{
|
|
||||||
// TryAddAndWalkGenericType(new GenericClass(gm.Method.DeclaringType, gm.KlassInst));
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Debug.Log($"PostPrepare allMethods:{_notGenericMethods.Count} newMethods:{_newMethods.Count}");
|
Debug.Log($"PostPrepare allMethods:{_notGenericMethods.Count} newMethods:{_newMethods.Count}");
|
||||||
|
|
Loading…
Reference in New Issue