Skip to content

Commit 2a0c44e

Browse files
committed
NFC: Code clean up, in large part combining methods that only have single callers/callees and simplifying.
1 parent bbb6ca1 commit 2a0c44e

File tree

1 file changed

+53
-122
lines changed

1 file changed

+53
-122
lines changed

lib/SILGen/SILGenPattern.cpp

Lines changed: 53 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -451,25 +451,17 @@ class PatternMatchEmission {
451451

452452
void bindRefutablePatterns(const ClauseRow &row, ArgArray args,
453453
const FailureHandler &failure);
454-
void bindRefutablePattern(Pattern *pattern, ConsumableManagedValue v,
455-
const FailureHandler &failure);
456-
void bindExprPattern(ExprPattern *pattern, ConsumableManagedValue v,
457-
const FailureHandler &failure);
458454
void emitGuardBranch(SILLocation loc, Expr *guard,
459455
const FailureHandler &failure,
460456
Pattern *usingImplicitVariablesFromPattern,
461457
CaseStmt *usingImplicitVariablesFromStmt);
462458

463459
void bindIrrefutablePatterns(const ClauseRow &row, ArgArray args,
464460
bool forIrrefutableRow, bool hasMultipleItems);
465-
void bindIrrefutablePattern(Pattern *pattern, ConsumableManagedValue v,
466-
bool forIrrefutableRow, bool hasMultipleItems);
467-
void bindNamedPattern(NamedPattern *pattern, ConsumableManagedValue v,
468-
bool forIrrefutableRow, bool hasMultipleItems);
469461

470-
void bindVariable(SILLocation loc, VarDecl *var,
471-
ConsumableManagedValue value, CanType formalValueType,
472-
bool isIrrefutable, bool hasMultipleItems);
462+
void bindVariable(Pattern *pattern, VarDecl *var,
463+
ConsumableManagedValue value, bool isIrrefutable,
464+
bool hasMultipleItems);
473465

474466
void emitSpecializedDispatch(ClauseMatrix &matrix, ArgArray args,
475467
unsigned &lastRow, unsigned column,
@@ -1104,63 +1096,38 @@ void PatternMatchEmission::emitWildcardDispatch(ClauseMatrix &clauses,
11041096
assert(!SGF.B.hasValidInsertionPoint());
11051097
}
11061098

1107-
/// Bind all the irrefutable patterns in the given row, which is
1108-
/// nothing but wildcard patterns.
1099+
/// Bind all the refutable patterns in the given row.
11091100
void PatternMatchEmission::
11101101
bindRefutablePatterns(const ClauseRow &row, ArgArray args,
11111102
const FailureHandler &failure) {
11121103
assert(row.columns() == args.size());
11131104
for (unsigned i = 0, e = args.size(); i != e; ++i) {
1114-
bindRefutablePattern(row[i], args[i], failure);
1115-
}
1116-
}
1117-
1118-
/// Bind a refutable wildcard pattern to a given value.
1119-
void PatternMatchEmission::bindRefutablePattern(Pattern *pattern,
1120-
ConsumableManagedValue value,
1121-
const FailureHandler &failure) {
1122-
// We use null patterns to mean artificial AnyPatterns.
1123-
if (!pattern) return;
1124-
1125-
pattern = pattern->getSemanticsProvidingPattern();
1126-
switch (pattern->getKind()) {
1127-
// Non-wildcard patterns.
1128-
case PatternKind::Tuple:
1129-
case PatternKind::EnumElement:
1130-
case PatternKind::OptionalSome:
1131-
case PatternKind::Bool:
1132-
case PatternKind::Is:
1133-
llvm_unreachable("didn't specialize specializable pattern?");
1134-
1135-
// Non-semantic patterns.
1136-
case PatternKind::Paren:
1137-
case PatternKind::Typed:
1138-
case PatternKind::Var:
1139-
llvm_unreachable("should have skipped non-semantic pattern");
1105+
if (!row[i]) // We use null patterns to mean artificial AnyPatterns
1106+
continue;
11401107

1141-
// Refutable patterns that we'll handle in a later pass.
1142-
case PatternKind::Any:
1143-
case PatternKind::Named:
1144-
return;
1108+
Pattern *pattern = row[i]->getSemanticsProvidingPattern();
1109+
switch (pattern->getKind()) {
1110+
// Irrefutable patterns that we'll handle in a later pass.
1111+
case PatternKind::Any:
1112+
break;
1113+
case PatternKind::Named:
1114+
break;
11451115

1146-
case PatternKind::Expr:
1147-
bindExprPattern(cast<ExprPattern>(pattern), value, failure);
1148-
return;
1116+
case PatternKind::Expr: {
1117+
ExprPattern *exprPattern = cast<ExprPattern>(pattern);
1118+
DebugLocOverrideRAII LocOverride{SGF.B,
1119+
getSubjectLocationOverride(pattern)};
1120+
FullExpr scope(SGF.Cleanups, CleanupLocation(pattern));
1121+
bindVariable(pattern, exprPattern->getMatchVar(), args[i],
1122+
/*isForSuccess*/ false, /* hasMultipleItems */ false);
1123+
emitGuardBranch(pattern, exprPattern->getMatchExpr(), failure, nullptr,
1124+
nullptr);
1125+
break;
1126+
}
1127+
default:
1128+
llvm_unreachable("bad pattern kind");
1129+
}
11491130
}
1150-
llvm_unreachable("bad pattern kind");
1151-
}
1152-
1153-
/// Check whether an expression pattern is satisfied.
1154-
void PatternMatchEmission::bindExprPattern(ExprPattern *pattern,
1155-
ConsumableManagedValue value,
1156-
const FailureHandler &failure) {
1157-
DebugLocOverrideRAII LocOverride{SGF.B, getSubjectLocationOverride(pattern)};
1158-
FullExpr scope(SGF.Cleanups, CleanupLocation(pattern));
1159-
bindVariable(pattern, pattern->getMatchVar(), value,
1160-
pattern->getType()->getCanonicalType(),
1161-
/*isForSuccess*/ false, /* hasMultipleItems */ false);
1162-
emitGuardBranch(pattern, pattern->getMatchExpr(), failure,
1163-
nullptr, nullptr);
11641131
}
11651132

11661133
/// Bind all the irrefutable patterns in the given row, which is nothing
@@ -1174,59 +1141,26 @@ void PatternMatchEmission::bindIrrefutablePatterns(const ClauseRow &row,
11741141
bool hasMultipleItems) {
11751142
assert(row.columns() == args.size());
11761143
for (unsigned i = 0, e = args.size(); i != e; ++i) {
1177-
bindIrrefutablePattern(row[i], args[i], forIrrefutableRow, hasMultipleItems);
1178-
}
1179-
}
1144+
if (!row[i]) // We use null patterns to mean artificial AnyPatterns
1145+
continue;
11801146

1181-
/// Bind an irrefutable wildcard pattern to a given value.
1182-
void PatternMatchEmission::bindIrrefutablePattern(Pattern *pattern,
1183-
ConsumableManagedValue value,
1184-
bool forIrrefutableRow,
1185-
bool hasMultipleItems) {
1186-
// We use null patterns to mean artificial AnyPatterns.
1187-
if (!pattern) return;
1188-
1189-
pattern = pattern->getSemanticsProvidingPattern();
1190-
switch (pattern->getKind()) {
1191-
// Non-wildcard patterns.
1192-
case PatternKind::Tuple:
1193-
case PatternKind::EnumElement:
1194-
case PatternKind::OptionalSome:
1195-
case PatternKind::Bool:
1196-
case PatternKind::Is:
1197-
llvm_unreachable("didn't specialize specializable pattern?");
1198-
1199-
// Non-semantic patterns.
1200-
case PatternKind::Paren:
1201-
case PatternKind::Typed:
1202-
case PatternKind::Var:
1203-
llvm_unreachable("should have skipped non-semantic pattern");
1204-
1205-
// We can just drop Any values.
1206-
case PatternKind::Any:
1207-
return;
1208-
1209-
// Ignore expression patterns, which we should have bound in an
1210-
// earlier pass.
1211-
case PatternKind::Expr:
1212-
return;
1213-
1214-
case PatternKind::Named:
1215-
bindNamedPattern(cast<NamedPattern>(pattern), value,
1216-
forIrrefutableRow, hasMultipleItems);
1217-
return;
1147+
Pattern *pattern = row[i]->getSemanticsProvidingPattern();
1148+
switch (pattern->getKind()) {
1149+
case PatternKind::Any: // We can just drop Any values.
1150+
break;
1151+
case PatternKind::Expr: // Ignore expression patterns, which we should have
1152+
// bound in an earlier pass.
1153+
break;
1154+
case PatternKind::Named: {
1155+
NamedPattern *named = cast<NamedPattern>(pattern);
1156+
bindVariable(pattern, named->getDecl(), args[i], forIrrefutableRow,
1157+
hasMultipleItems);
1158+
break;
1159+
}
1160+
default:
1161+
llvm_unreachable("bad pattern kind");
1162+
}
12181163
}
1219-
llvm_unreachable("bad pattern kind");
1220-
}
1221-
1222-
/// Bind a named pattern to a given value.
1223-
void PatternMatchEmission::bindNamedPattern(NamedPattern *pattern,
1224-
ConsumableManagedValue value,
1225-
bool forIrrefutableRow,
1226-
bool hasMultipleItems) {
1227-
bindVariable(pattern, pattern->getDecl(), value,
1228-
pattern->getType()->getCanonicalType(), forIrrefutableRow,
1229-
hasMultipleItems);
12301164
}
12311165

12321166
/// Should we take control of the mang
@@ -1240,26 +1174,23 @@ static bool shouldTake(ConsumableManagedValue value, bool isIrrefutable) {
12401174
}
12411175

12421176
/// Bind a variable into the current scope.
1243-
void PatternMatchEmission::bindVariable(SILLocation loc, VarDecl *var,
1177+
void PatternMatchEmission::bindVariable(Pattern *pattern, VarDecl *var,
12441178
ConsumableManagedValue value,
1245-
CanType formalValueType,
12461179
bool isIrrefutable,
12471180
bool hasMultipleItems) {
12481181
// If this binding is one of multiple patterns, each individual binding
12491182
// will just be let, and then the chosen value will get forwarded into
12501183
// a var box in the final shared case block.
1251-
bool forcedLet = var->isLet();
1252-
if (hasMultipleItems && !var->isLet())
1253-
forcedLet = true;
1254-
1255-
// Initialize the variable value.
1256-
InitializationPtr init = SGF.emitInitializationForVarDecl(var, forcedLet);
1184+
bool immutable = var->isLet() || hasMultipleItems;
12571185

1258-
RValue rv(SGF, loc, formalValueType, value.getFinalManagedValue());
1186+
// Initialize the variable value.
1187+
InitializationPtr init = SGF.emitInitializationForVarDecl(var, immutable);
1188+
CanType formalValueType = pattern->getType()->getCanonicalType();
1189+
RValue rv(SGF, pattern, formalValueType, value.getFinalManagedValue());
12591190
if (shouldTake(value, isIrrefutable)) {
1260-
std::move(rv).forwardInto(SGF, loc, init.get());
1191+
std::move(rv).forwardInto(SGF, pattern, init.get());
12611192
} else {
1262-
std::move(rv).copyInto(SGF, loc, init.get());
1193+
std::move(rv).copyInto(SGF, pattern, init.get());
12631194
}
12641195
}
12651196

0 commit comments

Comments
 (0)