- Uses of
msg_send!
will now correctly fail to compile if no return type can be inferred, instead of relying on an edge case of the compiler that will soon change and silently cause undefined behavior.
- Suppressed a deprecation warning in
sel!
,msg_send!
, andclass!
.
autoreleasepool
returns the value returned by its body closure.
-
Added an
rc
module with reference counting utilities:StrongPtr
,WeakPtr
, andautoreleasepool
. -
Added some reference counting ABI foreign functions to the
runtime
module.
- Messaging nil under GNUstep now correctly returns zeroed results for all return types.
-
Added a
class!
macro for getting statically-known classes. The result is non-optional (avoiding a need to unwrap) and cached so each usage will only look up the class once. -
Added caching to the
sel!
macro so that each usage will only register the selector once.
- Fixed the implementation of
objc::runtime
structs so there can't be unsound references to uninhabited types.
- Implemented
Sync
andSend
forSel
.
-
Added support for working with protocols with the
Protocol
struct. The protocols a class conforms to can be examined with the newClass::adopted_protocols
andClass::conforms_to
methods. -
Protocols can be declared using the new
ProtocolDecl
struct.
-
Added verification for the types used when sending messages. This can be enabled for all messages with the
"verify_message"
feature, or you can test before sending specific messages with theMessage::verify_message
method. Verification errors are reported using the newMessageError
struct. -
Added support for the GNUstep runtime! Operating systems besides OSX and iOS will fall back to the GNUstep runtime.
-
Root classes can be declared by using the
ClassDecl::root
constructor.
-
C types are now used from
std::os::raw
rather thanlibc
. This meansEncode
may not be implemented forlibc
types; switch them to thestd::os::raw
equivalents instead. This avoids an issue that would arise from simultaneously using different versions of the libc crate. -
Dynamic messaging was moved into the
Message
trait; instead of().send(obj, sel!(description))
, useobj.send_message(sel!(description), ())
. -
Rearranged the parameters to
ClassDecl::new
for consistency; instead ofClassDecl::new(superclass, "MyObject")
, useClassDecl::new("MyObject", superclass)
. -
Overhauled the
MethodImplementation
trait. Encodings are now accessed through theMethodImplementation::Args
associated type. Theimp_for
method was replaced withimp
and no longer takes a selector or returns anUnequalArgsError
, althoughClassDecl::add_method
still validates the number of arguments. -
Updated the definition of
Imp
to not use the old dispatch prototypes. To invoke anImp
, it must first be transmuted to the correct type. -
Removed
objc_msgSend
functions from theruntime
module; the availability of these functions varies and they shouldn't be called without trasmuting, so they are now hidden as an implementation detail of messaging.
-
Corrected alignment of ivars in
ClassDecl
; declared classes may now have a smaller size. -
With the
"exception"
or"verify_message"
feature enabled, panics frommsg_send!
will now be triggered from the line and file where the macro is used, rather than from within the implementation of messaging.