Skip to content

v8.2

Compare
Choose a tag to compare
@ronaldoussoren ronaldoussoren released this 24 Feb 23:11
· 629 commits to master since this release

This release contains a lot of little fixes due to improving
test coverage of the C code in pyobjc-core. These are mostly fixes
for edge cases that don't happen in normal programs.

  • Reintroduce binary wheels for Python 3.6

    PyObjC 8.x still supports Python 3.6, but I didn't ship binary wheels
    until now.

    I plan to explicitly remove support for Python 3.6 in PyObjC 9, which
    will include updating package metadata to ensure that users of Python 3.6
    will keep using PyObjC 8.x.

  • #414: [Python 3.10] The representation for C structures, like
    Foundation.NSPoint now have a __match_args__ attribute, which means
    it is now possible to use positional arguments to these types in match expressions.

    For example:

    .. sourcecode:: python

    from Foundation import NSPoint

    value = ...

    match value:
    case NSPoint(0, _):
    print("On the Y axis")

  • The internal extension API between framework bindings and pyobjc-core has
    been cleaned up a little. Because of this extensions need to be
    recompiled for this version.

  • :func:objc.allocateBuffer is deprecated, use :class:bytearray instead

    This function has always returned a bytearray object in Python 3 and it
    no longer necessary.

    As a side effect of this change the function is now implemented in Python
    instead of C.

  • The private function objc._dyld_shared_cache_contains_path is now
    always available, and unconditionally returns :data:False on systems without
    a shared library cache.

  • The private function objc._setClassExtender is now implemented in Python
    and will be removed in PyObjC 9.

  • Removed private function objc._typestr2typestr.

    This function was untested and is no longer used by PyObjC.

  • Removed the selector supportsWeakPointers from a number of classes.

    This method may have been needed during Apple's transition to ARC, but is
    no longer document and I've never seen it called during testing on recent
    versions of the OS.

    Furthermore the custom implementation of retain and release in PyObjC
    is a thin wrapper around the default one with additional locking to avoid
    race conditions during deallocation.

  • :func:objc.recylceAutoReleasePool will now restore the global release pool
    when called after calling :func:objc.removeAutoreleasePool.

  • Removed objc.FSSpec

    This is a wrapper for a C type that's only usable in 32-bit code, PyObjC
    no longer supports 32-bit.

  • The default implementation of -copy for subclasses of Objective-C
    classes that implemented -copy (needed to adjust Python attributes)
    didn't consider that the superclass implementation of -copy may
    return an instance of a different class. This caused a hard crash.

    The easiest way to trigger this bug: Create a subclass of NSMutableData
    in Python, create an instance of that class and call the copy method.

  • The module PyObjCTools.TestSupport was modernized a little

    This most visible part of this is that a number of functions and assertion
    method have been removed because they have a better alternative in the
    :mod:unittest library.

  • #404: Instances of the Python represention of C structs can now be pickled.

    That is, instances of AppKit.NSPoint, Foundation.NSRange, etc. can
    be pickled. The exception are a number of types in the CoreAudio bindings
    that have manual wrapper types instead of the generic support in pyobjc-core.

  • Switch to :c:func:PyCapsule_Import to load the PyObjC API object in
    extension modules.

  • Fix crash when calling objc.FSRef.from_pathname() with a path
    that cannot be encoded in the filesystem encoding (UTF-8).

  • Fix name of opaque pointer type wrappers (such as Foundation.NSZonePtr)

    The "name" and "qualname" attributes were correct, but the
    corresponding slot in the C struct of the type could point to
    no longer valid memory.

  • Function :func:objc.registerABCForClass now actually works

  • Fix bug in lazyloader where fetching the module's __all__ could
    raise :exc:AttributeError for some particular constants.

  • #317: Cleanup code dealing with libffi closures APIs on various versions
    of macOS.

  • If fetching the __pyobjc_object__ attribute during conversion from
    Python to Objective-C raisea an exception other than :exc:AttributeError
    the conversion will fail.

    In previous versions the attribute was ignored when this happens.

  • Fix error in __str__ and __repr__ of an Objective-C instance
    when the class' description selector returns nil.

  • Fixed crash in conversion of an Objective-C exception to a Python
    exception when the exception name is NULL.

  • Type encoding that ends with an incomplete pointer definition will
    now raise an error earlier, in particular before the first time the
    callable is used.

  • Using a value for the metadata dict of functions and selectors that
    is not a :class:dict now raises an exception instead of being silently
    ignored.

  • The "suggestion" function metadata was ignored for :class:objc.function
    instances using the fast FFI variant.

  • Deprecating the function returned by an API exposed through :class:objc.function
    would cause a crash.

  • Fix value of the "deprecated" key in the result of __metadata__() for
    callables that are deprecated in a macOS version.

  • Loading metadata for a function with more than 63 arguments would
    crash the interpreter.

    Note that calling such function is not supported even with this bugfix.

  • #406: The "docstring" field in the function list argument for
    :func:objc.loadBundleFunctions was effectively ignored. It is now
    part of the document string (__doc__) of the :class:objc.function
    object.

  • Actually implemented cyclic GC support in :class:objc.python_method.

  • Fix crash when calling -[NSObject dealloc], -[NSObject retain]
    or -[NSObject release] though an :class:objc.IMP, for example:

    .. sourcecode:: python

    anObject = NSObject.alloc().init()
    retain = anObject.methodForSelector_("retain")
    retain(anObject)

  • Tests in pyobjc-core better check the message of raised exceptions

    This resulted in some minor changes in messages, this should not affect
    code using PyObjC.

  • Fix the __name__ and __repr__ result for the exact class
    :class:objc.objc_object.

  • Fix use of uninitialized variable in the code that converts a C struct
    from Objective-C to a Python tuple.

  • Added :func:PyObjCTools.TestSupport.no_autorelease_pool to disable
    autorelease pool management by the test runnner for a specific test.

  • NSMutableArray.insert(idx, value) would fail when idx is beyond
    the length of the array. It now behaves the same as :meth:list.insert,
    the item will be appended to the array.

  • Change the way type specific class methods are added to :class:objc.ivar.

    This changes the way class methods are added to :class:objc.ivar to
    be more correct in the CPython interpreter.

  • #425: Fix CoreMIDI bindings

    The CoreMIDI is a wheel with a limited ABI tag, but one of the two
    extensions was build without using the limited ABI, resulting in a wheel
    that worked only for one python version.