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

rt.dwarfeh

Dwarf スタイルのポータブル例外処理をサポートする。
License:
Distributed under the Boost Software License 1.0. (See accompanying file LICENSE)
Authors:
Walter Bright

ソース rt/dwarfeh.d

struct ExceptionHeader;
アンワインダーのデータをコンパイラ固有の構造体でラップする。 でラップする。
static @nogc ExceptionHeader* create(Throwable o);
ExceptionHeaderを割り当てて初期化する。
Parameters:
Throwable o オブジェクトをスローする。
Returns:
ExceptionHeaderを割り当てて初期化する
static void free(ExceptionHeader* eh);
create()で作成されたExceptionHeaderを解放する。
Parameters:
ExceptionHeader* eh 解放するExceptionHeader
void push();
これを連鎖した例外スタックにプッシュする。
static ExceptionHeader* pop();
連鎖した例外スタックの先頭をポップして返す。
static ExceptionHeader* toExceptionHeader(_Unwind_Exception* eo);
exception_objectへのポインタをExceptionHeaderへのポインタに変換する。 へのポインタに変換する。
Parameters:
_Unwind_Exception* eo 例外オブジェクトフィールドへのポインタ
Returns:
eoが指すExceptionHeaderへのポインタ。
Throwable __dmd_begin_catch(_Unwind_Exception* exceptionObject);
キャッチ・ハンドラが最初にすることは、これを呼び出すことである。
Parameters:
_Unwind_Exception* exceptionObject unwinderによってキャッチ・ハンドラに渡される値
Returns:
キャッチされたオブジェクト
nothrow @nogc void* _d_eh_swapContextDwarf(void* newContext);
ファイバーがコンテキストを切り替えるときに呼び出される。
Parameters:
void* newContext 切り替えるスタック
Returns:
スタックの前の値
void _d_throwdwarf(Throwable o);
を介して例外をスローするためにDコードから呼び出される。
throw o;
Parameters:
Throwable o スローするオブジェクト
Returns:
を返さない
_Unwind_Reason_Code __dmd_personality_v0(int ver, _Unwind_Action actions, _Unwind_Exception_Class exceptionClass, _Unwind_Exception* exceptionObject, _Unwind_Context* context);
各言語固有の"個性"関数。 これはもちろんDMD特有のものだ。
Parameters:
int ver バージョンは1でなければならない。
_Unwind_Action actions 4つのアクションUA_xxxのビットORである。 UA_SEARCH_PHASEは、現在のフレームにハンドラーがあればURC_HANDLER_FOUNDを返す、 なければURC_CONTINUE_UNWINDを返す。UA_CLEANUP_PHASE とは併用できない。 UA_CLEANUP_PHASE は、ネストされた関数を呼び出して現在のフレームのクリーンアップを行うことを意味する。 を呼び出してURC_CONTINUE_UNWINDを返す。または、ランディングパッドのレジスタとIPをセットアップする。 をセットアップし、URC_INSTALL_CONTEXTを返す。 UA_HANDLER_FRAMEは、このフレームがフェーズ1でハンドラのあるフレームであったことを意味する。 フェーズ2であり、ハンドラを実行しなければならない。 UA_FORCE_UNWINDは、longjmpまたはスレッドキャンセルのためにスタックを巻き戻すことを意味する。実行する finally 節は catch 節ではなく、Uwind_Resume() の呼び出しで終わらなければならない。
_Unwind_Exception_Class exceptionClass スローされた例外の型を示す8バイトの値。下位4バイトが が"C++0"の場合、C++例外である。
_Unwind_Exception* exceptionObject 言語固有の例外情報
_Unwind_Context* context アンワインダ状態情報の不透明型
Returns:
理由コード
ClassInfo getClassInfo(_Unwind_Exception* exceptionObject, const(ubyte)* currentLsd);
機内例外の連鎖を見て、catch節で探すクラス型を選ぶ。 catch節で探されるクラス型を選ぶ。
Parameters:
_Unwind_Exception* exceptionObject 言語固有の例外情報
const(ubyte)* currentLsd LSDAテーブルへのポインタ
Returns:
検索するクラス型
_uleb128_t uLEB128(const(ubyte)** p);
符号なしLEB128をデコードする。
Parameters:
const(ubyte)** p データポインタへのポインタ、*pは更新される デコードされた過去の値を指すように更新される
Returns:
デコード値
_sleb128_t sLEB128(const(ubyte)** p);
符号付き LEB128 をデコードする。
Parameters:
const(ubyte)** p データ・ポインタへのポインタ、*pは更新される。 を更新する。
Returns:
デコード値
LsdaResult scanLSDA(const(ubyte)* lsda, _Unwind_Ptr ip, _Unwind_Exception_Class exceptionClass, bool cleanupsOnly, bool preferHandler, _Unwind_Exception* exceptionObject, out _Unwind_Ptr landingPad, out int handler);
LSDA(別名gcc_except_tableセクション)から情報を読み取り、抽出する。 dmdコールサイトテーブルは、他の実装とは構造的に異なる。それは つのipが複数の範囲にマッピングできる。検索時には、最も 検索時には、最もネストした候補が選択される。他の実装では を持つ。
Parameters:
const(ubyte)* lsda LSDAテーブルへのポインタ
_Unwind_Ptr ip 例外が発生した関数開始からのオフセット
_Unwind_Exception_Class exceptionClass どの言語が例外をスローしたか。
bool cleanupsOnly クリーンアップだけを探す
bool preferHandler ハンドラがクリーンアップを含んでいる場合、そのハンドラを優先する
_Unwind_Exception* exceptionObject 言語固有の例外情報
_Unwind_Ptr landingPad ランディングパッドに設定される
int handler どのcatch節にマッチしたかのインデックスにセットされる
Returns:
LsdaResult
int actionTableLookup(_Unwind_Exception* exceptionObject, uint actionRecordPtr, const(ubyte)* pActionTable, const(ubyte)* tt, ubyte TType, _Unwind_Exception_Class exceptionClass, const(ubyte)* lsda);
アクションテーブルでclassTypeを検索する。
Parameters:
_Unwind_Exception* exceptionObject 言語固有の例外情報
uint actionRecordPtr アクションテーブルの開始インデックス+1
const(ubyte)* pActionTable アクションテーブルの開始へのポインタ
const(ubyte)* tt 型テーブルの末尾を過ぎたポインタ
ubyte TType 型テーブルのエントリーのエンコーディング
_Unwind_Exception_Class exceptionClass どの言語が例外をスローしたか
const(ubyte)* lsda LSDAテーブルへのポインタ
Returns:
  • >=1はclassTypeのハンドラインデックスを意味する。
  • 0はclassTypeがアクションテーブルにないことを意味する
  • <0は壊れていることを意味する
