英語版
このページの英語版を見る

dmd.escape

スコープ付きポインタとスコープ付き参照を実装するためのロジックのほとんどはここに記載されている。
Authors:

ソースescape.d

適用範囲 https://codecov.io/gh/dlang/dmd/src/master/src/dmd/escape.d

struct EscapeState;
エスケープチェックのためのグローバル状態をまとめてグループ化する
static void reset();
initDMD /deinitializeDMD によってグローバル状態のリセットのために呼び出される
bool checkMutableArguments(ref Scope sc, FuncDeclaration fd, TypeFunction tf, Expression ethis, Expressions* arguments, bool gag);
関数に渡されたメモリオブジェクトをチェックする。 メモリオブジェクトが参照渡しまたはポインタ渡しされた場合、 すべての参照またはポインタが const であるか、または変更可能な参照またはポインタが1つだけ存在する ことを確認する。

参考文献 DIP 1021

Parameters: 現在の関数とモジュールを決定するために使用される
Scope sc 現在の関数と、呼び出されるモジュール関数を決定するために使用される
FuncDeclaration fd 呼び出される関数とモジュールを決定する
TypeFunction tf fdの型
Expression ethis null でなければ、this ポインタ
Expressions* arguments 関数への実際の引数
bool gag エラーメッセージは表示しない
Returns:
true エラーが発生した場合
bool checkArrayLiteralEscape(ref Scope sc, ArrayLiteralExp ae, bool gag);
配列リテラルはGCヒープ上に割り当てられる予定である。 その要素がヒープ上にエスケープする可能性があるかどうかを確認する。
Parameters:
Scope sc 現在の関数とモジュールを決定するために使用される
ArrayLiteralExp ae 配列リテラル式
bool gag エラーメッセージを表示しない
Returns:
true 要素がエスケープされた場合
bool checkAssocArrayLiteralEscape(ref Scope sc, AssocArrayLiteralExp ae, bool gag);
連想配列リテラルは GC ヒープ上に割り当てられる予定である。 その要素がヒープ上にエスケープするかどうかを確認する。
Parameters:
Scope sc 現在の関数とモジュールを決定するために使用される
AssocArrayLiteralExp ae 連想配列リテラル式
bool gag エラーメッセージを表示しない。
Returns:
true 要素がエスケープされている場合
bool checkParamArgumentEscape(ref Scope sc, FuncDeclaration fdc, Identifier parId, VarDeclaration vPar, STC parStc, Expression arg, bool assertmsg, bool gag);
関数パラメータpar は初期化されている argpar はエスケープされる可能性がある。 スコープされた値がこのようにエスケープされるかどうかを検出する。 エスケープが検出された場合はエラーメッセージを表示する。
Parameters:
Scope sc 現在の関数とモジュールを決定するために使用される
FuncDeclaration fdc 間接的に呼び出された場合はnull
Identifier parId エラーメッセージ用の関数パラメータの名前
VarDeclaration vPar VarDeclaration par
STC parStc 関数パラメータのストレージクラス(pure から追加されたscope がある場合がある)
Expression arg パラメータの初期化子
bool assertmsg パラメータが assert(bool, msg) の msg 引数である場合は true。
bool gag エラーメッセージを表示しない
Returns:
true スタックへのポインタが代入によって外部に漏れる可能性がある場合
bool checkParamArgumentReturn(ref Scope sc, Expression firstArg, Expression arg, Parameter param, bool gag);
関数引数はreturn パラメータを初期化し、 そのパラメータが代入される firstArg。 本質的には、 firstArg = arg;
Parameters: 現在の関数とモジュールを決定するために使用される
Scope sc 現在の関数とモジュールを決定するために使用される
Expression firstArg ref 引数を通して、 arg初期化子を割り当てることができる
Expression arg パラメータの初期化子を割り当てる
Parameter param パラメータ宣言に対応する arg
bool gag エラーメッセージを表示しない
Returns:
truefirstArgエラーが発生する
bool checkConstructorEscape(ref Scope sc, CallExp ce, bool gag);
s.this(args) の構造体コンストラクタをチェックし、 各return パラメータがs に割り当てられるかどうかを確認する。
Parameters:
Scope sc 現在の関数とモジュールを決定するために使用される
CallExp ce コンストラクタ呼び出しの形式をs.this(args)
bool gag エラーメッセージを表示しない
Returns:
true エスケープ参照エラーが発生する可能性がある場合、
enum ReturnParamDest: int;
return パラメータがリターンステートメントによってポインタ値をどのようにエスケープするのか
returnVal
return文を通して:return x
this_
構造体インスタンスに代入される場合:this.x = x
firstArg
最初の引数に割り当てられる: firstArg = x
ReturnParamDest returnParamDest(TypeFunction tf, Type tthis);
return文を使用してreturn パラメータを返す代わりに、this または最初のパラメータに代入して返すかどうかを確認する。
これは、return文で値を返すのと同じ動作である。 最初の引数はref でなければならないが、ref で返されるとはみなされない。
See Also: https://dlang.org.spec/function.html#return-ref-parameters
Parameters:
TypeFunction tf 関数型
Type tthis this パラメータの型、またはnull (なしの場合)
Returns:
return パラメータは引数の寿命を転送するべきである。
bool checkAssignEscape(ref Scope sc, Expression e, bool gag, bool byRef);
AssignExp が与えられた場合、"l値"が "r値"の内容をエスケープするかどうかを判断する。 エラーが検出された場合、エラーメッセージを表示する。 可能な場合は、"l値"のscope 属性を推論し、 エラーを排除する。
Parameters: 現在の関数とモジュールを決定するために使用される
Scope sc 現在の関数とモジュールを決定するために使用される
Expression e AssignExp または を使用してスタックへのポインタをチェックするCatAssignExp
bool gag エラーメッセージは表示しない
bool byRef true に設定する。e1e参照が割り当てられるe2
Returns:
true スタックへのポインタが代入によって漏洩する可能性がある場合
bool checkThrowEscape(ref Scope sc, Expression e, bool gag);
スタックへのポインタがスタックフレームの寿命から抜け出せる場合を検出する。 e。 これらが検出された場合、エラーメッセージを表示する。
Parameters:
Scope sc 現在の関数とモジュールを決定するために使用される
Expression e スタックへのポインタをチェックするための式
bool gag エラーメッセージを表示しない
Returns: スタックへのポインタがエスケープできる場合は
true スタックへのポインタがエスケープできる場合
bool checkNewEscape(ref Scope sc, Expression e, bool gag);
GCで割り当てられたオブジェクトにスタックポインタが置かれることで、スタックポインタがスタックフレームの寿命から抜け出せる場合を検出する。 検出された場合、エラーメッセージを表示する。
Parameters: 現在の関数とモジュールを特定するために使用される
Scope sc 現在の関数とモジュールを決定するために使用される
Expression e スタックへのポインタをチェックするための式
bool gag エラーメッセージを表示しない
Returns: スタックへのポインタがエスケープできる場合は
true スタックへのポインタがエスケープできる場合は
bool checkReturnEscape(ref Scope sc, Expression e, bool gag);
スタックへのポインタがスタックフレームの寿命から抜け出せる場合を検出する。 値を返すことで e。 これらが検出された場合はエラーメッセージを表示する。
Parameters:
Scope sc 現在の関数とモジュールを決定するために使用される
Expression e スタックへのポインタをチェックするための式
bool gag エラーメッセージを表示しない
Returns: スタックへのポインタがエスケープできる場合は
true スタックへのポインタがエスケープできる場合
bool checkReturnEscapeRef(ref Scope sc, Expression e, bool gag);
xml-ph-0000@deepl.internal による戻り値がスタックへの参照を返す可能性がある場合を検出する eref によってスタックへの参照が返される可能性がある場合を検出する。 検出された場合はエラーメッセージを表示する。
Parameters: 現在の関数とモジュールを特定するために使用される
Scope sc 現在の関数とモジュールを決定するために使用される
Expression e 式をチェックして
bool gag エラーメッセージを表示しない
Returns:
true スタックへの参照がエスケープできる場合
void escapeByValue(Expression e, ref scope EscapeByResults er, bool retRefTransition = false);
e は値として返される式であり、その値にはポインタが含まれる。 e をたどって、値として返される可能性のある変数を特定する。 例えば、 int* function(int* p) { return p; } e が &p の形式である場合、ref として返される内容を持つ変数を特定する。 例えば、 int* function(int i) { return &i; } このような式があるため、複数の変数を挿入できる。 int function(bool b, int i, int* p) { return b ? &i : p; }
副作用なし。
Parameters:
Expression e 値として返される式
EscapeByResults er 収集したデータをどこに配置するか
bool retRefTransition xml-ph-0000@deepl.internal関数呼び出しを通じて返される場合、 ereturn (ref) scope 関数呼び出しによって返される場合
struct EscapeByResults;
escapeBy??()関数によって収集されたデータを集約する。
void delegate(VarDeclaration, bool retRefTransition) byRef;
ref / addressで返される変数で呼び出される
void delegate(VarDeclaration) byValue;
ポインタを含む値を持つ変数に対して呼び出される
void delegate(FuncDeclaration, bool called) byFunc;
ネストされた関数がデリゲートに変換された場合called が true の場合、デリゲートが クロージャから変数を呼び出しによってエスケープすることを意味し、false は デリゲート自体がエスケープすることを意味する。
void delegate(Expression, bool retRefTransition) byExp;
式のテンポラリが参照/アドレスによって返される際に呼び出される
bool live;
@liveセマンティクスが適用される場合、すなわち、式p*p**p など、すべてp を返す。
void findAllOuterAccessedVariables(FuncDeclaration fd, VarDeclarations* vars);
このデリゲートによってアクセスされるすべての変数を見つけ、 それを囲む関数で
Parameters:
FuncDeclaration fd 関数
VarDeclarations* vars 配列に、見つかった変数を追加する
void finishScopeParamInference(FuncDeclaration funcdecl, ref TypeFunction f);
関数本体の意味解析後、 パラメータでscope /return を推測する
Parameters:
FuncDeclaration funcdecl 解析された関数宣言の
TypeFunction f 最終的な関数型。 funcdecl.type属性推論の前に「早期型」として開始され、 その後、推論された属性が最終型にコピーされる。 f