private void CreateNodeCaches() { _typeSymbols = new NodeCache <TypeDesc, EETypeNode>((TypeDesc type) => { return(new EETypeNode(type, false)); }); _constructedTypeSymbols = new NodeCache <TypeDesc, EETypeNode>((TypeDesc type) => { return(new EETypeNode(type, true)); }); _nonGCStatics = new NodeCache <MetadataType, NonGCStaticsNode>((MetadataType type) => { return(new NonGCStaticsNode(type, this)); }); _GCStatics = new NodeCache <MetadataType, GCStaticsNode>((MetadataType type) => { return(new GCStaticsNode(type, this)); }); _threadStatics = new NodeCache <MetadataType, ThreadStaticsNode>((MetadataType type) => { return(new ThreadStaticsNode(type, this)); }); _GCStaticEETypes = new NodeCache <bool[], GCStaticEETypeNode>((bool[] gcdesc) => { return(new GCStaticEETypeNode(gcdesc, this)); }, new BoolArrayEqualityComparer()); _readOnlyDataBlobs = new NodeCache <Tuple <string, byte[], int>, BlobNode>((Tuple <string, byte[], int> key) => { return(new BlobNode(key.Item1, "text", key.Item2, key.Item3)); }); _externSymbols = new NodeCache <string, ExternSymbolNode>((string name) => { return(new ExternSymbolNode(name)); }); _internalSymbols = new NodeCache <Tuple <ObjectNode, int, string>, ObjectAndOffsetSymbolNode>( (Tuple <ObjectNode, int, string> key) => { return(new ObjectAndOffsetSymbolNode(key.Item1, key.Item2, key.Item3)); }); _methodCode = new NodeCache <MethodDesc, ISymbolNode>((MethodDesc method) => { if (_cppCodeGen) { return(new CppMethodCodeNode(method)); } else { return(new MethodCodeNode(method)); } }); _jumpStubs = new NodeCache <ISymbolNode, JumpStubNode>((ISymbolNode node) => { return(new JumpStubNode(node)); }); _virtMethods = new NodeCache <MethodDesc, VirtualMethodUseNode>((MethodDesc method) => { return(new VirtualMethodUseNode(method)); }); _readyToRunHelpers = new NodeCache <Tuple <ReadyToRunHelperId, Object>, ReadyToRunHelperNode>((Tuple <ReadyToRunHelperId, Object> helper) => { return(new ReadyToRunHelperNode(helper.Item1, helper.Item2)); }); _stringDataNodes = new NodeCache <string, StringDataNode>((string data) => { return(new StringDataNode(data)); }); _stringIndirectionNodes = new NodeCache <string, StringIndirectionNode>((string data) => { return(new StringIndirectionNode(data)); }); _typeOptionalFields = new NodeCache <EETypeOptionalFieldsBuilder, EETypeOptionalFieldsNode>((EETypeOptionalFieldsBuilder fieldBuilder) => { return(new EETypeOptionalFieldsNode(fieldBuilder, this.Target)); }); _interfaceDispatchCells = new NodeCache <MethodDesc, InterfaceDispatchCellNode>((MethodDesc method) => { return(new InterfaceDispatchCellNode(method)); }); _interfaceDispatchMaps = new NodeCache <TypeDesc, InterfaceDispatchMapNode>((TypeDesc type) => { return(new InterfaceDispatchMapNode(type)); }); _eagerCctorIndirectionNodes = new NodeCache <MethodDesc, EmbeddedObjectNode>((MethodDesc method) => { Debug.Assert(method.IsStaticConstructor); Debug.Assert(TypeInitializationManager.HasEagerStaticConstructor((MetadataType)method.OwningType)); ISymbolNode entrypoint = MethodEntrypoint(method); // TODO: multifile: We will likely hit this assert with ExternSymbolNode. We probably need ExternMethodSymbolNode // deriving from ExternSymbolNode that carries around the target method. Debug.Assert(entrypoint is IMethodNode); return(EagerCctorTable.NewNode((IMethodNode)entrypoint)); }); }