Exemple #1
0
 private ISymbolNode CreateGCStaticBaseHelper(TypeDesc type, SignatureContext signatureContext)
 {
     return(new DelayLoadHelperImport(
                _codegenNodeFactory,
                _codegenNodeFactory.HelperImports,
                ILCompiler.ReadyToRunHelper.DelayLoad_Helper,
                _codegenNodeFactory.TypeSignature(ReadyToRunFixupKind.READYTORUN_FIXUP_StaticBaseGC, type, signatureContext)));
 }
        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)));
            });
        }