Skip to content

Commit 813a4d4

Browse files
authored
Merge 6b11b9d into e58a29a
2 parents e58a29a + 6b11b9d commit 813a4d4

File tree

1 file changed

+85
-25
lines changed

1 file changed

+85
-25
lines changed
Lines changed: 85 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,114 @@
11
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
34
using System.Linq;
45
using dnlib.DotNet;
56

67
namespace Confuser.Core {
78
internal sealed class ConfuserAssemblyResolver : IAssemblyResolver {
8-
AssemblyResolver InternalResolver { get; }
9+
internal AssemblyResolver InternalFuzzyResolver { get; } = new AssemblyResolver { FindExactMatch = false };
10+
internal AssemblyResolver InternalExactResolver { get; } = new AssemblyResolver { FindExactMatch = true };
911

1012
public bool EnableTypeDefCache {
11-
get => InternalResolver.EnableTypeDefCache;
12-
set => InternalResolver.EnableTypeDefCache = value;
13+
get => InternalFuzzyResolver.EnableTypeDefCache;
14+
set {
15+
InternalFuzzyResolver.EnableTypeDefCache = value;
16+
InternalExactResolver.EnableTypeDefCache = value;
17+
}
1318
}
1419

1520
public ModuleContext DefaultModuleContext {
16-
get => InternalResolver.DefaultModuleContext;
17-
set => InternalResolver.DefaultModuleContext = value;
21+
get => InternalFuzzyResolver.DefaultModuleContext;
22+
set {
23+
InternalFuzzyResolver.DefaultModuleContext = value;
24+
InternalExactResolver.DefaultModuleContext = value;
25+
}
1826
}
1927

20-
public IList<string> PostSearchPaths => InternalResolver.PostSearchPaths;
21-
22-
internal ConfuserAssemblyResolver() =>
23-
InternalResolver = new AssemblyResolver();
28+
public IList<string> PostSearchPaths => new TeeList(InternalFuzzyResolver.PostSearchPaths, InternalExactResolver.PostSearchPaths);
29+
public IList<string> PreSearchPaths => new TeeList(InternalFuzzyResolver.PreSearchPaths, InternalExactResolver.PreSearchPaths);
2430

2531
/// <inheritdoc />
2632
public AssemblyDef Resolve(IAssembly assembly, ModuleDef sourceModule) {
2733
if (assembly is AssemblyDef assemblyDef)
2834
return assemblyDef;
2935

30-
var cachedAssemblyDef = InternalResolver
31-
.GetCachedAssemblies()
32-
.FirstOrDefault(a => AssemblyNameComparer.NameAndPublicKeyTokenOnly.Equals(a, assembly));
33-
if (!(cachedAssemblyDef is null))
34-
return cachedAssemblyDef;
36+
var resolvedAssemblyDef = InternalExactResolver.Resolve(assembly, sourceModule);
37+
return resolvedAssemblyDef ?? InternalFuzzyResolver.Resolve(assembly, sourceModule);
38+
}
39+
40+
public void Clear() {
41+
InternalExactResolver.Clear();
42+
InternalFuzzyResolver.Clear();
43+
}
44+
45+
public IEnumerable<AssemblyDef> GetCachedAssemblies() =>
46+
InternalExactResolver.GetCachedAssemblies().Concat(InternalFuzzyResolver.GetCachedAssemblies());
47+
48+
public void AddToCache(ModuleDefMD modDef) {
49+
InternalExactResolver.AddToCache(modDef);
50+
InternalFuzzyResolver.AddToCache(modDef);
51+
}
52+
53+
private sealed class TeeList : IList<string> {
54+
private readonly IList<IList<string>> _lists;
55+
56+
internal TeeList(params IList<string>[] lists) => _lists = lists;
57+
58+
/// <inheritdoc />
59+
public IEnumerator<string> GetEnumerator() => _lists[0].GetEnumerator();
3560

36-
AssemblyDef resolvedAssemblyDef = null;
37-
try {
38-
InternalResolver.FindExactMatch = true;
39-
resolvedAssemblyDef = InternalResolver.Resolve(assembly, sourceModule);
61+
/// <inheritdoc />
62+
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
63+
64+
/// <inheritdoc />
65+
public void Add(string item) {
66+
foreach (var list in _lists)
67+
list.Add(item);
4068
}
41-
finally {
42-
InternalResolver.FindExactMatch = false;
69+
70+
/// <inheritdoc />
71+
public void Clear() {
72+
foreach (var list in _lists)
73+
list.Clear();
4374
}
4475

45-
return resolvedAssemblyDef ?? InternalResolver.Resolve(assembly, sourceModule);
46-
}
76+
/// <inheritdoc />
77+
public bool Contains(string item) => _lists[0].Contains(item);
78+
79+
/// <inheritdoc />
80+
public void CopyTo(string[] array, int arrayIndex) => _lists[0].CopyTo(array, arrayIndex);
81+
82+
/// <inheritdoc />
83+
public bool Remove(string item) =>
84+
_lists.Aggregate(true, (current, list) => current | list.Remove(item));
85+
86+
/// <inheritdoc />
87+
public int Count => _lists[0].Count;
4788

48-
public void Clear() => InternalResolver.Clear();
89+
/// <inheritdoc />
90+
public bool IsReadOnly => _lists[0].IsReadOnly;
4991

50-
public IEnumerable<AssemblyDef> GetCachedAssemblies() => InternalResolver.GetCachedAssemblies();
92+
/// <inheritdoc />
93+
public int IndexOf(string item) => _lists[0].IndexOf(item);
5194

52-
public void AddToCache(ModuleDefMD modDef) => InternalResolver.AddToCache(modDef);
95+
/// <inheritdoc />
96+
public void Insert(int index, string item) {
97+
foreach (var list in _lists)
98+
list.Insert(index, item);
99+
}
100+
101+
/// <inheritdoc />
102+
public void RemoveAt(int index) {
103+
foreach (var list in _lists)
104+
list.RemoveAt(index);
105+
}
106+
107+
/// <inheritdoc />
108+
public string this[int index] {
109+
get => _lists[0][index];
110+
set => _lists[0][index] = value;
111+
}
112+
}
53113
}
54114
}

0 commit comments

Comments
 (0)