Skip to content

Commit 014bfa1

Browse files
committed
Handle MetadataKind::Class in readMetadata. This can only
come up as the exact value of the metadata kind for classes where ObjC interop is disabled.
1 parent c056691 commit 014bfa1

File tree

4 files changed

+65
-67
lines changed

4 files changed

+65
-67
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,14 @@ enum class MetadataKind : uint32_t {
3939
#include "MetadataKind.def"
4040
};
4141

42+
/// Try to translate the 'isa' value of a type/heap metadata into a value
43+
/// of the MetadataKind enum.
4244
template <typename StoredPointer>
43-
bool metadataKindIsClass(StoredPointer Kind) {
44-
return Kind > static_cast<StoredPointer>(MetadataKind::NonIsaMetadata_End) ||
45-
Kind < static_cast<StoredPointer>(MetadataKind::NonIsaMetadata_Start);
45+
MetadataKind getEnumeratedMetadataKind(StoredPointer kind) {
46+
if (kind > static_cast<StoredPointer>(MetadataKind::NonIsaMetadata_End) ||
47+
kind < static_cast<StoredPointer>(MetadataKind::NonIsaMetadata_Start))
48+
return MetadataKind::Class;
49+
return MetadataKind(kind);
4650
}
4751

4852
/// Kinds of Swift nominal type descriptor records.

include/swift/Remote/MetadataReader.h

Lines changed: 57 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -582,68 +582,66 @@ class MetadataReader {
582582
if (!Reader->readInteger(RemoteAddress(address), &KindValue))
583583
return nullptr;
584584

585-
auto Kind = static_cast<MetadataKind>(KindValue);
586-
587-
if (metadataKindIsClass(Kind)) {
585+
switch (getEnumeratedMetadataKind(KindValue)) {
586+
case MetadataKind::Class:
588587
return _readMetadata<TargetClassMetadata<Runtime>>(address);
589-
} else {
590-
switch (Kind) {
591-
case MetadataKind::Enum:
592-
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
593-
case MetadataKind::ErrorObject:
594-
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
595-
case MetadataKind::Existential: {
596-
StoredPointer NumProtocolsAddress = address +
597-
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
598-
StoredPointer NumProtocols;
599-
if (!Reader->readInteger(RemoteAddress(NumProtocolsAddress),
600-
&NumProtocols))
601-
return nullptr;
602-
603-
auto TotalSize = sizeof(TargetExistentialTypeMetadata<Runtime>) +
604-
NumProtocols *
605-
sizeof(ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
606-
607-
return _readMetadata<TargetExistentialTypeMetadata<Runtime>>(address,
608-
TotalSize);
609-
}
610-
case MetadataKind::ExistentialMetatype:
611-
return _readMetadata<
612-
TargetExistentialMetatypeMetadata<Runtime>>(address);
613-
case MetadataKind::ForeignClass:
614-
return _readMetadata<TargetForeignClassMetadata<Runtime>>(address);
615-
case MetadataKind::Function:
616-
return _readMetadata<TargetFunctionTypeMetadata<Runtime>>(address);
617-
case MetadataKind::HeapGenericLocalVariable:
618-
return _readMetadata<TargetHeapLocalVariableMetadata<Runtime>>(address);
619-
case MetadataKind::HeapLocalVariable:
620-
return _readMetadata<TargetHeapLocalVariableMetadata<Runtime>>(address);
621-
case MetadataKind::Metatype:
622-
return _readMetadata<TargetMetatypeMetadata<Runtime>>(address);
623-
case MetadataKind::ObjCClassWrapper:
624-
return _readMetadata<TargetObjCClassWrapperMetadata<Runtime>>(address);
625-
case MetadataKind::Opaque:
626-
return _readMetadata<TargetOpaqueMetadata<Runtime>>(address);
627-
case MetadataKind::Optional:
628-
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
629-
case MetadataKind::Struct:
630-
return _readMetadata<TargetStructMetadata<Runtime>>(address);
631-
case MetadataKind::Tuple: {
632-
auto NumElementsAddress = address +
633-
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
634-
StoredSize NumElements;
635-
if (!Reader->readInteger(RemoteAddress(NumElementsAddress),
636-
&NumElements))
637-
return nullptr;
638-
auto TotalSize = sizeof(TargetTupleTypeMetadata<Runtime>) +
639-
NumElements * sizeof(StoredPointer);
640-
return _readMetadata<TargetTupleTypeMetadata<Runtime>>(address,
641-
TotalSize);
642-
}
643-
default:
588+
case MetadataKind::Enum:
589+
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
590+
case MetadataKind::ErrorObject:
591+
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
592+
case MetadataKind::Existential: {
593+
StoredPointer NumProtocolsAddress = address +
594+
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
595+
StoredPointer NumProtocols;
596+
if (!Reader->readInteger(RemoteAddress(NumProtocolsAddress),
597+
&NumProtocols))
644598
return nullptr;
645-
}
599+
600+
auto TotalSize = sizeof(TargetExistentialTypeMetadata<Runtime>) +
601+
NumProtocols *
602+
sizeof(ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
603+
604+
return _readMetadata<TargetExistentialTypeMetadata<Runtime>>(address,
605+
TotalSize);
646606
}
607+
case MetadataKind::ExistentialMetatype:
608+
return _readMetadata<
609+
TargetExistentialMetatypeMetadata<Runtime>>(address);
610+
case MetadataKind::ForeignClass:
611+
return _readMetadata<TargetForeignClassMetadata<Runtime>>(address);
612+
case MetadataKind::Function:
613+
return _readMetadata<TargetFunctionTypeMetadata<Runtime>>(address);
614+
case MetadataKind::HeapGenericLocalVariable:
615+
return _readMetadata<TargetHeapLocalVariableMetadata<Runtime>>(address);
616+
case MetadataKind::HeapLocalVariable:
617+
return _readMetadata<TargetHeapLocalVariableMetadata<Runtime>>(address);
618+
case MetadataKind::Metatype:
619+
return _readMetadata<TargetMetatypeMetadata<Runtime>>(address);
620+
case MetadataKind::ObjCClassWrapper:
621+
return _readMetadata<TargetObjCClassWrapperMetadata<Runtime>>(address);
622+
case MetadataKind::Opaque:
623+
return _readMetadata<TargetOpaqueMetadata<Runtime>>(address);
624+
case MetadataKind::Optional:
625+
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
626+
case MetadataKind::Struct:
627+
return _readMetadata<TargetStructMetadata<Runtime>>(address);
628+
case MetadataKind::Tuple: {
629+
auto NumElementsAddress = address +
630+
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
631+
StoredSize NumElements;
632+
if (!Reader->readInteger(RemoteAddress(NumElementsAddress),
633+
&NumElements))
634+
return nullptr;
635+
auto TotalSize = sizeof(TargetTupleTypeMetadata<Runtime>) +
636+
NumElements * sizeof(StoredPointer);
637+
return _readMetadata<TargetTupleTypeMetadata<Runtime>>(address,
638+
TotalSize);
639+
}
640+
}
641+
642+
// We can fall out here if the value wasn't actually a valid
643+
// MetadataKind.
644+
return nullptr;
647645
}
648646

649647
StoredPointer readAddressOfNominalTypeDescriptor(MetadataRef metadata) {

include/swift/Runtime/Metadata.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,9 +1097,7 @@ struct TargetMetadata {
10971097
public:
10981098
/// Get the metadata kind.
10991099
MetadataKind getKind() const {
1100-
if (metadataKindIsClass(Kind))
1101-
return MetadataKind::Class;
1102-
return MetadataKind(Kind);
1100+
return getEnumeratedMetadataKind(Kind);
11031101
}
11041102

11051103
/// Set the metadata kind.

test/RemoteAST/nominal_types.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// RUN: %target-swift-remoteast-test %s | FileCheck %s
22

3-
// XFAIL: linux
4-
53
@_silgen_name("printMetadataType")
64
func printType(_: Any.Type)
75

0 commit comments

Comments
 (0)