Skip to content

Commit f1e2a39

Browse files
author
Julien Couvreur
committed
Adjust arguments for local state tracing. Add tests for CodeCoverageInstrumenter
1 parent b93c861 commit f1e2a39

File tree

8 files changed

+423
-183
lines changed

8 files changed

+423
-183
lines changed

src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6660,14 +6660,15 @@ static ImmutableArray<ParameterSymbol> getParameters(ImmutableArray<ParameterSym
66606660
}
66616661
}
66626662

6663-
private static ImmutableArray<RefKind> GetArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, bool isNewExtension,
6663+
internal static ImmutableArray<RefKind> GetArgumentRefKinds(ImmutableArray<RefKind> argumentRefKindsOpt, bool adjustForNewExtension,
66646664
MethodSymbol method, int argumentCount)
66656665
{
6666-
if (!isNewExtension)
6666+
if (!adjustForNewExtension)
66676667
{
66686668
return argumentRefKindsOpt;
66696669
}
66706670

6671+
Debug.Assert(method.GetIsNewExtensionMember());
66716672
RefKind receiverRefKind = GetExtensionReceiverRefKind(method);
66726673

66736674
if (argumentRefKindsOpt.IsDefault)

src/Compilers/CSharp/Portable/Lowering/ExtensionMethodBodyRewriter.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public ExtensionMethodBodyRewriter(MethodSymbol sourceMethod, SourceExtensionImp
6666

6767
foreach (var parameter in symbol.Parameters)
6868
{
69-
builder.Add(parameter, rewrittenParameters[parameter.Ordinal]); // TODO2
69+
builder.Add(parameter, rewrittenParameters[parameter.Ordinal]);
7070
}
7171

7272
_symbolMap = builder.ToImmutable();
@@ -215,10 +215,7 @@ public override BoundNode VisitUnaryOperator(BoundUnaryOperator node)
215215

216216
public override BoundNode? VisitMethodDefIndex(BoundMethodDefIndex node)
217217
{
218-
MethodSymbol method = node.Method;
219-
Debug.Assert(method.IsDefinition);
220-
221-
method = ExtensionMethodReferenceRewriter.VisitMethodSymbolWithExtensionRewrite(this, method);
218+
MethodSymbol method = ExtensionMethodReferenceRewriter.VisitMethodSymbolWithExtensionRewrite(this, node.Method);
222219
TypeSymbol? type = this.VisitType(node.Type);
223220
return node.Update(method, type);
224221
}

src/Compilers/CSharp/Portable/Lowering/ExtensionMethodReferenceRewriter.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,7 @@ method.OriginalDefinition is ErrorMethodSymbol ||
194194

195195
public override BoundNode? VisitMethodDefIndex(BoundMethodDefIndex node)
196196
{
197-
MethodSymbol method = node.Method;
198-
Debug.Assert(method.IsDefinition);
199-
// TODO2 Is it possible to have a MethodDef to extension method, from outside the method?
200-
197+
MethodSymbol method = VisitMethodSymbolWithExtensionRewrite(this, node.Method);
201198
TypeSymbol? type = this.VisitType(node.Type);
202199
return node.Update(method, type);
203200
}

src/Compilers/CSharp/Portable/Lowering/Instrumentation/CodeCoverageInstrumenter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public override void InstrumentBlock(BoundBlock original, LocalRewriter rewriter
263263
_methodBodyFactory.Local(_methodPayload),
264264
_methodBodyFactory.ArrayAccess(
265265
_methodBodyFactory.InstrumentationPayloadRoot(analysisKind, modulePayloadType),
266-
ImmutableArray.Create(_methodBodyFactory.MethodDefIndex(_method)))); // TODO2 test this scenario
266+
ImmutableArray.Create(_methodBodyFactory.MethodDefIndex(_method))));
267267

268268
BoundExpression mvid = _methodBodyFactory.ModuleVersionId();
269269
BoundExpression methodToken = _methodBodyFactory.MethodDefIndex(_method);

src/Compilers/CSharp/Portable/Lowering/Instrumentation/LocalStateTracingInstrumenter.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ public override void InstrumentBlock(BoundBlock original, LocalRewriter rewriter
309309
continue;
310310
}
311311

