Skip to content

Commit 033d8ba

Browse files
authored
Expand API functionality (#475)
1 parent 2b5fa59 commit 033d8ba

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

Cpp2IL.Core/Model/Contexts/ConcreteGenericFieldAnalysisContext.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ public class ConcreteGenericFieldAnalysisContext : FieldAnalysisContext
88
public FieldAnalysisContext BaseFieldContext { get; }
99
public override FieldAttributes DefaultAttributes => BaseFieldContext.DefaultAttributes;
1010
public override FieldAttributes? OverrideAttributes { get => BaseFieldContext.OverrideAttributes; set => BaseFieldContext.OverrideAttributes = value; }
11+
public override object? DefaultConstantValue => BaseFieldContext.DefaultConstantValue;
12+
public override object? OverrideConstantValue { get => BaseFieldContext.OverrideConstantValue; set => BaseFieldContext.OverrideConstantValue = value; }
13+
public override byte[] DefaultStaticArrayInitialValue => BaseFieldContext.DefaultStaticArrayInitialValue;
14+
public override byte[]? OverrideStaticArrayInitialValue { get => BaseFieldContext.OverrideStaticArrayInitialValue; set => BaseFieldContext.OverrideStaticArrayInitialValue = value; }
1115
public override TypeAnalysisContext DefaultFieldType { get; }
1216
public override string DefaultName => BaseFieldContext.DefaultName;
1317
public override string? OverrideName { get => BaseFieldContext.OverrideName; set => BaseFieldContext.OverrideName = value; }

Cpp2IL.Core/Model/Contexts/FieldAnalysisContext.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ public class FieldAnalysisContext : HasCustomAttributesAndName, IFieldInfoProvid
3737

3838
public bool IsStatic => (Attributes & FieldAttributes.Static) != 0;
3939

40+
public virtual object? DefaultConstantValue => BackingData?.Field.DefaultValue?.Value;
41+
42+
public virtual object? OverrideConstantValue { get; set; }
43+
44+
public object? ConstantValue => OverrideConstantValue ?? DefaultConstantValue;
45+
4046
public int Offset => BackingData == null ? 0 : AppContext.Binary.GetFieldOffsetFromIndex(DeclaringType.Definition!.TypeIndex, BackingData.IndexInParent, BackingData.Field.FieldIndex, DeclaringType.Definition.IsValueType, IsStatic);
4147

4248
public virtual TypeAnalysisContext DefaultFieldType => DeclaringType.DeclaringAssembly.ResolveIl2CppType(RawFieldType)
@@ -46,6 +52,12 @@ public class FieldAnalysisContext : HasCustomAttributesAndName, IFieldInfoProvid
4652

4753
public TypeAnalysisContext FieldType => OverrideFieldType ?? DefaultFieldType;
4854

55+
public virtual byte[] DefaultStaticArrayInitialValue => BackingData?.Field.StaticArrayInitialValue ?? [];
56+
57+
public virtual byte[]? OverrideStaticArrayInitialValue { get; set; }
58+
59+
public byte[] StaticArrayInitialValue => OverrideStaticArrayInitialValue ?? DefaultStaticArrayInitialValue;
60+
4961
public FieldAttributes Visibility
5062
{
5163
get

Cpp2IL.Core/Model/Contexts/MethodAnalysisContext.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public class MethodAnalysisContext : HasGenericParameters, IMethodInfoProvider
6262

6363
public bool IsStatic => (Attributes & MethodAttributes.Static) != 0;
6464

65+
public bool IsVirtual => (Attributes & MethodAttributes.Virtual) != 0;
66+
6567
protected override int CustomAttributeIndex => Definition?.customAttributeIndex ?? throw new("Subclasses of MethodAnalysisContext should override CustomAttributeIndex if they have custom attributes");
6668

6769
public override AssemblyAnalysisContext CustomAttributeAssembly => DeclaringType?.DeclaringAssembly ?? throw new("Subclasses of MethodAnalysisContext should override CustomAttributeAssembly if they have custom attributes");

Cpp2IL.Core/Model/Contexts/TypeAnalysisContext.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,20 @@ public virtual Il2CppTypeEnum Type
120120
}
121121
}
122122

123+
public string DefaultFullName
124+
{
125+
get
126+
{
127+
if (DeclaringType != null)
128+
return DeclaringType.DefaultFullName + "+" + DefaultName;
129+
130+
if (string.IsNullOrEmpty(DefaultNamespace))
131+
return DefaultName;
132+
133+
return $"{DefaultNamespace}.{DefaultName}";
134+
}
135+
}
136+
123137
public string FullName
124138
{
125139
get

Cpp2IL.Core/Utils/AsmResolver/AsmResolverAssemblyPopulator.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -336,16 +336,16 @@ private static void CopyFieldsInType(ReferenceImporter importer, TypeAnalysisCon
336336

337337
var managedField = new FieldDefinition(fieldContext.Name, (FieldAttributes)fieldContext.Attributes, fieldTypeSig);
338338

339-
if (fieldInfo != null)
340-
{
341-
//Field default values
342-
if (managedField.HasDefault && fieldInfo.Field.DefaultValue?.Value is { } constVal)
343-
managedField.Constant = AsmResolverConstants.GetOrCreateConstant(constVal);
339+
//Field default values
340+
if (managedField.HasDefault && fieldContext.ConstantValue is { } constVal)
341+
managedField.Constant = AsmResolverConstants.GetOrCreateConstant(constVal);
344342

345-
//Field Initial Values (used for allocation of Array Literals)
346-
if (managedField.HasFieldRva)
347-
managedField.FieldRva = new DataSegment(fieldInfo.Field.StaticArrayInitialValue);
343+
//Field Initial Values (used for allocation of Array Literals)
344+
if (managedField.HasFieldRva)
345+
managedField.FieldRva = new DataSegment(fieldContext.StaticArrayInitialValue);
348346

347+
if (fieldInfo != null)
348+
{
349349
if (ilTypeDefinition.IsExplicitLayout && !fieldContext.IsStatic)
350350
//Copy field offset
351351
managedField.FieldOffset = fieldInfo.FieldOffset;

0 commit comments

Comments
 (0)