Compiler\BodySubstitutionParser.cs (9)
22private readonly Dictionary<MethodDesc, BodySubstitution> _methodSubstitutions;
29_methodSubstitutions = new Dictionary<MethodDesc, BodySubstitution>();
36_methodSubstitutions = new Dictionary<MethodDesc, BodySubstitution>();
61MethodDesc method = FindMethod(type, signature);
157private static MethodDesc FindMethod(TypeDesc type, string signature)
159foreach (MethodDesc meth in type.GetMethods())
228private Dictionary<MethodDesc, BodySubstitution> _bodySubstitutions;
231public IReadOnlyDictionary<MethodDesc, BodySubstitution> BodySubstitutions => _bodySubstitutions;
234public BodyAndFieldSubstitutions(Dictionary<MethodDesc, BodySubstitution> bodySubstitutions, Dictionary<FieldDesc, object> fieldSubstitutions)
Compiler\Compilation.cs (40)
79public virtual MethodIL GetMethodIL(MethodDesc method)
92public void DetectGenericCycles(MethodDesc caller, MethodDesc callee)
102public bool CanInline(MethodDesc caller, MethodDesc callee)
117public DelegateCreationInfo GetDelegateCtor(TypeDesc delegateType, MethodDesc target, TypeDesc constrainedType, bool followVirtualDispatch)
127MethodDesc originalTarget = target;
128MethodDesc targetDefinition = target.GetMethodDefinition();
174public MethodDesc ExpandIntrinsicForCallsite(MethodDesc intrinsicMethod, MethodDesc callsiteMethod)
240public bool IsEffectivelySealed(MethodDesc method)
245public MethodDesc ResolveVirtualMethod(MethodDesc declMethod, TypeDesc implType, out CORINFO_DEVIRTUALIZATION_DETAIL devirtualizationDetail)
266return ((MethodDesc)targetOfLookup).IsRuntimeDeterminedExactMethod;
302public static MethodDesc GetConstructorForCreateInstanceIntrinsic(TypeDesc type)
304MethodDesc ctor = type.GetDefaultConstructor();
355return NodeFactory.MethodGenericDictionary((MethodDesc)targetOfLookup);
357return NodeFactory.FatFunctionPointer((MethodDesc)targetOfLookup);
359return NodeFactory.RuntimeMethodHandle((MethodDesc)targetOfLookup);
365MethodDesc ctor = GetConstructorForCreateInstanceIntrinsic(type);
379public GenericDictionaryLookup ComputeGenericLookup(MethodDesc contextMethod, ReadyToRunHelperId lookupKind, object targetOfLookup)
457public bool IsFatPointerCandidate(MethodDesc containingMethod, MethodSignature signature)
480public MethodDesc GetTargetOfGenericVirtualMethodCall(MethodDesc calledMethod)
488MethodDesc targetMethod = calledMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
489MethodDesc targetMethodDefinition = targetMethod.GetMethodDefinition();
491MethodDesc slotNormalizedMethodDefinition = MetadataVirtualMethodAlgorithm.FindSlotDefiningMethodForVirtualMethod(targetMethodDefinition);
508MethodDesc runtimeDeterminedSlotNormalizedMethod;
560private sealed class ILCache : LockFreeReaderHashtable<MethodDesc, ILCache.MethodILData>
569protected override int GetKeyHashCode(MethodDesc key)
577protected override bool CompareKeyToValue(MethodDesc key, MethodILData value)
585protected override MethodILData CreateValueFromKey(MethodDesc key)
592public MethodDesc Method;
608public override MethodIL GetMethodIL(MethodDesc method)
653public IEnumerable<MethodDesc> CompiledMethodBodies
665public bool IsMethodBodyCompiled(MethodDesc method)
694public IEnumerable<MethodDesc> ReflectedMethods
710public readonly MethodDesc Method;
711public ConstrainedCallInfo(TypeDesc constrainedType, MethodDesc method)
Compiler\Dataflow\CompilerGeneratedState.cs (40)
26MethodDesc CreatingMethod,
89private Dictionary<MetadataType, MethodDesc>? _compilerGeneratedTypeToUserCodeMethod;
91private Dictionary<MethodDesc, MethodDesc>? _compilerGeneratedMethodToUserCodeMethod;
96private Dictionary<MethodDesc, List<TypeSystemEntity>>? _compilerGeneratedMembers;
125var userDefinedMethods = new HashSet<MethodDesc>();
137void ProcessMethod(MethodDesc method)
175MethodDesc? referencedMethod = methodBody.GetObject(reader.ReadILToken(), NotFoundBehavior.ReturnNull) as MethodDesc;
193var alreadyAssociatedMethod = generatedTypeToTypeArgs[generatedType].CreatingMethod;
258_compilerGeneratedTypeToUserCodeMethod ??= new Dictionary<MetadataType, MethodDesc>();
261var alreadyAssociatedMethod = _compilerGeneratedTypeToUserCodeMethod[stateMachineType];
287foreach (MethodDesc method in type.GetMethods())
299foreach (var method in nestedType.GetMethods())
314foreach (var userDefinedMethod in userDefinedMethods)
320_compilerGeneratedMembers ??= new Dictionary<MethodDesc, List<TypeSystemEntity>>();
327case MethodDesc nestedFunction:
330_compilerGeneratedMethodToUserCodeMethod ??= new Dictionary<MethodDesc, MethodDesc>();
333var alreadyAssociatedMethod = _compilerGeneratedMethodToUserCodeMethod[nestedFunction];
364var method = info.CreatingMethod;
365var alreadyAssociatedMethod = _generatedTypeToTypeArgumentInfo[generatedType].CreatingMethod;
403var method = typeInfo.CreatingMethod;
468MethodDesc? methodOperand = null;
473methodOperand = body.GetObject(reader.ReadILToken()) as MethodDesc;
474if (methodOperand is MethodDesc { OwningType: MetadataType owningType }
487methodOperand = body.GetObject(reader.ReadILToken()) as MethodDesc;
528public bool TryGetCompilerGeneratedCalleesForUserMethod(MethodDesc method, [NotNullWhen(true)] out List<TypeSystemEntity>? callees)
549public bool TryGetOwningMethodForCompilerGeneratedMethod(MethodDesc compilerGeneratedMethod, [NotNullWhen(true)] out MethodDesc? owningMethod)
560public bool TryGetOwningMethodForCompilerGeneratedType(MetadataType compilerGeneratedType, [NotNullWhen(true)] out MethodDesc? owningMethod)
604if (member is MethodDesc method && CompilerGeneratedNames.IsLambdaOrLocalFunction(method.Name.AsSpan()))
613public static bool TryGetStateMachineType(MethodDesc method, [NotNullWhen(true)] out MetadataType? stateMachineType)
660public bool TryGetCompilerGeneratedCalleesForUserMethod(MethodDesc method, [NotNullWhen(true)] out List<TypeSystemEntity>? callees)
707public bool TryGetOwningMethodForCompilerGeneratedMember(TypeSystemEntity sourceMember, [NotNullWhen(true)] out MethodDesc? owningMethod)
727MethodDesc? compilerGeneratedMethod = sourceMember as MethodDesc;
740public bool TryGetUserMethodForCompilerGeneratedMember(TypeSystemEntity sourceMember, [NotNullWhen(true)] out MethodDesc? userMethod)
746Debug.Assert(sourceMember is not MethodDesc sourceMethod || sourceMethod.IsTypicalMethodDefinition);
753MethodDesc? userMethodCandidate;
Compiler\Dataflow\FlowAnnotations.cs (21)
52public bool RequiresDataflowAnalysisDueToSignature(MethodDesc method)
68public bool RequiresVirtualMethodDataflowAnalysis(MethodDesc method)
110public bool HasGenericParameterAnnotation(MethodDesc method)
125MethodDesc method = param.Method.Method.GetTypicalMethodDefinition();
135public DynamicallyAccessedMemberTypes GetReturnParameterAnnotation(MethodDesc method)
167MethodDesc method => ShouldWarnWhenAccessedForReflection(method),
190MethodDesc parent = ecmaGenericParameter.Module.GetMethod(paramDef.Parent);
201public bool ShouldWarnWhenAccessedForReflection(MethodDesc method)
528MethodDesc setMethod = property.SetMethod;
573MethodDesc getMethod = property.GetMethod;
727internal void ValidateMethodAnnotationsAreSame(MethodDesc method, MethodDesc baseMethod, TypeSystemEntity origin)
785private void ValidateMethodParametersHaveNoAnnotations(DynamicallyAccessedMemberTypes[] parameterAnnotations, MethodDesc method, MethodDesc baseMethod, TypeSystemEntity origin)
798private void ValidateMethodGenericParametersHaveNoAnnotations(DynamicallyAccessedMemberTypes[] genericParameterAnnotations, MethodDesc method, MethodDesc baseMethod, TypeSystemEntity origin)
831case (TypeDesc, MethodDesc method):
833DiagnosticUtilities.GetMethodSignatureDisplayName(method), DiagnosticUtilities.GetMethodSignatureDisplayName((MethodDesc)baseProvider));
860public bool TryGetAnnotation(MethodDesc method, out MethodAnnotations annotations)
926public readonly MethodDesc Method;
932MethodDesc method,
Compiler\Dataflow\MethodBodyScanner.cs (15)
288MethodDesc startingMethod = startingMethodBody.OwningMethod;
334private static void TrackNestedFunctionReference(MethodDesc referencedMethod, ref InterproceduralState interproceduralState)
336MethodDesc method = referencedMethod.GetTypicalMethodDefinition();
346MethodDesc thisMethod = methodIL.OwningMethod;
475if (methodIL.GetObject(reader.ReadILToken()) is MethodDesc methodOperand)
536if (methodIL.GetObject(reader.ReadILToken()) is MethodDesc methodOperand)
763MethodDesc methodOperand = (MethodDesc)methodIL.GetObject(reader.ReadILToken());
884private void ScanLdarg(ILOpcode opcode, int parameterIndex, Stack<StackSlot> currentStack, MethodDesc thisMethod)
979else if (operand is MethodDesc method)
1167MethodDesc methodCalled,
1241MethodDesc calledMethod,
1265protected abstract void HandleMethodTokenAccess(MethodIL methodIL, int offset, MethodDesc accessedMethod);
1276MethodDesc calledMethod,
1327MethodDesc calledMethod,
Compiler\Dataflow\ReflectionMarker.cs (11)
35public List<(MethodDesc OwningMethod, INodeWithRuntimeDeterminedDependencies Dependency)> RuntimeDeterminedDependencies { get; } = new List<(MethodDesc, INodeWithRuntimeDeterminedDependencies)>();
78case MethodDesc method:
181internal void MarkMethod(in MessageOrigin origin, MethodDesc method, TypeSystemEntity reason, AccessKind accessKind = AccessKind.Unspecified)
189internal void MarkMethod(in MessageOrigin origin, MethodDesc method, string reason, AccessKind accessKind = AccessKind.Unspecified)
239internal void MarkConstructorsOnType(in MessageOrigin origin, TypeDesc type, Func<MethodDesc, bool>? filter, TypeSystemEntity reason, BindingFlags? bindingFlags = null)
245foreach (var ctor in type.GetConstructorsOnType(filter, bindingFlags))
284MethodDesc cctor = type.GetStaticConstructor();
306Debug.Assert(entity is MethodDesc or FieldDesc);
334if (entity is MethodDesc)
358Debug.Assert(entity is MethodDesc or FieldDesc);
Compiler\Dataflow\ReflectionMethodBodyScanner.cs (9)
37public static bool RequiresReflectionMethodBodyScannerForCallSite(FlowAnnotations flowAnnotations, MethodDesc method)
48public static bool RequiresReflectionMethodBodyScannerForMethodBody(FlowAnnotations flowAnnotations, MethodDesc methodDefinition)
127public static DependencyList ScanAndProcessReturnValue(NodeFactory factory, FlowAnnotations annotations, Logger logger, MethodIL methodIL, out List<(MethodDesc OwningMethod, INodeWithRuntimeDeterminedDependencies Dependency)> runtimeDependencies)
271protected override void HandleMethodTokenAccess(MethodIL methodIL, int offset, MethodDesc accessedMethod)
289public override MultiValue HandleCall(MethodIL callingMethodIL, MethodDesc calledMethod, ILOpcode operation, int offset, ValueNodeList methodParams)
333MethodDesc calledMethod,
340var callingMethodDefinition = callingMethodBody.OwningMethod;
442private void ProcessGenericArgumentDataFlow(MethodDesc method)
477internal static bool IsPInvokeDangerous(MethodDesc calledMethod, out bool comDangerousMethod, out bool aotUnsafeDelegate)
Compiler\DependencyAnalysis\NativeLayoutVertexNode.cs (33)
102protected readonly MethodDesc _method;
107public MethodDesc Method => _method;
113public NativeLayoutMethodEntryVertexNode(NodeFactory factory, MethodDesc method, MethodEntryFlags flags)
194MethodDesc methodForToken = GetMethodForMetadata(_method, out bool isAsyncVariant, out bool isReturnDroppingAsyncThunk);
213private static MethodDesc GetMethodForMetadata(MethodDesc method, out bool isAsyncVariant, out bool isReturnDroppingAsyncThunk)
215MethodDesc result = method.GetTypicalMethodDefinition();
642private static bool NeedsEntrypoint(MethodDesc method)
659public NativeLayoutTemplateMethodSignatureVertexNode(NodeFactory factory, MethodDesc method)
707if (owningMethodOrType is MethodDesc owningMethod)
725if (_owningMethodOrType is MethodDesc owningMethod)
802private MethodDesc _method;
806public NativeLayoutTemplateMethodLayoutVertexNode(NodeFactory factory, MethodDesc method)
1034MethodDesc cctorMethod = _type.GetStaticConstructor();
1035MethodDesc canonCctorMethod = cctorMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
1228private MethodDesc _method;
1230public NativeLayoutInterfaceDispatchGenericDictionarySlotNode(NodeFactory factory, MethodDesc method)
1243MethodDesc canonMethod = _method.GetCanonMethodTarget(CanonicalFormKind.Specific);
1257MethodDesc method = _method;
1269private MethodDesc _method;
1271public NativeLayoutGvmDispatchGenericDictionarySlotNode(NodeFactory factory, MethodDesc method)
1296MethodDesc canonMethod = _method.GetCanonMethodTarget(CanonicalFormKind.Specific);
1312private MethodDesc _method;
1314public NativeLayoutMethodDictionaryGenericDictionarySlotNode(NodeFactory factory, MethodDesc method)
1395private MethodDesc _method;
1397public NativeLayoutMethodLdTokenGenericDictionarySlotNode(NodeFactory factory, MethodDesc method)
1441private MethodDesc _constrainedMethod;
1445public NativeLayoutConstrainedMethodDictionarySlotNode(MethodDesc constrainedMethod, TypeDesc constraintType, bool directCall)
1506MethodDesc canonMethod = _constrainedMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
1524var canonConstrainedMethod = _constrainedMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
1534private MethodDesc _method;
1544public WrappedMethodEntryVertexNode(NodeFactory factory, MethodDesc method, bool unboxingStub, IMethodNode functionPointerNode) :
1560public NativeLayoutMethodEntrypointGenericDictionarySlotNode(NodeFactory factory, MethodDesc method, IMethodNode functionPointerNode, bool unboxingStub)
Compiler\DependencyAnalysis\NodeFactory.cs (106)
132protected virtual bool CanFold(MethodDesc method) => false;
275_directPInvokes = new NodeCache<MethodDesc, ExternFunctionSymbolNode>((MethodDesc key) =>
304_tentativeMethodEntrypoints = new NodeCache<MethodDesc, IMethodNode>((MethodDesc method) =>
316_unboxingStubs = new NodeCache<MethodDesc, IMethodNode>(CreateUnboxingStubNode);
333_gvmDependenciesNode = new NodeCache<MethodDesc, GVMDependenciesNode>(method =>
338_gvmImpls = new NodeCache<MethodDesc, GenericVirtualMethodImplNode>(method =>
343_genericMethodEntries = new NodeCache<MethodDesc, GenericMethodsHashtableEntryNode>(method =>
348_exactMethodEntries = new NodeCache<MethodDesc, ExactMethodInstantiationsEntryNode>(method =>
358_addressTakenMethods = new NodeCache<MethodDesc, AddressTakenMethodNode>(method =>
363_reflectedDelegateTargetMethods = new NodeCache<MethodDesc, DelegateTargetVirtualMethodNode>(method =>
368_delegateTargetMethods = new NodeCache<MethodDesc, DelegateTargetVirtualMethodNode>(method =>
373_reflectableVirtualMethodImpls = new NodeCache<(MethodDesc Declaration, MethodDesc Implementation), ReflectableVirtualMethodImplNode>(methods =>
383_reflectedMethods = new NodeCache<MethodDesc, ReflectedMethodNode>(method =>
425_variantMethods = new NodeCache<MethodDesc, VariantInterfaceMethodUseNode>((MethodDesc method) =>
487_runtimeMethodHandles = new NodeCache<MethodDesc, RuntimeMethodHandleNode>((MethodDesc method) =>
532_eagerCctorIndirectionNodes = new NodeCache<MethodDesc, EmbeddedObjectNode>((MethodDesc method) =>
551_methodGenericDictionaries = new NodeCache<MethodDesc, ISortableSymbolNode>(method =>
575_methodsWithMetadata = new NodeCache<MethodDesc, MethodMetadataNode>(method =>
580_methodsWithLimitedMetadata = new NodeCache<MethodDesc, MethodMetadataNode>(method =>
622_stringAllocators = new NodeCache<MethodDesc, IMethodNode>(constructor =>
724protected abstract IMethodNode CreateMethodEntrypointNode(MethodDesc method);
726protected abstract IMethodNode CreateUnboxingStubNode(MethodDesc method);
906public DispatchCellNode DispatchCell(MethodDesc method, ISortableSymbolNode callSite = null)
911private NodeCache<MethodDesc, RuntimeMethodHandleNode> _runtimeMethodHandles;
913public RuntimeMethodHandleNode RuntimeMethodHandle(MethodDesc method)
1017private NodeCache<MethodDesc, ExternFunctionSymbolNode> _directPInvokes;
1018public ExternFunctionSymbolNode DirectPInvokeTarget(MethodDesc method)
1074private NodeCache<MethodDesc, ISortableSymbolNode> _methodGenericDictionaries;
1075public ISortableSymbolNode MethodGenericDictionary(MethodDesc method)
1092private NodeCache<MethodDesc, IMethodNode> _stringAllocators;
1093public IMethodNode StringAllocator(MethodDesc stringConstructor)
1109private sealed class MethodEntrypointHashtable : LockFreeReaderHashtable<MethodDesc, IMethodNode>
1113protected override bool CompareKeyToValue(MethodDesc key, IMethodNode value) => key == value.Method;
1115protected override IMethodNode CreateValueFromKey(MethodDesc key) => _factory.CreateMethodEntrypointNode(key);
1116protected override int GetKeyHashCode(MethodDesc key) => key.GetHashCode();
1121private NodeCache<MethodDesc, IMethodNode> _unboxingStubs;
1124public IMethodNode MethodEntrypoint(MethodDesc method, bool unboxingStub = false)
1134protected NodeCache<MethodDesc, IMethodNode> _tentativeMethodEntrypoints;
1136public IMethodNode TentativeMethodEntrypoint(MethodDesc method, bool unboxingStub = false)
1144public IMethodNode MethodEntrypointOrTentativeMethod(MethodDesc method, bool unboxingStub = false)
1163public IMethodNode FatFunctionPointer(MethodDesc method, bool isUnboxingStub = false)
1170public IMethodNode FatAddressTakenFunctionPointer(MethodDesc method, bool isUnboxingStub = false)
1178public IMethodNode ExactCallableAddress(MethodDesc method, bool isUnboxingStub = false)
1180MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
1187public IMethodNode ExactCallableAddressTakenAddress(MethodDesc method, bool isUnboxingStub = false)
1189MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
1196public IMethodNode CanonicalEntrypoint(MethodDesc method)
1198MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
1205private NodeCache<MethodDesc, GVMDependenciesNode> _gvmDependenciesNode;
1206public GVMDependenciesNode GVMDependencies(MethodDesc method)
1211private NodeCache<MethodDesc, GenericVirtualMethodImplNode> _gvmImpls;
1212public GenericVirtualMethodImplNode GenericVirtualMethodImpl(MethodDesc method)
1217private NodeCache<MethodDesc, GenericMethodsHashtableEntryNode> _genericMethodEntries;
1218public GenericMethodsHashtableEntryNode GenericMethodsHashtableEntry(MethodDesc method)
1223private NodeCache<MethodDesc, ExactMethodInstantiationsEntryNode> _exactMethodEntries;
1224public ExactMethodInstantiationsEntryNode ExactMethodInstantiationsHashtableEntry(MethodDesc method)
1235private NodeCache<MethodDesc, AddressTakenMethodNode> _addressTakenMethods;
1236public IMethodNode AddressTakenMethodEntrypoint(MethodDesc method, bool unboxingStub = false)
1244private NodeCache<MethodDesc, DelegateTargetVirtualMethodNode> _reflectedDelegateTargetMethods;
1245public DelegateTargetVirtualMethodNode ReflectedDelegateTargetVirtualMethod(MethodDesc method)
1250private NodeCache<MethodDesc, DelegateTargetVirtualMethodNode> _delegateTargetMethods;
1251public DelegateTargetVirtualMethodNode DelegateTargetVirtualMethod(MethodDesc method)
1256private NodeCache<(MethodDesc Declaration, MethodDesc Implementation), ReflectableVirtualMethodImplNode> _reflectableVirtualMethodImpls;
1257public ReflectableVirtualMethodImplNode ReflectableVirtualMethodImpl(MethodDesc declaration, MethodDesc implementation)
1272private NodeCache<MethodDesc, ReflectedMethodNode> _reflectedMethods;
1273public ReflectedMethodNode ReflectedMethod(MethodDesc method)
1314private sealed class ShadowConcreteMethodHashtable : LockFreeReaderHashtable<MethodDesc, ShadowConcreteMethodNode>
1318protected override bool CompareKeyToValue(MethodDesc key, ShadowConcreteMethodNode value) => key == value.Method;
1320protected override ShadowConcreteMethodNode CreateValueFromKey(MethodDesc key) =>
1322protected override int GetKeyHashCode(MethodDesc key) => key.GetHashCode();
1327public ShadowConcreteMethodNode ShadowConcreteMethod(MethodDesc method)
1332private sealed class ShadowNonConcreteMethodHashtable : LockFreeReaderHashtable<MethodDesc, ShadowNonConcreteMethodNode>
1336protected override bool CompareKeyToValue(MethodDesc key, ShadowNonConcreteMethodNode value) => key == value.Method;
1338protected override ShadowNonConcreteMethodNode CreateValueFromKey(MethodDesc key) =>
1340protected override int GetKeyHashCode(MethodDesc key) => key.GetHashCode();
1345public ShadowNonConcreteMethodNode ShadowNonConcreteMethod(MethodDesc method)
1372var method = type.GetKnownMethod(Encoding.UTF8.GetBytes(entry[2]), null);
1390private MethodDesc _instanceMethodRemovedHelper;
1391public MethodDesc InstanceMethodRemovedHelper
1401private sealed class VirtualMethodUseHashtable : LockFreeReaderHashtable<MethodDesc, VirtualMethodUseNode>
1405protected override bool CompareKeyToValue(MethodDesc key, VirtualMethodUseNode value) => key == value.Method;
1407protected override VirtualMethodUseNode CreateValueFromKey(MethodDesc key)
1414protected override int GetKeyHashCode(MethodDesc key) => key.GetHashCode();
1420public DependencyNodeCore<NodeFactory> VirtualMethodUse(MethodDesc decl)
1425private NodeCache<MethodDesc, VariantInterfaceMethodUseNode> _variantMethods;
1427public DependencyNodeCore<NodeFactory> VariantInterfaceMethodUse(MethodDesc decl)
1477private NodeCache<MethodDesc, MethodMetadataNode> _methodsWithMetadata;
1479internal MethodMetadataNode MethodMetadata(MethodDesc method)
1487private NodeCache<MethodDesc, MethodMetadataNode> _methodsWithLimitedMetadata;
1489internal MethodMetadataNode LimitedMethodMetadata(MethodDesc method)
1591private NodeCache<MethodDesc, EmbeddedObjectNode> _eagerCctorIndirectionNodes;
1593public EmbeddedObjectNode EagerCctorIndirection(MethodDesc cctorMethod)
1647public WasmTypeNode WasmTypeNode(MethodDesc desc)
1740public Vertex EncodeReferenceToMethod(NativeWriter writer, MethodDesc method)
1748public readonly MethodDesc Method;
1751public MethodKey(MethodDesc method, bool isUnboxingStub)
1810public readonly MethodDesc Target;
1813public DispatchCellKey(MethodDesc target, ISortableSymbolNode callsiteId)
Compiler\DependencyAnalysis\NodeFactory.GenericLookups.cs (13)
45_methodHandles = new NodeCache<MethodDesc, GenericLookupResult>(method =>
55_methodDictionaries = new NodeCache<MethodDesc, GenericLookupResult>(method =>
65_dispatchCells = new NodeCache<MethodDesc, GenericLookupResult>(method =>
140private NodeCache<MethodDesc, GenericLookupResult> _methodHandles;
142public GenericLookupResult MethodHandle(MethodDesc method)
175private NodeCache<MethodDesc, GenericLookupResult> _methodDictionaries;
177public GenericLookupResult MethodDictionary(MethodDesc method)
182private NodeCache<MethodDesc, GenericLookupResult> _dispatchCells;
184public GenericLookupResult DispatchCell(MethodDesc method)
191public GenericLookupResult MethodEntry(MethodDesc method, bool isUnboxingThunk = false)
211public GenericLookupResult ConstrainedMethodUse(MethodDesc constrainedMethod, TypeDesc constraintType, bool directCall)
221public ConstrainedMethodUseKey(MethodDesc constrainedMethod, TypeDesc constraintType, bool directCall)
228public readonly MethodDesc ConstrainedMethod;
Compiler\DependencyAnalysis\NodeFactory.NativeLayout.cs (25)
55_methodEntries = new NodeCache<MethodDesc, NativeLayoutMethodEntryVertexNode>(method =>
60_templateMethodEntries = new NodeCache<MethodDesc, NativeLayoutTemplateMethodSignatureVertexNode>(method =>
65_templateMethodLayouts = new NodeCache<MethodDesc, NativeLayoutTemplateMethodLayoutVertexNode>(method =>
110_interfaceCell_GenericDictionarySlots = new NodeCache<MethodDesc, NativeLayoutInterfaceDispatchGenericDictionarySlotNode>(method =>
115_gvmCell_GenericDictionarySlots = new NodeCache<MethodDesc, NativeLayoutGvmDispatchGenericDictionarySlotNode>(method =>
120_methodDictionary_GenericDictionarySlots = new NodeCache<MethodDesc, NativeLayoutMethodDictionaryGenericDictionarySlotNode>(method =>
135_methodLdToken_GenericDictionarySlots = new NodeCache<MethodDesc, NativeLayoutMethodLdTokenGenericDictionarySlotNode>(method =>
315private NodeCache<MethodDesc, NativeLayoutMethodEntryVertexNode> _methodEntries;
316internal NativeLayoutMethodEntryVertexNode MethodEntry(MethodDesc method)
321private NodeCache<MethodDesc, NativeLayoutTemplateMethodSignatureVertexNode> _templateMethodEntries;
322internal NativeLayoutTemplateMethodSignatureVertexNode TemplateMethodEntry(MethodDesc method)
327private NodeCache<MethodDesc, NativeLayoutTemplateMethodLayoutVertexNode> _templateMethodLayouts;
328public NativeLayoutTemplateMethodLayoutVertexNode TemplateMethodLayout(MethodDesc method)
381private NodeCache<MethodDesc, NativeLayoutInterfaceDispatchGenericDictionarySlotNode> _interfaceCell_GenericDictionarySlots;
382public NativeLayoutInterfaceDispatchGenericDictionarySlotNode InterfaceCellDictionarySlot(MethodDesc method)
387private NodeCache<MethodDesc, NativeLayoutGvmDispatchGenericDictionarySlotNode> _gvmCell_GenericDictionarySlots;
388public NativeLayoutGvmDispatchGenericDictionarySlotNode GvmCellDictionarySlot(MethodDesc method)
393private NodeCache<MethodDesc, NativeLayoutMethodDictionaryGenericDictionarySlotNode> _methodDictionary_GenericDictionarySlots;
394public NativeLayoutMethodDictionaryGenericDictionarySlotNode MethodDictionaryDictionarySlot(MethodDesc method)
404public readonly MethodDesc Method;
407public MethodEntrypointSlotKey(MethodDesc method, bool unboxing, IMethodNode functionPointerTarget)
447public NativeLayoutMethodEntrypointGenericDictionarySlotNode MethodEntrypointDictionarySlot(MethodDesc method, bool unboxing, IMethodNode functionPointerTarget)
458private NodeCache<MethodDesc, NativeLayoutMethodLdTokenGenericDictionarySlotNode> _methodLdToken_GenericDictionarySlots;
459public NativeLayoutMethodLdTokenGenericDictionarySlotNode MethodLdTokenDictionarySlot(MethodDesc method)
471public NativeLayoutConstrainedMethodDictionarySlotNode ConstrainedMethodUse(MethodDesc constrainedMethod, TypeDesc constraintType, bool directCall)
Compiler\ILScanner.cs (33)
57var canonicalMethodsToCompile = new HashSet<MethodDesc>();
71MethodDesc method = methodCodeNodeNeedingCode.Method;
119MethodDesc method = methodCodeNodeNeedingCode.Method;
195MethodDesc methodDesc = JitHelper.GetEntryPoint(_compilation.TypeSystemContext, key);
289private readonly Dictionary<TypeDesc, MethodDesc[]> _vtableSlices = new Dictionary<TypeDesc, MethodDesc[]>();
298ArrayBuilder<MethodDesc> usedSlots = default;
302MethodDesc slot = vtableSliceNode.Slots[i];
314if (!_vtableSlices.TryGetValue(type, out MethodDesc[] slots))
384MethodDesc targetMethod = methodDictLookup.Method.GetCanonMethodTarget(CanonicalFormKind.Specific);
439Debug.Assert(methodOrType is MethodDesc);
440MethodDesc method = (MethodDesc)methodOrType;
457private HashSet<MethodDesc> _overriddenMethods = new();
458private HashSet<MethodDesc> _generatedVirtualMethods = new();
473var vtables = new Dictionary<TypeDesc, List<MethodDesc>>();
594static List<MethodDesc> BuildVTable(NodeFactory factory, TypeDesc currentType, TypeDesc implType, List<MethodDesc> vtable)
601IReadOnlyList<MethodDesc> slice = factory.VTable(currentType).Slots;
602foreach (MethodDesc decl in slice)
614if (!vtables.TryGetValue(baseType, out List<MethodDesc> baseVtable))
615vtables.Add(baseType, baseVtable = BuildVTable(factory, baseType, baseType, new List<MethodDesc>()));
617if (!vtables.TryGetValue(type, out List<MethodDesc> vtable))
618vtables.Add(type, vtable = BuildVTable(factory, type, type, new List<MethodDesc>()));
707public override bool IsEffectivelySealed(MethodDesc method)
722MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
730protected override MethodDesc ResolveVirtualMethod(MethodDesc declMethod, DefType implType, out CORINFO_DEVIRTUALIZATION_DETAIL devirtualizationDetail)
829public bool CanInline(MethodDesc caller, MethodDesc callee)
850private readonly Dictionary<MethodDesc, TypeSystemException> _importationErrors = new Dictionary<MethodDesc, TypeSystemException>();
864public override TypeSystemException GetCompilationError(MethodDesc method)
Compiler\MetadataManager.cs (68)
53private List<MetadataMapping<MethodDesc>> _methodMappings;
54private Dictionary<MethodDesc, int> _methodHandleMap;
72private readonly SortedSet<MethodDesc> _methodsGenerated = new SortedSet<MethodDesc>(TypeSystemComparer.Instance);
73private readonly SortedSet<MethodDesc> _reflectableMethods = new SortedSet<MethodDesc>(TypeSystemComparer.Instance);
84private readonly SortedSet<MethodDesc> _genericMethodHashtableEntries = new SortedSet<MethodDesc>(TypeSystemComparer.Instance);
85private readonly SortedSet<MethodDesc> _exactMethodHashtableEntries = new SortedSet<MethodDesc>(TypeSystemComparer.Instance);
396public virtual bool IsReflectionInvokable(MethodDesc method)
401public static bool IsMethodSupportedInReflectionInvoke(MethodDesc method)
446public bool HasReflectionInvokeStub(MethodDesc method)
457public bool ShouldMethodBeInInvokeMap(MethodDesc method)
470public void GetDependenciesDueToGenericDictionary(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
479public IEnumerable<CombinedDependencyListEntry> GetConditionalDependenciesDueToGenericDictionary(NodeFactory factory, MethodDesc method)
492public void GetDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
545public virtual void GetDependenciesDueToVirtualMethodReflectability(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
549protected virtual void GetMetadataDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
556public virtual void GetNativeLayoutMetadataDependencies(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
607public virtual void GetDependenciesDueToLdToken(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
622public void GetDependenciesDueToDelegateCreation(ref DependencyList dependencies, NodeFactory factory, TypeDesc delegateType, MethodDesc target)
634public virtual void GetDependenciesDueToDelegateCreation(ref CombinedDependencyList dependencies, NodeFactory factory, TypeDesc delegateType, MethodDesc target)
643public virtual void GetDependenciesForOverridingMethod(ref CombinedDependencyList dependencies, NodeFactory factory, MethodDesc decl, MethodDesc impl)
656public void GetDependenciesDueToMethodCodePresence(ref DependencyList dependencies, NodeFactory factory, MethodDesc method, MethodIL methodIL)
663public virtual void GetConditionalDependenciesDueToMethodCodePresence(ref CombinedDependencyList dependencies, NodeFactory factory, MethodDesc method)
669protected virtual void GetDependenciesDueToMethodCodePresenceInternal(ref DependencyList dependencies, NodeFactory factory, MethodDesc method, MethodIL methodIL)
678public bool HasReflectionInvokeStubForInvokableMethod(MethodDesc method)
688public bool WillUseMetadataTokenToReferenceMethod(MethodDesc method)
705public MethodDesc GetReflectionInvokeStub(MethodDesc method)
728out List<MetadataMapping<MethodDesc>> methodMappings,
729out Dictionary<MethodDesc, int> methodMetadataMappings,
740out List<MetadataMapping<MethodDesc>> methodMappings,
741out Dictionary<MethodDesc, int> methodMetadataMappings,
754var methodsWithMappings = new HashSet<MethodDesc>();
755foreach (var method in GetReflectableMethods())
765var methodBodies = new HashSet<MethodDesc>();
768MethodDesc method = methodBody.Method;
828methodMappings = new List<MetadataMapping<MethodDesc>>();
829methodMetadataMappings = new Dictionary<MethodDesc, int>();
855foreach (var method in GetReflectableMethods())
857MethodDesc typicalMethod = method.GetTypicalMethodDefinition();
888methodMappings.Add(new MetadataMapping<MethodDesc>(method, writer.GetRecordHandle(record)));
938protected StackTraceRecordData CreateStackTraceRecord(Metadata.MetadataTransform transform, MethodDesc method, StackTraceRecordFlags flags)
941MethodDesc methodToGenerateMetadataFor = method.GetTypicalMethodDefinition();
1007public IEnumerable<MetadataMapping<MethodDesc>> GetMethodMapping(NodeFactory factory)
1013public int GetMetadataHandleForMethod(NodeFactory factory, MethodDesc method)
1103public IEnumerable<MethodDesc> GetCompiledMethods()
1108public IEnumerable<MethodDesc> GetReflectableMethods()
1128public IEnumerable<MethodDesc> GetGenericMethodHashtableEntries()
1133public IEnumerable<MethodDesc> GetExactMethodHashtableEntries()
1233public bool IsReflectionBlocked(MethodDesc method)
1235MethodDesc methodDefinition = method.GetMethodDefinition();
1241MethodDesc typicalMethodDefinition = methodDefinition.GetTypicalMethodDefinition();
1268public bool CanGenerateMetadata(MethodDesc method)
1287protected abstract MetadataCategory GetMetadataCategory(MethodDesc method);
1303public virtual void GetDependenciesDueToAccess(ref DependencyList dependencies, NodeFactory factory, MethodIL methodIL, MethodDesc calledMethod)
1311public virtual DependencyList GetDependenciesForCustomAttribute(NodeFactory factory, MethodDesc attributeCtor, CustomAttributeValue decodedValue, TypeSystemEntity parent)
1316public virtual void NoteOverridingMethod(MethodDesc baseMethod, MethodDesc overridingMethod, TypeSystemEntity origin = null)
1332public readonly MethodDesc Method;
1339public StackTraceMapping(MethodDesc method, int owningTypeHandle, int methodSignatureHandle, int methodNameHandle, int methodInstantiationArgumentCollectionHandle, StackTraceRecordFlags flags)
1346public readonly MethodDesc Method;
1350public ReflectionStackTraceMapping(MethodDesc method, int owningTypeHandle, int methodHandle)
1364public readonly MethodDesc Method;
1371public StackTraceRecordData(MethodDesc method, MetadataRecord owningType, MetadataRecord methodSignature, MetadataRecord methodName, MetadataRecord methodInstantiationArgumentCollection, StackTraceRecordFlags flags)
Compiler\MstatObjectDumper.cs (6)
40private List<(MethodDesc Method, string MangledName, int Size, int GcInfoSize)> _methods = new();
41private Dictionary<MethodDesc, int> _methodEhInfo = new();
43private Dictionary<MethodDesc, List<(MethodDesc Method, int MangledName)>> _deduplicatedBodies = new();
114if (!_deduplicatedBodies.TryGetValue(originalBody.Method, out List<(MethodDesc, int)> targetBodies))
115_deduplicatedBodies.Add(originalBody.Method, targetBodies = new List<(MethodDesc, int)>());
Compiler\TypePreinit.cs (33)
116private bool TryGetNestedPreinitResult(MethodDesc callingMethod, MetadataType type, Stack<MethodDesc> recursionProtect, ref int instructionCounter, out NestedPreinitResult result)
121recursionProtect ??= new Stack<MethodDesc>();
167private Status TryScanMethod(MethodDesc method, Value[] parameters, Stack<MethodDesc> recursionProtect, ref int instructionCounter, out Value returnValue)
179private Status TryScanMethod(MethodIL methodIL, Value[] parameters, Stack<MethodDesc> recursionProtect, ref int instructionCounter, out Value returnValue)
488MethodDesc method = (MethodDesc)methodIL.GetObject(reader.ReadILToken());
496MethodDesc directMethod = constrainedType.GetClosestDefType().TryResolveConstraintMethodApprox(method.OwningType, method, out bool forceUseRuntimeLookup, ref staticResolution);
542recursionProtect ??= new Stack<MethodDesc>();
560MethodDesc ctor = (MethodDesc)methodIL.GetObject(reader.ReadILToken());
633MethodDesc pointedMethod = methodPointer.PointedToMethod;
698recursionProtect ??= new Stack<MethodDesc>();
1036var method = methodIL.GetObject(reader.ReadILToken()) as MethodDesc;
1888private bool TryHandleIntrinsicCall(MethodDesc method, Value[] parameters, out Value retVal)
1977private static TypeDesc GetArgType(MethodDesc method, int index)
2600private readonly MethodDesc[] _methods;
2604: this(type, new MethodDesc[GetFieldCount(type)], fieldThatOwnsMemory)
2608private VTableLikeStructValue(MetadataType type, MethodDesc[] methods, FieldDesc fieldThatOwnsMemory)
2661foreach (MethodDesc method in _methods)
2678return new VTableLikeStructValue(_type, (MethodDesc[])_methods.Clone(), fieldThatOwnsMemory: null);
2747MethodDesc[] slots = new MethodDesc[GetFieldCount(mdType)];
2781MethodDesc method = _parent._methods[GetFieldIndex(field)];
3049public MethodDesc PointedToMethod { get; }
3051public MethodPointerValue(MethodDesc pointedToMethod)
3260private readonly MethodDesc _methodPointed;
3263public DelegateInstance(TypeDesc delegateType, MethodDesc methodPointed, ReferenceTypeValue firstParameter, AllocationSite allocationSite)
3286MethodDesc targetMethod = creationInfo.PossiblyUnresolvedTargetMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
3734public static Status Fail(MethodDesc method, ILOpcode opcode, string detail = null)
3739public static Status Fail(MethodDesc method, string detail)
Compiler\UsageBasedMetadataManager.cs (34)
55private readonly List<MethodDesc> _methodsWithMetadata = new List<MethodDesc>();
193protected override MetadataCategory GetMetadataCategory(MethodDesc method)
230out List<MetadataMapping<MethodDesc>> methodMappings,
231out Dictionary<MethodDesc, int> methodMetadataMappings,
241protected override void GetMetadataDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
247public override void GetNativeLayoutMetadataDependencies(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
271if (module.GetGlobalModuleType().GetStaticConstructor() is MethodDesc moduleCctor)
307MethodDesc invokeMethod = type.GetMethod("Invoke"u8, null);
322MethodDesc defaultConstructor = elementType.GetDefaultConstructor();
509foreach (MethodDesc method in type.GetMethods())
519MethodDesc reflectedMethod;
551public override void GetDependenciesDueToLdToken(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
557MethodDesc canonicalMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
570public override void GetDependenciesDueToDelegateCreation(ref CombinedDependencyList dependencies, NodeFactory factory, TypeDesc delegateType, MethodDesc target)
622public override void GetDependenciesForOverridingMethod(ref CombinedDependencyList dependencies, NodeFactory factory, MethodDesc decl, MethodDesc impl)
641protected override void GetDependenciesDueToMethodCodePresenceInternal(ref DependencyList dependencies, NodeFactory factory, MethodDesc method, MethodIL methodIL)
692public override void GetConditionalDependenciesDueToMethodCodePresence(ref CombinedDependencyList dependencies, NodeFactory factory, MethodDesc method)
694MethodDesc typicalMethod = method.GetTypicalMethodDefinition();
706public override void GetDependenciesDueToVirtualMethodReflectability(ref DependencyList dependencies, NodeFactory factory, MethodDesc method)
776public override void GetDependenciesDueToAccess(ref DependencyList dependencies, NodeFactory factory, MethodIL methodIL, MethodDesc calledMethod)
785public override DependencyList GetDependenciesForCustomAttribute(NodeFactory factory, MethodDesc attributeCtor, CustomAttributeValue decodedValue, TypeSystemEntity parent)
808public override void NoteOverridingMethod(MethodDesc baseMethod, MethodDesc overridingMethod, TypeSystemEntity origin)
841public static bool HasMismatchingAttributes(MethodDesc baseMethod, MethodDesc overridingMethod, string requiresAttributeName)
876var reflectableMethods = ReflectableEntityBuilder<MethodDesc>.Create();
877foreach (var methodWithMetadata in _methodsWithMetadata)
882foreach (var method in GetReflectableMethods())
893MethodDesc typicalMethod = method.GetTypicalMethodDefinition();
934if (FlowAnnotations.CompilerGeneratedState.TryGetUserMethodForCompilerGeneratedMember(methodILDefinition.OwningMethod, out var userMethod))
1023public bool GeneratesMetadata(MethodDesc methodDef)
1067public bool IsBlocked(MethodDesc methodDef)
IL\ILImporter.Scanner.cs (53)
34private readonly MethodDesc _canonMethod;
84public ILImporter(ILScanner compilation, MethodDesc method, MethodIL methodIL = null)
113MethodDesc sharedMethod = method.GetSharedRuntimeFormMethodTarget();
146MethodDesc method = _methodIL.OwningMethod;
168MethodDesc method = _methodIL.OwningMethod;
220private ISymbolNode GetGenericLookupHelper(ReadyToRunHelperId helperId, MethodDesc method)
332private IMethodNode GetMethodEntrypoint(MethodDesc method)
391|| !IsTaskConfigureAwait((MethodDesc)_methodIL.GetObject(reader.ReadILToken()))
403&& IsAsyncHelpersAwait((MethodDesc)_methodIL.GetObject(reader.ReadILToken()));
491if (!IsValueTaskAsTask((MethodDesc)_methodIL.GetObject(callToken)))
511MethodDesc ctorMethod = (MethodDesc)_methodIL.GetObject(ctorToken);
545var runtimeDeterminedMethod = (MethodDesc)_methodIL.GetObject(token);
546var method = (MethodDesc)_canonMethodIL.GetObject(token);
577MethodDesc asyncVariantMethod = _factory.TypeSystemContext.GetAsyncVariantMethod(method);
578MethodDesc asyncVariantRuntimeDeterminedMethod = _factory.TypeSystemContext.GetAsyncVariantMethod(runtimeDeterminedMethod);
586private void ImportCall(ILOpcode opcode, MethodDesc method, MethodDesc runtimeDeterminedMethod)
668MethodDesc ctor = Compilation.GetConstructorForCreateInstanceIntrinsic(type);
730MethodDesc methodAfterConstraintResolution = method;
755MethodDesc directMethod = constrained.GetClosestDefType().TryResolveConstraintMethodApprox(method.OwningType, method, out forceUseRuntimeLookup, ref staticResolution);
785MethodDesc targetMethod = methodAfterConstraintResolution;
833MethodDesc targetForDelegate = !resolvedConstraint || forceUseRuntimeLookup ? runtimeDeterminedMethod : targetMethod;
855MethodDesc targetOfLookup;
901MethodDesc concreteMethod = targetMethod;
1009MethodDesc methodToLookup = _compilation.GetTargetOfGenericVirtualMethodCall(runtimeDeterminedMethod);
1039MethodDesc slotDefiningMethod = targetMethod.IsNewSlot ?
1052var ctorMethod = (MethodDesc)_methodIL.GetObject(ctorToken);
1105private void RegisterDependenciesOnAwaitAwaiterInContinuation(MethodDesc runtimeDeterminedMethod, bool isUnsafe, string reason)
1130MethodDesc runtimeDeterminedResult = asyncHelpers
1134MethodDesc targetMethod = runtimeDeterminedResult.GetCanonMethodTarget(CanonicalFormKind.Specific);
1175MethodDesc stub = _compilation.PInvokeILProvider.GetCalliStub(
1228&& _methodIL.GetObject(reader.ReadILToken()) is MethodDesc { IsIntrinsic: true } intrinsicMethod
1363else if (obj is MethodDesc method)
1365_factory.MetadataManager.GetDependenciesDueToAccess(ref _dependencies, _factory, _methodIL, (MethodDesc)_canonMethodIL.GetObject(token));
1842private static bool IsTypeGetTypeFromHandle(MethodDesc method)
1856private static bool IsActivatorDefaultConstructorOf(MethodDesc method)
1870private static bool IsActivatorAllocatorOf(MethodDesc method)
1884private static bool IsEETypePtrOf(MethodDesc method)
1898private static bool IsRuntimeHelpersIsReferenceOrContainsReferences(MethodDesc method)
1912private static bool IsMemoryMarshalGetArrayDataReference(MethodDesc method)
1926private static bool IsAsyncHelpersAwait(MethodDesc method)
1942private static bool IsAsyncHelpersAwaitAwaiter(MethodDesc method, out bool isUnsafe)
1966private static bool IsTaskConfigureAwait(MethodDesc method)
1986private static bool IsValueTaskAsTask(MethodDesc method)
2003private static bool IsValueTaskCtor(MethodDesc method)
2046MethodDesc taskReturningMethod = _canonMethod.GetTargetOfAsyncVariant();
2053MethodDesc runtimeDeterminedCaller = _canonMethod.GetSharedRuntimeFormMethodTarget();
2056MethodDesc runtimeDeterminedResult;
2075MethodDesc targetMethod = runtimeDeterminedResult.GetCanonMethodTarget(CanonicalFormKind.Specific);
IL\RvaIntrinsicPatternAnalyzer.cs (9)
161MethodDesc constructor = (MethodDesc)methodIL.GetObject(reader.PeekILToken());
210if (!TryGetCallTarget(opcode, reader, methodIL, out MethodDesc method)
224if (!TryGetCallTarget(opcode, reader, methodIL, out MethodDesc method)
243private static bool TryGetCallTarget(ILOpcode opcode, in ILReader reader, MethodIL methodIL, out MethodDesc method)
246&& methodIL.GetObject(reader.PeekILToken()) is MethodDesc targetMethod)
322private static bool IsRuntimeHelpersInitializeArray(MethodDesc method)
335private static bool IsRuntimeHelpersCreateSpan(MethodDesc method, out TypeDesc elementType)
354private static bool IsRuntimeHelpersIntrinsic(MethodDesc method)
IL\Stubs\StartupCode\StartupCodeMainMethod.cs (12)
22private IReadOnlyCollection<MethodDesc> _libraryInitializers;
25public StartupCodeMainMethod(TypeDesc owningType, MethodDesc mainMethod, IReadOnlyCollection<MethodDesc> libraryInitializers, bool generateLibraryAndModuleInitializers)
76foreach (MethodDesc method in _libraryInitializers)
88MethodDesc initArgs = startup?.GetMethod(initArgsName, null);
97MethodDesc initEntryAssembly = startup?.GetMethod("InitializeEntryAssembly"u8, null);
106MethodDesc initApartmentState = startup?.GetMethod("InitializeApartmentState"u8, null);
123MethodDesc runModuleInitializers = startup?.GetMethod("RunModuleInitializers"u8, null);
143MethodDesc setLatchedExitCode = startup?.GetMethod("SetLatchedExitCode"u8, null);
144MethodDesc shutdown = startup?.GetMethod("Shutdown"u8, null);
210public MainMethodWrapper(TypeDesc owningType, MethodDesc mainMethod)
216public MethodDesc WrappedMethod
parent\parent\Common\Compiler\CachingVirtualMethodAlgorithm.cs (19)
15private readonly ConcurrentDictionary<TypeDesc, (MethodDesc Slot, MethodDesc Implementation)[]> _vtableCache
16= new ConcurrentDictionary<TypeDesc, (MethodDesc Slot, MethodDesc Implementation)[]>();
18private readonly Func<TypeDesc, (MethodDesc Slot, MethodDesc Implementation)[]> _vtableCreator;
23private (MethodDesc Slot, MethodDesc Implementation)[] ComputeVtable(TypeDesc type)
28var result = new ArrayBuilder<(MethodDesc Slot, MethodDesc Implementation)>(3 /* At least Equals/GetHashCode/ToString */);
30foreach (MethodDesc slotDecl in base.ComputeAllVirtualSlots(type))
38public override IEnumerable<MethodDesc> ComputeAllVirtualSlots(TypeDesc type)
46static IEnumerable<MethodDesc> GetCachedSlots(CachingVirtualMethodAlgorithm thisObj, TypeDesc type)
48foreach ((MethodDesc slot, _) in thisObj._vtableCache.GetOrAdd(type.GetTypeDefinition(), thisObj._vtableCreator))
55public override MethodDesc FindVirtualFunctionTargetMethodOnObjectType(MethodDesc targetMethod, TypeDesc objectType)
58MethodDesc targetMethodDefinition = targetMethod.GetMethodDefinition();
60MethodDesc slotDefiningMethod = targetMethodDefinition;
71MethodDesc result = kvp.Implementation;
parent\parent\Common\Compiler\CompilerTypeSystemContext.Async.cs (47)
16public static IEnumerable<MethodDesc> GetAllMethodsAndAsyncVariants(this TypeDesc type)
31private MethodDesc DecomposeAsyncVariant(MethodDesc method, out bool isAsyncVariant)
37private MethodDesc WrapAsAsyncVariant(MethodDesc originalMethod, MethodDesc resolvedMethod)
42MethodDesc asyncVariant = _context.GetAsyncVariantMethod(resolvedMethod);
55public override MethodDesc FindVirtualFunctionTargetMethodOnObjectType(MethodDesc targetMethod, TypeDesc objectType)
58MethodDesc result = base.FindVirtualFunctionTargetMethodOnObjectType(targetMethod, objectType);
65public override DefaultInterfaceMethodResolution ResolveInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, TypeDesc currentType, out MethodDesc impl)
75public override MethodDesc ResolveInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
78MethodDesc result = base.ResolveInterfaceMethodToStaticVirtualMethodOnType(interfaceMethod, currentType);
84public override MethodDesc ResolveInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
87MethodDesc result = base.ResolveInterfaceMethodToVirtualMethodOnType(interfaceMethod, currentType);
93public override DefaultInterfaceMethodResolution ResolveVariantInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, TypeDesc currentType, out MethodDesc impl)
102public override MethodDesc ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
105MethodDesc result = base.ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(interfaceMethod, currentType);
111public override MethodDesc ResolveVariantInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
114MethodDesc result = base.ResolveVariantInterfaceMethodToVirtualMethodOnType(interfaceMethod, currentType);
121public override IEnumerable<MethodDesc> ComputeAllVirtualSlots(TypeDesc type)
127internal static IEnumerable<MethodDesc> WithAsyncVariants(CompilerTypeSystemContext context, IEnumerable<MethodDesc> methods)
129foreach (MethodDesc method in methods)
172public MethodDesc GetTargetOfAsyncVariantMethod(MethodDesc asyncVariantMethod)
175MethodDesc result = asyncMethodVariantDefinition.Target;
191public MethodDesc GetAsyncVariantMethod(MethodDesc taskReturningMethod)
194MethodDesc taskReturningMethodDefinition = taskReturningMethod.GetTypicalMethodDefinition();
195MethodDesc result = _asyncVariantHashtable.GetOrCreateValue((EcmaMethod)taskReturningMethodDefinition);
210public MethodDesc GetTargetOfReturnDroppingThunk(MethodDesc returnDroppingThunk)
214MethodDesc result = returnDroppingThunkDefinition.AsyncVariantTarget;
241public MethodDesc GetReturnDroppingAsyncVariantMethod(MethodDesc asyncVariantMethod)
246MethodDesc typicalMethodDefinition = asyncVariantMethod.GetTypicalMethodDefinition();
247MethodDesc result = _returnDroppingHashtable.GetOrCreateValue((AsyncMethodVariant)typicalMethodDefinition);
273public AsyncResumptionStub GetAsyncResumptionStub(MethodDesc targetMethod, TypeDesc owningType)
280public readonly MethodDesc TargetMethod;
283public AsyncResumptionStubKey(MethodDesc targetMethod, TypeDesc owningType)
parent\parent\Common\Compiler\Dataflow\DynamicallyAccessedMembersBinder.cs (12)
38foreach (var c in typeDefinition.ApplyIncludeInherited(t => t.GetConstructorsOnType(filter: null, bindingFlags: BindingFlags.NonPublic), withInherited))
45foreach (var c in typeDefinition.ApplyIncludeInherited(t => t.GetConstructorsOnType(filter: null, bindingFlags: BindingFlags.Public), withInherited))
51foreach (var c in typeDefinition.GetConstructorsOnType(filter: m => m.IsPublic() && !m.HasMetadataParameters()))
58foreach (var m in typeDefinition.ApplyIncludeInherited(t => t.GetMethodsOnTypeHierarchy(filter: null, bindingFlags: BindingFlags.NonPublic | declaredOnlyFlags), withInherited))
64foreach (var m in typeDefinition.GetMethodsOnTypeHierarchy(filter: null, bindingFlags: BindingFlags.Public | declaredOnlyFlags))
140public static IEnumerable<MethodDesc> GetConstructorsOnType(this TypeDesc type, Func<MethodDesc, bool> filter, BindingFlags? bindingFlags = null)
148foreach (var method in type.GetMethods())
172public static IEnumerable<MethodDesc> GetMethodsOnTypeHierarchy(this TypeDesc type, Func<MethodDesc, bool> filter, BindingFlags? bindingFlags = null)
185foreach (var method in type.GetMethods())
493foreach (var m in type.GetMethods())
parent\parent\Common\TypeSystem\IL\HelperExtensions.cs (8)
30public static MethodDesc GetHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName)
33MethodDesc helperMethod = helperType.GetKnownMethod(methodName, null);
37public static MethodDesc GetCoreLibEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> namespaceName, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName, MethodSignature signature)
43public static MethodDesc GetOptionalHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName)
46MethodDesc helperMethod = helperType?.GetMethod(methodName, null);
55public static void EmitCallThrowHelper(this ILCodeStream codeStream, ILEmitter emitter, MethodDesc method)
74public static MethodDesc GetKnownMethod(this TypeDesc type, ReadOnlySpan<byte> name, MethodSignature signature)
76MethodDesc method = type.GetMethod(name, signature);
parent\parent\Common\TypeSystem\Interop\IL\Marshaller.Aot.cs (38)
111var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AllocMemoryForAnsiCharArray"u8);
123var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "WideCharArrayToAnsiCharArray"u8);
135var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiCharArrayToWideCharArray"u8);
148var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "WideCharToAnsiChar"u8);
160var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiCharToWideChar"u8);
209var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, helperMethodName);
221var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, helperMethodName);
236var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, helperMethodName);
560protected abstract MethodDesc GetManagedToNativeHelper();
562protected abstract MethodDesc GetNativeToManagedHelper();
619protected override MethodDesc GetManagedToNativeHelper()
624protected override MethodDesc GetNativeToManagedHelper()
640protected override MethodDesc GetManagedToNativeHelper()
645protected override MethodDesc GetNativeToManagedHelper()
879MethodDesc getNativeSizeHelper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AsAnyGetNativeSize"u8);
984MethodDesc guidCtorHandleMethod =
988MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertManagedComInterfaceToNative"u8);
998MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertManagedComInterfaceToIUnknown"u8);
1010MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertNativeComInterfaceToManaged"u8);
1029var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("FreeBSTR"u8, null);
1037var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "StringToAnsiBstrBuffer"u8);
1048var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiBstrBufferToString"u8);
1062var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("FreeBSTR"u8, null);
1070var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("StringToBSTR"u8, null);
1081var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "BstrBufferToString"u8);
1095var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "DateTimeToOleDateTime"u8);
1106var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "OleDateTimeToDateTime"u8);
1120var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "DecimalToOleCurrency"u8);
1131var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "OleCurrencyToDecimal"u8);
1171var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertObjectToVariant"u8);
1186var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "VariantToObject"u8);
1203var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "CleanupVariant"u8);
1227var getInstanceMethod = marshallerType.GetMethod(
1235var initializeCustomMarshallerMethod = Context.GetHelperEntryPoint("InteropHelpers"u8, "InitializeCustomMarshaller"u8);
1267var manageToNativeMethod = customMarshallerType.GetKnownMethod(
1296var marshalNativeToManagedMethod = customMarshallerType.GetKnownMethod(
1314var cleanupManagedDataMethod = customMarshallerType.GetKnownMethod(
1331var cleanupNativeDataMethod = customMarshallerType.GetKnownMethod(
Compiler\CallChainProfile.cs (21)
43private readonly Dictionary<MethodDesc, Dictionary<MethodDesc, int>> _resolvedProfileData;
64private Dictionary<MethodDesc, Dictionary<MethodDesc, int>> ResolveMethods(Dictionary<string, Dictionary<string, int>> profileData, CompilerTypeSystemContext context)
66var resolvedProfileData = new Dictionary<MethodDesc, Dictionary<MethodDesc, int>>();
67Dictionary<string, MethodDesc> nameToMethodDescMap = new Dictionary<string, MethodDesc>();
72var resolvedKeyMethod = CachedResolveMethodName(nameToMethodDescMap, keyAndMethods.Key, context);
80var resolvedCalledMethod = CachedResolveMethodName(nameToMethodDescMap ,methodAndHitCount.Key, context);
86resolvedProfileData.Add(resolvedKeyMethod, new Dictionary<MethodDesc, int>());
100private MethodDesc CachedResolveMethodName(Dictionary<string, MethodDesc> nameToMethodDescMap, string methodName, CompilerTypeSystemContext context)
102MethodDesc resolvedMethod = null;
126private MethodDesc ResolveMethodName(CompilerTypeSystemContext context, string methodName)
186var resolvedMethod = ResolveMethodName(context, resolvedModule, namespaceAndTypeName, methodNameWithoutType);
207var resolvedMethod = ResolveMethodName(context, module, namespaceAndTypeName, methodNameWithoutType);
228private MethodDesc ResolveMethodName(CompilerTypeSystemContext context, ModuleDesc module, string namespaceAndTypeName, string methodName)
235var resolvedMethod = resolvedType.GetMethod(Encoding.UTF8.GetBytes(methodName), null);
325public IReadOnlyDictionary<MethodDesc, Dictionary<MethodDesc, int>> ResolvedProfileData => _resolvedProfileData;
Compiler\DependencyAnalysis\ReadyToRunCodegenNodeFactory.cs (34)
74public HashSet<MethodDesc> CompiledMethodDefs;
131private NodeCache<MethodDesc, MethodWithGCInfo> _localMethodCache;
133public MethodWithGCInfo CompiledMethodNode(MethodDesc method)
140private bool CanPrecompileUnboxingStub(MethodDesc targetMethod)
162public bool NeedsUnboxingStub(MethodDesc method)
171public DependencyNodeCore<NodeFactory> UnboxingStub(MethodDesc targetMethod)
181MethodDesc thunk = targetMethod.IsSharedByGenericInstantiations && !targetMethod.HasInstantiation
188private WasmUnboxingStubTargetNode CreateWasmUnboxingStubTargetNode(MethodDesc targetMethod)
191MethodDesc thunk = targetMethod.IsSharedByGenericInstantiations && !targetMethod.HasInstantiation
254private NodeCache<MethodDesc, GVMDependenciesNode> _gvmDependenciesNode;
256public GVMDependenciesNode GVMDependencies(MethodDesc method)
259MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
260MethodDesc canonSlotMethodDefinition = MetadataVirtualMethodAlgorithm.FindSlotDefiningMethodForVirtualMethod(canonMethod.GetMethodDefinition());
264private NodeCache<MethodDesc, VirtualMethodUseNode> _virtualMethodUseNodes;
266public VirtualMethodUseNode VirtualMethodUse(MethodDesc method)
270MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
402_gvmDependenciesNode = new NodeCache<MethodDesc, GVMDependenciesNode>(method =>
412_virtualMethodUseNodes = new NodeCache<MethodDesc, VirtualMethodUseNode>(method =>
484_wasmUnboxingStubTargets = new NodeCache<MethodDesc, WasmUnboxingStubTargetNode>(CreateWasmUnboxingStubTargetNode);
488_localMethodCache = new NodeCache<MethodDesc, MethodWithGCInfo>(key =>
542_copiedMethodIL = new NodeCache<MethodDesc, CopiedMethodILNode>(method =>
670MethodDesc compilableMethod = method.Method.GetCanonMethodTarget(CanonicalFormKind.Specific);
716MethodDesc method = methodNode.Method;
745public HashSet<MethodDesc> BuildCompiledMethodDefsSet()
749var set = new HashSet<MethodDesc>();
878public readonly MethodDesc Method;
880public ILBodyFixupSignatureFixupKey(ReadyToRunFixupKind fixupKind, MethodDesc method)
895public ILBodyFixupSignature ILBodyFixupSignature(ReadyToRunFixupKind fixupKind, MethodDesc method)
1251foreach (MethodDesc method in ProfileDataManager.GetInputProfileDataMethodsForModule(inputModule))
1439private NodeCache<MethodDesc, CopiedMethodILNode> _copiedMethodIL;
1481public bool CanBeInGenericCycle(MethodDesc method)
1486MethodDesc methodDefinition = method.GetTypicalMethodDefinition();
1530private NodeCache<MethodDesc, WasmUnboxingStubTargetNode> _wasmUnboxingStubTargets;
1545public WasmTypeNode WasmTypeNode(MethodDesc method)
Compiler\ProfileData.cs (10)
37public MethodProfileData(MethodDesc method, MethodProfilingDataFlags flags, double exclusiveWeight, Dictionary<MethodDesc, int> callWeights, uint scenarioMask, PgoSchemaElem[] schemaData)
49public readonly MethodDesc Method;
53public readonly Dictionary<MethodDesc, int> CallWeights;
61public abstract MethodProfileData GetMethodProfileData(MethodDesc m);
63public abstract byte[] GetMethodBlockCount(MethodDesc m);
65public static void MergeProfileData(Dictionary<MethodDesc, MethodProfileData> mergedProfileData, ProfileData profileData)
81mergedCallWeights = new Dictionary<MethodDesc, int>(data.CallWeights);
135public override MethodProfileData GetMethodProfileData(MethodDesc m)
145public override byte[] GetMethodBlockCount(MethodDesc m)
Compiler\ProfileDataManager.cs (31)
45Func<MethodDesc, bool> canBeIncludedInCurrentCompilation,
102public IEnumerable<MethodDesc> GetInputProfileDataMethodsForModule(ModuleDesc moduleDesc)
107public bool IsMethodInInputProfileData(MethodDesc method)
112public MethodProfileData this[MethodDesc method]
133public MethodProfileData GetAllowSynthesis(Compilation comp, MethodDesc method, out bool isSynthesized)
176private PgoSchemaElem[] SynthesizeSchema(Compilation comp, MethodDesc method)
198MethodDesc targetMeth = obj as MethodDesc;
264IList<MethodDesc> compatible = _gdvEntityFinder.GetCompatibleWithDelegateInvoke(delegateSignature);
284Debug.Assert(value is MethodDesc or TypeDesc);
285if (value is MethodDesc md)
322private readonly Dictionary<MethodDesc, MethodProfileData> _profileData = new();
323private readonly Dictionary<ModuleDesc, HashSet<MethodDesc>> _placedProfileMethods = new();
324private readonly HashSet<MethodDesc> _placedProfileMethodsAll = new();
332public MethodProfileData this[MethodDesc method]
344foreach ((MethodDesc method, MethodProfileData profileData) in _profileData)
350public bool Contains(MethodDesc md) => _profileData.ContainsKey(md);
352private void AssociateMethodProfileDataWithModule(MethodDesc method, MethodProfileData profileData)
383if (!_placedProfileMethods.TryGetValue(home, out HashSet<MethodDesc> set))
384_placedProfileMethods.Add(home, set = new HashSet<MethodDesc>());
391public IEnumerable<MethodDesc> GetPlacedMethodsForModuleDesc(ModuleDesc moduleDesc)
396return Array.Empty<MethodDesc>();
412private readonly Dictionary<MethodSignature, List<MethodDesc>> _delegateTargets;
417Dictionary<MethodSignature, HashSet<MethodDesc>> delegateTargets = new();
426foreach (MethodDesc method in type.GetMethods())
434if (!delegateTargets.TryGetValue(method.Signature, out HashSet<MethodDesc> set))
435delegateTargets.Add(method.Signature, set = new HashSet<MethodDesc>());
480List<MethodDesc> list = new(kvp.Value);
493public IList<MethodDesc> GetCompatibleWithDelegateInvoke(MethodSignature delegateInvokeSignature)
495return _delegateTargets.TryGetValue(delegateInvokeSignature, out List<MethodDesc> methods) ? methods : Array.Empty<MethodDesc>();
Compiler\ReadyToRunCodegenCompilation.cs (50)
80public bool CanInline(MethodDesc caller, MethodDesc callee)
106MethodDesc calleeMethodImpl = callee.OwningType.FindVirtualFunctionTargetMethodOnObjectType(callee);
118public virtual MethodIL GetMethodIL(MethodDesc method)
128public bool IsEffectivelySealed(MethodDesc method)
133public MethodDesc ResolveVirtualMethod(MethodDesc declMethod, TypeDesc implType, out CORINFO_DEVIRTUALIZATION_DETAIL devirtualizationDetail)
183public sealed class ILCache : LockFreeReaderHashtable<MethodDesc, ILCache.MethodILData>
196protected override int GetKeyHashCode(MethodDesc key)
204protected override bool CompareKeyToValue(MethodDesc key, MethodILData value)
212protected override MethodILData CreateValueFromKey(MethodDesc key)
227public MethodDesc Method;
259public void AddCompilationRoot(MethodDesc method, bool rootMinimalDependencies, string reason, bool isJitHelper = false)
261MethodDesc canonMethod = method.GetCanonMethodTarget(CanonicalFormKind.Specific);
310private readonly Func<MethodDesc, string> _printReproInstructions;
314private readonly HashSet<MethodDesc> _methodsWhichNeedMutableILBodies = new HashSet<MethodDesc>();
316private HashSet<MethodDesc> _directManagedHelpers;
326internal bool IsDirectManagedHelperEligible(MethodDesc method)
331HashSet<MethodDesc> directManagedHelpers = Volatile.Read(ref _directManagedHelpers);
361Func<MethodDesc, string> printReproInstructions,
477HashSet<MethodDesc> compiledMethodDefs = null;
504private void RewriteComponentFile(string inputFile, string outputFile, string ownerExecutableName, HashSet<MethodDesc> compiledMethodDefs)
722public void PrepareForCompilationRetry(MethodWithGCInfo methodToBeRecompiled, IEnumerable<MethodDesc> methodsThatNeedILBodies)
729foreach (var method in methodsThatNeedILBodies)
770var method = methodCodeNodeNeedingCode.Method;
771var typicalDef = method.GetTypicalMethodDefinition();
844void EnsureGeneratedILTokensAreAvailable(MethodDesc method)
885MethodDesc[] mutableMethodBodyNeedList = new MethodDesc[_methodsWhichNeedMutableILBodies.Count];
889Comparison<MethodDesc> comparison = (MethodDesc a, MethodDesc b) => comparer.Compare(a, b);
893foreach (var method in mutableMethodBodyNeedList)
905HashSet<MethodDesc> deniedHelpers = new HashSet<MethodDesc>();
912HashSet<MethodDesc> newlyDeniedHelpers = new HashSet<MethodDesc>();
946foreach (MethodDesc method in probeResult.MethodsRequiringILBodies)
1030HashSet<MethodDesc> deniedHelpers)
1032HashSet<MethodDesc> directManagedHelpers = new HashSet<MethodDesc>();
1079void LogManagedHelperProbeFailure(MethodDesc method, string reason)
1144MethodDesc method = methodCodeNodeNeedingCode.Method;
1196private void EnsureInstantiationReferencesArePresentForExternalMethod(MethodDesc method)
1207private void AddNecessaryAsyncReferences(MethodDesc method)
1232MethodDesc[] requiredMethods =
1276private void AddNecessaryDelegateCtorReferences(MethodDesc method)
1287MethodDesc[] requiredMethods =
1318public string GetReproInstructions(MethodDesc method)
Compiler\ReadyToRunCompilationModuleGroupBase.cs (25)
55private readonly ConcurrentDictionary<MethodDesc, bool> _versionsWithMethodCache = new ConcurrentDictionary<MethodDesc, bool>();
56private readonly Func<MethodDesc, bool> _versionsWithMethodUncached;
57private readonly ConcurrentDictionary<MethodDesc, bool> _crossModuleInlineableCache = new ConcurrentDictionary<MethodDesc, bool>();
58private readonly Func<MethodDesc, bool> _crossModuleInlineableCacheUncached;
61private readonly ConcurrentDictionary<MethodDesc, bool> _crossModuleCompilableCache = new ConcurrentDictionary<MethodDesc, bool>();
62private readonly Func<MethodDesc, bool> _crossModuleCompilableCacheUncached;
108public bool IsDirectPInvoke(MethodDesc method)
134public sealed override bool ContainsMethodBody(MethodDesc method, bool unboxingStub)
152protected abstract bool ContainsMethodBodyCore(MethodDesc method, bool unboxingStub);
170protected bool CompileVersionBubbleGenericsIntoCurrentModule(MethodDesc method)
435public sealed override bool VersionsWithMethodBody(MethodDesc method)
440private bool VersionsWithMethodUncached(MethodDesc method)
456public sealed override bool CanInline(MethodDesc callerMethod, MethodDesc calleeMethod)
473public bool IsNonVersionableWithILTokensThatDoNotNeedTranslation(MethodDesc method)
481public override bool CrossModuleCompileable(MethodDesc method)
489private bool CrossModuleCompileableUncached(MethodDesc method)
556public override bool CrossModuleInlineable(MethodDesc method)
565private bool CrossModuleInlineableInternal(MethodDesc method)
570private bool CrossModuleInlineableUncached(MethodDesc method)
757public sealed override bool GeneratesPInvoke(MethodDesc method)
941entityDefinitionInstantiation = ((MethodDesc)entityWithInstantiation).GetTypicalMethodDefinition().Instantiation;
JitInterface\CorInfoImpl.ReadyToRun.cs (85)
143public readonly MethodDesc Method;
150public MethodWithToken(MethodDesc method, ModuleToken token, TypeDesc constrainedType, bool unboxing, TypeSystemEntity genericContextObject, TypeDesc devirtualizedMethodOwner = null, bool forceOwningTypeFromMethodDesc = false)
153Debug.Assert(genericContextObject is null or MethodDesc or TypeDesc);
218if (genericContextObject is MethodDesc methodContext)
438public TypeDesc ContextType { get { return (Context is MethodDesc contextAsMethod ? contextAsMethod.OwningType : (TypeDesc)Context); } }
440public MethodDesc ContextMethod { get { return (MethodDesc)Context; } }
455if (Context is MethodDesc contextAsMethod)
480MethodDesc[] methodsRequiringILBodies)
485public MethodDesc[] MethodsRequiringILBodies { get; } = methodsRequiringILBodies;
496private HashSet<MethodDesc> _inlinedMethods;
499private List<MethodDesc> _ilBodiesNeeded;
501private HashSet<MethodDesc> _synthesizedPgoDependencies;
530MethodDesc asyncResumptionStub = _compilation.TypeSystemContext.GetAsyncResumptionStub(MethodBeingCompiled, MethodBeingCompiled.OwningType);
562public static bool ShouldSkipCompilation(InstructionSetSupport instructionSetSupport, MethodDesc methodNeedingCode, ReadyToRunCodegenCompilation compilation = null)
605public static bool ShouldCodeNotBeCompiledIntoFinalImage(InstructionSetSupport instructionSetSupport, MethodDesc method)
720private static ConditionalWeakTable<MethodDesc, DeterminismData> _determinismTable = new ConditionalWeakTable<MethodDesc, DeterminismData>();
785public static bool IsMethodCompilable(Compilation compilation, MethodDesc method, bool isJitHelper)
809public ManagedHelperProbeResult ProbeManagedHelper(MethodDesc method, Logger logger)
863var typicalDef = MethodBeingCompiled.GetTypicalMethodDefinition();
894_ilBodiesNeeded = _ilBodiesNeeded ?? new List<MethodDesc>();
920MethodDesc[] methodsRequiringILBodies = _ilBodiesNeeded is null ? null : [.. _ilBodiesNeeded];
1058MethodDesc targetMethodDesc = HandleToObject(pTargetMethod.hMethod);
1084private void AddManagedHelperDependency(MethodDesc helperMethod)
1098private ISymbolNode GetHelperFtnUncached(CorInfoHelpFunc ftnNum, out MethodDesc helperMethod)
1100MethodDesc managedHelper = ReadyToRunJitHelperRootProvider.GetManagedHelper(
1461var method = HandleToObject(ftn);
1481MethodDesc targetMethod = HandleToObject(targetMethodHnd);
1482MethodDesc delegateInvoke = HandleToObject(clsHnd).GetKnownMethod("Invoke"u8, null);
1502private MethodWithToken ComputeMethodWithToken(MethodDesc method, ref CORINFO_RESOLVED_TOKEN pResolvedToken, TypeDesc constrainedType, bool unboxing)
1517ModuleToken _HandleToModuleToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken, MethodDesc methodDesc, out TypeSystemEntity context, ref TypeDesc constrainedType, out bool strippedInstantiation)
1577if (resultDef is MethodDesc resultMethod)
1584var primaryMethod = resultMethod.GetPrimaryMethodDesc();
1891MethodDesc callerMethod = HandleToObject(callerHandle);
2054out MethodDesc methodToCall,
2055out MethodDesc targetMethod,
2057out MethodDesc originalMethod,
2059out MethodDesc callerMethod,
2087MethodDesc versioningCallerMethod = _compilation.TypeSystemContext.IsUnboxingThunk(callerMethod)
2131MethodDesc methodAfterConstraintResolution = originalMethod;
2146MethodDesc methodOnUnderlyingType = constrainedType.UnderlyingType.FindVirtualFunctionTargetMethodOnObjectType(originalMethod);
2154MethodDesc directMethod = constrainedType.TryResolveConstraintMethodApprox(exactType, originalMethod, out forceUseRuntimeLookup, ref dimResolution);
2246var rawMethod = (MethodDesc)methodIL.GetMethodILScopeDefinition().GetObject((int)pResolvedToken.token);
2338MethodDesc canonMethod = (isArrayConstructor ? null : targetMethod.GetCanonMethodTarget(CanonicalFormKind.Specific));
2542MethodDesc method = HandleToObject(ftn);
2547private void PrepareForUseAsAFunctionPointer(MethodDesc method)
2604private void UpdateConstLookupWithRequiresRuntimeJitSymbolIfNeeded(ref CORINFO_CONST_LOOKUP constLookup, MethodDesc method)
2626MethodDesc methodToCall;
2627MethodDesc targetMethod;
2629MethodDesc originalMethod;
2631MethodDesc callerMethod;
2741MethodDesc nonUnboxingMethod = methodToCall;
2768MethodDesc compilableTarget = nonUnboxingMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
2826MethodDesc canonMethod = targetMethod.GetCanonMethodTarget(CanonicalFormKind.Specific);
2909MethodDesc templateMethod,
2910MethodDesc callerHandle,
2928MethodDesc contextMethod = callerHandle;
2995if (helperArg is MethodDesc methodDesc)
2998MethodDesc sharedMethod = methodIL.OwningMethod.GetSharedRuntimeFormMethodTarget();
3022HandleToObject(pResolvedToken.hMethod) is MethodDesc declaringMethod &&
3059MethodDesc templateMethod = null;
3063MethodDesc md = HandleToObject(pResolvedToken.hMethod);
3095MethodDesc declaringMethod = HandleToObject(pResolvedToken.hMethod);
3212MethodDesc md = HandleToObject(pResolvedToken.hMethod);
3246private MethodDesc getUnboxingThunk(MethodDesc method)
3254MethodDesc methodDesc = HandleToObject(handle);
3273private void PreventRecursiveFieldInlinesOutsideVersionBubble(FieldDesc field, MethodDesc callerMethod)
3283private void EncodeFieldBaseOffset(FieldDesc field, ref CORINFO_RESOLVED_TOKEN pResolvedToken, CORINFO_FIELD_INFO* pResult, MethodDesc callerMethod)
3573MethodDesc methodDesc = HandleToObject(method);
3601var method = HandleToObject(handle);
3736private readonly Stack<HashSet<MethodDesc>> _stashedInlinedMethods = new Stack<HashSet<MethodDesc>>();
3751MethodDesc inlinee = HandleToObject(inlineeHnd);
3780HashSet<MethodDesc> previouslyStashedInlinees = _stashedInlinedMethods.Pop();
3783previouslyStashedInlinees = previouslyStashedInlinees ?? new HashSet<MethodDesc>();
3784foreach (var inlineeInHashSet in _inlinedMethods)
3790_inlinedMethods = _inlinedMethods ?? new HashSet<MethodDesc>();
3793var typicalMethod = inlinee.GetTypicalMethodDefinition();
3800_ilBodiesNeeded = _ilBodiesNeeded ?? new List<MethodDesc>();
3833_ilBodiesNeeded = _ilBodiesNeeded ?? new List<MethodDesc>();
3954MethodDesc method = HandleToObject(ftn);
3984MethodDesc method = methodHandle is null ? null : HandleToObject(methodHandle);
ObjectWriter\ProfileFileBuilder.cs (9)
33public readonly MethodDesc Caller;
36public readonly MethodDesc Callee;
42public CallInfo(MethodDesc caller, OutputNode callerNode, int callerRVA, MethodDesc callee, OutputNode calleeNode, int calleeRVA, int callCount, CrossPageCall callType)
60private Dictionary<MethodDesc, ISymbolDefinitionNode> _symbolMethodMap;
135_symbolMethodMap = new Dictionary<MethodDesc, ISymbolDefinitionNode>();
153foreach (KeyValuePair<MethodDesc, Dictionary<MethodDesc, int>> kvpCallerCalleeCount in _callChainProfile.ResolvedProfileData)
163foreach (KeyValuePair<MethodDesc, int> kvpCalleeCount in kvpCallerCalleeCount.Value)
parent\parent\Common\Compiler\CachingVirtualMethodAlgorithm.cs (19)
15private readonly ConcurrentDictionary<TypeDesc, (MethodDesc Slot, MethodDesc Implementation)[]> _vtableCache
16= new ConcurrentDictionary<TypeDesc, (MethodDesc Slot, MethodDesc Implementation)[]>();
18private readonly Func<TypeDesc, (MethodDesc Slot, MethodDesc Implementation)[]> _vtableCreator;
23private (MethodDesc Slot, MethodDesc Implementation)[] ComputeVtable(TypeDesc type)
28var result = new ArrayBuilder<(MethodDesc Slot, MethodDesc Implementation)>(3 /* At least Equals/GetHashCode/ToString */);
30foreach (MethodDesc slotDecl in base.ComputeAllVirtualSlots(type))
38public override IEnumerable<MethodDesc> ComputeAllVirtualSlots(TypeDesc type)
46static IEnumerable<MethodDesc> GetCachedSlots(CachingVirtualMethodAlgorithm thisObj, TypeDesc type)
48foreach ((MethodDesc slot, _) in thisObj._vtableCache.GetOrAdd(type.GetTypeDefinition(), thisObj._vtableCreator))
55public override MethodDesc FindVirtualFunctionTargetMethodOnObjectType(MethodDesc targetMethod, TypeDesc objectType)
58MethodDesc targetMethodDefinition = targetMethod.GetMethodDefinition();
60MethodDesc slotDefiningMethod = targetMethodDefinition;
71MethodDesc result = kvp.Implementation;
parent\parent\Common\Compiler\CompilerTypeSystemContext.Async.cs (47)
16public static IEnumerable<MethodDesc> GetAllMethodsAndAsyncVariants(this TypeDesc type)
31private MethodDesc DecomposeAsyncVariant(MethodDesc method, out bool isAsyncVariant)
37private MethodDesc WrapAsAsyncVariant(MethodDesc originalMethod, MethodDesc resolvedMethod)
42MethodDesc asyncVariant = _context.GetAsyncVariantMethod(resolvedMethod);
55public override MethodDesc FindVirtualFunctionTargetMethodOnObjectType(MethodDesc targetMethod, TypeDesc objectType)
58MethodDesc result = base.FindVirtualFunctionTargetMethodOnObjectType(targetMethod, objectType);
65public override DefaultInterfaceMethodResolution ResolveInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, TypeDesc currentType, out MethodDesc impl)
75public override MethodDesc ResolveInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
78MethodDesc result = base.ResolveInterfaceMethodToStaticVirtualMethodOnType(interfaceMethod, currentType);
84public override MethodDesc ResolveInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
87MethodDesc result = base.ResolveInterfaceMethodToVirtualMethodOnType(interfaceMethod, currentType);
93public override DefaultInterfaceMethodResolution ResolveVariantInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, TypeDesc currentType, out MethodDesc impl)
102public override MethodDesc ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
105MethodDesc result = base.ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(interfaceMethod, currentType);
111public override MethodDesc ResolveVariantInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
114MethodDesc result = base.ResolveVariantInterfaceMethodToVirtualMethodOnType(interfaceMethod, currentType);
121public override IEnumerable<MethodDesc> ComputeAllVirtualSlots(TypeDesc type)
127internal static IEnumerable<MethodDesc> WithAsyncVariants(CompilerTypeSystemContext context, IEnumerable<MethodDesc> methods)
129foreach (MethodDesc method in methods)
172public MethodDesc GetTargetOfAsyncVariantMethod(MethodDesc asyncVariantMethod)
175MethodDesc result = asyncMethodVariantDefinition.Target;
191public MethodDesc GetAsyncVariantMethod(MethodDesc taskReturningMethod)
194MethodDesc taskReturningMethodDefinition = taskReturningMethod.GetTypicalMethodDefinition();
195MethodDesc result = _asyncVariantHashtable.GetOrCreateValue((EcmaMethod)taskReturningMethodDefinition);
210public MethodDesc GetTargetOfReturnDroppingThunk(MethodDesc returnDroppingThunk)
214MethodDesc result = returnDroppingThunkDefinition.AsyncVariantTarget;
241public MethodDesc GetReturnDroppingAsyncVariantMethod(MethodDesc asyncVariantMethod)
246MethodDesc typicalMethodDefinition = asyncVariantMethod.GetTypicalMethodDefinition();
247MethodDesc result = _returnDroppingHashtable.GetOrCreateValue((AsyncMethodVariant)typicalMethodDefinition);
273public AsyncResumptionStub GetAsyncResumptionStub(MethodDesc targetMethod, TypeDesc owningType)
280public readonly MethodDesc TargetMethod;
283public AsyncResumptionStubKey(MethodDesc targetMethod, TypeDesc owningType)
parent\parent\Common\Compiler\Dataflow\DynamicallyAccessedMembersBinder.cs (12)
38foreach (var c in typeDefinition.ApplyIncludeInherited(t => t.GetConstructorsOnType(filter: null, bindingFlags: BindingFlags.NonPublic), withInherited))
45foreach (var c in typeDefinition.ApplyIncludeInherited(t => t.GetConstructorsOnType(filter: null, bindingFlags: BindingFlags.Public), withInherited))
51foreach (var c in typeDefinition.GetConstructorsOnType(filter: m => m.IsPublic() && !m.HasMetadataParameters()))
58foreach (var m in typeDefinition.ApplyIncludeInherited(t => t.GetMethodsOnTypeHierarchy(filter: null, bindingFlags: BindingFlags.NonPublic | declaredOnlyFlags), withInherited))
64foreach (var m in typeDefinition.GetMethodsOnTypeHierarchy(filter: null, bindingFlags: BindingFlags.Public | declaredOnlyFlags))
140public static IEnumerable<MethodDesc> GetConstructorsOnType(this TypeDesc type, Func<MethodDesc, bool> filter, BindingFlags? bindingFlags = null)
148foreach (var method in type.GetMethods())
172public static IEnumerable<MethodDesc> GetMethodsOnTypeHierarchy(this TypeDesc type, Func<MethodDesc, bool> filter, BindingFlags? bindingFlags = null)
185foreach (var method in type.GetMethods())
493foreach (var m in type.GetMethods())
parent\parent\Common\JitInterface\CorInfoImpl.cs (82)
78private Dictionary<MethodDesc, PgoInstrumentationResults> _pgoResults = new Dictionary<MethodDesc, PgoInstrumentationResults>();
316MethodDesc method = (MethodDesc)handleToObject[likelyClassMethods->handle];
564MethodDesc[] inlineeArray;
567inlineeArray = new MethodDesc[_inlinedMethods.Count];
573inlineeArray = Array.Empty<MethodDesc>();
682private MethodDesc MethodBeingCompiled
790private Dictionary<MethodDesc, IntPtr> _methodILScopeToHandle = new Dictionary<MethodDesc, IntPtr>(new JitObjectComparer());
826private MethodDesc HandleToObject(CORINFO_METHOD_STRUCT_* method) => (MethodDesc)HandleToObject((void*)method);
827private CORINFO_METHOD_STRUCT_* ObjectToHandle(MethodDesc method) => (CORINFO_METHOD_STRUCT_*)ObjectToHandle((object)method);
840MethodDesc owningMethod = methodIL.OwningMethod;
846private bool Get_CORINFO_METHOD_INFO(MethodDesc method, MethodIL methodIL, CORINFO_METHOD_INFO* methodInfo)
915private void Get_CORINFO_SIG_INFO(MethodDesc method, CORINFO_SIG_INFO* sig, MethodILScope scope, bool suppressHiddenArgument = false)
1080private CORINFO_CONTEXT_STRUCT* contextFromMethod(MethodDesc method)
1095private MethodDesc methodFromContext(CORINFO_CONTEXT_STRUCT* contextStruct)
1141MethodDesc method = HandleToObject(ftn);
1147MethodDesc method = HandleToObject(ftn);
1175private uint getMethodAttribsInternal(MethodDesc method)
1296MethodDesc caller = HandleToObject(callerHnd);
1318MethodDesc callee = exactCalleeHnd == null ? null : HandleToObject(exactCalleeHnd);
1330MethodDesc method = HandleToObject(ftn);
1363MethodDesc method = HandleToObject(ftn);
1368if (ctx is MethodDesc methodFromCtx && context != contextFromMethodBeingCompiled())
1375MethodDesc instantiatedMethod = _compilation.TypeSystemContext.GetMethodForInstantiatedType(method.GetTypicalMethodDefinition(), instantiatedCtxType);
1397MethodDesc meth1 = HandleToObject(methHnd1);
1398MethodDesc meth2 = HandleToObject(methHnd2);
1409MethodDesc callerMethod = HandleToObject(callerHnd);
1410MethodDesc calleeMethod = HandleToObject(calleeHnd);
1477var m = HandleToObject(method);
1498MethodDesc decl = HandleToObject(info->virtualMethod);
1513MethodDesc originalImpl = _compilation.ResolveVirtualMethod(decl, objType, out info->detail);
1536MethodDesc impl = originalImpl.GetCanonMethodTarget(CanonicalFormKind.Specific);
1540MethodDesc nonUnboxingImpl = impl;
1624MethodDesc instArgTarget = unboxingStub ? nonUnboxingImpl : impl;
1706static CORINFO_RESOLVED_TOKEN CreateResolvedTokenFromMethod(CorInfoImpl jitInterface, MethodDesc method
1746MethodDesc method = HandleToObject(ftn);
1802MethodDesc methodDesc = HandleToObject(method);
1814private static CorInfoCallConvExtension GetUnmanagedCallConv(MethodDesc methodDesc, out bool suppressGCTransition)
1904if (result is MethodDesc methodResult)
1922MethodDesc owningMethod = methodIL.OwningMethod;
1943var methodContext = (MethodDesc)typeOrMethodContext;
1986result = _compilation.TypeSystemContext.GetAsyncVariantMethod((MethodDesc)result);
1995if (result is MethodDesc method)
1999MethodDesc sharedMethod = methodIL.OwningMethod.GetSharedRuntimeFormMethodTarget();
2001Debug.Assert(((MethodDesc)result).IsRuntimeDeterminedExactMethod);
2008MethodDesc sharedMethod = methodIL.OwningMethod.GetSharedRuntimeFormMethodTarget();
2018MethodDesc sharedMethod = methodIL.OwningMethod.GetSharedRuntimeFormMethodTarget();
2058if (result is MethodDesc method)
2152private static bool HasCallableAsyncVariant(MethodDesc method)
2193Get_CORINFO_SIG_INFO(((MethodDesc)methodIL.GetObject((int)methTOK)), sig: sig, methodIL);
2949MethodDesc md = method == null ? MethodBeingCompiled : HandleToObject(method);
3734MethodDesc caller = HandleToObject(callerHandle);
3737MethodDesc taskReturningMethod = caller.GetTargetOfAsyncVariant();
3745MethodDesc runtimeDeterminedCaller = caller.GetSharedRuntimeFormMethodTarget();
3748MethodDesc result;
3749MethodDesc runtimeDeterminedResult;
3770MethodDesc targetMethod = runtimeDeterminedResult.GetCanonMethodTarget(CanonicalFormKind.Specific);
3812MethodDesc caller = HandleToObject(callerHandle);
3813MethodDesc awaitAwaiterMethod = HandleToObject(pResolvedToken.hMethod);
3819var runtimeDeterminedAwaitAwaiterMethod = (MethodDesc)GetRuntimeDeterminedObjectForToken(ref pResolvedToken);
3830MethodDesc typicalMethod = asyncHelpers.GetKnownMethod(
3833MethodDesc result = typicalMethod.MakeInstantiatedMethod(awaiterType);
3834MethodDesc runtimeDeterminedResult = typicalMethod.MakeInstantiatedMethod(runtimeDeterminedAwaiterType);
3836MethodDesc targetMethod = runtimeDeterminedResult.GetCanonMethodTarget(CanonicalFormKind.Specific);
3896MethodDesc method = HandleToObject(hMethod);
3903MethodDesc methodDefinition = method.GetTypicalMethodDefinition();
3933MethodDesc method = HandleToObject(ftn);
3937private static string getMethodNameFromMetadataImpl(MethodDesc method, out string className, out string namespaceName, string[] enclosingClassName)
3969MethodDesc method = HandleToObject(ftn);
4134private Dictionary<CorInfoHelpFunc, (ISymbolNode EntryPoint, MethodDesc Method)> _helperCache =
4135new Dictionary<CorInfoHelpFunc, (ISymbolNode EntryPoint, MethodDesc Method)>();
4144if (!_helperCache.TryGetValue(ftnNum, out (ISymbolNode EntryPoint, MethodDesc Method) helper))
4146ISymbolNode entryPoint = GetHelperFtnUncached(ftnNum, out MethodDesc method);
4208private static CORINFO_RUNTIME_LOOKUP_KIND GetGenericRuntimeLookupKind(MethodDesc method)
4223MethodDesc method = HandleToObject(context);
5060MethodDesc methodDesc = HandleToObject(ftnHnd);
5070_synthesizedPgoDependencies = new HashSet<MethodDesc>();
parent\parent\Common\TypeSystem\IL\HelperExtensions.cs (8)
30public static MethodDesc GetHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName)
33MethodDesc helperMethod = helperType.GetKnownMethod(methodName, null);
37public static MethodDesc GetCoreLibEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> namespaceName, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName, MethodSignature signature)
43public static MethodDesc GetOptionalHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName)
46MethodDesc helperMethod = helperType?.GetMethod(methodName, null);
55public static void EmitCallThrowHelper(this ILCodeStream codeStream, ILEmitter emitter, MethodDesc method)
74public static MethodDesc GetKnownMethod(this TypeDesc type, ReadOnlySpan<byte> name, MethodSignature signature)
76MethodDesc method = type.GetMethod(name, signature);
PortableCallHelpers\PInvokeCollector.cs (6)
132public void CollectPInvokes(List<PInvokeInfo> pinvokes, List<PInvokeCallback> callbacks, Dictionary<string, MethodDesc> signatures, EcmaType type)
134foreach (MethodDesc methodDesc in type.GetMethods())
161MethodDesc invokeMethod = type.GetMethod("Invoke"u8, null);
188private void CollectUnmanagedCalliSignatures(Dictionary<string, MethodDesc> signatures, EcmaMethod method)
257private void AddSignature(Dictionary<string, MethodDesc> signatures, MethodDesc method, WasmLowering.LoweringFlags flags, string kind)
parent\parent\Common\TypeSystem\Common\MetadataVirtualMethodAlgorithm.cs (134)
14private sealed class MethodDescHashtable : LockFreeReaderHashtable<MethodDesc, MethodDesc>
16protected override int GetKeyHashCode(MethodDesc key)
21protected override int GetValueHashCode(MethodDesc value)
26protected override bool CompareKeyToValue(MethodDesc key, MethodDesc value)
32protected override bool CompareValueToValue(MethodDesc value1, MethodDesc value2)
38protected override MethodDesc CreateValueFromKey(MethodDesc key)
46private MethodDesc[] _members = MethodDesc.EmptyMethods;
49private MethodDesc[] _methodsRequiringSlotUnification = MethodDesc.EmptyMethods;
57private MethodDesc[] _arrayToEnumerate;
59private MethodDesc _current;
61internal Enumerator(MethodDesc[] arrayToEnumerate)
65_current = default(MethodDesc);
80_current = default(MethodDesc);
84public MethodDesc Current
95private readonly MethodDesc[] _arrayToEnumerate;
97public Enumerable(MethodDesc[] arrayToEnumerate)
108public UnificationGroup(MethodDesc definingMethod)
114public MethodDesc DefiningMethod;
120public void AddMethodRequiringSlotUnification(MethodDesc method)
133public bool RequiresSlotUnification(MethodDesc method)
143public void SetDefiningMethod(MethodDesc newDefiningMethod)
151MethodDesc oldDefiningMethod = DefiningMethod;
159public void AddToGroup(MethodDesc method)
182public void RemoveFromGroup(MethodDesc method)
198public bool IsInGroupOrIsDefiningSlot(MethodDesc method)
206public bool IsInGroup(MethodDesc method)
218public override MethodDesc FindVirtualFunctionTargetMethodOnObjectType(MethodDesc targetMethod, TypeDesc objectType)
229private static MethodDesc FindVirtualFunctionTargetMethodOnObjectType(MethodDesc targetMethod, MetadataType objectType)
233MethodDesc initialTargetMethod = targetMethod;
242MethodDesc initialTargetMethodDefinition = targetMethod;
253MethodDesc resolutionTarget = FindNameSigOverrideForVirtualMethod(group.DefiningMethod, uninstantiatedType);
281private static MethodDesc FindImplFromDeclFromMethodImpls(MetadataType type, MethodDesc decl)
293MethodDesc recordDecl = record.Decl;
309private static MethodDesc FindInterfaceImplFromDeclFromMethodImpls(MetadataType type, MethodDesc decl)
322MethodDesc recordDecl = foundMethodImpls[i].Decl;
381private static MethodDesc FindMatchingVirtualMethodOnTypeByNameAndSig(MethodDesc targetMethod, DefType currentType, bool reverseMethodSearch, Func<MethodDesc, MethodDesc, bool> nameSigMatchMethodIsValidCandidate)
386MethodDesc implMethod = null;
387MethodDesc implMethodEquivalent = null;
388foreach (MethodDesc candidate in currentType.GetAllVirtualMethods())
420private static MethodDesc FindNameSigOverrideForVirtualMethod(MethodDesc targetMethod, MetadataType currentType)
424MethodDesc nameSigOverride = FindMatchingVirtualMethodOnTypeByNameAndSigWithSlotCheck(targetMethod, currentType, reverseMethodSearch:true);
440public static MethodDesc FindSlotDefiningMethodForVirtualMethod(MethodDesc method)
452MethodDesc foundMethod = FindMatchingVirtualMethodOnTypeByNameAndSig(method, currentType, reverseMethodSearch: true, nameSigMatchMethodIsValidCandidate:null);
476private static MethodDesc FindMatchingVirtualMethodOnTypeByNameAndSigWithSlotCheck(MethodDesc method, DefType currentType, bool reverseMethodSearch)
481private static readonly Func<MethodDesc, MethodDesc, bool> s_VerifyMethodsHaveTheSameVirtualSlot = VerifyMethodsHaveTheSameVirtualSlot;
484private static bool VerifyMethodsHaveTheSameVirtualSlot(MethodDesc slotDefiningMethod, MethodDesc methodToVerify)
486MethodDesc slotDefiningMethodOfMethodToVerify = FindSlotDefiningMethodForVirtualMethod(methodToVerify);
490private static readonly Func<MethodDesc, MethodDesc, bool> s_VerifyMethodIsPublic = VerifyMethodIsPublic;
493private static bool VerifyMethodIsPublic(MethodDesc slotDefiningMethod, MethodDesc methodToVerify)
500MethodDesc originalDefiningMethod = unificationGroup.DefiningMethod;
502MethodDesc methodImpl = FindImplFromDeclFromMethodImpls(currentType, unificationGroup.DefiningMethod);
513MethodDesc nameSigMatchMethod = FindMatchingVirtualMethodOnTypeByNameAndSigWithSlotCheck(unificationGroup.DefiningMethod, currentType, reverseMethodSearch: true);
550foreach (MethodDesc memberMethod in unificationGroup.Members)
557MethodDesc nameSigMatchMemberMethod = FindMatchingVirtualMethodOnTypeByNameAndSigWithSlotCheck(memberMethod, currentType, reverseMethodSearch: true);
567foreach (MethodDesc separatedMethod in MethodDescHashtable.Enumerator.Get(separatedMethods))
576MethodDesc declSlot = FindSlotDefiningMethodForVirtualMethod(methodImplRecord.Decl);
577MethodDesc implSlot = FindSlotDefiningMethodForVirtualMethod(methodImplRecord.Body);
611foreach (MethodDesc methodImplRequiredToRemainInEffect in addDeclGroup.MethodsRequiringSlotUnification)
623foreach (MethodDesc addDeclGroupMemberMethod in addDeclGroup.Members)
653public override MethodDesc ResolveInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
658public override MethodDesc ResolveVariantInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
663public override MethodDesc ResolveInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
668public override MethodDesc ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, TypeDesc currentType)
698private static MethodDesc ResolveInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, MetadataType currentType, bool returnRecursive = false)
707MethodDesc methodImpl = FindImplFromDeclFromMethodImpls(currentType, interfaceMethod);
719MethodDesc foundOnCurrentType = FindMatchingVirtualMethodOnTypeByNameAndSig(interfaceMethod, currentType,
750MethodDesc baseClassImplementationOfInterfaceMethod = ResolveInterfaceMethodToVirtualMethodOnTypeRecursive(interfaceMethod, baseType);
757MethodDesc foundOnCurrentType = FindMatchingVirtualMethodOnTypeByNameAndSig(interfaceMethod, currentType,
771public static MethodDesc ResolveVariantInterfaceMethodToVirtualMethodOnType(MethodDesc interfaceMethod, MetadataType currentType)
777MethodDesc implMethod;
802private static MethodDesc ResolveInterfaceMethodToVirtualMethodOnTypeRecursive(MethodDesc interfaceMethod, MetadataType currentType)
817MethodDesc currentTypeInterfaceResolution = ResolveInterfaceMethodToVirtualMethodOnType(interfaceMethod, currentType, returnRecursive: true);
826private static MethodDesc FindNameSigOverrideForInterfaceMethodRecursive(MethodDesc interfaceMethod, MetadataType currentType)
833MethodDesc nameSigOverride = FindMatchingVirtualMethodOnTypeByNameAndSig(interfaceMethod, currentType,
846public override DefaultInterfaceMethodResolution ResolveInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, TypeDesc currentType, out MethodDesc impl)
851public override DefaultInterfaceMethodResolution ResolveVariantInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, TypeDesc currentType, out MethodDesc impl)
856public static DefaultInterfaceMethodResolution ResolveVariantInterfaceMethodToDefaultImplementationOnType(MethodDesc interfaceMethod, MetadataType currentType, out MethodDesc impl)
867MethodDesc interfaceMethod,
870out MethodDesc candidateMD)
873MethodDesc interfaceMethodDefinition = interfaceMethod.GetMethodDefinition();
929MethodDesc interfaceMethod,
932out MethodDesc impl)
935MethodDesc interfaceMethodDefinition = interfaceMethod.GetMethodDefinition();
951MethodDesc[] candidateMethods = new MethodDesc[consideredInterfaces.Length];
971if (!TryGetCandidateImplementation(currentMT, interfaceMethod, interfaceMT, allowVariance, out MethodDesc currentMD))
1044MethodDesc bestCandidateMD = null;
1083public override IEnumerable<MethodDesc> ComputeAllVirtualSlots(TypeDesc type)
1089public static IEnumerable<MethodDesc> EnumAllVirtualSlots(MetadataType type)
1093private static IEnumerable<MethodDesc> EnumAllVirtualSlotsOnClass(MetadataType type)
1098foreach (MethodDesc m in type.GetAllVirtualMethods())
1100MethodDesc possibleVirtual = FindSlotDefiningMethodForVirtualMethod(m);
1118public static MethodDesc ResolveInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, MetadataType currentType)
1128MethodDesc resolvedMethodOnType = TryResolveVirtualStaticMethodOnThisType(typeToCheck, interfaceMethod);
1143public static MethodDesc ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(MethodDesc interfaceMethod, MetadataType currentType)
1150MethodDesc resolvedMethodOnType = TryResolveVirtualStaticMethodOnThisType(typeToCheck, interfaceMethod);
1175MethodDesc runtimeInterfaceMethod = runtimeInterfaceType.FindMethodOnExactTypeWithMatchingTypicalMethod(interfaceMethod);
1193private static MethodDesc TryResolveVirtualStaticMethodOnThisType(MetadataType constrainedType, MethodDesc interfaceMethod)
1201MethodDesc interfaceMethodDefinition = interfaceMethod.GetMethodDefinition();
1206MethodDesc resolvedMethodImpl = methodImpl.Body;
parent\parent\Common\TypeSystem\Common\TypeSystemHelpers.cs (35)
30public static InstantiatedMethod MakeInstantiatedMethod(this MethodDesc methodDef, Instantiation instantiation)
35public static InstantiatedMethod MakeInstantiatedMethod(this MethodDesc methodDef, params TypeDesc[] genericParameters)
86public static MethodDesc GetParameterlessConstructor(this TypeDesc type)
98internal static MethodDesc FindMethodOnExactTypeWithMatchingTypicalMethod(this TypeDesc type, MethodDesc method)
100MethodDesc methodTypicalDefinition = method.GetTypicalMethodDefinition();
129public static MethodDesc FindMethodOnTypeWithMatchingTypicalMethod(this TypeDesc targetType, MethodDesc method)
152MethodDesc matchingMethod = targetOrBase.FindMethodOnExactTypeWithMatchingTypicalMethod(method);
165public static IEnumerable<MethodDesc> GetAllMethods(this TypeDesc type)
173public static IEnumerable<MethodDesc> GetAllVirtualMethods(this TypeDesc type)
178public static IEnumerable<MethodDesc> EnumAllVirtualSlots(this TypeDesc type)
187public static MethodDesc ResolveInterfaceMethodToVirtualMethodOnType(this TypeDesc type, MethodDesc interfaceMethod)
192public static MethodDesc ResolveVariantInterfaceMethodToVirtualMethodOnType(this TypeDesc type, MethodDesc interfaceMethod)
197public static MethodDesc ResolveInterfaceMethodToStaticVirtualMethodOnType(this TypeDesc type, MethodDesc interfaceMethod)
202public static MethodDesc ResolveVariantInterfaceMethodToStaticVirtualMethodOnType(this TypeDesc type, MethodDesc interfaceMethod)
207public static DefaultInterfaceMethodResolution ResolveInterfaceMethodToDefaultImplementationOnType(this TypeDesc type, MethodDesc interfaceMethod, out MethodDesc implMethod)
212public static DefaultInterfaceMethodResolution ResolveVariantInterfaceMethodToDefaultImplementationOnType(this TypeDesc type, MethodDesc interfaceMethod, out MethodDesc implMethod)
220public static MethodDesc FindVirtualFunctionTargetMethodOnObjectType(this TypeDesc type, MethodDesc targetMethod)
271public static MethodDesc InstantiateAsOpen(this MethodDesc method)
290public static MethodDesc ResolveInterfaceMethodTarget(this TypeDesc thisType, MethodDesc interfaceMethodToResolve)
294MethodDesc result;
310public static MethodDesc ResolveInterfaceMethodTargetWithVariance(this TypeDesc thisType, MethodDesc interfaceMethodToResolve)
314MethodDesc result;
374public static bool RequiresSlotUnification(this MethodDesc method)
parent\parent\Common\TypeSystem\IL\HelperExtensions.cs (8)
30public static MethodDesc GetHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName)
33MethodDesc helperMethod = helperType.GetKnownMethod(methodName, null);
37public static MethodDesc GetCoreLibEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> namespaceName, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName, MethodSignature signature)
43public static MethodDesc GetOptionalHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan<byte> typeName, ReadOnlySpan<byte> methodName)
46MethodDesc helperMethod = helperType?.GetMethod(methodName, null);
55public static void EmitCallThrowHelper(this ILCodeStream codeStream, ILEmitter emitter, MethodDesc method)
74public static MethodDesc GetKnownMethod(this TypeDesc type, ReadOnlySpan<byte> name, MethodSignature signature)
76MethodDesc method = type.GetMethod(name, signature);