Crate blocksr

Crate blocksr 

Source
Expand description

§Drew’s Rust library for (clang/objc) blocks.

This is my Rust crate for using blocks, the Apple C extension often used with ObjC. This crate may be compared with the more popular block crate.

This crate is part of the objr expanded universe universe which provide low-level, zero-cost abstractions for Apple platform features that mimic code from first-party compilers. Distinctive features of this library include:

  • Every block is a distinct newtype, creating a richer typesystem that unlocks new compile-time optimizations
    • In Rust, blocks may be FnOnce (implemented), Fn, or FnMut (planned), unlocking the full Rust typesystem
    • In C/ObjC, blocks may escape (implemented) or not escape (planned), unlocking various optimizations used by real C/ObjC compilers
    • C/ObjC is a giant ball of unsafe code, and most direct use of this crate is also unsafe. Bindings authors are encouraged to wrap safe API based on their local knowledge.
    • Ergonomic macros for quickly binding new platform APIs
  • The continuation feature (off by default) bridges block-based completion handlers to Rust async fns.
    • This is similar to (and informed by) Apple’s own Swift bridge for async methods, with broad compatability across real-world Apple APIs.
    • This Rust version is self-contained, 200 lines, does not depend on Tokio and is tested against other async runtimes.
  • Free for noncommercial or “small commercial” use

§Examples

§Escaping block

use blocksr::once_escaping;
once_escaping!(MyBlock (arg: u8) -> u8);
let f = unsafe{ MyBlock::new(|_arg| {
    3
})};
//pass f somewhere...

Macros§

many_escaping_nonreentrant
Declares a block that escapes and executes any number of times. this is a typical pattern for IO.
many_escaping_reentrant
Declares a block that escapes and executes any number of times. this is a typical pattern for IO.
once_escaping
Declares a block that escapes and executes once. this is a typical pattern for completion handlers.
once_noescape
Declares a block that doesn’t escape and executes once. this is a typical pattern for dispatch_sync.