提交 784c7f7a 编写于 作者: D Dustin Campbell 提交者: GitHub

Merge pull request #15577 from vslsnap/merge-dev15-rc2-into-master-20161129-160029

Merge dev15-rc2 into master
...@@ -5,11 +5,11 @@ ...@@ -5,11 +5,11 @@
using Microsoft.VisualStudio.Debugger.ComponentInterfaces; using Microsoft.VisualStudio.Debugger.ComponentInterfaces;
using Microsoft.VisualStudio.Debugger.Evaluation; using Microsoft.VisualStudio.Debugger.Evaluation;
using Microsoft.VisualStudio.Debugger.FunctionResolution; using Microsoft.VisualStudio.Debugger.FunctionResolution;
using Microsoft.VisualStudio.Debugger.Symbols;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using Microsoft.VisualStudio.Debugger.Symbols;
namespace Microsoft.CodeAnalysis.ExpressionEvaluator namespace Microsoft.CodeAnalysis.ExpressionEvaluator
{ {
...@@ -39,12 +39,12 @@ void IDkmRuntimeFunctionResolver.EnableResolution(DkmRuntimeFunctionResolutionRe ...@@ -39,12 +39,12 @@ void IDkmRuntimeFunctionResolver.EnableResolution(DkmRuntimeFunctionResolutionRe
// (see https://github.com/dotnet/roslyn/issues/15119). // (see https://github.com/dotnet/roslyn/issues/15119).
} }
EnableResolution(request.Process, request); EnableResolution(request.Process, request, OnFunctionResolved(workList));
} }
void IDkmModuleInstanceLoadNotification.OnModuleInstanceLoad(DkmModuleInstance moduleInstance, DkmWorkList workList, DkmEventDescriptorS eventDescriptor) void IDkmModuleInstanceLoadNotification.OnModuleInstanceLoad(DkmModuleInstance moduleInstance, DkmWorkList workList, DkmEventDescriptorS eventDescriptor)
{ {
OnModuleLoad(moduleInstance); OnModuleLoad(moduleInstance, workList);
} }
void IDkmModuleInstanceUnloadNotification.OnModuleInstanceUnload(DkmModuleInstance moduleInstance, DkmWorkList workList, DkmEventDescriptor eventDescriptor) void IDkmModuleInstanceUnloadNotification.OnModuleInstanceUnload(DkmModuleInstance moduleInstance, DkmWorkList workList, DkmEventDescriptor eventDescriptor)
...@@ -63,10 +63,10 @@ void IDkmModuleModifiedNotification.OnModuleModified(DkmModuleInstance moduleIns ...@@ -63,10 +63,10 @@ void IDkmModuleModifiedNotification.OnModuleModified(DkmModuleInstance moduleIns
void IDkmModuleSymbolsLoadedNotification.OnModuleSymbolsLoaded(DkmModuleInstance moduleInstance, DkmModule module, bool isReload, DkmWorkList workList, DkmEventDescriptor eventDescriptor) void IDkmModuleSymbolsLoadedNotification.OnModuleSymbolsLoaded(DkmModuleInstance moduleInstance, DkmModule module, bool isReload, DkmWorkList workList, DkmEventDescriptor eventDescriptor)
{ {
OnModuleLoad(moduleInstance); OnModuleLoad(moduleInstance, workList);
} }
private void OnModuleLoad(DkmModuleInstance moduleInstance) private void OnModuleLoad(DkmModuleInstance moduleInstance, DkmWorkList workList)
{ {
var module = moduleInstance as DkmClrModuleInstance; var module = moduleInstance as DkmClrModuleInstance;
Debug.Assert(module != null); // <Filter><RuntimeId RequiredValue="DkmRuntimeId.Clr"/></Filter> should ensure this. Debug.Assert(module != null); // <Filter><RuntimeId RequiredValue="DkmRuntimeId.Clr"/></Filter> should ensure this.
...@@ -82,7 +82,7 @@ private void OnModuleLoad(DkmModuleInstance moduleInstance) ...@@ -82,7 +82,7 @@ private void OnModuleLoad(DkmModuleInstance moduleInstance)
return; return;
} }
OnModuleLoad(module.Process, module); OnModuleLoad(module.Process, module, OnFunctionResolved(workList));
} }
internal override bool ShouldEnableFunctionResolver(DkmProcess process) internal override bool ShouldEnableFunctionResolver(DkmProcess process)
...@@ -152,21 +152,24 @@ internal override string GetRequestModuleName(DkmRuntimeFunctionResolutionReques ...@@ -152,21 +152,24 @@ internal override string GetRequestModuleName(DkmRuntimeFunctionResolutionReques
return request.ModuleName; return request.ModuleName;
} }
internal override void OnFunctionResolved( private static OnFunctionResolvedDelegate<DkmClrModuleInstance, DkmRuntimeFunctionResolutionRequest> OnFunctionResolved(DkmWorkList workList)
DkmClrModuleInstance module, {
return (DkmClrModuleInstance module,
DkmRuntimeFunctionResolutionRequest request, DkmRuntimeFunctionResolutionRequest request,
int token, int token,
int version, int version,
int ilOffset) int ilOffset) =>
{ {
var address = DkmClrInstructionAddress.Create( var address = DkmClrInstructionAddress.Create(
module.RuntimeInstance, module.RuntimeInstance,
module, module,
new DkmClrMethodId(Token: token, Version: (uint)version), new DkmClrMethodId(Token: token, Version: (uint)version),
NativeOffset: uint.MaxValue, NativeOffset: 0,
ILOffset: (uint)ilOffset, ILOffset: (uint)ilOffset,
CPUInstruction: null); CPUInstruction: null);
request.OnFunctionResolved(address); // Use async overload of OnFunctionResolved to avoid deadlock.
request.OnFunctionResolved(workList, address, result => { });
};
} }
private static readonly Guid s_messageSourceId = new Guid("ac353c9b-c599-427b-9424-cbe1ad19f81e"); private static readonly Guid s_messageSourceId = new Guid("ac353c9b-c599-427b-9424-cbe1ad19f81e");
......
...@@ -11,17 +11,6 @@ internal abstract class FunctionResolverBase<TProcess, TModule, TRequest> ...@@ -11,17 +11,6 @@ internal abstract class FunctionResolverBase<TProcess, TModule, TRequest>
where TModule : class where TModule : class
where TRequest : class where TRequest : class
{ {
internal void EnableResolution(TProcess process, TRequest request)
{
ResolveRequest(process, request);
}
internal void OnModuleLoad(TProcess process, TModule module)
{
var requests = GetRequests(process);
ResolveRequests(process, module, requests);
}
internal abstract bool ShouldEnableFunctionResolver(TProcess process); internal abstract bool ShouldEnableFunctionResolver(TProcess process);
internal abstract IEnumerable<TModule> GetAllModules(TProcess process); internal abstract IEnumerable<TModule> GetAllModules(TProcess process);
internal abstract string GetModuleName(TModule module); internal abstract string GetModuleName(TModule module);
...@@ -29,9 +18,8 @@ internal void OnModuleLoad(TProcess process, TModule module) ...@@ -29,9 +18,8 @@ internal void OnModuleLoad(TProcess process, TModule module)
internal abstract TRequest[] GetRequests(TProcess process); internal abstract TRequest[] GetRequests(TProcess process);
internal abstract string GetRequestModuleName(TRequest request); internal abstract string GetRequestModuleName(TRequest request);
internal abstract RequestSignature GetParsedSignature(TRequest request); internal abstract RequestSignature GetParsedSignature(TRequest request);
internal abstract void OnFunctionResolved(TModule module, TRequest request, int token, int version, int ilOffset);
private void ResolveRequest(TProcess process, TRequest request) internal void EnableResolution(TProcess process, TRequest request, OnFunctionResolvedDelegate<TModule, TRequest> onFunctionResolved)
{ {
var moduleName = GetRequestModuleName(request); var moduleName = GetRequestModuleName(request);
var signature = GetParsedSignature(request); var signature = GetParsedSignature(request);
...@@ -51,6 +39,7 @@ private void ResolveRequest(TProcess process, TRequest request) ...@@ -51,6 +39,7 @@ private void ResolveRequest(TProcess process, TRequest request)
} }
checkEnabled = false; checkEnabled = false;
} }
if (!ShouldModuleHandleRequest(module, moduleName)) if (!ShouldModuleHandleRequest(module, moduleName))
{ {
continue; continue;
...@@ -60,12 +49,12 @@ private void ResolveRequest(TProcess process, TRequest request) ...@@ -60,12 +49,12 @@ private void ResolveRequest(TProcess process, TRequest request)
{ {
continue; continue;
} }
var resolver = new MetadataResolver<TProcess, TModule, TRequest>(this, process, module, reader); var resolver = new MetadataResolver<TProcess, TModule, TRequest>(process, module, reader, onFunctionResolved);
resolver.Resolve(request, signature); resolver.Resolve(request, signature);
} }
} }
private void ResolveRequests(TProcess process, TModule module, TRequest[] requests) internal void OnModuleLoad(TProcess process, TModule module, OnFunctionResolvedDelegate<TModule, TRequest> onFunctionResolved)
{ {
if (!ShouldEnableFunctionResolver(process)) if (!ShouldEnableFunctionResolver(process))
{ {
...@@ -73,6 +62,7 @@ private void ResolveRequests(TProcess process, TModule module, TRequest[] reques ...@@ -73,6 +62,7 @@ private void ResolveRequests(TProcess process, TModule module, TRequest[] reques
} }
MetadataResolver<TProcess, TModule, TRequest> resolver = null; MetadataResolver<TProcess, TModule, TRequest> resolver = null;
var requests = GetRequests(process);
foreach (var request in requests) foreach (var request in requests)
{ {
...@@ -95,7 +85,7 @@ private void ResolveRequests(TProcess process, TModule module, TRequest[] reques ...@@ -95,7 +85,7 @@ private void ResolveRequests(TProcess process, TModule module, TRequest[] reques
{ {
return; return;
} }
resolver = new MetadataResolver<TProcess, TModule, TRequest>(this, process, module, reader); resolver = new MetadataResolver<TProcess, TModule, TRequest>(process, module, reader, onFunctionResolved);
} }
resolver.Resolve(request, signature); resolver.Resolve(request, signature);
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
namespace Microsoft.CodeAnalysis.ExpressionEvaluator namespace Microsoft.CodeAnalysis.ExpressionEvaluator
{ {
internal delegate void OnFunctionResolvedDelegate<TModule, TRequest>(TModule module, TRequest request, int token, int version, int ilOffset);
internal sealed class MetadataResolver<TProcess, TModule, TRequest> internal sealed class MetadataResolver<TProcess, TModule, TRequest>
where TProcess : class where TProcess : class
where TModule : class where TModule : class
...@@ -18,21 +20,21 @@ internal sealed class MetadataResolver<TProcess, TModule, TRequest> ...@@ -18,21 +20,21 @@ internal sealed class MetadataResolver<TProcess, TModule, TRequest>
{ {
private static readonly StringComparer s_stringComparer = StringComparer.Ordinal; private static readonly StringComparer s_stringComparer = StringComparer.Ordinal;
private readonly FunctionResolverBase<TProcess, TModule, TRequest> _resolver;
private readonly TProcess _process; private readonly TProcess _process;
private readonly TModule _module; private readonly TModule _module;
private readonly MetadataReader _reader; private readonly MetadataReader _reader;
private readonly OnFunctionResolvedDelegate<TModule, TRequest> _onFunctionResolved;
internal MetadataResolver( internal MetadataResolver(
FunctionResolverBase<TProcess, TModule, TRequest> resolver,
TProcess process, TProcess process,
TModule module, TModule module,
MetadataReader reader) MetadataReader reader,
OnFunctionResolvedDelegate<TModule, TRequest> onFunctionResolved)
{ {
_resolver = resolver;
_process = process; _process = process;
_module = module; _module = module;
_reader = reader; _reader = reader;
_onFunctionResolved = onFunctionResolved;
} }
internal void Resolve(TRequest request, RequestSignature signature) internal void Resolve(TRequest request, RequestSignature signature)
...@@ -293,7 +295,7 @@ private void GetAllGenericTypeParameters(Name typeName, ImmutableArray<string>.B ...@@ -293,7 +295,7 @@ private void GetAllGenericTypeParameters(Name typeName, ImmutableArray<string>.B
MethodDefinitionHandle handle) MethodDefinitionHandle handle)
{ {
Debug.Assert(!handle.IsNil); Debug.Assert(!handle.IsNil);
_resolver.OnFunctionResolved(_module, request, token: MetadataTokens.GetToken(handle), version: 1, ilOffset: 0); _onFunctionResolved(_module, request, token: MetadataTokens.GetToken(handle), version: 1, ilOffset: 0);
} }
private void OnAccessorResolved( private void OnAccessorResolved(
......
...@@ -174,7 +174,7 @@ public void ShouldEnableFunctionResolver() ...@@ -174,7 +174,7 @@ public void ShouldEnableFunctionResolver()
VerifySignatures(requestG); VerifySignatures(requestG);
} }
// Two modules after after two requests for same module, // Two modules after two requests for same module,
// ... resolver enabled. // ... resolver enabled.
moduleA = new Module(bytesA, name: "A.dll"); moduleA = new Module(bytesA, name: "A.dll");
moduleB = new Module(bytesB, name: "B.dll"); moduleB = new Module(bytesB, name: "B.dll");
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
...@@ -23,7 +24,7 @@ internal Address(Module module, int token, int version, int ilOffset) ...@@ -23,7 +24,7 @@ internal Address(Module module, int token, int version, int ilOffset)
internal sealed class Request internal sealed class Request
{ {
internal readonly List<Address> _resolvedAddresses; private readonly List<Address> _resolvedAddresses;
internal Request(string moduleName, RequestSignature signature) internal Request(string moduleName, RequestSignature signature)
{ {
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection.Metadata; using System.Reflection.Metadata;
...@@ -14,7 +15,7 @@ internal Resolver() ...@@ -14,7 +15,7 @@ internal Resolver()
_requests = new Dictionary<Process, List<Request>>(); _requests = new Dictionary<Process, List<Request>>();
} }
internal new void EnableResolution(Process process, Request request) internal void EnableResolution(Process process, Request request)
{ {
List<Request> requests; List<Request> requests;
if (!_requests.TryGetValue(process, out requests)) if (!_requests.TryGetValue(process, out requests))
...@@ -23,7 +24,12 @@ internal new void EnableResolution(Process process, Request request) ...@@ -23,7 +24,12 @@ internal new void EnableResolution(Process process, Request request)
_requests.Add(process, requests); _requests.Add(process, requests);
} }
requests.Add(request); requests.Add(request);
base.EnableResolution(process, request); base.EnableResolution(process, request, OnFunctionResolved);
}
internal void OnModuleLoad(Process process, Module module)
{
base.OnModuleLoad(process, module, OnFunctionResolved);
} }
internal override bool ShouldEnableFunctionResolver(Process process) internal override bool ShouldEnableFunctionResolver(Process process)
...@@ -66,14 +72,9 @@ internal override RequestSignature GetParsedSignature(Request request) ...@@ -66,14 +72,9 @@ internal override RequestSignature GetParsedSignature(Request request)
return request.Signature; return request.Signature;
} }
internal override void OnFunctionResolved(Module module, Request request, int token, int version, int ilOffset) private static void OnFunctionResolved(Module module, Request request, int token, int version, int ilOffset)
{ {
request.OnFunctionResolved(module, token, version, ilOffset); request.OnFunctionResolved(module, token, version, ilOffset);
} }
private void OnModuleLoaded(object sender, Module e)
{
OnModuleLoad((Process)sender, e);
}
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册