From 34d1d2ff401d2d61ca2ae6bc27c78eab7cd856f4 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 13 Mar 2015 16:57:45 +0100 Subject: [PATCH 1/2] setup: add a variable to see if we are in 64 bits or not. --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index 56fdb14..c584922 100644 --- a/setup.py +++ b/setup.py @@ -28,6 +28,10 @@ config_pxi_need_update = True config_pxi = 'DEF PLATFORM = "{}"\n'.format(dev_platform) config_pxi += 'DEF ARCH = "{}"'.format(arch) +if arch in ("x86_64", "arm64"): + config_pxi += 'DEF __LP64__ = 1' +else: + config_pxi += 'DEF __LP64__ = 0' if exists(config_pxi_fn): with open(config_pxi_fn) as fd: config_pxi_need_update = fd.read() != config_pxi From c0557821378c52e5d9ff56ccfa1d562a80125fcb Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 13 Mar 2015 16:58:07 +0100 Subject: [PATCH 2/2] tagged pointer: starts converting objc-internal into cython code. --- pyobjus/pyobjus_conversions.pxi | 61 ++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/pyobjus/pyobjus_conversions.pxi b/pyobjus/pyobjus_conversions.pxi index 24801f4..46ab624 100644 --- a/pyobjus/pyobjus_conversions.pxi +++ b/pyobjus/pyobjus_conversions.pxi @@ -185,18 +185,61 @@ cdef convert_to_cy_cls_instance(id ret_id, main_cls_name=None): # Tagged pointers ctypedef enum: - kCFTaggedObjectID_Integer = (1 << 1) + 1 + OBJC_TAG_NSAtom = 0 + OBJC_TAG_1 = 1 + OBJC_TAG_NSString = 2 + OBJC_TAG_NSNumber = 3 + OBJC_TAG_NSIndexPath = 4 + OBJC_TAG_NSManagedObjectID = 5 + OBJC_TAG_NSDate = 6 + OBJC_TAG_7 = 7 + +IF __LP64__ and PLATFORM == "ios": + + # TODO + +ELIF __LP64__ and PLATFORM == "darwin": + + cdef objc_is_tagged_pointer(void *ptr): + cdef unsigned long long pointer = ptr + return ((unsigned long long)pointer & 0x1) == 0x1 + + cdef objc_make_tagged_pointer(unsigned int tag, unsigned long long value): + return (void *)((value << 4) | ((unsigned long long)tag << 1) | 1) + + cdef objc_get_tagged_pointer_tag(void *ptr): + return (((unsigned long long)ptr) & 0xe) >> 1 + + cdef objc_get_tagged_pointer_value(void *ptr): + return ((unsigned long long)ptr) >> 4 + + cdef objc_get_tagged_pointer_signed_value(void *ptr): + return ((long long)ptr) >> 4 + +ELSE: + + cdef objc_is_tagged_pointer(void *_pointer): + return False + + cdef objc_make_tagged_pointer(unsigned int tag, unsigned long long value): + return 0 + + cdef objc_get_tagged_pointer_tag(void *ptr): + return 0 + + cdef objc_get_tagged_pointer_value(void *ptr): + return 0 + + cdef objc_get_tagged_pointer_signed_value(void *ptr): + return 0 -cdef is_tagged_pointer(void *_pointer): - cdef unsigned long long pointer = _pointer - return pointer & 0x1 == 0x1 cdef read_tagged_pointer(void *_pointer): cdef unsigned long long pointer = _pointer cdef unsigned char _cls = pointer & 0xf cdef unsigned char _type - if _cls == kCFTaggedObjectID_Integer: + if _cls == OBJC_TAG_NSNumber: _type = (pointer >> 4) & 0xf if _type == 0: return (pointer >> 8) @@ -208,7 +251,6 @@ cdef read_tagged_pointer(void *_pointer): return (pointer >> 8) elif _type == 4: return (pointer >> 8) - #elif _type == 5: # return (pointer >> 8) #elif _type == 6: @@ -218,8 +260,11 @@ cdef read_tagged_pointer(void *_pointer): elif _type == 8: return (pointer >> 8) - raise ObjcException('We got a tagged pointer, but we dont know how to read it: {}'.format( - pointer)) + elif _cls == OBJC_TAG_NSString: + print("got nsstring?") + + raise ObjcException('We got a tagged pointer, but we dont know how to read it: {} (cls={})'.format( + pointer, _cls)) cdef object convert_cy_ret_to_py(id *f_result, sig, size_t size, members=None, objc_prop=False, main_cls_name=None):