mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Runtime: provide inline friendly isa mask/shift variables for 1.0
<rdar://problem/16663586> provide a global isa mask so v-table dispatch doesn't have to call object_getClass Swift SVN r16960
This commit is contained in:
@@ -1619,16 +1619,23 @@ swift_getExistentialMetatypeMetadata(const Metadata *instanceType);
|
|||||||
extern "C" const ExistentialTypeMetadata *
|
extern "C" const ExistentialTypeMetadata *
|
||||||
swift_getExistentialTypeMetadata(size_t numProtocols,
|
swift_getExistentialTypeMetadata(size_t numProtocols,
|
||||||
const ProtocolDescriptor **protocols);
|
const ProtocolDescriptor **protocols);
|
||||||
|
|
||||||
/// \brief Load the Swift class metadata
|
/// \brief Load the Swift class metadata
|
||||||
///
|
///
|
||||||
/// \param object The object
|
/// \param object The object
|
||||||
///
|
///
|
||||||
/// \returns the Class class metadata in a way that ignores dynamic subclassing.
|
/// \returns the Class class metadata in a way that ignores dynamic subclassing.
|
||||||
/// This will crash if the object is not a pure Swift class.
|
/// This will crash if the object is not a pure Swift class. If we know that
|
||||||
|
/// dynamic subclassing will never happen, then swift_classMask and
|
||||||
|
/// swift_classShift are sufficient.
|
||||||
extern "C" const ClassMetadata *
|
extern "C" const ClassMetadata *
|
||||||
swift_getClassMetadata(const void *object);
|
swift_getClassMetadata(const void *object);
|
||||||
|
|
||||||
|
// Mask and left shift for reading the isa directly from Swift objects when
|
||||||
|
// we know that dynamic subclassing (CoreData, KVO, etc) doesn't happen.
|
||||||
|
extern "C" size_t swift_classMask;
|
||||||
|
extern "C" uint8_t swift_classShift;
|
||||||
|
|
||||||
/// \brief Checked dynamic cast to a class type.
|
/// \brief Checked dynamic cast to a class type.
|
||||||
///
|
///
|
||||||
/// \param object The object to cast.
|
/// \param object The object to cast.
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
using namespace swift;
|
using namespace swift;
|
||||||
using namespace metadataimpl;
|
using namespace metadataimpl;
|
||||||
|
|
||||||
|
extern "C" const uintptr_t objc_debug_isa_class_mask;
|
||||||
extern "C" const ClassMetadata* object_getClass(const void *);
|
extern "C" const ClassMetadata* object_getClass(const void *);
|
||||||
extern "C" const char* class_getName(const ClassMetadata*);
|
extern "C" const char* class_getName(const ClassMetadata*);
|
||||||
extern "C" const ClassMetadata* class_getSuperclass(const ClassMetadata*);
|
extern "C" const ClassMetadata* class_getSuperclass(const ClassMetadata*);
|
||||||
@@ -284,6 +285,9 @@ swift::swift_getClassMetadata(const void *object) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
size_t swift::swift_classMask = objc_debug_isa_class_mask;
|
||||||
|
uint8_t swift::swift_classShift = 0;
|
||||||
|
|
||||||
/// The primary entrypoint.
|
/// The primary entrypoint.
|
||||||
const void *
|
const void *
|
||||||
swift::swift_dynamicCastClass(const void *object,
|
swift::swift_dynamicCastClass(const void *object,
|
||||||
|
|||||||
Reference in New Issue
Block a user