Skip to content

Commit 51d1130

Browse files
authored
Merge pull request #41 from tmat/ISymReader5
Add ISymUnmanagedReader5 and ISymUnmanagedEncUpdate
2 parents 8c42875 + 61b6e0b commit 51d1130

9 files changed

Lines changed: 377 additions & 11 deletions

File tree

.gitignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*.user
77
*.sln.docstates
88
.vs/
9+
*.VC.db
910

1011
# Build results
1112
[Aa]rtifacts/
@@ -21,8 +22,8 @@ x64/
2122
# NuGet restore semaphore
2223
build/ToolsetPackages/toolsetpackages.semaphore
2324

24-
# NuGet package
25-
src/Tools/UploadNugetZip/*.zip
25+
# NuGet
26+
nuget.exe
2627

2728
# MSTest test Results
2829
[Tt]est[Rr]esult*/

SymReader.sln

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 14
4-
VisualStudioVersion = 14.0.25420.1
3+
# Visual Studio 15
4+
VisualStudioVersion = 15.0.26021.0
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.DiaSymReader", "src\Microsoft.DiaSymReader\Microsoft.DiaSymReader.shproj", "{F9127F0F-95C8-4576-8081-96E004C1652F}"
6+
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.DiaSymReader", "src\Microsoft.DiaSymReader\Shared\Microsoft.DiaSymReader.shproj", "{F9127F0F-95C8-4576-8081-96E004C1652F}"
77
EndProject
88
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DiaSymReader.NetFX20", "src\Microsoft.DiaSymReader\NetFX20\Microsoft.DiaSymReader.NetFX20.csproj", "{FA2C8969-BD1F-457A-A6E3-CA772135FF73}"
99
EndProject
@@ -13,9 +13,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DiaSymReader.Unit
1313
EndProject
1414
Global
1515
GlobalSection(SharedMSBuildProjectFiles) = preSolution
16-
src\Microsoft.DiaSymReader\Microsoft.DiaSymReader.projitems*{316fd2ad-8514-41bd-98d5-61a821f3320e}*SharedItemsImports = 4
17-
src\Microsoft.DiaSymReader\Microsoft.DiaSymReader.projitems*{f9127f0f-95c8-4576-8081-96e004c1652f}*SharedItemsImports = 13
18-
src\Microsoft.DiaSymReader\Microsoft.DiaSymReader.projitems*{fa2c8969-bd1f-457a-a6e3-ca772135ff73}*SharedItemsImports = 4
16+
src\Microsoft.DiaSymReader\Shared\Microsoft.DiaSymReader.projitems*{316fd2ad-8514-41bd-98d5-61a821f3320e}*SharedItemsImports = 4
17+
src\Microsoft.DiaSymReader\Shared\Microsoft.DiaSymReader.projitems*{f9127f0f-95c8-4576-8081-96e004c1652f}*SharedItemsImports = 13
18+
src\Microsoft.DiaSymReader\Shared\Microsoft.DiaSymReader.projitems*{fa2c8969-bd1f-457a-a6e3-ca772135ff73}*SharedItemsImports = 4
1919
EndGlobalSection
2020
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2121
Debug|Any CPU = Debug|Any CPU

src/Microsoft.DiaSymReader.Tests/Microsoft.DiaSymReader.UnitTests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
<ItemGroup>
3232
<Reference Include="System" />
3333
</ItemGroup>
34+
<ItemGroup>
35+
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
36+
</ItemGroup>
3437
<ImportGroup>
3538
<Import Project="..\..\build\Targets\Imports.targets" />
3639
<Import Project="..\..\build\Toolset\XunitProjectRunAction.targets" />

src/Microsoft.DiaSymReader/Shared/Extensions/SymUnmanagedExtensions.Reader.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ public static int GetUserEntryPoint(this ISymUnmanagedReader reader)
7676
return entryPoint;
7777
}
7878

