Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion Cpp2IL.Core/Model/Contexts/ApplicationAnalysisContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ public class ApplicationAnalysisContext : ContextWithDataStorage
/// </summary>
public bool HasFinishedInitializing { get; private set; }

private readonly Dictionary<Il2CppImageDefinition, AssemblyAnalysisContext> AssembliesByImageDefinition = new();

public ApplicationAnalysisContext(Il2CppBinary binary, Il2CppMetadata metadata)
{
Binary = binary;
Expand All @@ -100,6 +102,7 @@ public ApplicationAnalysisContext(Il2CppBinary binary, Il2CppMetadata metadata)
var aac = new AssemblyAnalysisContext(assemblyDefinition, this);
Assemblies.Add(aac);
AssembliesByName[assemblyDefinition.AssemblyName.Name] = aac;
AssembliesByImageDefinition[assemblyDefinition.Image] = aac;
}

SystemTypes = new(this);
Expand Down Expand Up @@ -170,10 +173,22 @@ private void PopulateMethodsByAddressTable()
return AssembliesByName[name];
}

public AssemblyAnalysisContext? ResolveContextForAssembly(Il2CppImageDefinition? imageDefinition)
{
return imageDefinition is not null
? AssembliesByImageDefinition[imageDefinition]
: null;
}

public AssemblyAnalysisContext? ResolveContextForAssembly(Il2CppAssemblyDefinition? assemblyDefinition)
{
return ResolveContextForAssembly(assemblyDefinition?.Image);
}

public TypeAnalysisContext? ResolveContextForType(Il2CppTypeDefinition? typeDefinition)
{
return typeDefinition is not null
? GetAssemblyByName(typeDefinition.DeclaringAssembly!.Name!)?.GetTypeByDefinition(typeDefinition)
? AssembliesByImageDefinition[typeDefinition.DeclaringAssembly!].GetTypeByDefinition(typeDefinition)
: null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ private ConcreteGenericMethodAnalysisContext(Cpp2IlMethodRef? methodRef, MethodA

private static AssemblyAnalysisContext ResolveDeclaringAssembly(Cpp2IlMethodRef methodRef, ApplicationAnalysisContext context)
{
return context.GetAssemblyByName(methodRef.DeclaringType.DeclaringAssembly!.Name!)
?? throw new($"Unable to resolve declaring assembly {methodRef.DeclaringType.DeclaringAssembly.Name} for generic method {methodRef}");
return context.ResolveContextForAssembly(methodRef.DeclaringType.DeclaringAssembly)
?? throw new($"Unable to resolve declaring assembly {methodRef.DeclaringType.DeclaringAssembly?.Name} for generic method {methodRef}");
}

private static TypeAnalysisContext ResolveDeclaringType(Cpp2IlMethodRef methodRef, AssemblyAnalysisContext declaringAssembly)
Expand Down
Loading