public NonGCStaticsNode(MetadataType type, NodeFactory factory) { Debug.Assert(!type.IsCanonicalSubtype(CanonicalFormKind.Specific)); _type = type; _factory = factory; var preInitFieldInfos = PreInitFieldInfo.GetPreInitFieldInfos(_type, hasGCStaticBase: false); if (preInitFieldInfos != null) { _sortedPreInitFields = new List <PreInitFieldInfo>(preInitFieldInfos); _sortedPreInitFields.Sort(PreInitFieldInfo.FieldDescCompare); } }
public static ObjectData GetDataForPreInitDataField( ISymbolDefinitionNode node, MetadataType _type, List <PreInitFieldInfo> sortedPreInitFields, int startOffset, NodeFactory factory, bool relocsOnly = false) { ObjectDataBuilder builder = new ObjectDataBuilder(factory, relocsOnly); builder.RequireInitialAlignment(_type.GCStaticFieldAlignment.AsInt); int staticOffset = startOffset; int staticOffsetEnd = _type.GCStaticFieldSize.AsInt; int idx = 0; while (staticOffset < staticOffsetEnd) { PreInitFieldInfo fieldInfo = idx < sortedPreInitFields.Count ? sortedPreInitFields[idx] : null; int writeTo = staticOffsetEnd; if (fieldInfo != null) { writeTo = fieldInfo.Field.Offset.AsInt; } // Emit the zero before the next preinitField builder.EmitZeros(writeTo - staticOffset); staticOffset = writeTo; if (fieldInfo != null) { int count = builder.CountBytes; if (fieldInfo.Field.FieldType.IsValueType) { // Emit inlined data for value types fieldInfo.WriteData(ref builder, factory); } else { // Emit a pointer reloc to the frozen data for reference types builder.EmitPointerReloc(factory.SerializedFrozenArray(fieldInfo)); } staticOffset += builder.CountBytes - count; idx++; } } builder.AddSymbol(node); return(builder.ToObjectData()); }
public FrozenArrayNode SerializedFrozenArray(PreInitFieldInfo preInitFieldInfo) { return(_frozenArrayNodes.GetOrAdd(preInitFieldInfo)); }
static int FieldDescCompare(PreInitFieldInfo fieldInfo1, PreInitFieldInfo fieldInfo2) { return(fieldInfo1.Field.Offset.AsInt - fieldInfo2.Field.Offset.AsInt); }
public GCStaticsNode(MetadataType type) { Debug.Assert(!type.IsCanonicalSubtype(CanonicalFormKind.Specific)); _type = type; _preInitFieldInfos = PreInitFieldInfo.GetPreInitFieldInfos(_type, hasGCStaticBase: true); }
public FrozenArrayNode(PreInitFieldInfo preInitFieldInfo) { _preInitFieldInfo = preInitFieldInfo; }