Skip to content

Commit b2adf51

Browse files
committed
Sema: Record disabled constraints in the trail
1 parent 411c590 commit b2adf51

File tree

4 files changed

+32
-22
lines changed

4 files changed

+32
-22
lines changed

include/swift/Sema/CSTrail.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class SolverTrail {
8282
RecordedNodeType,
8383
/// Recorded an assignment of a type to a keypath component.
8484
RecordedKeyPathComponentType,
85+
/// Disabled a constraint.
86+
DisabledConstraint,
8587
};
8688

8789
/// A change made to the constraint system.
@@ -243,6 +245,9 @@ class SolverTrail {
243245
unsigned component,
244246
Type oldType);
245247

248+
/// Create a change that disabled a constraint.
249+
static Change disabledConstraint(Constraint *constraint);
250+
246251
/// Undo this change, reverting the constraint graph to the state it
247252
/// had prior to this change.
248253
///

include/swift/Sema/ConstraintSystem.h

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2632,15 +2632,6 @@ class ConstraintSystem {
26322632

26332633
generatedConstraints.erase(genStart, genEnd);
26342634

2635-
for (unsigned constraintIdx :
2636-
range(scope->numDisabledConstraints, disabledConstraints.size())) {
2637-
if (disabledConstraints[constraintIdx]->isDisabled())
2638-
disabledConstraints[constraintIdx]->setEnabled();
2639-
}
2640-
disabledConstraints.erase(
2641-
disabledConstraints.begin() + scope->numDisabledConstraints,
2642-
disabledConstraints.end());
2643-
26442635
for (unsigned constraintIdx :
26452636
range(scope->numFavoredConstraints, favoredConstraints.size())) {
26462637
if (favoredConstraints[constraintIdx]->isFavored())
@@ -2657,15 +2648,11 @@ class ConstraintSystem {
26572648
return AllowFreeTypeVariables != FreeTypeVariableBinding::Disallow;
26582649
}
26592650

2660-
unsigned getNumDisabledConstraints() const {
2661-
return disabledConstraints.size();
2662-
}
2663-
26642651
/// Disable the given constraint; this change will be rolled back
26652652
/// when we exit the current solver scope.
26662653
void disableConstraint(Constraint *constraint) {
26672654
constraint->setDisabled();
2668-
disabledConstraints.push_back(constraint);
2655+
Trail.recordChange(SolverTrail::Change::disabledConstraint(constraint));
26692656
}
26702657

26712658
unsigned getNumFavoredConstraints() const {
@@ -2702,7 +2689,6 @@ class ConstraintSystem {
27022689
llvm::SmallVector<
27032690
std::tuple<SolverScope *, ConstraintList::iterator, unsigned>, 4> scopes;
27042691

2705-
SmallVector<Constraint *, 4> disabledConstraints;
27062692
SmallVector<Constraint *, 4> favoredConstraints;
27072693

27082694
/// Depth of the solution stack.
@@ -2885,8 +2871,6 @@ class ConstraintSystem {
28852871
/// FIXME: Remove this.
28862872
unsigned numFixes;
28872873

2888-
unsigned numDisabledConstraints;
2889-
28902874
unsigned numFavoredConstraints;
28912875

28922876
unsigned numResultBuilderTransformed;

lib/Sema/CSSolver.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,6 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
664664
numTypeVariables = cs.TypeVariables.size();
665665
numFixes = cs.Fixes.size();
666666
numKeyPaths = cs.KeyPaths.size();
667-
numDisabledConstraints = cs.solverState->getNumDisabledConstraints();
668667
numFavoredConstraints = cs.solverState->getNumFavoredConstraints();
669668
numResultBuilderTransformed = cs.resultBuilderTransformed.size();
670669
numAppliedPropertyWrappers = cs.appliedPropertyWrappers.size();
@@ -1771,10 +1770,12 @@ ConstraintSystem::filterDisjunction(
17711770
if (restoreOnFail)
17721771
constraintsToRestoreOnFail.push_back(constraint);
17731772

1774-
if (solverState)
1775-
solverState->disableConstraint(constraint);
1776-
else
1777-
constraint->setDisabled();
1773+
if (!constraint->isDisabled()) {
1774+
if (solverState)
1775+
solverState->disableConstraint(constraint);
1776+
else
1777+
constraint->setDisabled();
1778+
}
17781779
}
17791780

17801781
switch (numEnabledTerms) {

lib/Sema/CSTrail.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,14 @@ SolverTrail::Change::recordedKeyPathComponentType(const KeyPathExpr *expr,
246246
return result;
247247
}
248248

249+
SolverTrail::Change
250+
SolverTrail::Change::disabledConstraint(Constraint *constraint) {
251+
Change result;
252+
result.Kind = ChangeKind::DisabledConstraint;
253+
result.TheConstraint.Constraint = constraint;
254+
return result;
255+
}
256+
249257
void SolverTrail::Change::undo(ConstraintSystem &cs) const {
250258
auto &cg = cs.getConstraintGraph();
251259

@@ -342,6 +350,11 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
342350
case ChangeKind::RecordedKeyPathComponentType:
343351
cs.restoreType(KeyPath.Expr, Options, KeyPath.OldType);
344352
break;
353+
354+
case ChangeKind::DisabledConstraint:
355+
if (TheConstraint.Constraint->isDisabled())
356+
TheConstraint.Constraint->setEnabled();
357+
break;
345358
}
346359
}
347360

@@ -530,6 +543,13 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
530543
out << "null";
531544
out << " for component " << Options << ")\n";
532545
break;
546+
547+
case ChangeKind::DisabledConstraint:
548+
out << "(disabled constraint ";
549+
TheConstraint.Constraint->print(out, &cs.getASTContext().SourceMgr,
550+
indent + 2);
551+
out << ")\n";
552+
break;
533553
}
534554
}
535555

0 commit comments

Comments
 (0)