79+
public static ISymUnmanagedDocument GetDocument(this ISymUnmanagedReader reader, string name)
80+
{
81+
if (reader == null)
82+
{
83+
throw new ArgumentNullException(nameof(reader));
84+
}
85+
86+
ISymUnmanagedDocument document;
87+
ThrowExceptionForHR(reader.GetDocument(name, default(Guid), default(Guid), default(Guid), out document));
88+
return document;
89+
}
90+
7991
public static ISymUnmanagedDocument[] GetDocuments(this ISymUnmanagedReader reader)
8092
{
8193
if (reader == null)
@@ -100,7 +112,27 @@ public static ISymUnmanagedMethod[] GetMethodsInDocument(this ISymUnmanagedReade
100112

101113
public static ISymUnmanagedMethod GetMethod(this ISymUnmanagedReader reader, int methodToken)
102114
{
103-
return GetMethodByVersion(reader, methodToken, methodVersion: 1);
115+
if (reader == null)
116+
{
117+
throw new ArgumentNullException(nameof(reader));
118+
}
119+
120+
ISymUnmanagedMethod method;
121+
int hr = reader.GetMethod(methodToken, out method);
122+
ThrowExceptionForHR(hr);
123+
124+
if (hr < 0)
125+
{
126+
// method has no symbol info
127+
return null;
128+
}
129+
130+
if (method == null)
131+
{
132+
throw new InvalidOperationException();
133+
}
134+
135+
return method;
104136
}
105137

106138
public static ISymUnmanagedMethod GetMethodByVersion(this ISymUnmanagedReader reader, int methodToken, int methodVersion)
@@ -110,7 +142,7 @@ public static ISymUnmanagedMethod GetMethodByVersion(this ISymUnmanagedReader re
110142
throw new ArgumentNullException(nameof(reader));
111143
}
112144

113-
ISymUnmanagedMethod method = null;
145+
ISymUnmanagedMethod method;
114146
int hr = reader.GetMethodByVersion(methodToken, methodVersion, out method);
115147
ThrowExceptionForHR(hr);
116148

@@ -127,5 +159,17 @@ public static ISymUnmanagedMethod GetMethodByVersion(this ISymUnmanagedReader re
127159

128160
return method;
129161
}
162+
163+
public static int GetMethodVersion(this ISymUnmanagedReader reader, ISymUnmanagedMethod method)
164+
{
165+
if (reader == null)
166+
{
167+
throw new ArgumentNullException(nameof(reader));
168+
}
169+
170+
int version;
171+
ThrowExceptionForHR(reader.GetMethodVersion(method, out version));
172+
return version;
173+
}
130174
}
131175
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
using System;
4+
using System.Runtime.InteropServices;
5+
using System.Runtime.InteropServices.ComTypes;
6+
7+
namespace Microsoft.DiaSymReader
8+
{
9+
[ComImport]
10+
[Guid("E502D2DD-8671-4338-8F2A-FC08229628C4")]
11+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
12+
[ComVisible(false)]
13+
public interface ISymUnmanagedEncUpdate
14+
{
15+
/// <summary>
16+
/// Applies EnC edit.
17+
/// </summary>
18+
[PreserveSig]
19+
int UpdateSymbolStore2(
20+
IStream stream,
21+
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]SymUnmanagedLineDelta[] lineDeltas,
22+
int lineDeltaCount);
23+
24+
/// <summary>
25+
/// Gets the number of local variables of the latest version of the specified method.
26+
/// </summary>
27+
[PreserveSig]
28+
int GetLocalVariableCount(int methodToken, out int count);
29+
30+
/// <summary>
31+
/// Gets local variables of the latest version of the specified method.
32+
/// </summary>
33+
[PreserveSig]
34+
int GetLocalVariables(
35+
int methodToken,
36+
int bufferLength,
37+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] variables,
38+
out int count);
39+
40+
[PreserveSig]
41+
int InitializeForEnc();
42+
43+
/// <summary>
44+
/// Allows updating the line info for a method that has not been recompiled,
45+
/// but whose lines have moved independently. A delta for each statement is allowed.
46+
/// </summary>
47+
[PreserveSig]
48+
int UpdateMethodLines(
49+
int methodToken,
50+
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] int[] deltas,
51+
int count);
52+
}
53+
}

src/Microsoft.DiaSymReader/Shared/ISymUnmanagedReader4.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ public interface ISymUnmanagedReader4 : ISymUnmanagedReader3
185185
unsafe int GetPortableDebugMetadata(out byte* metadata, out int size);
186186

187187
/// <summary>
188-
/// Returns a pointer to Source Server data stored in the PDB.
188+
/// Returns a pointer to Source Server data stored in the PDB (source link data for Portable PDB or srcsvr section for Windows PDB).
189189
/// </summary>
190190
/// <param name="data">
191191
/// A pointer to memory where Source Server data start. The memory is owned by the SymReader and
@@ -194,6 +194,13 @@ public interface ISymUnmanagedReader4 : ISymUnmanagedReader3
194194
/// Null if the PDB doesn't contain Source Server data.
195195
/// </param>
196196
/// <param name="size">Size of the data in bytes.</param>
197+
/// <remarks>
198+
/// This method is a replacement for <see cref="M:ISymUnmanagedSourceServerModule.GetSourceServerData"/>.
199+
/// The reader doesn't implement <see cref="M:ISymUnmanagedSourceServerModule.GetSourceServerData"/> since
200+
/// the format of the returned data is completely different for Portable PDBs, which the callers wouldn't expect.
201+
/// The native diasymreader may implement <see cref="GetSourceServerData(out byte*, out int)"/> by simply calling
202+
/// to <see cref="M:ISymUnmanagedSourceServerModule.GetSourceServerData"/>.
203+
/// </remarks>
197204
[PreserveSig]
198205
unsafe int GetSourceServerData(out byte* data, out int size);
199206

0 commit comments

Comments
 (0)