Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
1ee15f02
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1ee15f02
编写于
5月 04, 2017
作者:
S
Shyam N
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix C# partial method instrumentation.
上级
86e3f08b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
185 addition
and
3 deletion
+185
-3
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
+11
-1
src/Compilers/CSharp/Test/Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.cs
.../Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.cs
+174
-2
未找到文件。
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
浏览文件 @
1ee15f02
...
...
@@ -2719,7 +2719,17 @@ private void EmitMethodDefIndexExpression(BoundMethodDefIndex node)
Debug
.
Assert
(
node
.
Method
.
IsDefinition
);
Debug
.
Assert
(
node
.
Type
.
SpecialType
==
SpecialType
.
System_Int32
);
_builder
.
EmitOpCode
(
ILOpCode
.
Ldtoken
);
EmitSymbolToken
(
node
.
Method
,
node
.
Syntax
,
null
,
encodeAsRawDefinitionToken
:
true
);
// For partial methods, we emit pseudo token based on the symbol for the partial
// definition part as opposed to the symbol for the partial implementation part.
// We will need to resolve the symbol associated with each pseudo token in order
// to compute the real method definition tokens later. For partial methods, this
// resolution can only succeed if the associated symbol is the symbol for the
// partial definition and not the symbol for the partial implementation (see
// MethodSymbol.ResolvedMethodImpl()).
var
symbol
=
node
.
Method
.
PartialDefinitionPart
??
node
.
Method
;
EmitSymbolToken
(
symbol
,
node
.
Syntax
,
null
,
encodeAsRawDefinitionToken
:
true
);
}
private
void
EmitMaximumMethodDefIndexExpression
(
BoundMaximumMethodDefIndex
node
)
...
...
src/Compilers/CSharp/Test/Emit/Emit/DynamicAnalysis/DynamicInstrumentationTests.cs
浏览文件 @
1ee15f02
...
...
@@ -2380,7 +2380,7 @@ int P2
}
"
;
var
verifier
=
CompileAndVerify
(
source
+
InstrumentationHelperSource
,
options
:
TestOptions
.
ReleaseDll
);
AssertNotInstrumented
(
verifier
,
"C.P1.get"
);
AssertNotInstrumented
(
verifier
,
"C.P1.set"
);
AssertNotInstrumented
(
verifier
,
"C.<get_P1>g__L11_0"
);
...
...
@@ -2526,7 +2526,7 @@ class C
}
"
;
var
verifier
=
CompileAndVerify
(
source
+
InstrumentationHelperSource
,
options
:
TestOptions
.
ReleaseDll
);
AssertNotInstrumented
(
verifier
,
"C.P1.get"
);
AssertNotInstrumented
(
verifier
,
"C.P1.set"
);
AssertNotInstrumented
(
verifier
,
"C.E1.add"
);
...
...
@@ -2612,6 +2612,178 @@ class D
AssertInstrumented
(
verifier
,
"D.M"
);
}
[
Fact
]
public
void
TestPartialMethodsWithImplementation
()
{
var
source
=
@"
using System;
public partial class Class1<T>
{
partial void Method1<U>(int x);
public void Method2(int x)
{
Console.WriteLine($""Method2: x = {x}"");
Method1<T>(x);
}
}
public partial class Class1<T>
{
partial void Method1<U>(int x)
{
Console.WriteLine($""Method1: x = {x}"");
if (x > 0)
{
Console.WriteLine(""Method1: x > 0"");
Method1<U>(0);
}
else if (x < 0)
{
Console.WriteLine(""Method1: x < 0"");
}
}
}
public class Program
{
public static void Main(string[] args)
{
Test();
Microsoft.CodeAnalysis.Runtime.Instrumentation.FlushPayload();
}
static void Test()
{
Console.WriteLine(""Test"");
var c = new Class1<int>();
c.Method2(1);
}
}
"
+
InstrumentationHelperSource
;
var
checker
=
new
CSharpInstrumentationChecker
();
checker
.
Method
(
1
,
1
,
"partial void Method1<U>(int x)"
)
.
True
(
@"Console.WriteLine($""Method1: x = {x}"");"
)
.
True
(
@"Console.WriteLine(""Method1: x > 0"");"
)
.
True
(
"Method1<U>(0);"
)
.
False
(
@"Console.WriteLine(""Method1: x < 0"");"
)
.
True
(
"x < 0)"
)
.
True
(
"x > 0)"
);
checker
.
Method
(
2
,
1
,
"public void Method2(int x)"
)
.
True
(
@"Console.WriteLine($""Method2: x = {x}"");"
)
.
True
(
"Method1<T>(x);"
);
checker
.
Method
(
3
,
1
,
".ctor()"
,
expectBodySpan
:
false
);
checker
.
Method
(
4
,
1
,
"public static void Main(string[] args)"
)
.
True
(
"Test();"
)
.
True
(
"Microsoft.CodeAnalysis.Runtime.Instrumentation.FlushPayload();"
);
checker
.
Method
(
5
,
1
,
"static void Test()"
)
.
True
(
@"Console.WriteLine(""Test"");"
)
.
True
(
"var c = new Class1<int>();"
)
.
True
(
"c.Method2(1);"
);
checker
.
Method
(
8
,
1
)
.
True
()
.
False
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
();
var
expectedOutput
=
@"Test
Method2: x = 1
Method1: x = 1
Method1: x > 0
Method1: x = 0
"
+
checker
.
ExpectedOutput
;
var
verifier
=
CompileAndVerify
(
source
,
expectedOutput
,
options
:
TestOptions
.
ReleaseExe
);
checker
.
CompleteCheck
(
verifier
.
Compilation
,
source
);
verifier
.
VerifyDiagnostics
();
verifier
=
CompileAndVerify
(
source
,
expectedOutput
,
options
:
TestOptions
.
DebugExe
);
checker
.
CompleteCheck
(
verifier
.
Compilation
,
source
);
verifier
.
VerifyDiagnostics
();
}
[
Fact
]
public
void
TestPartialMethodsWithoutImplementation
()
{
var
source
=
@"
using System;
public partial class Class1<T>
{
partial void Method1<U>(int x);
public void Method2(int x)
{
Console.WriteLine($""Method2: x = {x}"");
Method1<T>(x);
}
}
public class Program
{
public static void Main(string[] args)
{
Test();
Microsoft.CodeAnalysis.Runtime.Instrumentation.FlushPayload();
}
static void Test()
{
Console.WriteLine(""Test"");
var c = new Class1<int>();
c.Method2(1);
}
}
"
+
InstrumentationHelperSource
;
var
checker
=
new
CSharpInstrumentationChecker
();
checker
.
Method
(
1
,
1
,
"public void Method2(int x)"
)
.
True
(
@"Console.WriteLine($""Method2: x = {x}"");"
);
checker
.
Method
(
2
,
1
,
".ctor()"
,
expectBodySpan
:
false
);
checker
.
Method
(
3
,
1
,
"public static void Main(string[] args)"
)
.
True
(
"Test();"
)
.
True
(
"Microsoft.CodeAnalysis.Runtime.Instrumentation.FlushPayload();"
);
checker
.
Method
(
4
,
1
,
"static void Test()"
)
.
True
(
@"Console.WriteLine(""Test"");"
)
.
True
(
"var c = new Class1<int>();"
)
.
True
(
"c.Method2(1);"
);
checker
.
Method
(
7
,
1
)
.
True
()
.
False
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
()
.
True
();
var
expectedOutput
=
@"Test
Method2: x = 1
"
+
checker
.
ExpectedOutput
;
var
verifier
=
CompileAndVerify
(
source
,
expectedOutput
,
options
:
TestOptions
.
ReleaseExe
);
checker
.
CompleteCheck
(
verifier
.
Compilation
,
source
);
verifier
.
VerifyDiagnostics
();
verifier
=
CompileAndVerify
(
source
,
expectedOutput
,
options
:
TestOptions
.
DebugExe
);
checker
.
CompleteCheck
(
verifier
.
Compilation
,
source
);
verifier
.
VerifyDiagnostics
();
}
private
static
void
AssertNotInstrumented
(
CompilationVerifier
verifier
,
string
qualifiedMethodName
)
=>
AssertInstrumented
(
verifier
,
qualifiedMethodName
,
expected
:
false
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录