EcmaModule targetModule = factory.SignatureContext.GetTargetModule(_fieldDesc);
SignatureContext innerContext = dataBuilder.EmitFixup(factory, _fixupKind, targetModule, factory.SignatureContext);
+ if (_fixupKind == ReadyToRunFixupKind.Check_FieldOffset)
+ {
+ dataBuilder.EmitInt(_fieldDesc.Offset.AsInt);
+ }
+
dataBuilder.EmitFieldSignature(_fieldDesc, innerContext);
}
);
});
+ _checkFieldOffsetCache = new NodeCache<FieldDesc, ISymbolNode>(key =>
+ {
+ return new PrecodeHelperImport(
+ _codegenNodeFactory,
+ new FieldFixupSignature(ReadyToRunFixupKind.Check_FieldOffset, key)
+ );
+ });
+
_interfaceDispatchCells = new NodeCache<MethodAndCallSite, ISymbolNode>(cellKey =>
{
return new DelayLoadHelperMethodImport(
return _fieldOffsetCache.GetOrAdd(fieldDesc);
}
+ private NodeCache<FieldDesc, ISymbolNode> _checkFieldOffsetCache;
+
+ public ISymbolNode CheckFieldOffset(FieldDesc fieldDesc)
+ {
+ return _checkFieldOffsetCache.GetOrAdd(fieldDesc);
+ }
+
private NodeCache<TypeDesc, ISymbolNode> _fieldBaseOffsetCache;
public ISymbolNode FieldBaseOffset(TypeDesc typeDesc)
{
if (pMT.IsValueType)
{
- throw new NotImplementedException("https://github.com/dotnet/runtime/issues/32630: ENCODE_CHECK_FIELD_OFFSET: root field check import");
+ // ENCODE_CHECK_FIELD_OFFSET
+ pResult->offset = 0;
+ pResult->fieldAccessor = CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INSTANCE_WITH_BASE;
+ pResult->fieldLookup = CreateConstLookupToSymbol(_compilation.SymbolNodeFactory.CheckFieldOffset(field));
}
else
{