blob: 2fa83280a29e3af1474d35caad21d79c4faefee7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# オブジェクトの構築と非公開メモリ
[English](README.md) | 日本語
[前章: 型が確定する前の SSA 構築](../chapter-incomplete-types/README.ja.md) |
[次章: エスケープ解析と未知の呼び出し元](../chapter-escape/README.ja.md)
この章では、フィールドの初期化とコンストラクタを関数として扱います。
構築中のフィールドはローカルな SSA 値として扱い、分岐やループでは
通常の Phi で合流させます。各初期化関数の出口で通常の Store を生成し、
フィールドごとの非公開メモリを次の関数に渡します。構築が完了した時点で、
`EscapeNode` が初期化済みのフィールドを公開メモリに合流させます。
パーサーはコンストラクタの出口で、必須フィールドが初期化されていることを確認します。
この検査は SCCP より前なので、後の解析で安全と分かる呼び出しでも拒否する場合があります。
構築中の `self` を通常の関数に渡したり、オブジェクトに格納したりする
ことは、この章では禁止します。次のエスケープ解析の章でもこの制限は残ります。
インライン化後に安全性を確認してヘルパー呼び出しを許す案は、まだ実装していません。
未完成のオブジェクトをコンストラクタ内で読むことはできますが、読むフィールドは
すでに初期化されている必要があります。他のフィールドはまだ未設定でも構いません。
final フィールドも構築中はローカル値として再代入でき、ループでは通常の Phi を使います。
Store はヘルパーの出口で生成します。構築後の書き換え、通常のローカル `val` への再代入、
共有する関数宣言の置き換えは禁止します。
詳細と提案中の規則は [英語版](README.md#helper-calls-and-final-fields-during-construction) を参照してください。
モジュール、クラスの遅延初期化、分割コンパイルはまだ導入しません。
詳しい説明、制限、実行例は [英語版](README.md) を参照してください。
このディレクトリで `make lib tests CTAGS=` を実行できます。
|