Skip to content

Commit 6eaa22d

Browse files
committed
Core: Fix more test failures
1 parent c91170a commit 6eaa22d

File tree

1 file changed

+38
-28
lines changed

1 file changed

+38
-28
lines changed

Cpp2IL.Core/Model/Contexts/HasCustomAttributes.cs

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public abstract class HasCustomAttributes(uint token, ApplicationAnalysisContext
6464

6565
public abstract string CustomAttributeOwnerName { get; }
6666

67+
/// <summary>
68+
/// Pre-v29, stores the index of the custom attribute range for this member. Post-v29, always 0.
69+
/// </summary>
70+
private int Pre29RangeIndex;
71+
6772
public bool IsCompilerGeneratedBasedOnCustomAttributes =>
6873
CustomAttributes?.Any(a => a.Constructor.DeclaringType!.FullName.Contains("CompilerGeneratedAttribute"))
6974
?? AttributeTypes?.Any(t => t.Type == Il2CppTypeEnum.IL2CPP_TYPE_CLASS && t.AsClass().FullName!.Contains("CompilerGeneratedAttribute"))
@@ -88,7 +93,7 @@ protected void InitCustomAttributeData()
8893
return;
8994
}
9095

91-
AttributeTypeRange = AppContext.Metadata.GetCustomAttributeData(CustomAttributeAssembly.Definition.Image, CustomAttributeIndex, Token, out var rangeIndex);
96+
AttributeTypeRange = AppContext.Metadata.GetCustomAttributeData(CustomAttributeAssembly.Definition.Image, CustomAttributeIndex, Token, out Pre29RangeIndex);
9297

9398
if (AttributeTypeRange == null || AttributeTypeRange.count == 0)
9499
{
@@ -101,7 +106,35 @@ protected void InitCustomAttributeData()
101106
.Select(attrIdx => AppContext.Metadata!.attributeTypes![attrIdx]) //Not null because we've checked we're not on v29
102107
.Select(typeIdx => AppContext.Binary!.GetType(typeIdx))
103108
.ToList();
109+
}
110+
111+
private (long blobStart, long blobEnd)? GetV29BlobOffsets()
112+
{
113+
var target = new Il2CppCustomAttributeDataRange() { token = Token };
114+
var caIndex = AppContext.Metadata.AttributeDataRanges.BinarySearch
115+
(
116+
CustomAttributeAssembly.Definition.Image.customAttributeStart,
117+
(int)CustomAttributeAssembly.Definition.Image.customAttributeCount,
118+
target,
119+
new TokenComparer()
120+
);
121+
122+
if (caIndex < 0)
123+
{
124+
RawIl2CppCustomAttributeData = Array.Empty<byte>();
125+
return null;
126+
}
127+
128+
var attributeDataRange = AppContext.Metadata.AttributeDataRanges[caIndex];
129+
var next = AppContext.Metadata.AttributeDataRanges[caIndex + 1];
130+
131+
var blobStart = AppContext.Metadata.metadataHeader.attributeDataOffset + attributeDataRange.startOffset;
132+
var blobEnd = AppContext.Metadata.metadataHeader.attributeDataOffset + next.startOffset;
133+
return (blobStart, blobEnd);
134+
}
104135

136+
private void InitPre29AttributeGeneratorAnalysis(int rangeIndex)
137+
{
105138
ulong generatorPtr;
106139
if (AppContext.MetadataVersion < 27)
107140
try
@@ -112,7 +145,7 @@ protected void InitCustomAttributeData()
112145
{
113146
Logger.WarnNewline("Custom attribute generator out of range for " + this, "CA Restore");
114147
RawIl2CppCustomAttributeData = Array.Empty<byte>();
115-
return; //Bail out
148+
return;
116149
}
117150
else
118151
{
@@ -126,38 +159,13 @@ protected void InitCustomAttributeData()
126159
{
127160
Logger.WarnNewline($"Supposedly had custom attributes ({string.Join(", ", AttributeTypes)}), but generator was null for " + this, "CA Restore");
128161
RawIl2CppCustomAttributeData = Memory<byte>.Empty;
129-
return; //Possibly no attributes with params?
162+
return;
130163
}
131164

132165
CaCacheGeneratorAnalysis = new(generatorPtr, AppContext, this);
133166
RawIl2CppCustomAttributeData = CaCacheGeneratorAnalysis.RawBytes;
134167
}
135168

136-
private (long blobStart, long blobEnd)? GetV29BlobOffsets()
137-
{
138-
var target = new Il2CppCustomAttributeDataRange() { token = Token };
139-
var caIndex = AppContext.Metadata.AttributeDataRanges.BinarySearch
140-
(
141-
CustomAttributeAssembly.Definition.Image.customAttributeStart,
142-
(int)CustomAttributeAssembly.Definition.Image.customAttributeCount,
143-
target,
144-
new TokenComparer()
145-
);
146-
147-
if (caIndex < 0)
148-
{
149-
RawIl2CppCustomAttributeData = Array.Empty<byte>();
150-
return null;
151-
}
152-
153-
var attributeDataRange = AppContext.Metadata.AttributeDataRanges[caIndex];
154-
var next = AppContext.Metadata.AttributeDataRanges[caIndex + 1];
155-
156-
var blobStart = AppContext.Metadata.metadataHeader.attributeDataOffset + attributeDataRange.startOffset;
157-
var blobEnd = AppContext.Metadata.metadataHeader.attributeDataOffset + next.startOffset;
158-
return (blobStart, blobEnd);
159-
}
160-
161169
/// <summary>
162170
/// Attempt to parse the Il2CppCustomAttributeData blob into custom attributes.
163171
/// </summary>
@@ -175,6 +183,8 @@ public void AnalyzeCustomAttributeData(bool allowAnalysis = true)
175183
AnalyzeCustomAttributeDataV29();
176184
return;
177185
}
186+
187+
InitPre29AttributeGeneratorAnalysis(Pre29RangeIndex);
178188

179189
if (RawIl2CppCustomAttributeData.Length == 0)
180190
return;

0 commit comments

Comments
 (0)