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
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ public class ConcreteGenericFieldAnalysisContext : FieldAnalysisContext
public FieldAnalysisContext BaseFieldContext { get; }
public override FieldAttributes DefaultAttributes => BaseFieldContext.DefaultAttributes;
public override FieldAttributes? OverrideAttributes { get => BaseFieldContext.OverrideAttributes; set => BaseFieldContext.OverrideAttributes = value; }
public override object? DefaultConstantValue => BaseFieldContext.DefaultConstantValue;
public override object? OverrideConstantValue { get => BaseFieldContext.OverrideConstantValue; set => BaseFieldContext.OverrideConstantValue = value; }
public override byte[] DefaultStaticArrayInitialValue => BaseFieldContext.DefaultStaticArrayInitialValue;
public override byte[]? OverrideStaticArrayInitialValue { get => BaseFieldContext.OverrideStaticArrayInitialValue; set => BaseFieldContext.OverrideStaticArrayInitialValue = value; }
public override TypeAnalysisContext DefaultFieldType { get; }
public override string DefaultName => BaseFieldContext.DefaultName;
public override string? OverrideName { get => BaseFieldContext.OverrideName; set => BaseFieldContext.OverrideName = value; }
Expand Down
12 changes: 12 additions & 0 deletions Cpp2IL.Core/Model/Contexts/FieldAnalysisContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ public class FieldAnalysisContext : HasCustomAttributesAndName, IFieldInfoProvid

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

public virtual object? DefaultConstantValue => BackingData?.Field.DefaultValue?.Value;

public virtual object? OverrideConstantValue { get; set; }

public object? ConstantValue => OverrideConstantValue ?? DefaultConstantValue;

public int Offset => BackingData == null ? 0 : AppContext.Binary.GetFieldOffsetFromIndex(DeclaringType.Definition!.TypeIndex, BackingData.IndexInParent, BackingData.Field.FieldIndex, DeclaringType.Definition.IsValueType, IsStatic);

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

public TypeAnalysisContext FieldType => OverrideFieldType ?? DefaultFieldType;

public virtual byte[] DefaultStaticArrayInitialValue => BackingData?.Field.StaticArrayInitialValue ?? [];

public virtual byte[]? OverrideStaticArrayInitialValue { get; set; }

public byte[] StaticArrayInitialValue => OverrideStaticArrayInitialValue ?? DefaultStaticArrayInitialValue;

public FieldAttributes Visibility
{
get
Expand Down
2 changes: 2 additions & 0 deletions Cpp2IL.Core/Model/Contexts/MethodAnalysisContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ public class MethodAnalysisContext : HasGenericParameters, IMethodInfoProvider

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

public bool IsVirtual => (Attributes & MethodAttributes.Virtual) != 0;

protected override int CustomAttributeIndex => Definition?.customAttributeIndex ?? throw new("Subclasses of MethodAnalysisContext should override CustomAttributeIndex if they have custom attributes");

public override AssemblyAnalysisContext CustomAttributeAssembly => DeclaringType?.DeclaringAssembly ?? throw new("Subclasses of MethodAnalysisContext should override CustomAttributeAssembly if they have custom attributes");
Expand Down
14 changes: 14 additions & 0 deletions Cpp2IL.Core/Model/Contexts/TypeAnalysisContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,20 @@ public virtual Il2CppTypeEnum Type
}
}

public string DefaultFullName
{
get
{
if (DeclaringType != null)
return DeclaringType.DefaultFullName + "+" + DefaultName;

if (string.IsNullOrEmpty(DefaultNamespace))
return DefaultName;

return $"{DefaultNamespace}.{DefaultName}";
}
}

public string FullName
{
get
Expand Down
16 changes: 8 additions & 8 deletions Cpp2IL.Core/Utils/AsmResolver/AsmResolverAssemblyPopulator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -336,16 +336,16 @@ private static void CopyFieldsInType(ReferenceImporter importer, TypeAnalysisCon

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

if (fieldInfo != null)
{
//Field default values
if (managedField.HasDefault && fieldInfo.Field.DefaultValue?.Value is { } constVal)
managedField.Constant = AsmResolverConstants.GetOrCreateConstant(constVal);
//Field default values
if (managedField.HasDefault && fieldContext.ConstantValue is { } constVal)
managedField.Constant = AsmResolverConstants.GetOrCreateConstant(constVal);

//Field Initial Values (used for allocation of Array Literals)
if (managedField.HasFieldRva)
managedField.FieldRva = new DataSegment(fieldInfo.Field.StaticArrayInitialValue);
//Field Initial Values (used for allocation of Array Literals)
if (managedField.HasFieldRva)
managedField.FieldRva = new DataSegment(fieldContext.StaticArrayInitialValue);

if (fieldInfo != null)
{
if (ilTypeDefinition.IsExplicitLayout && !fieldContext.IsStatic)
//Copy field offset
managedField.FieldOffset = fieldInfo.FieldOffset;
Expand Down
Loading