macOS: Remove unused qt_objcDynamicSuper machinery
We switched to mixins in 7319c342c34f6bcc8f0322e9613c6296331f1487 for the QNSWindow/QNSPanel case, and haven't found another case for this helper since, so let's remove it. Change-Id: I92f57bb41bb7cbef18fb97d5ec43a5f48f4805a7 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
92619ce2ec
commit
988a2c1352
@ -186,129 +186,6 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSPanelContentsWrapper);
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
// Depending on the ABI of the platform, we may need to use objc_msgSendSuper_stret:
|
||||
// - http://www.sealiesoftware.com/blog/archive/2008/10/30/objc_explain_objc_msgSend_stret.html
|
||||
// - https://lists.apple.com/archives/cocoa-dev/2008/Feb/msg02338.html
|
||||
template <typename T>
|
||||
struct objc_msgsend_requires_stret
|
||||
{ static const bool value =
|
||||
#if defined(Q_PROCESSOR_X86)
|
||||
#define PLATFORM_USES_SEND_SUPER_STRET 1
|
||||
// Any return value larger than two registers on i386/x86_64
|
||||
sizeof(T) > sizeof(void*) * 2;
|
||||
#elif defined(Q_PROCESSOR_ARM_32)
|
||||
#define PLATFORM_USES_SEND_SUPER_STRET 1
|
||||
// Any return value larger than a single register on arm
|
||||
sizeof(T) > sizeof(void*);
|
||||
#elif defined(Q_PROCESSOR_ARM_64)
|
||||
#define PLATFORM_USES_SEND_SUPER_STRET 0
|
||||
false; // Stret not used on arm64
|
||||
#endif
|
||||
};
|
||||
|
||||
template <>
|
||||
struct objc_msgsend_requires_stret<void>
|
||||
{ static const bool value = false; };
|
||||
|
||||
template <typename ReturnType, typename... Args>
|
||||
ReturnType qt_msgSendSuper(id receiver, SEL selector, Args... args)
|
||||
{
|
||||
static_assert(!objc_msgsend_requires_stret<ReturnType>::value,
|
||||
"The given return type requires stret on this platform");
|
||||
|
||||
typedef ReturnType (*SuperFn)(objc_super *, SEL, Args...);
|
||||
SuperFn superFn = reinterpret_cast<SuperFn>(objc_msgSendSuper);
|
||||
objc_super sup = { receiver, [receiver superclass] };
|
||||
return superFn(&sup, selector, args...);
|
||||
}
|
||||
|
||||
#if PLATFORM_USES_SEND_SUPER_STRET
|
||||
template <typename ReturnType, typename... Args>
|
||||
ReturnType qt_msgSendSuper_stret(id receiver, SEL selector, Args... args)
|
||||
{
|
||||
static_assert(objc_msgsend_requires_stret<ReturnType>::value,
|
||||
"The given return type does not use stret on this platform");
|
||||
|
||||
typedef void (*SuperStretFn)(ReturnType *, objc_super *, SEL, Args...);
|
||||
SuperStretFn superStretFn = reinterpret_cast<SuperStretFn>(objc_msgSendSuper_stret);
|
||||
|
||||
objc_super sup = { receiver, [receiver superclass] };
|
||||
ReturnType ret;
|
||||
superStretFn(&ret, &sup, selector, args...);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename... Args>
|
||||
class QSendSuperHelper {
|
||||
public:
|
||||
QSendSuperHelper(id receiver, SEL sel, Args... args)
|
||||
: m_receiver(receiver), m_selector(sel), m_args(std::make_tuple(args...)), m_sent(false)
|
||||
{
|
||||
}
|
||||
|
||||
~QSendSuperHelper()
|
||||
{
|
||||
if (!m_sent)
|
||||
msgSendSuper<void>(m_args);
|
||||
}
|
||||
|
||||
template <typename ReturnType>
|
||||
operator ReturnType()
|
||||
{
|
||||
#if defined(QT_DEBUG)
|
||||
Method method = class_getInstanceMethod(object_getClass(m_receiver), m_selector);
|
||||
char returnTypeEncoding[256];
|
||||
method_getReturnType(method, returnTypeEncoding, sizeof(returnTypeEncoding));
|
||||
NSUInteger alignedReturnTypeSize = 0;
|
||||
NSGetSizeAndAlignment(returnTypeEncoding, nullptr, &alignedReturnTypeSize);
|
||||
Q_ASSERT(alignedReturnTypeSize == sizeof(ReturnType));
|
||||
#endif
|
||||
m_sent = true;
|
||||
return msgSendSuper<ReturnType>(m_args);
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename ReturnType, bool V>
|
||||
using if_requires_stret = typename std::enable_if<objc_msgsend_requires_stret<ReturnType>::value == V, ReturnType>::type;
|
||||
|
||||
template <typename ReturnType, size_t... Is>
|
||||
if_requires_stret<ReturnType, false> msgSendSuper(std::tuple<Args...>& args, std::index_sequence<Is...>)
|
||||
{
|
||||
return qt_msgSendSuper<ReturnType>(m_receiver, m_selector, std::get<Is>(args)...);
|
||||
}
|
||||
|
||||
#if PLATFORM_USES_SEND_SUPER_STRET
|
||||
template <typename ReturnType, size_t... Is>
|
||||
if_requires_stret<ReturnType, true> msgSendSuper(std::tuple<Args...>& args, std::index_sequence<Is...>)
|
||||
{
|
||||
return qt_msgSendSuper_stret<ReturnType>(m_receiver, m_selector, std::get<Is>(args)...);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <typename ReturnType>
|
||||
ReturnType msgSendSuper(std::tuple<Args...>& args)
|
||||
{
|
||||
return msgSendSuper<ReturnType>(args, std::make_index_sequence<sizeof...(Args)>{});
|
||||
}
|
||||
|
||||
id m_receiver;
|
||||
SEL m_selector;
|
||||
std::tuple<Args...> m_args;
|
||||
bool m_sent;
|
||||
};
|
||||
|
||||
template<typename... Args>
|
||||
QSendSuperHelper<Args...> qt_objcDynamicSuperHelper(id receiver, SEL selector, Args... args)
|
||||
{
|
||||
return QSendSuperHelper<Args...>(receiver, selector, args...);
|
||||
}
|
||||
|
||||
// Same as calling super, but the super_class field resolved at runtime instead of compile time
|
||||
#define qt_objcDynamicSuper(...) qt_objcDynamicSuperHelper(self, _cmd, ##__VA_ARGS__)
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
struct InputMethodQueryResult : public QHash<int, QVariant>
|
||||
{
|
||||
operator bool() { return !isEmpty(); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user