Skip to content

Commit 5bacc08

Browse files
committed
[AST] Represent requirement signature as a flat set of requirements.
The outside representation already went to a flat set of requirements; make the internal representation match so we aren't tempted to use the requirement signature as inputs to a generic signature.
1 parent 623d72d commit 5bacc08

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

include/swift/AST/Decl.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3501,7 +3501,7 @@ class ProtocolDecl : public NominalTypeDecl {
35013501

35023502
/// The generic signature representing exactly the new requirements introduced
35033503
/// by this protocol.
3504-
GenericSignature *RequirementSignature = nullptr;
3504+
const Requirement *RequirementSignature = nullptr;
35053505

35063506
/// True if the protocol has requirements that cannot be satisfied (e.g.
35073507
/// because they could not be imported from Objective-C).
@@ -3511,6 +3511,9 @@ class ProtocolDecl : public NominalTypeDecl {
35113511
/// value, plus one. Otherwise, it will be 0.
35123512
unsigned KnownProtocol : 6;
35133513

3514+
/// The number of requirements in the requirement signature.
3515+
unsigned NumRequirementsInSignature : 16;
3516+
35143517
bool requiresClassSlow();
35153518

35163519
bool existentialConformsToSelfSlow();
@@ -3687,8 +3690,6 @@ class ProtocolDecl : public NominalTypeDecl {
36873690

36883691
/// Create the implicit generic parameter list for a protocol or
36893692
/// extension thereof.
3690-
///
3691-
/// FIXME: protocol extensions will introduce a where clause here as well.
36923693
GenericParamList *createGenericParams(DeclContext *dc);
36933694

36943695
/// Create the generic parameters of this protocol if the haven't been
@@ -3708,9 +3709,9 @@ class ProtocolDecl : public NominalTypeDecl {
37083709
/// protocols of the inherited protocols) are not mentioned. The conformance
37093710
/// requirements listed here become entries in the witness table.
37103711
ArrayRef<Requirement> getRequirementSignature() const {
3711-
assert(RequirementSignature &&
3712+
assert(isRequirementSignatureComputed() &&
37123713
"getting requirement signature before computing it");
3713-
return RequirementSignature->getRequirements();
3714+
return llvm::makeArrayRef(RequirementSignature, NumRequirementsInSignature);
37143715
}
37153716

37163717
/// Has the requirement signature been computed yet?
@@ -3720,9 +3721,7 @@ class ProtocolDecl : public NominalTypeDecl {
37203721

37213722
void computeRequirementSignature();
37223723

3723-
void setRequirementSignature(GenericSignature *sig) {
3724-
RequirementSignature = sig;
3725-
}
3724+
void setRequirementSignature(ArrayRef<Requirement> requirements);
37263725

37273726
// Implement isa/cast/dyncast/etc.
37283727
static bool classof(const Decl *D) {

lib/AST/Decl.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2861,10 +2861,11 @@ ProtocolDecl::ProtocolDecl(DeclContext *DC, SourceLoc ProtocolLoc,
28612861
ProtocolDeclBits.RequiresClass = false;
28622862
ProtocolDeclBits.ExistentialConformsToSelfValid = false;
28632863
ProtocolDeclBits.ExistentialConformsToSelf = false;
2864-
KnownProtocol = 0;
28652864
ProtocolDeclBits.Circularity
28662865
= static_cast<unsigned>(CircularityCheck::Unchecked);
28672866
HasMissingRequirements = false;
2867+
KnownProtocol = 0;
2868+
NumRequirementsInSignature = 0;
28682869
}
28692870

28702871
llvm::TinyPtrVector<ProtocolDecl *>
@@ -3299,8 +3300,23 @@ void ProtocolDecl::computeRequirementSignature() {
32993300
GenericSignatureBuilder::RequirementSource
33003301
::forRequirementSignature(selfPA, this),
33013302
nullptr);
3302-
3303-
RequirementSignature = builder.computeGenericSignature(SourceLoc());
3303+
3304+
// Compute and record the signature.
3305+
auto requirementSig = builder.computeGenericSignature(SourceLoc());
3306+
RequirementSignature = requirementSig->getRequirements().data();
3307+
assert(RequirementSignature != nullptr);
3308+
NumRequirementsInSignature = requirementSig->getRequirements().size();
3309+
}
3310+
3311+
void ProtocolDecl::setRequirementSignature(ArrayRef<Requirement> requirements) {
3312+
assert(!RequirementSignature && "already computed requirement signature");
3313+
if (requirements.empty()) {
3314+
RequirementSignature = reinterpret_cast<Requirement *>(this + 1);
3315+
NumRequirementsInSignature = 0;
3316+
} else {
3317+
RequirementSignature = getASTContext().AllocateCopy(requirements).data();
3318+
NumRequirementsInSignature = requirements.size();
3319+
}
33043320
}
33053321

33063322
/// Returns the default witness for a requirement, or nullptr if there is

lib/Serialization/Deserialization.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3066,9 +3066,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
30663066
proto->setImplicit();
30673067
proto->computeType();
30683068

3069-
auto signature = GenericSignature::get(
3070-
{ proto->getProtocolSelfType() }, requirements);
3071-
proto->setRequirementSignature(signature);
3069+
proto->setRequirementSignature(requirements);
30723070

30733071
proto->setMemberLoader(this, DeclTypeCursor.GetCurrentBitNo());
30743072
proto->setCircularityCheck(CircularityCheck::Checked);

0 commit comments

Comments
 (0)