From dc940bec431f76d8e4b8be50410e8e9e31137e10 Mon Sep 17 00:00:00 2001 From: "Tatsuya Kawano (Circle CI)" Date: Sat, 25 Jun 2016 13:33:23 +0800 Subject: [PATCH] Update FFI to 1.9 --- 1.9/ja/book/ffi.md | 29 +++++++++++++++++--------- diff-1.6.0..1.9.0/src/doc/book/ffi.md | 30 --------------------------- 2 files changed, 19 insertions(+), 40 deletions(-) delete mode 100644 diff-1.6.0..1.9.0/src/doc/book/ffi.md diff --git a/1.9/ja/book/ffi.md b/1.9/ja/book/ffi.md index 5a6e7415..ff2176b8 100644 --- a/1.9/ja/book/ffi.md +++ b/1.9/ja/book/ffi.md @@ -18,7 +18,8 @@ Rustは現在、C++ライブラリを直接呼び出すことができません -これらの例の多くは [`libc`クレート][libc] を使っています。これは、主にCの様々な型の定義を提供するものです。 +これらの例の多くは [`libc`クレート][libc] を使っています。 +これは、主にCの様々な型の定義を提供するものです。 もしこれらの例を自分で試すのであれば、次のように `libc` を `Cargo.toml` に追加する必要があるでしょう。 ```toml @@ -73,7 +74,8 @@ Cライブラリは、スレッドセーフでないインターフェイスを -他言語関数について引数の型を宣言するとき、Rustのコンパイラはその宣言が正しいかどうかを確認することができません。それを正しく指定することは実行時にバインディングを正しく動作させるために必要なことです。 +他言語関数について引数の型を宣言するとき、Rustのコンパイラはその宣言が正しいかどうかを確認することができません。 +それを正しく指定することは実行時にバインディングを正しく動作させるために必要なことです。 `extern` ブロックはsnappyのAPI全体をカバーするように拡張することができます。 @@ -148,7 +150,7 @@ pub fn validate_compressed_buffer(src: &[u8]) -> bool { `snappy_max_compressed_length` 関数は、圧縮後の結果を保持するために必要な最大の容量のベクタを割り当てるために使うことができます。 -そして、そのベクタは結果を受け取るための引数として`snappy_compress`関数に渡されます。 +そして、そのベクタは結果を受け取るための引数として `snappy_compress` 関数に渡されます。 結果を受け取るための引数は、長さをセットするために、圧縮後の本当の長さを取得するためにも渡されます。 ```rust @@ -441,24 +443,26 @@ void trigger_callback() { 異なる `kind` の値はリンク時のネイティブライブラリの使われ方の違いを意味します。 リンクの視点からすると、Rustコンパイラは2種類の生成物を作ります。 部分生成物(rlib/staticlib)と最終生成物(dylib/binary)です。 -ネイティブダイナミックライブラリとフレームワークの依存関係は最終生成物を作るときまで伝播され解決されますが、スタティックライブラリの依存関係は全く伝えません。なぜなら、スタティックライブラリはその後に続く生成物に直接統合されてしまうからです。 +ネイティブダイナミックライブラリとフレームワークの依存関係は最終生成物を作るときまで伝播され解決されますが、スタティックライブラリの依存関係は全く伝えません。 +なぜなら、スタティックライブラリはその後に続く生成物に直接統合されてしまうからです。 このモデルをどのように使うことができるのかという例は次のとおりです。 - + * ネイティブビルドの依存関係。 - ときどき、Rustのコードを書くときにC/C++のグルーが必要になりますが、ライブラリの形式でのC/C++のコードの配布は重荷でしかありません。 + ときどき、Rustのコードを書くときにC/C++のグルーが必要ですが、ライブラリの形式でのC/C++のコードの配布は重荷になります。 このような場合、 コードは `libfoo.a` にアーカイブされ、それからRustのクレートで `#[link(name = "foo", kind = "static")]` によって依存関係を宣言します。 - クレートの成果物の種類にかかわらず、ネイティブスタティックライブラリは成果物に含まれます。これは、ネイティブスタティックライブラリの配布は不要だということを意味します。 + クレートの成果物の種類にかかわらず、ネイティブスタティックライブラリは成果物に含まれます。 + これは、ネイティブスタティックライブラリの配布は不要だということを意味します。 @@ -585,6 +589,9 @@ extern "stdcall" { * `aapcs` * `cdecl` * `fastcall` +* `vectorcall` + + **TODO**: 翻訳する * `Rust` * `rust-intrinsic` * `system` @@ -597,7 +604,7 @@ extern "stdcall" { - + このリストのABIのほとんどは名前のとおりですが、 `system` ABIは少し変わっています。 この規則はターゲットのライブラリを相互利用するために適切なABIを選択します。 例えば、x86アーキテクチャのWin32では、使われるABIは `stdcall` になります。 @@ -625,7 +632,8 @@ extern "stdcall" { Rust独自のボックス( `Box` )は包んでいるオブジェクトを指すハンドルとして非ヌルポインタを使います。 しかし、それらは内部のアロケータによって管理されるため、手で作るべきではありません。 参照は型を直接指す非ヌルポインタとみなすことが安全にできます。 -しかし、借用チェックやミュータブルについてのルールが破られた場合、安全性は保証されません。生ポインタについてはコンパイラは借用チェックやミュータブルほどには仮定を置かないので、必要なときには、生ポインタ( `*` )を使いましょう。 +しかし、借用チェックやミュータブルについてのルールが破られた場合、安全性は保証されません。 +生ポインタについてはコンパイラは借用チェックやミュータブルほどには仮定を置かないので、必要なときには、生ポインタ( `*` )を使いましょう。 @@ -746,7 +754,8 @@ extern "C" { これはその状況に対処するための完全に正当な方法です。 しかし、もっとよい方法があります。 -これを解決するために、いくつかのCライブラリでは、代わりに `struct` を作っています。そこでは構造体の詳細とメモリレイアウトはプライベートです。 +これを解決するために、いくつかのCライブラリでは、代わりに `struct` を作っています。 +そこでは構造体の詳細とメモリレイアウトはプライベートです。 これは型の安全性をいくらか満たします。 それらの構造体は「オペーク」と呼ばれます。 これがCによる例です。 diff --git a/diff-1.6.0..1.9.0/src/doc/book/ffi.md b/diff-1.6.0..1.9.0/src/doc/book/ffi.md deleted file mode 100644 index eb8943ea..00000000 --- a/diff-1.6.0..1.9.0/src/doc/book/ffi.md +++ /dev/null @@ -1,30 +0,0 @@ ---- a/src/doc/book/ffi.md -+++ b/src/doc/book/ffi.md -@@ -367,7 +367,7 @@ artifact. - A few examples of how this model can be used are: - - * A native build dependency. Sometimes some C/C++ glue is needed when writing -- some Rust code, but distribution of the C/C++ code in a library format is just -+ some Rust code, but distribution of the C/C++ code in a library format is - a burden. In this case, the code will be archived into `libfoo.a` and then the - Rust crate would declare a dependency via `#[link(name = "foo", kind = - "static")]`. -@@ -478,6 +478,8 @@ are: - * `aapcs` - * `cdecl` - * `fastcall` -+* `vectorcall` -+This is currently hidden behind the `abi_vectorcall` gate and is subject to change. - * `Rust` - * `rust-intrinsic` - * `system` -@@ -490,7 +492,7 @@ interoperating with the target's libraries. For example, on win32 with a x86 - architecture, this means that the abi used would be `stdcall`. On x86_64, - however, windows uses the `C` calling convention, so `C` would be used. This - means that in our previous example, we could have used `extern "system" { ... }` --to define a block for all windows systems, not just x86 ones. -+to define a block for all windows systems, not only x86 ones. - - # Interoperability with foreign code - -diff --git a/src/doc/book/functions.md b/src/doc/book/functions.md