private ISymbolNode GenericLookupTypeHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, object helperArgument, GenericContext methodContext) { TypeDesc typeArgument; if (helperArgument is MethodWithToken methodWithToken) { typeArgument = methodWithToken.Method.OwningType; } else if (helperArgument is FieldDesc fieldDesc) { typeArgument = fieldDesc.OwningType; } else { typeArgument = (TypeDesc)helperArgument; } GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext); return(_genericLookupHelpers.GetOrAdd(key)); }
private ISymbolNode GenericLookupMethodHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, MethodWithToken methodArgument, TypeDesc constrainedType, GenericContext methodContext, SignatureContext signatureContext) { GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument, fieldArgument: null, methodContext); ISymbolNode node; if (!_genericLookupHelpers.TryGetValue(key, out node)) { node = new DelayLoadHelperMethodImport( _codegenNodeFactory, _codegenNodeFactory.HelperImports, ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper, methodArgument, useInstantiatingStub: false, new GenericLookupSignature(runtimeLookupKind, fixupKind, constrainedType, methodArgument, fieldArgument: null, methodContext, signatureContext), signatureContext); _genericLookupHelpers.Add(key, node); } return(node); }
public GenericLookupKey(CORINFO_RUNTIME_LOOKUP_KIND lookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, MethodWithToken methodArgument, TypeDesc contextType) { LookupKind = lookupKind; FixupKind = fixupKind; TypeArgument = typeArgument; MethodArgument = methodArgument; ContextType = contextType; }
private ISymbolNode GenericLookupMethodHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, MethodWithToken methodArgument, GenericContext methodContext) { GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument, fieldArgument: null, methodContext); return(_genericLookupHelpers.GetOrAdd(key)); }
public ISymbolNode GenericLookupHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunHelperId helperId, object helperArgument, TypeDesc contextType, SignatureContext signatureContext) { switch (helperId) { case ReadyToRunHelperId.NecessaryTypeHandle: case ReadyToRunHelperId.TypeHandle: return(GenericLookupTypeHelper( runtimeLookupKind, ReadyToRunFixupKind.READYTORUN_FIXUP_TypeHandle, (TypeDesc)helperArgument, contextType, signatureContext)); case ReadyToRunHelperId.MethodHandle: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.READYTORUN_FIXUP_MethodHandle, (MethodWithToken)helperArgument, contextType, signatureContext)); case ReadyToRunHelperId.MethodEntry: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.READYTORUN_FIXUP_MethodEntry, (MethodWithToken)helperArgument, contextType, signatureContext)); case ReadyToRunHelperId.MethodDictionary: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.READYTORUN_FIXUP_MethodHandle, (MethodWithToken)helperArgument, contextType, signatureContext)); case ReadyToRunHelperId.VirtualDispatchCell: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.READYTORUN_FIXUP_VirtualEntry, (MethodWithToken)helperArgument, contextType, signatureContext)); default: throw new NotImplementedException(); } }
private ISymbolNode GenericLookupFieldHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, FieldDesc fieldArgument, GenericContext methodContext, SignatureContext signatureContext) { GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext, signatureContext); return(_genericLookupHelpers.GetOrAdd(key)); }
public GenericLookupKey( CORINFO_RUNTIME_LOOKUP_KIND lookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, MethodWithToken methodArgument, FieldDesc fieldArgument, GenericContext methodContext) { LookupKind = lookupKind; FixupKind = fixupKind; TypeArgument = typeArgument; MethodArgument = methodArgument; FieldArgument = fieldArgument; MethodContext = methodContext; }
public GenericLookupSignature( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, MethodWithToken methodArgument, GenericContext methodContext, SignatureContext signatureContext) { _runtimeLookupKind = runtimeLookupKind; _fixupKind = fixupKind; _typeArgument = typeArgument; _methodArgument = methodArgument; _methodContext = methodContext; _signatureContext = signatureContext; }
public GenericLookupSignature( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, MethodWithToken methodArgument, FieldDesc fieldArgument, GenericContext methodContext) { Debug.Assert(typeArgument != null || methodArgument != null || fieldArgument != null); _runtimeLookupKind = runtimeLookupKind; _fixupKind = fixupKind; _typeArgument = typeArgument; _methodArgument = methodArgument; _fieldArgument = fieldArgument; _methodContext = methodContext; }
private ISymbolNode GenericLookupTypeHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, TypeDesc contextType, SignatureContext signatureContext) { GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, contextType); ISymbolNode node; if (!_genericLookupHelpers.TryGetValue(key, out node)) { node = new DelayLoadHelperImport( _codegenNodeFactory, _codegenNodeFactory.HelperImports, ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper, new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, contextType, signatureContext)); _genericLookupHelpers.Add(key, node); } return(node); }
private ISymbolNode GenericLookupFieldHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, FieldDesc fieldArgument, GenericContext methodContext, SignatureContext signatureContext) { GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext); ISymbolNode node; if (!_genericLookupHelpers.TryGetValue(key, out node)) { node = new DelayLoadHelperImport( _codegenNodeFactory, _codegenNodeFactory.HelperImports, ILCompiler.ReadyToRunHelper.DelayLoad_Helper, new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext, signatureContext)); _genericLookupHelpers.Add(key, node); } return(node); }
private ISymbolNode GenericLookupTypeHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, object helperArgument, GenericContext methodContext, SignatureContext signatureContext) { TypeDesc typeArgument; if (helperArgument is MethodWithToken methodWithToken) { typeArgument = methodWithToken.Method.OwningType; } else if (helperArgument is FieldDesc fieldDesc) { typeArgument = fieldDesc.OwningType; } else { typeArgument = (TypeDesc)helperArgument; } GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext); ISymbolNode node; if (!_genericLookupHelpers.TryGetValue(key, out node)) { node = new DelayLoadHelperImport( _codegenNodeFactory, _codegenNodeFactory.HelperImports, ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper, new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext, signatureContext)); _genericLookupHelpers.Add(key, node); } return(node); }
public GenericLookupSignature( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunFixupKind fixupKind, TypeDesc typeArgument, MethodWithToken methodArgument, FieldDesc fieldArgument, GenericContext methodContext, SignatureContext signatureContext) { Debug.Assert(typeArgument != null || methodArgument != null || fieldArgument != null); _runtimeLookupKind = runtimeLookupKind; _fixupKind = fixupKind; _typeArgument = typeArgument; _methodArgument = methodArgument; _fieldArgument = fieldArgument; _methodContext = methodContext; _signatureContext = signatureContext; // Ensure types in signature are loadable and resolvable, otherwise we'll fail later while emitting the signature if (typeArgument != null) { signatureContext.Resolver.CompilerContext.EnsureLoadableType(typeArgument); } if (fieldArgument != null) { signatureContext.Resolver.CompilerContext.EnsureLoadableType(fieldArgument.OwningType); } if (methodArgument != null) { signatureContext.Resolver.CompilerContext.EnsureLoadableMethod(methodArgument.Method); if (methodArgument.ConstrainedType != null) { signatureContext.Resolver.CompilerContext.EnsureLoadableType(methodArgument.ConstrainedType); } } }
public ISymbolNode GenericLookupHelper( CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunHelperId helperId, object helperArgument, GenericContext methodContext) { switch (helperId) { case ReadyToRunHelperId.TypeHandle: return(GenericLookupTypeHelper( runtimeLookupKind, ReadyToRunFixupKind.TypeHandle, helperArgument, methodContext)); case ReadyToRunHelperId.MethodHandle: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.MethodHandle, (MethodWithToken)helperArgument, methodContext)); case ReadyToRunHelperId.MethodEntry: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.MethodEntry, (MethodWithToken)helperArgument, methodContext)); case ReadyToRunHelperId.MethodDictionary: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.MethodHandle, (MethodWithToken)helperArgument, methodContext)); case ReadyToRunHelperId.TypeDictionary: return(GenericLookupTypeHelper( runtimeLookupKind, ReadyToRunFixupKind.TypeDictionary, (TypeDesc)helperArgument, methodContext)); case ReadyToRunHelperId.VirtualDispatchCell: return(GenericLookupMethodHelper( runtimeLookupKind, ReadyToRunFixupKind.VirtualEntry, (MethodWithToken)helperArgument, methodContext)); case ReadyToRunHelperId.FieldHandle: return(GenericLookupFieldHelper( runtimeLookupKind, ReadyToRunFixupKind.FieldHandle, (FieldDesc)helperArgument, methodContext)); default: throw new NotImplementedException(helperId.ToString()); } }
private ISymbolNode GetGenericLookupHelper(CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind, ReadyToRunHelperId helperId, object helperArgument) { if (runtimeLookupKind == CORINFO_RUNTIME_LOOKUP_KIND.CORINFO_LOOKUP_THISOBJ || runtimeLookupKind == CORINFO_RUNTIME_LOOKUP_KIND.CORINFO_LOOKUP_CLASSPARAM) { return _compilation.NodeFactory.ReadyToRunHelperFromTypeLookup(helperId, helperArgument, MethodBeingCompiled.OwningType); } Debug.Assert(runtimeLookupKind == CORINFO_RUNTIME_LOOKUP_KIND.CORINFO_LOOKUP_METHODPARAM); return _compilation.NodeFactory.ReadyToRunHelperFromDictionaryLookup(helperId, helperArgument, MethodBeingCompiled); }