Skip to content

Commit 39d0eab

Browse files
committed
Sema: Record case label items in the trail
1 parent 8c8a385 commit 39d0eab

File tree

5 files changed

+38
-15
lines changed

5 files changed

+38
-15
lines changed

include/swift/Sema/CSTrail.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ CHANGE(RecordedResultBuilderTransform)
6363
CHANGE(RecordedClosureType)
6464
CHANGE(RecordedContextualInfo)
6565
CHANGE(RecordedTarget)
66+
CHANGE(RecordedCaseLabelItemInfo)
6667

67-
LAST_CHANGE(RecordedTarget)
68+
LAST_CHANGE(RecordedCaseLabelItemInfo)
6869

6970
#undef LOCATOR_CHANGE
7071
#undef EXPR_CHANGE

include/swift/Sema/CSTrail.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ class SolverTrail {
132132
AnyFunctionRef TheRef;
133133
ClosureExpr *TheClosure;
134134
DeclContext *TheDeclContext;
135+
CaseLabelItem *TheItem;
135136
};
136137

137138
Change() : Kind(ChangeKind::AddedTypeVariable), TypeVar(nullptr) { }
@@ -220,6 +221,9 @@ class SolverTrail {
220221
/// Create a change that recorded a SyntacticElementTarget.
221222
static Change RecordedTarget(SyntacticElementTargetKey key);
222223

224+
/// Create a change that recorded a SyntacticElementTarget.
225+
static Change RecordedCaseLabelItemInfo(CaseLabelItem *item);
226+
223227
/// Undo this change, reverting the constraint graph to the state it
224228
/// had prior to this change.
225229
///

include/swift/Sema/ConstraintSystem.h

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1580,8 +1580,7 @@ class Solution {
15801580

15811581
/// Maps case label items to information tracked about them as they are
15821582
/// being solved.
1583-
llvm::MapVector<const CaseLabelItem *, CaseLabelItemInfo>
1584-
caseLabelItems;
1583+
llvm::DenseMap<const CaseLabelItem *, CaseLabelItemInfo> caseLabelItems;
15851584

15861585
/// Maps catch nodes to the set of potential throw sites that will be caught
15871586
/// at that location.
@@ -2281,8 +2280,7 @@ class ConstraintSystem {
22812280
llvm::DenseMap<ASTNode, std::pair<ContextualTypeInfo, Type>> contextualTypes;
22822281

22832282
/// Information about each case label item tracked by the constraint system.
2284-
llvm::SmallMapVector<const CaseLabelItem *, CaseLabelItemInfo, 4>
2285-
caseLabelItems;
2283+
llvm::SmallDenseMap<const CaseLabelItem *, CaseLabelItemInfo, 4> caseLabelItems;
22862284

22872285
/// Keep track of all of the potential throw sites.
22882286
/// FIXME: This data structure should be replaced with something that
@@ -2857,9 +2855,6 @@ class ConstraintSystem {
28572855
/// FIXME: Remove this.
28582856
unsigned numFixes;
28592857

2860-
/// The length of \c caseLabelItems.
2861-
unsigned numCaseLabelItems;
2862-
28632858
/// The length of \c potentialThrowSites.
28642859
unsigned numPotentialThrowSites;
28652860

@@ -3392,9 +3387,19 @@ class ConstraintSystem {
33923387
}
33933388

33943389
void setCaseLabelItemInfo(const CaseLabelItem *item, CaseLabelItemInfo info) {
3395-
assert(item != nullptr);
3396-
assert(caseLabelItems.count(item) == 0);
3397-
caseLabelItems[item] = info;
3390+
ASSERT(item);
3391+
bool inserted = caseLabelItems.insert({item, info}).second;
3392+
ASSERT(inserted);
3393+
3394+
if (solverState) {
3395+
recordChange(SolverTrail::Change::RecordedCaseLabelItemInfo(
3396+
const_cast<CaseLabelItem *>(item)));
3397+
}
3398+
}
3399+
3400+
void removeCaseLabelItemInfo(const CaseLabelItem *item) {
3401+
bool erased = caseLabelItems.erase(item);
3402+
ASSERT(erased);
33983403
}
33993404

34003405
/// Record a given ExprPattern as the parent of its sub-expression.

lib/Sema/CSSolver.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,6 @@ ConstraintSystem::SolverScope::SolverScope(ConstraintSystem &cs)
693693
numTypeVariables = cs.TypeVariables.size();
694694
numFixes = cs.Fixes.size();
695695
numKeyPaths = cs.KeyPaths.size();
696-
numCaseLabelItems = cs.caseLabelItems.size();
697696
numPotentialThrowSites = cs.potentialThrowSites.size();
698697
numExprPatterns = cs.exprPatterns.size();
699698
numIsolatedParams = cs.isolatedParams.size();
@@ -737,9 +736,6 @@ ConstraintSystem::SolverScope::~SolverScope() {
737736
/// Remove any key path expressions.
738737
truncate(cs.KeyPaths, numKeyPaths);
739738

740-
// Remove any case label item infos.
741-
truncate(cs.caseLabelItems, numCaseLabelItems);
742-
743739
// Remove any potential throw sites.
744740
truncate(cs.potentialThrowSites, numPotentialThrowSites);
745741

lib/Sema/CSTrail.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,14 @@ SolverTrail::Change::RecordedTarget(SyntacticElementTargetKey key) {
303303
return result;
304304
}
305305

306+
SolverTrail::Change
307+
SolverTrail::Change::RecordedCaseLabelItemInfo(CaseLabelItem *item) {
308+
Change result;
309+
result.Kind = ChangeKind::RecordedCaseLabelItemInfo;
310+
result.TheItem = item;
311+
return result;
312+
}
313+
306314
SyntacticElementTargetKey
307315
SolverTrail::Change::getSyntacticElementTargetKey() const {
308316
ASSERT(Kind == ChangeKind::RecordedTarget);
@@ -465,6 +473,10 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
465473
case ChangeKind::RecordedTarget:
466474
cs.removeTargetFor(getSyntacticElementTargetKey());
467475
break;
476+
477+
case ChangeKind::RecordedCaseLabelItemInfo:
478+
cs.removeCaseLabelItemInfo(TheItem);
479+
break;
468480
}
469481
}
470482

@@ -669,6 +681,11 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
669681
getSyntacticElementTargetKey().dump(out);
670682
out << ")\n";
671683
break;
684+
685+
case ChangeKind::RecordedCaseLabelItemInfo:
686+
// FIXME: Print something here
687+
out << "(RecordedCaseLabelItemInfo)\n";
688+
break;
672689
}
673690
}
674691

0 commit comments

Comments
 (0)