enum _Unwind_Exception_Class cppExceptionClass;
C++サポート
void* getCppPtrToThrownObject(_Unwind_Exception* exceptionObject, CppTypeInfo sti);
スローされたオブジェクトの型が暗黙的にキャッチ型に変換可能な場合、スローされたオブジェクトへのポインタを取得する。 へのポインタを取得する。
Parameters:
_Unwind_Exception* exceptionObject 言語固有の例外情報
CppTypeInfo sti catch節の型
Returns:
キャッチされなかった場合はnull、キャッチされた場合はスローされたオブジェクトへのポインタ
interface CppTypeInfo;
D言語からC++ std::type_info の仮想関数にアクセスする、 libstd++とリンクする必要がないように注意する。 とのリンクが必要になったり、core.stdcpp.typeinfoと干渉したりしないように注意すること。 そこで、別の名前をつける。
struct CppExceptionHeader;
DのExceptionHeaderラッパーのC++バージョン
static CppExceptionHeader* toExceptionHeader(_Unwind_Exception* eo);
exception_objectフィールドへのポインタからCppExceptionHeaderへのポインタに変換する。 へのポインタに変換する。
Parameters:
_Unwind_Exception* eo 例外オブジェクト・フィールドへのポインタ
Returns:
eoが指すCppExceptionHeaderへのポインタ。