Skip to content

Commit 434ad69

Browse files
committed
---
yaml --- r: 59110 b: refs/heads/incoming c: e605536 h: refs/heads/master v: v3
1 parent 8ff048f commit 434ad69

File tree

220 files changed

+1941
-4945
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

220 files changed

+1941
-4945
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: c50a9d5b664478e533ba1d1d353213d70c8ad589
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/incoming: 58a37a1f485a738f6802b42dd39437618b18bbae
9+
refs/heads/incoming: e605536648c76b220b583b5525d1fed2750f9ae8
1010
refs/heads/dist-snap: 00dbbd01c2aee72982b3e0f9511ae1d4428c3ba9
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/incoming/doc/rust.md

Lines changed: 71 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ each of which may have some number of [attributes](#attributes) attached to it.
618618

619619
~~~~~~~~ {.ebnf .gram}
620620
item : mod_item | fn_item | type_item | struct_item | enum_item
621-
| static_item | trait_item | impl_item | extern_block ;
621+
| static_item | trait_item | impl_item | foreign_mod_item ;
622622
~~~~~~~~
623623

624624
An _item_ is a component of a crate; some module items can be defined in crate
@@ -752,11 +752,10 @@ link_attr : ident '=' literal ;
752752
~~~~~~~~
753753

754754
An _`extern mod` declaration_ specifies a dependency on an external crate.
755-
The external crate is then bound into the declaring scope
756-
as the `ident` provided in the `extern_mod_decl`.
755+
The external crate is then bound into the declaring scope as the `ident` provided in the `extern_mod_decl`.
757756

758-
The external crate is resolved to a specific `soname` at compile time,
759-
and a runtime linkage requirement to that `soname` is passed to the linker for
757+
The external crate is resolved to a specific `soname` at compile time, and a
758+
runtime linkage requirement to that `soname` is passed to the linker for
760759
loading at runtime. The `soname` is resolved at compile time by scanning the
761760
compiler's library path and matching the `link_attrs` provided in the
762761
`use_decl` against any `#link` attributes that were declared on the external
@@ -993,10 +992,10 @@ Thus the return type on `f` only needs to reflect the `if` branch of the conditi
993992
#### Extern functions
994993

995994
Extern functions are part of Rust's foreign function interface,
996-
providing the opposite functionality to [external blocks](#external-blocks).
997-
Whereas external blocks allow Rust code to call foreign code,
998-
extern functions with bodies defined in Rust code _can be called by foreign
999-
code_. They are defined in the same way as any other Rust function,
995+
providing the opposite functionality to [foreign modules](#foreign-modules).
996+
Whereas foreign modules allow Rust code to call foreign code,
997+
extern functions with bodies defined in Rust code _can be called by foreign code_.
998+
They are defined in the same way as any other Rust function,
1000999
except that they have the `extern` modifier.
10011000

10021001
~~~
@@ -1012,8 +1011,7 @@ let fptr: *u8 = new_vec;
10121011
~~~
10131012

10141013
The primary motivation for extern functions is
1015-
to create callbacks for foreign functions that expect to receive function
1016-
pointers.
1014+
to create callbacks for foreign functions that expect to receive function pointers.
10171015

10181016
### Type definitions
10191017

@@ -1310,61 +1308,64 @@ impl Seq<bool> for u32 {
13101308
}
13111309
~~~~
13121310

1313-
### External blocks
1311+
### Foreign modules
13141312

13151313
~~~ {.ebnf .gram}
1316-
extern_block_item : "extern" '{' extern_block '} ;
1317-
extern_block : [ foreign_fn ] * ;
1314+
foreign_mod_item : "extern mod" ident '{' foreign_mod '} ;
1315+
foreign_mod : [ foreign_fn ] * ;
13181316
~~~
13191317

1320-
External blocks form the basis for Rust's foreign function interface.
1321-
Declarations in an external block describe symbols
1322-
in external, non-Rust libraries.
1323-
1324-
Functions within external blocks
1325-
are declared in the same way as other Rust functions,
1326-
with the exception that they may not have a body
1327-
and are instead terminated by a semicolon.
1318+
Foreign modules form the basis for Rust's foreign function interface. A
1319+
foreign module describes functions in external, non-Rust
1320+
libraries.
1321+
Functions within foreign modules are declared in the same way as other Rust functions,
1322+
with the exception that they may not have a body and are instead terminated by a semicolon.
13281323

13291324
~~~
13301325
# use core::libc::{c_char, FILE};
13311326
# #[nolink]
13321327
1333-
extern {
1328+
extern mod c {
13341329
fn fopen(filename: *c_char, mode: *c_char) -> *FILE;
13351330
}
13361331
~~~
13371332

1338-
Functions within external blocks may be called by Rust code,
1339-
just like functions defined in Rust.
1340-
The Rust compiler automatically translates
1341-
between the Rust ABI and the foreign ABI.
1333+
Functions within foreign modules may be called by Rust code, just like functions defined in Rust.
1334+
The Rust compiler automatically translates between the Rust ABI and the foreign ABI.
1335+
1336+
The name of the foreign module has special meaning to the Rust compiler in
1337+
that it will treat the module name as the name of a library to link to,
1338+
performing the linking as appropriate for the target platform. The name
1339+
given for the foreign module will be transformed in a platform-specific way
1340+
to determine the name of the library. For example, on Linux the name of the
1341+
foreign module is prefixed with 'lib' and suffixed with '.so', so the
1342+
foreign mod 'rustrt' would be linked to a library named 'librustrt.so'.
13421343

1343-
A number of [attributes](#attributes) control the behavior of external
1344-
blocks.
1344+
A number of [attributes](#attributes) control the behavior of foreign
1345+
modules.
13451346

1346-
By default external blocks assume
1347-
that the library they are calling uses the standard C "cdecl" ABI.
1348-
Other ABIs may be specified using the `abi` attribute as in
1347+
By default foreign modules assume that the library they are calling use the
1348+
standard C "cdecl" ABI. Other ABIs may be specified using the `abi`
1349+
attribute as in
13491350

13501351
~~~{.xfail-test}
13511352
// Interface to the Windows API
13521353
#[abi = "stdcall"]
1353-
extern { }
1354+
extern mod kernel32 { }
13541355
~~~
13551356

1356-
The `link_name` attribute allows the name of the library to be specified.
1357+
The `link_name` attribute allows the default library naming behavior to
1358+
be overridden by explicitly specifying the name of the library.
13571359

13581360
~~~{.xfail-test}
13591361
#[link_name = "crypto"]
1360-
extern { }
1362+
extern mod mycrypto { }
13611363
~~~
13621364

1363-
The `nolink` attribute tells the Rust compiler
1364-
not to do any linking for the external block.
1365-
This is particularly useful for creating external blocks for libc,
1366-
which tends to not follow standard library naming conventions
1367-
and is linked to all Rust programs anyway.
1365+
The `nolink` attribute tells the Rust compiler not to do any linking for the foreign module.
1366+
This is particularly useful for creating foreign
1367+
modules for libc, which tends to not follow standard library naming
1368+
conventions and is linked to all Rust programs anyway.
13681369

13691370
## Attributes
13701371

@@ -1945,6 +1946,35 @@ fn avg(v: &[float]) -> float {
19451946
}
19461947
~~~~
19471948

1949+
#### Swap expressions
1950+
1951+
A _swap expression_ consists of an [lvalue](#lvalues-rvalues-and-temporaries) followed by a bi-directional arrow (`<->`) and another [lvalue](#lvalues-rvalues-and-temporaries).
1952+
1953+
Evaluating a swap expression causes, as a side effect, the values held in the left-hand-side and right-hand-side [lvalues](#lvalues-rvalues-and-temporaries) to be exchanged indivisibly.
1954+
1955+
Evaluating a swap expression neither changes reference counts,
1956+
nor deeply copies any owned structure pointed to by the moved [rvalue](#lvalues-rvalues-and-temporaries).
1957+
Instead, the swap expression represents an indivisible *exchange of ownership*,
1958+
between the right-hand-side and the left-hand-side of the expression.
1959+
No allocation or destruction is entailed.
1960+
1961+
An example of three different swap expressions:
1962+
1963+
~~~~~~~~
1964+
# let mut x = &mut [0];
1965+
# let mut a = &mut [0];
1966+
# let i = 0;
1967+
# struct S1 { z: int };
1968+
# struct S2 { c: int };
1969+
# let mut y = S1{z: 0};
1970+
# let mut b = S2{c: 0};
1971+
1972+
x <-> a;
1973+
x[i] <-> a[i];
1974+
y.z <-> b.c;
1975+
~~~~~~~~
1976+
1977+
19481978
#### Assignment expressions
19491979

19501980
An _assignment expression_ consists of an [lvalue](#lvalues-rvalues-and-temporaries) expression followed by an
@@ -1985,7 +2015,7 @@ as
19852015
== !=
19862016
&&
19872017
||
1988-
=
2018+
= <->
19892019
~~~~
19902020

19912021
Operators at the same precedence level are evaluated left-to-right.

branches/incoming/doc/tutorial-ffi.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ wrapping `malloc` and `free`:
151151
~~~~
152152
use core::libc::{c_void, size_t, malloc, free};
153153
use core::unstable::intrinsics;
154-
use core::util;
155154
156155
// a wrapper around the handle returned by the foreign code
157156
pub struct Unique<T> {
@@ -185,8 +184,7 @@ impl<T: Owned> Drop for Unique<T> {
185184
fn finalize(&self) {
186185
unsafe {
187186
let mut x = intrinsics::init(); // dummy value to swap in
188-
// moving the object out is needed to call the destructor
189-
util::replace_ptr(self.ptr, x);
187+
x <-> *self.ptr; // moving the object out is needed to call the destructor
190188
free(self.ptr as *c_void)
191189
}
192190
}
@@ -237,8 +235,7 @@ convention to use:
237235
~~~~
238236
#[cfg(target_os = "win32")]
239237
#[abi = "stdcall"]
240-
#[link_name = "kernel32"]
241-
extern {
238+
extern mod kernel32 {
242239
fn SetEnvironmentVariableA(n: *u8, v: *u8) -> int;
243240
}
244241
~~~~

0 commit comments

Comments
 (0)