Skip to content

Commit

Permalink
remove claim about searching through nested fields for the nullable t…
Browse files Browse the repository at this point in the history
…ype, even though that is how it works
  • Loading branch information
durka committed Jul 27, 2016
1 parent 1319b29 commit 29546dd
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions src/doc/book/ffi.md
Expand Up @@ -581,12 +581,12 @@ interfacing with C, pointers that might be `null` are often used, which would se
require some messy `transmute`s and/or unsafe code to handle conversions to/from Rust types.
However, the language provides a workaround.

As a special case, an `enum` is eligible for the "nullable pointer optimization" if it
contains exactly two variants, one of which contains no data and the other contains
a field of one of the non-nullable types listed above (or a struct containing such a type).
This means no extra space is required for a discriminant; rather, the empty variant is represented
by putting a `null` value into the non-nullable field. This is called an "optimization", but unlike
other optimizations it is guaranteed to apply to eligible types.
As a special case, an `enum` is eligible for the "nullable pointer optimization" if it contains
exactly two variants, one of which contains no data and the other contains a field of one of the
non-nullable types listed above. This means no extra space is required for a discriminant; rather,
the empty variant is represented by putting a `null` value into the non-nullable field. This is
called an "optimization", but unlike other optimizations it is guaranteed to apply to eligible
types.

The most common type that takes advantage of the nullable pointer optimization is `Option<T>`,
where `None` corresponds to `null`. So `Option<extern "C" fn(c_int) -> c_int>` is a correct way
Expand All @@ -599,7 +599,9 @@ and an integer and it is supposed to run the function with the integer as a para
we have function pointers flying across the FFI boundary in both directions.

```rust
use std::os::raw::c_int;
# #![feature(libc)]
extern crate libc;
use libc::c_int;

# #[cfg(hidden)]
extern "C" {
Expand Down

0 comments on commit 29546dd

Please sign in to comment.