コード例 #1
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);
        }
コード例 #2
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);
        }
コード例 #3
0
        private void CreateNodeCaches()
        {
            _importStrings = new NodeCache <ModuleTokenAndSignatureContext, ISymbolNode>(key =>
            {
                return(new StringImport(_codegenNodeFactory.StringImports, key.ModuleToken, key.SignatureContext));
            });

            _r2rHelpers = new NodeCache <ReadyToRunHelperKey, ISymbolNode>(CreateReadyToRunHelper);

            _fieldAddressCache = new NodeCache <FieldAndSignatureContext, ISymbolNode>(key =>
            {
                return(new DelayLoadHelperImport(
                           _codegenNodeFactory,
                           _codegenNodeFactory.HelperImports,
                           ReadyToRunHelper.DelayLoad_Helper,
                           new FieldFixupSignature(ReadyToRunFixupKind.FieldAddress, key.Field, key.SignatureContext)
                           ));
            });

            _fieldOffsetCache = new NodeCache <FieldAndSignatureContext, ISymbolNode>(key =>
            {
                return(new PrecodeHelperImport(
                           _codegenNodeFactory,
                           new FieldFixupSignature(ReadyToRunFixupKind.FieldOffset, key.Field, key.SignatureContext)
                           ));
            });

            _fieldBaseOffsetCache = new NodeCache <TypeAndSignatureContext, ISymbolNode>(key =>
            {
                return(new PrecodeHelperImport(
                           _codegenNodeFactory,
                           _codegenNodeFactory.TypeSignature(ReadyToRunFixupKind.FieldBaseOffset, key.Type, key.SignatureContext)
                           ));
            });

            _interfaceDispatchCells = new NodeCache <MethodAndCallSite, ISymbolNode>(cellKey =>
            {
                return(new DelayLoadHelperMethodImport(
                           _codegenNodeFactory,
                           _codegenNodeFactory.DispatchImports,
                           ReadyToRunHelper.DelayLoad_MethodCall,
                           cellKey.Method,
                           useVirtualCall: true,
                           useInstantiatingStub: false,
                           _codegenNodeFactory.MethodSignature(ReadyToRunFixupKind.VirtualEntry,
                                                               cellKey.Method,
                                                               cellKey.IsUnboxingStub, isInstantiatingStub: false, cellKey.SignatureContext),
                           cellKey.SignatureContext,
                           cellKey.CallSite));
            });

            _delegateCtors = new NodeCache <TypeAndMethod, ISymbolNode>(ctorKey =>
            {
                SignatureContext signatureContext = ctorKey.SignatureContext;
                IMethodNode targetMethodNode      = _codegenNodeFactory.MethodEntrypoint(
                    ctorKey.Method,
                    isUnboxingStub: false,
                    isInstantiatingStub: ctorKey.Method.Method.HasInstantiation,
                    isPrecodeImportRequired: false,
                    signatureContext: signatureContext);

                return(new DelayLoadHelperImport(
                           _codegenNodeFactory,
                           _codegenNodeFactory.HelperImports,
                           ReadyToRunHelper.DelayLoad_Helper_ObjObj,
                           new DelegateCtorSignature(ctorKey.Type, targetMethodNode, ctorKey.Method.Token, signatureContext)));
            });

            _genericLookupHelpers = new NodeCache <GenericLookupKey, ISymbolNode>(key =>
            {
                return(new DelayLoadHelperImport(
                           _codegenNodeFactory,
                           _codegenNodeFactory.HelperImports,
                           ReadyToRunHelper.DelayLoad_Helper,
                           new GenericLookupSignature(
                               key.LookupKind,
                               key.FixupKind,
                               key.TypeArgument,
                               key.MethodArgument,
                               key.FieldArgument,
                               key.MethodContext,
                               key.SignatureContext)));
            });

            _pInvokeTargetNodes = new NodeCache <PInvokeTargetKey, ISymbolNode>(key =>
            {
                return(new PrecodeHelperImport(
                           _codegenNodeFactory,
                           _codegenNodeFactory.MethodSignature(
                               key.IsIndirect ? ReadyToRunFixupKind.IndirectPInvokeTarget : ReadyToRunFixupKind.PInvokeTarget,
                               key.MethodWithToken,
                               signatureContext: key.SignatureContext,
                               isUnboxingStub: false,
                               isInstantiatingStub: false)));
            });
        }