Skip to content

Commit d9048e9

Browse files
ds5678gompoc
authored andcommitted
* Reduce allocations
* Ensure correct return type * Ensure correct declaring type * Improve output in call analysis
1 parent 11c3cce commit d9048e9

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

Cpp2IL.Core/Model/Contexts/ConcreteGenericMethodAnalysisContext.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,25 @@ private ConcreteGenericMethodAnalysisContext(Cpp2IlMethodRef methodRef, Assembly
3535
DeclaringAsm = declaringAssembly;
3636
BaseMethodContext = ResolveBaseMethod(methodRef, declaringAssembly.GetTypeByDefinition(methodRef.DeclaringType)!);
3737

38+
var genericTypeParameters = ResolveTypeArray(methodRef.TypeGenericParams, declaringAssembly);
39+
var genericMethodParameters = ResolveTypeArray(methodRef.MethodGenericParams, declaringAssembly);
40+
3841
for (var i = 0; i < BaseMethodContext.Parameters.Count; i++)
3942
{
4043
var parameter = BaseMethodContext.Parameters[i];
4144
var parameterType = parameter.ParameterTypeContext;
4245
var instantiatedType = GenericInstantiation.Instantiate(
4346
parameter.ParameterTypeContext,
44-
ResolveTypeArray(methodRef.TypeGenericParams, declaringAssembly),
45-
ResolveTypeArray(methodRef.MethodGenericParams, declaringAssembly));
47+
genericTypeParameters,
48+
genericMethodParameters);
4649

4750
Parameters.Add(parameterType == instantiatedType
4851
? parameter
4952
: new InjectedParameterAnalysisContext(parameter.Name, instantiatedType, i, BaseMethodContext));
5053
}
5154

55+
InjectedReturnType = GenericInstantiation.Instantiate(BaseMethodContext.ReturnTypeContext, genericTypeParameters, genericMethodParameters);
56+
5257
if (UnderlyingPointer != 0)
5358
rawMethodBody = AppContext.InstructionSet.GetRawBytesForMethod(this, false);
5459
}
@@ -64,13 +69,19 @@ private static TypeAnalysisContext ResolveDeclaringType(Cpp2IlMethodRef methodRe
6469
var baseType = declaringAssembly.AppContext.ResolveContextForType(methodRef.DeclaringType)
6570
?? throw new($"Unable to resolve declaring type {methodRef.DeclaringType.FullName} for generic method {methodRef}");
6671

72+
if (methodRef.TypeGenericParams.Length == 0)
73+
return baseType;
74+
6775
var genericParams = ResolveTypeArray(methodRef.TypeGenericParams, declaringAssembly);
6876

6977
return new GenericInstanceTypeAnalysisContext(baseType, genericParams, declaringAssembly);
7078
}
7179

7280
private static TypeAnalysisContext[] ResolveTypeArray(Il2CppTypeReflectionData[] array, AssemblyAnalysisContext declaringAssembly)
7381
{
82+
if (array.Length == 0)
83+
return [];
84+
7485
var ret = new TypeAnalysisContext[array.Length];
7586
for (var i = 0; i < array.Length; i++)
7687
{

Cpp2IL.Core/ProcessingLayers/CallAnalysisProcessingLayer.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,8 @@ private static void AddAttribute((InjectedMethodAnalysisContext, InjectedFieldAn
195195

196196
var memberField = (callsAttributeInfo.Item2[1], targetMethod.Name);
197197

198-
var concreteMethod = targetMethod as ConcreteGenericMethodAnalysisContext;
199-
200198
(FieldAnalysisContext, object)? typeParametersField;
201-
if (concreteMethod is not null)
199+
if (targetMethod is ConcreteGenericMethodAnalysisContext concreteMethod)
202200
{
203201
if (concreteMethod.MethodRef.MethodGenericParams.Length > 0)
204202
{
@@ -269,10 +267,6 @@ private static void AddAttribute((InjectedMethodAnalysisContext, InjectedFieldAn
269267
{
270268
returnType = targetMethod.InjectedReturnType;
271269
}
272-
else if (concreteMethod is { BaseMethodContext: { Definition: not null } or { InjectedReturnType: not null } })
273-
{
274-
returnType = concreteMethod.BaseMethodContext.ReturnTypeContext;
275-
}
276270
else if (targetMethod.Definition is null)
277271
{
278272
returnType = null;

0 commit comments

Comments
 (0)