Skip to content

Commit 1d4519a

Browse files
committed
[Runtime] Assert dynamic metadata is not static.
Added an assertion that a generic metadata record that is instantiated at runtime is not a prespecialized metadata record.
1 parent 5e85500 commit 1d4519a

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,18 @@ SWIFT_ALLOWED_RUNTIME_GLOBAL_CTOR_END
436436
extern "C" void *_objc_empty_cache;
437437
#endif
438438

439+
template <>
440+
bool Metadata::isCanonicalStaticallySpecializedGenericMetadata() const {
441+
if (auto *metadata = dyn_cast<StructMetadata>(this))
442+
return metadata->isCanonicalStaticallySpecializedGenericMetadata();
443+
if (auto *metadata = dyn_cast<EnumMetadata>(this))
444+
return metadata->isCanonicalStaticallySpecializedGenericMetadata();
445+
if (auto *metadata = dyn_cast<ClassMetadata>(this))
446+
return metadata->isCanonicalStaticallySpecializedGenericMetadata();
447+
448+
return false;
449+
}
450+
439451
static void copyMetadataPattern(void **section,
440452
const GenericMetadataPartialPattern *pattern) {
441453
memcpy(section + pattern->OffsetInWords,
@@ -672,6 +684,9 @@ swift::swift_getGenericMetadata(MetadataRequest request,
672684
arguments);
673685
auto result = cache.getOrInsert(key, request, description, arguments);
674686

687+
assert(
688+
!result.second.Value->isCanonicalStaticallySpecializedGenericMetadata());
689+
675690
return result.second;
676691
}
677692

@@ -5521,18 +5536,6 @@ bool Metadata::satisfiesClassConstraint() const {
55215536
return isAnyClass();
55225537
}
55235538

5524-
template <>
5525-
bool Metadata::isCanonicalStaticallySpecializedGenericMetadata() const {
5526-
if (auto *metadata = dyn_cast<StructMetadata>(this))
5527-
return metadata->isCanonicalStaticallySpecializedGenericMetadata();
5528-
if (auto *metadata = dyn_cast<EnumMetadata>(this))
5529-
return metadata->isCanonicalStaticallySpecializedGenericMetadata();
5530-
if (auto *metadata = dyn_cast<ClassMetadata>(this))
5531-
return metadata->isCanonicalStaticallySpecializedGenericMetadata();
5532-
5533-
return false;
5534-
}
5535-
55365539
#if !NDEBUG
55375540
static bool referencesAnonymousContext(Demangle::Node *node) {
55385541
if (node->getKind() == Demangle::Node::Kind::AnonymousContext)

0 commit comments

Comments
 (0)