未验证 提交 a8e4a4cf 编写于 作者: F Filip Navara 提交者: GitHub

[NativeAOT] Ensure that frozen objects respect the minimum object size (#76031)

* Ensure that frozen objects respect the minimum object size

* Handle FrozenStringNode too
上级 93cfa75b
......@@ -128,7 +128,10 @@ public override ObjectNodeSection Section
}
}
public int MinimumObjectSize => _type.Context.Target.PointerSize * 3;
public int MinimumObjectSize => GetMinimumObjectSize(_type.Context);
public static int GetMinimumObjectSize(TypeSystemContext typeSystemContext)
=> typeSystemContext.Target.PointerSize * 3;
protected virtual bool EmitVirtualSlotsAndInterfaces => false;
......
......@@ -48,11 +48,20 @@ int ISymbolDefinitionNode.Offset
public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly)
{
int initialOffset = dataBuilder.CountBytes;
// Sync Block
dataBuilder.EmitZeroPointer();
// byte contents
_data.WriteContent(ref dataBuilder, this, factory);
int objectSize = dataBuilder.CountBytes - initialOffset;
int minimumObjectSize = EETypeNode.GetMinimumObjectSize(factory.TypeSystemContext);
if (objectSize < minimumObjectSize)
{
dataBuilder.EmitZeros(minimumObjectSize - objectSize);
}
}
protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);
......
......@@ -59,6 +59,8 @@ private static IEETypeNode GetEETypeNode(NodeFactory factory)
public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly)
{
int initialOffset = dataBuilder.CountBytes;
dataBuilder.EmitZeroPointer(); // Sync block
dataBuilder.EmitPointerReloc(GetEETypeNode(factory));
......@@ -73,6 +75,12 @@ public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory f
// Null-terminate for friendliness with interop
dataBuilder.EmitShort(0);
int objectSize = dataBuilder.CountBytes - initialOffset;
int minimumObjectSize = EETypeNode.GetMinimumObjectSize(factory.TypeSystemContext);
if (objectSize < minimumObjectSize)
{
dataBuilder.EmitZeros(minimumObjectSize - objectSize);
}
}
protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册