diff --git a/stdlib/public/SwiftShims/RuntimeShims.h b/stdlib/public/SwiftShims/RuntimeShims.h index b5ffb04c81958..c133adae411a2 100644 --- a/stdlib/public/SwiftShims/RuntimeShims.h +++ b/stdlib/public/SwiftShims/RuntimeShims.h @@ -20,6 +20,7 @@ #include "SwiftStddef.h" #include "SwiftStdint.h" +#include "SwiftStdbool.h" #include "Visibility.h" #ifdef __cplusplus @@ -61,6 +62,12 @@ int _swift_stdlib_putc_stderr(int C); SWIFT_RUNTIME_STDLIB_API __swift_size_t _swift_stdlib_getHardwareConcurrency(void); +#ifdef __swift__ +/// Called by ReflectionMirror in stdlib through C-calling-convention +SWIFT_RUNTIME_STDLIB_API +__swift_bool swift_isClassType(const void *type); +#endif + /// Manually allocated memory is at least 16-byte aligned in Swift. /// /// When swift_slowAlloc is called with "default" alignment (alignMask == diff --git a/stdlib/public/core/ReflectionMirror.swift b/stdlib/public/core/ReflectionMirror.swift index 2f68b9078aa21..8631695d99e79 100644 --- a/stdlib/public/core/ReflectionMirror.swift +++ b/stdlib/public/core/ReflectionMirror.swift @@ -12,8 +12,11 @@ import SwiftShims -@_silgen_name("swift_isClassType") -internal func _isClassType(_: Any.Type) -> Bool +internal func _isClassType(_ type: Any.Type) -> Bool { + // a thick metatype is represented with a pointer metadata structure, + // so this unsafeBitCast is a safe operation here. + return swift_isClassType(unsafeBitCast(type, to: UnsafeRawPointer.self)) +} @_silgen_name("swift_getMetadataKind") internal func _metadataKind(_: Any.Type) -> UInt