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 override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly) { // Sync Block dataBuilder.EmitZeroPointer(); // EEType dataBuilder.EmitPointerReloc(GetEETypeNode(factory)); // numComponents dataBuilder.EmitInt(_preInitFieldInfo.Length); int pointerSize = _preInitFieldInfo.Field.Context.Target.PointerSize; Debug.Assert(pointerSize == 8 || pointerSize == 4); if (pointerSize == 8) { // padding numComponents in 64-bit dataBuilder.EmitInt(0); } // byte contents _preInitFieldInfo.WriteData(ref dataBuilder, factory); }