コード例 #1
0
        public ISymbolNode FieldAddress(FieldDesc fieldDesc, SignatureContext signatureContext)
        {
            ISymbolNode result;

            if (!_fieldAddressCache.TryGetValue(fieldDesc, out result))
            {
                result = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    new FieldFixupSignature(ReadyToRunFixupKind.READYTORUN_FIXUP_FieldAddress, fieldDesc, signatureContext));
                _fieldAddressCache.Add(fieldDesc, result);
            }
            return(result);
        }
コード例 #2
0
        public ISymbolNode InterfaceDispatchCell(MethodDesc method, ModuleToken methodToken, SignatureContext signatureContext, bool isUnboxingStub, string callSite)
        {
            MethodAndCallSite cellKey = new MethodAndCallSite(method, callSite);

            if (!_interfaceDispatchCells.TryGetValue(cellKey, out ISymbolNode dispatchCell))
            {
                dispatchCell = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.DispatchImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_MethodCall |
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_FLAG_VSD,
                    _codegenNodeFactory.MethodSignature(ReadyToRunFixupKind.READYTORUN_FIXUP_VirtualEntry, method,
                                                        null, methodToken, signatureContext, isUnboxingStub, isInstantiatingStub: false),
                    callSite);

                _interfaceDispatchCells.Add(cellKey, dispatchCell);
            }
            return(dispatchCell);
        }
コード例 #3
0
        private ISymbolNode GenericLookupMethodHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            MethodWithToken methodArgument,
            TypeDesc contextType,
            SignatureContext signatureContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument, contextType);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument, contextType, signatureContext));
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }
コード例 #4
0
        private ISymbolNode GenericLookupFieldHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            FieldDesc fieldArgument,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.ReadyToRunHelper.DelayLoad_Helper,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument: null, methodArgument: null, fieldArgument: fieldArgument, methodContext, signatureContext));
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }
コード例 #5
0
        public ISymbolNode DelegateCtor(TypeDesc delegateType, MethodWithToken method, SignatureContext signatureContext)
        {
            TypeAndMethod ctorKey = new TypeAndMethod(delegateType, method, isUnboxingStub: false, isInstantiatingStub: false);

            if (!_delegateCtors.TryGetValue(ctorKey, out ISymbolNode ctorNode))
            {
                IMethodNode targetMethodNode = _codegenNodeFactory.MethodEntrypoint(
                    method,
                    isUnboxingStub: false,
                    isInstantiatingStub: false,
                    signatureContext: signatureContext);

                ctorNode = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.ReadyToRunHelper.DelayLoad_Helper,
                    new DelegateCtorSignature(delegateType, targetMethodNode, method.Token, signatureContext));
                _delegateCtors.Add(ctorKey, ctorNode);
            }
            return(ctorNode);
        }
コード例 #6
0
        public ISymbolNode DynamicHelperCell(MethodWithToken methodWithToken, SignatureContext signatureContext)
        {
            ISymbolNode result;

            if (!_dynamicHelperCellCache.TryGetValue(methodWithToken, out result))
            {
                result = new DelayLoadHelperImport(
                    this,
                    DispatchImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper_Obj,
                    MethodSignature(
                        ReadyToRunFixupKind.READYTORUN_FIXUP_VirtualEntry,
                        methodWithToken.Method,
                        constrainedType: null,
                        methodWithToken.Token,
                        signatureContext: signatureContext,
                        isUnboxingStub: false,
                        isInstantiatingStub: false));
                _dynamicHelperCellCache.Add(methodWithToken, result);
            }
            return(result);
        }
コード例 #7
0
        public ISymbolNode DelegateCtor(TypeDesc delegateType, MethodDesc targetMethod, ModuleToken methodToken, SignatureContext signatureContext)
        {
            TypeAndMethod ctorKey = new TypeAndMethod(delegateType, targetMethod, methodToken: methodToken, isUnboxingStub: false, isInstantiatingStub: false);

            if (!_delegateCtors.TryGetValue(ctorKey, out ISymbolNode ctorNode))
            {
                IMethodNode targetMethodNode = _codegenNodeFactory.MethodEntrypoint(
                    targetMethod,
                    constrainedType: null,
                    originalMethod: null,
                    methodToken: methodToken,
                    signatureContext: signatureContext,
                    isUnboxingStub: false);

                ctorNode = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    new DelegateCtorSignature(delegateType, targetMethodNode, methodToken, signatureContext));
                _delegateCtors.Add(ctorKey, ctorNode);
            }
            return(ctorNode);
        }
コード例 #8
0
        private ISymbolNode GenericLookupTypeHelper(
            CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind,
            ReadyToRunFixupKind fixupKind,
            object helperArgument,
            GenericContext methodContext,
            SignatureContext signatureContext)
        {
            TypeDesc typeArgument;

            if (helperArgument is MethodWithToken methodWithToken)
            {
                typeArgument = methodWithToken.Method.OwningType;
            }
            else if (helperArgument is FieldDesc fieldDesc)
            {
                typeArgument = fieldDesc.OwningType;
            }
            else
            {
                typeArgument = (TypeDesc)helperArgument;
            }

            GenericLookupKey key = new GenericLookupKey(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext);
            ISymbolNode      node;

            if (!_genericLookupHelpers.TryGetValue(key, out node))
            {
                node = new DelayLoadHelperImport(
                    _codegenNodeFactory,
                    _codegenNodeFactory.HelperImports,
                    ILCompiler.DependencyAnalysis.ReadyToRun.ReadyToRunHelper.READYTORUN_HELPER_DelayLoad_Helper,
                    new GenericLookupSignature(runtimeLookupKind, fixupKind, typeArgument, methodArgument: null, fieldArgument: null, methodContext, signatureContext));
                _genericLookupHelpers.Add(key, node);
            }
            return(node);
        }