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:
Dave Zarzycki
2014-04-28 05:47:55 +00:00
parent 8c224c9d64
commit e5f7cddded
2 changed files with 13 additions and 2 deletions

View File

@@ -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.

View File

@@ -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,