def test_typedSelector(self): @objc.typedSelector(b"I@:qq") def mySelector_arg_(self, a, b): return 4 self.assertIsInstance(mySelector_arg_, objc.selector) self.assertEqual(mySelector_arg_.signature, b"I@:qq") self.assertEqual(mySelector_arg_.selector, b"mySelector:arg:") self.assertRaises(TypeError, objc.typedSelector(b"v@:i"), None) self.assertRaises(TypeError, objc.typedSelector(b"v@:i"), 42)
def signature(signature): """Returns an objc.signature with 'i' and 'f' letters changed to correct NSInteger and CGFloat values. """ signature = bytes(signature, encoding='ascii') signature = signature.replace(b'i', objc._C_NSInteger) signature = signature.replace(b'I', objc._C_NSUInteger) signature = signature.replace(b'f', objc._C_CGFloat) return objc.typedSelector(signature)
def event_handler(f, assertion = running_on_thread_named('MainThread')): def handle_exceptions(*n, **kw): try: return assert_message_queue(f, assertion)(*n, **kw) except Exception: unhandled_exc_handler() TRACE('stack above exception was:') trace_stack() if kw.get('trace_locals', True): TRACE('locals are:') trace_locals(locals()) handle_exceptions.__name__ = f.__name__ if hasattr(f, 'signature'): try: import objc return objc.typedSelector(f.signature)(handle_exceptions) except Exception: unhandled_exc_handler() return handle_exceptions