v8.2
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
insteadThis 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
andrelease
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 thecopy
method. -
The module
PyObjCTools.TestSupport
was modernized a littleThis 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 returnsnil
. -
Fixed crash in conversion of an Objective-C exception to a Python
exception when the exception name isNULL
. -
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 whenidx
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.