Skip to content

Commit

Permalink
Save and restore '_factory.Syntax' in LocalRewriter methods
Browse files Browse the repository at this point in the history
  • Loading branch information
cston committed Feb 3, 2022
1 parent 29e1ec8 commit 1dac167
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ testNode.WhenTrue is BoundEvaluationDecisionDagNode evaluationNode &&
private void GenerateTest(BoundExpression test, BoundDecisionDagNode whenTrue, BoundDecisionDagNode whenFalse, BoundDecisionDagNode nextNode)
{
// Because we have already "optimized" away tests for a constant switch expression, the test should be nontrivial.
var oldSyntax = _factory.Syntax;
_factory.Syntax = test.Syntax;
Debug.Assert(test != null);

Expand All @@ -490,6 +491,8 @@ private void GenerateTest(BoundExpression test, BoundDecisionDagNode whenTrue, B
_loweredDecisionDag.Add(_factory.ConditionalGoto(test, GetDagNodeLabel(whenTrue), jumpIfTrue: true));
_loweredDecisionDag.Add(_factory.Goto(GetDagNodeLabel(whenFalse)));
}

_factory.Syntax = oldSyntax;
}

/// <summary>
Expand Down Expand Up @@ -1026,6 +1029,7 @@ void lowerWhenExpressionIfShared(BoundExpression whenExpression, LabelSymbol lab
// }
void addConditionalGoto(BoundExpression whenExpression, SyntaxNode whenClauseSyntax, LabelSymbol whenTrueLabel, ArrayBuilder<BoundStatement> sectionBuilder)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = whenClauseSyntax;
BoundStatement conditionalGoto = _factory.ConditionalGoto(_localRewriter.VisitExpression(whenExpression), whenTrueLabel, jumpIfTrue: true);

Expand All @@ -1036,6 +1040,7 @@ void addConditionalGoto(BoundExpression whenExpression, SyntaxNode whenClauseSyn
}

sectionBuilder.Add(conditionalGoto);
_factory.Syntax = oldSyntax;
}

bool isSharedWhenExpression(BoundExpression? whenExpression)
Expand Down Expand Up @@ -1101,7 +1106,9 @@ void lowerBindings(ImmutableArray<BoundPatternBinding> bindings, ArrayBuilder<Bo
/// </summary>
private void LowerDecisionDagNode(BoundDecisionDagNode node, BoundDecisionDagNode nextNode)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = node.Syntax;

switch (node)
{
case BoundEvaluationDecisionDagNode evaluationNode:
Expand Down Expand Up @@ -1140,6 +1147,8 @@ private void LowerDecisionDagNode(BoundDecisionDagNode node, BoundDecisionDagNod
default:
throw ExceptionUtilities.UnexpectedValue(node.Kind);
}

_factory.Syntax = oldSyntax;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,14 @@ private PEModuleBuilder? EmitModule
return VisitExpressionImpl(expr);
}

return node.Accept(this);
#if DEBUG
var oldSyntax = _factory.Syntax;
#endif
var result = node.Accept(this);
#if DEBUG
Debug.Assert(oldSyntax == _factory.Syntax);
#endif
return result;
}

[return: NotNullIfNotNull("node")]
Expand All @@ -192,7 +199,14 @@ private PEModuleBuilder? EmitModule
}
Debug.Assert(!node.HasErrors, "nodes with errors should not be lowered");

return (BoundStatement?)node.Accept(this);
#if DEBUG
var oldSyntax = _factory.Syntax;
#endif
var result = (BoundStatement?)node.Accept(this);
#if DEBUG
Debug.Assert(oldSyntax == _factory.Syntax);
#endif
return result;
}

private BoundExpression? VisitExpressionImpl(BoundExpression node)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public IsPatternExpressionGeneralLocalRewriter(

internal BoundExpression LowerGeneralIsPattern(BoundIsPatternExpression node)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = node.Syntax;
var resultBuilder = ArrayBuilder<BoundStatement>.GetInstance();
var inputExpression = _localRewriter.VisitExpression(node.Expression);
Expand All @@ -129,7 +130,9 @@ internal BoundExpression LowerGeneralIsPattern(BoundIsPatternExpression node)
resultBuilder.Add(_factory.Assignment(_factory.Local(resultTemp), _factory.Literal(false)));
resultBuilder.Add(_factory.Label(afterIsPatternExpression));
_localRewriter._needsSpilling = true;
return _factory.SpillSequence(_tempAllocator.AllTemps().Add(resultTemp), resultBuilder.ToImmutableAndFree(), _factory.Local(resultTemp));
var result = _factory.SpillSequence(_tempAllocator.AllTemps().Add(resultTemp), resultBuilder.ToImmutableAndFree(), _factory.Local(resultTemp));
_factory.Syntax = oldSyntax;
return result;
}
}