312-
// TODO2
313312
var parameterLogger = GetLocalOrParameterStoreLogger(parameter.Type, parameter, refAssignmentSourceIsLocal: null, _factory.Syntax);
314313
if (parameterLogger != null)
315314
{
@@ -372,7 +371,7 @@ public override BoundExpression InstrumentUserDefinedLocalAssignment(BoundAssign
372371
else if (original.Right is BoundParameter rightParameter)
373372
{
374373
refAssignmentSourceIsLocal = false;
375-
refAssignmentSourceIndex = _factory.ParameterId(rightParameter.ParameterSymbol); // TODO2
374+
refAssignmentSourceIndex = _factory.ParameterId(rightParameter.ParameterSymbol);
376375
}
377376
else
378377
{
@@ -423,7 +422,7 @@ private bool TryGetLocalOrParameterInfo(BoundNode node, [NotNullWhen(true)] out
423422

424423
symbol = parameterSymbol;
425424
type = parameterSymbol.Type;
426-
indexExpression = _factory.ParameterId(parameterSymbol); // TODO2
425+
indexExpression = _factory.ParameterId(parameterSymbol);
427426
return true;
428427
}
429428

@@ -543,7 +542,20 @@ public override void InstrumentCatchBlock(
543542
}
544543

545544
public override BoundExpression InstrumentCall(BoundCall original, BoundExpression rewritten)
546-
=> InstrumentCall(base.InstrumentCall(original, rewritten), original.Arguments, original.ArgumentRefKindsOpt); // TODO2 adjust arguments?
545+
{
546+
ImmutableArray<BoundExpression> arguments = original.Arguments;
547+
MethodSymbol method = original.Method;
548+
bool adjustForNewExtension = method.GetIsNewExtensionMember() && !method.IsStatic;
549+
ImmutableArray<RefKind> argumentRefKindsOpt = NullableWalker.GetArgumentRefKinds(original.ArgumentRefKindsOpt, adjustForNewExtension, method, arguments.Length);
550+
551+
if (adjustForNewExtension)
552+
{
553+
Debug.Assert(original.ReceiverOpt is not null);
554+
arguments = [original.ReceiverOpt, .. arguments];
555+
}
556+
557+
return InstrumentCall(base.InstrumentCall(original, rewritten), arguments, argumentRefKindsOpt);
558+
}
547559

548560
public override BoundExpression InstrumentObjectCreationExpression(BoundObjectCreationExpression original, BoundExpression rewritten)
549561
=> InstrumentCall(base.InstrumentObjectCreationExpression(original, rewritten), original.Arguments, original.ArgumentRefKindsOpt);
@@ -553,7 +565,6 @@ public override BoundExpression InstrumentFunctionPointerInvocation(BoundFunctio
553565

554566
private BoundExpression InstrumentCall(BoundExpression invocation, ImmutableArray<BoundExpression> arguments, ImmutableArray<RefKind> refKinds)
555567
{
556-
// TODO2
557568
Debug.Assert(refKinds.IsDefault || arguments.Length == refKinds.Length);
558569
Debug.Assert(invocation.Type is not null);
559570

@@ -575,6 +586,7 @@ private BoundExpression InstrumentCall(BoundExpression invocation, ImmutableArra
575586
builder.Add(invocation);
576587
}
577588

589+
// Record outbound assignments
578590
for (int i = 0; i < arguments.Length; i++)
579591
{
580592
if (refKinds[i] is not (RefKind.Ref or RefKind.Out))

src/Compilers/CSharp/Portable/Symbols/Extensions/SourceExtensionImplementationMethodSymbol.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,6 @@ protected override ImmutableArray<ParameterSymbol> MakeParameters()
125125

126126
if (!_originalMethod.IsStatic)
127127
{
128-
// TODO2
129-
// Tracked by https://github.com/dotnet/roslyn/issues/78962 : Need to confirm if this rewrite going to break LocalStateTracingInstrumenter
130-
// Specifically BoundParameterId, etc.
131128
parameters.Add(new ExtensionMetadataMethodParameterSymbol(this, ((SourceNamedTypeSymbol)_originalMethod.ContainingType).ExtensionParameter!));
132129
}
133130

0 commit comments

Comments
 (0)