internal static MethodDebugInfo <TypeSymbol, LocalSymbol> GetMethodDebugInfo(RuntimeInstance runtime, string qualifiedMethodName, int ilOffset = 0) { var peCompilation = runtime.Modules.SelectAsArray(m => m.MetadataBlock).ToCompilation(); var peMethod = peCompilation.GlobalNamespace.GetMember <PEMethodSymbol>(qualifiedMethodName); var peModule = (PEModuleSymbol)peMethod.ContainingModule; var symReader = runtime.Modules.Single(mi => mi.ModuleVersionId == peModule.Module.GetModuleVersionIdOrThrow()).SymReader; var symbolProvider = new CSharpEESymbolProvider((SourceAssemblySymbol)peCompilation.Assembly, peModule, peMethod); return(MethodDebugInfo <TypeSymbol, LocalSymbol> .ReadMethodDebugInfo((ISymUnmanagedReader3)symReader, symbolProvider, MetadataTokens.GetToken(peMethod.Handle), methodVersion : 1, ilOffset : ilOffset, isVisualBasicMethod : false)); }
private static EvaluationContext CreateMethodContext( CSharpCompilation compilation, object symReader, Guid moduleVersionId, int methodToken, int methodVersion, int ilOffset, int localSignatureToken) { var methodHandle = (MethodDefinitionHandle)MetadataTokens.Handle(methodToken); var localSignatureHandle = (localSignatureToken != 0) ? (StandaloneSignatureHandle)MetadataTokens.Handle(localSignatureToken) : default(StandaloneSignatureHandle); var currentFrame = compilation.GetMethod(moduleVersionId, methodHandle); Debug.Assert((object)currentFrame != null); var sourceAssembly = compilation.SourceAssembly; var symbolProvider = new CSharpEESymbolProvider(sourceAssembly, (PEModuleSymbol)currentFrame.ContainingModule, currentFrame); var metadataDecoder = new MetadataDecoder((PEModuleSymbol)currentFrame.ContainingModule, currentFrame); var localInfo = metadataDecoder.GetLocalInfo(localSignatureHandle); var typedSymReader = (ISymUnmanagedReader3)symReader; var inScopeHoistedLocals = InScopeHoistedLocals.Empty; var debugInfo = MethodDebugInfo <TypeSymbol, LocalSymbol> .ReadMethodDebugInfo(typedSymReader, symbolProvider, methodToken, methodVersion, ilOffset, isVisualBasicMethod : false); var reuseSpan = debugInfo.ReuseSpan; var localsBuilder = ArrayBuilder <LocalSymbol> .GetInstance(); MethodDebugInfo <TypeSymbol, LocalSymbol> .GetLocals( localsBuilder, symbolProvider, debugInfo.LocalVariableNames, localInfo, debugInfo.DynamicLocalMap, debugInfo.TupleLocalMap); if (!debugInfo.HoistedLocalScopeRecords.IsDefaultOrEmpty) { inScopeHoistedLocals = new CSharpInScopeHoistedLocals(debugInfo.GetInScopeHoistedLocalIndices(ilOffset, ref reuseSpan)); } localsBuilder.AddRange(debugInfo.LocalConstants); return(new EvaluationContext( new MethodContextReuseConstraints(moduleVersionId, methodToken, methodVersion, reuseSpan), compilation, currentFrame, localsBuilder.ToImmutableAndFree(), inScopeHoistedLocals, debugInfo)); }