Expand Down Expand Up @@ -189,16 +192,17 @@ private void AddConjunct(BoundExpression test)
/// </summary>
private void LowerOneTest(BoundDagTest test, bool invert = false)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = test.Syntax;
switch (test)
{
case BoundDagAssignmentEvaluation:
return;
break;
case BoundDagEvaluation eval:
{
var sideEffect = LowerEvaluation(eval);
_sideEffectBuilder.Add(sideEffect);
return;
break;
}
case var _:
{
Expand All @@ -210,10 +214,10 @@ private void LowerOneTest(BoundDagTest test, bool invert = false)

AddConjunct(testExpression);
}

return;
break;
}
}
_factory.Syntax = oldSyntax;
}

public BoundExpression LowerIsPatternAsLinearTestSequence(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ private SwitchStatementLocalRewriter(BoundSwitchStatement node, LocalRewriter lo

private BoundStatement LowerSwitchStatement(BoundSwitchStatement node)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = node.Syntax;
var result = ArrayBuilder<BoundStatement>.GetInstance();
var outerVariables = ArrayBuilder<LocalSymbol>.GetInstance();
Expand Down Expand Up @@ -173,6 +174,7 @@ private BoundStatement LowerSwitchStatement(BoundSwitchStatement node)
if (GenerateInstrumentation)
translatedSwitch = _localRewriter._instrumenter.InstrumentSwitchStatement(node, translatedSwitch);

_factory.Syntax = oldSyntax;
return translatedSwitch;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,9 @@ private bool CanLowerToStringConcatenation(BoundInterpolatedString node)

private void MakeInterpolatedStringFormat(BoundInterpolatedString node, out BoundExpression format, out ArrayBuilder<BoundExpression> expressions)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = node.Syntax;

int n = node.Parts.Length - 1;
var formatString = PooledStringBuilder.GetInstance();
var stringBuilder = formatString.Builder;
Expand Down Expand Up @@ -249,6 +251,7 @@ private void MakeInterpolatedStringFormat(BoundInterpolatedString node, out Boun
}

format = _factory.StringLiteral(formatString.ToStringAndFree());
_factory.Syntax = oldSyntax;
}

public override BoundNode VisitInterpolatedString(BoundInterpolatedString node)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ private BoundExpression LowerSwitchExpression(BoundConvertedSwitchExpression nod
// When compiling for Debug (not Release), we produce the most detailed sequence points.
var produceDetailedSequencePoints =
GenerateInstrumentation && _localRewriter._compilation.Options.OptimizationLevel != OptimizationLevel.Release;
var oldSyntax = _factory.Syntax;
_factory.Syntax = node.Syntax;
var result = ArrayBuilder<BoundStatement>.GetInstance();
var outerVariables = ArrayBuilder<LocalSymbol>.GetInstance();
Expand Down Expand Up @@ -139,7 +140,9 @@ private BoundExpression LowerSwitchExpression(BoundConvertedSwitchExpression nod

outerVariables.Add(resultTemp);
outerVariables.AddRange(_tempAllocator.AllTemps());
return _factory.SpillSequence(outerVariables.ToImmutableAndFree(), result.ToImmutableAndFree(), _factory.Local(resultTemp));
var sequence = _factory.SpillSequence(outerVariables.ToImmutableAndFree(), result.ToImmutableAndFree(), _factory.Local(resultTemp));
_factory.Syntax = oldSyntax;
return sequence;

bool implicitConversionExists(BoundExpression expression, TypeSymbol type)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ internal LoweredDynamicOperation MakeDynamicConversion(
bool isChecked,
TypeSymbol resultType)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredOperand.Syntax;

CSharpBinderFlags binderFlags = 0;
Expand Down Expand Up @@ -108,7 +109,9 @@ internal LoweredDynamicOperation MakeDynamicConversion(
_factory.TypeofDynamicOperationContextType()
});

return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
var result = MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicUnaryOperator(
Expand All @@ -118,6 +121,7 @@ internal LoweredDynamicOperation MakeDynamicUnaryOperator(
{
Debug.Assert(operatorKind.IsDynamic());

var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredOperand.Syntax;

CSharpBinderFlags binderFlags = 0;
Expand All @@ -144,7 +148,9 @@ internal LoweredDynamicOperation MakeDynamicUnaryOperator(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments)
}) : null;

return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
var result = MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicBinaryOperator(
Expand All @@ -156,6 +162,7 @@ internal LoweredDynamicOperation MakeDynamicBinaryOperator(
{
Debug.Assert(operatorKind.IsDynamic());

var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredLeft.Syntax;

CSharpBinderFlags binderFlags = 0;
Expand Down Expand Up @@ -187,7 +194,9 @@ internal LoweredDynamicOperation MakeDynamicBinaryOperator(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments)
}) : null;

return MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
var result = MakeDynamicOperation(binderConstruction, null, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicMemberInvocation(
Expand All @@ -200,6 +209,7 @@ internal LoweredDynamicOperation MakeDynamicMemberInvocation(
bool hasImplicitReceiver,
bool resultDiscarded)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;
Debug.Assert(_factory.TopLevelMethod is { });

Expand Down Expand Up @@ -255,14 +265,17 @@ internal LoweredDynamicOperation MakeDynamicMemberInvocation(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, argumentNames, refKinds, loweredReceiver, receiverRefKind, receiverIsStaticType)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, receiverRefKind, loweredArguments, refKinds, null, resultType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, receiverRefKind, loweredArguments, refKinds, null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicEventAccessorInvocation(
string accessorName,
BoundExpression loweredReceiver,
BoundExpression loweredHandler)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;

CSharpBinderFlags binderFlags = CSharpBinderFlags.InvokeSpecialName | CSharpBinderFlags.ResultDiscarded;
Expand All @@ -289,7 +302,9 @@ internal LoweredDynamicOperation MakeDynamicEventAccessorInvocation(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, loweredReceiver: loweredReceiver, loweredRight: loweredHandler)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredHandler, resultType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredHandler, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicInvocation(
Expand All @@ -299,6 +314,7 @@ internal LoweredDynamicOperation MakeDynamicInvocation(
ImmutableArray<RefKind> refKinds,
bool resultDiscarded)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;

TypeSymbol resultType;
Expand Down Expand Up @@ -326,7 +342,9 @@ internal LoweredDynamicOperation MakeDynamicInvocation(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, argumentNames, refKinds, loweredReceiver)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicConstructorInvocation(
Expand All @@ -336,6 +354,7 @@ internal LoweredDynamicOperation MakeDynamicConstructorInvocation(
ImmutableArray<string> argumentNames,
ImmutableArray<RefKind> refKinds)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = syntax;

var loweredReceiver = _factory.Typeof(type);
Expand All @@ -353,14 +372,17 @@ internal LoweredDynamicOperation MakeDynamicConstructorInvocation(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, argumentNames, refKinds, loweredReceiver, receiverIsStaticType: true)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, type);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, type);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicGetMember(
BoundExpression loweredReceiver,
string name,
bool resultIndexed)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;

CSharpBinderFlags binderFlags = 0;
Expand Down Expand Up @@ -388,7 +410,9 @@ internal LoweredDynamicOperation MakeDynamicGetMember(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, loweredReceiver: loweredReceiver)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicSetMember(
Expand All @@ -398,6 +422,7 @@ internal LoweredDynamicOperation MakeDynamicSetMember(
bool isCompoundAssignment = false,
bool isChecked = false)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;

CSharpBinderFlags binderFlags = 0;
Expand Down Expand Up @@ -429,7 +454,9 @@ internal LoweredDynamicOperation MakeDynamicSetMember(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, loweredReceiver: loweredReceiver, loweredRight: loweredRight)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredRight, AssemblySymbol.DynamicType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, default(ImmutableArray<RefKind>), loweredRight, AssemblySymbol.DynamicType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicGetIndex(
Expand All @@ -438,6 +465,7 @@ internal LoweredDynamicOperation MakeDynamicGetIndex(
ImmutableArray<string> argumentNames,
ImmutableArray<RefKind> refKinds)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;

var resultType = DynamicTypeSymbol.Instance;
Expand All @@ -455,7 +483,9 @@ internal LoweredDynamicOperation MakeDynamicGetIndex(
MakeCallSiteArgumentInfos(argumentInfoFactory, loweredArguments, argumentNames, refKinds, loweredReceiver: loweredReceiver)
}) : null;

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, loweredArguments, refKinds, null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

internal LoweredDynamicOperation MakeDynamicSetIndex(
Expand Down Expand Up @@ -499,6 +529,7 @@ internal LoweredDynamicOperation MakeDynamicSetIndex(

internal LoweredDynamicOperation MakeDynamicIsEventTest(string name, BoundExpression loweredReceiver)
{
var oldSyntax = _factory.Syntax;
_factory.Syntax = loweredReceiver.Syntax;
var resultType = _factory.SpecialType(SpecialType.System_Boolean);
var binderConstruction = MakeBinderConstruction(WellKnownMember.Microsoft_CSharp_RuntimeBinder_Binder__IsEvent, new[]
Expand All @@ -513,7 +544,9 @@ internal LoweredDynamicOperation MakeDynamicIsEventTest(string name, BoundExpres
_factory.TypeofDynamicOperationContextType()
});

return MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, ImmutableArray<BoundExpression>.Empty, default(ImmutableArray<RefKind>), null, resultType);
var result = MakeDynamicOperation(binderConstruction, loweredReceiver, RefKind.None, ImmutableArray<BoundExpression>.Empty, default(ImmutableArray<RefKind>), null, resultType);
_factory.Syntax = oldSyntax;
return result;
}

private MethodSymbol GetArgumentInfoFactory()
Expand Down
Loading

0 comments on commit 1dac167

Please sign in to comment.