int ConformanceLookupTable::compareProtocolConformances( ProtocolConformance * const *lhsPtr, ProtocolConformance * const *rhsPtr) { ProtocolConformance *lhs = *lhsPtr; ProtocolConformance *rhs = *rhsPtr; // If the two conformances are normal conformances with locations, // sort by location. if (auto lhsNormal = dyn_cast<NormalProtocolConformance>(lhs)) { if (auto rhsNormal = dyn_cast<NormalProtocolConformance>(rhs)) { if (lhsNormal->getLoc().isValid() && rhsNormal->getLoc().isValid()) { ASTContext &ctx = lhs->getDeclContext()->getASTContext(); unsigned lhsBuffer = ctx.SourceMgr.findBufferContainingLoc(lhsNormal->getLoc()); unsigned rhsBuffer = ctx.SourceMgr.findBufferContainingLoc(rhsNormal->getLoc()); // If the buffers are the same, use source location ordering. if (lhsBuffer == rhsBuffer) { return ctx.SourceMgr.isBeforeInBuffer(lhsNormal->getLoc(), rhsNormal->getLoc()); } // Otherwise, order by buffer identifier. return StringRef(ctx.SourceMgr.getIdentifierForBuffer(lhsBuffer)) .compare(ctx.SourceMgr.getIdentifierForBuffer(rhsBuffer)); } } } // Otherwise, sort by protocol. ProtocolDecl *lhsProto = lhs->getProtocol(); ProtocolDecl *rhsProto = rhs->getProtocol(); return ProtocolType::compareProtocols(&lhsProto, &rhsProto); }
void layout() { // If the conforming type is generic, we just want to emit the // unbound generic type here. auto *Nominal = Conformance->getInterfaceType()->getAnyNominal(); assert(Nominal && "Structural conformance?"); PrettyStackTraceDecl DebugStack("emitting associated type metadata", Nominal); auto *M = IGM.getSILModule().getSwiftModule(); addTypeRef(M, Nominal->getDeclaredType()->getCanonicalType()); auto ProtoTy = Conformance->getProtocol()->getDeclaredType(); addTypeRef(M, ProtoTy->getCanonicalType()); addConstantInt32(AssociatedTypes.size()); addConstantInt32(AssociatedTypeRecordSize); for (auto AssocTy : AssociatedTypes) { auto NameGlobal = IGM.getAddrOfStringForTypeRef(AssocTy.first); addRelativeAddress(NameGlobal); addBuiltinTypeRefs(AssocTy.second); addTypeRef(M, AssocTy.second); } }
void layout() override { // If the conforming type is generic, we just want to emit the // unbound generic type here. auto *Nominal = Conformance->getType()->getAnyNominal(); assert(Nominal && "Structural conformance?"); PrettyStackTraceDecl DebugStack("emitting associated type metadata", Nominal); addTypeRef(Nominal->getDeclaredType()->getCanonicalType()); addNominalRef(Conformance->getProtocol()); B.addInt32(AssociatedTypes.size()); B.addInt32(AssociatedTypeRecordSize); for (auto AssocTy : AssociatedTypes) { auto NameGlobal = IGM.getAddrOfFieldName(AssocTy.first); B.addRelativeAddress(NameGlobal); addBuiltinTypeRefs(AssocTy.second); addTypeRef(AssocTy.second); } }