Unwind-safe scope(failure)

D 言語の scope(failure) を極大級 C++ 闇魔法を総投入してでもエミュレートしたいが stack unwind のときにどうしよう問題.
8
Akso de la Malbono @Cryolite

http://t.co/yVSy6PeD ようやく要点を思い出した.これでグローバル変数消せる.寝る.

2012-03-19 03:11:47
でちまるさん(実際かわいい) @decimalbloat

そういえばメンバ関数をtrailing-return-typeの形式で宣言したいけどその中でその他のメンバにアクセスしたいと考えた末に思いついたのが http://t.co/vWmtcxnQ

2012-03-19 03:14:54
でちまるさん(実際かわいい) @decimalbloat

これもうちょっとカッコいい方法ある気がするんだけど思いつかない.あとそもそもこれ規格的には必要あるのかどうかも分かってない.

2012-03-19 03:17:20
Akso de la Malbono @Cryolite

@decimalbloat 9.2/2 から trailing-return-type 内では PoD においては定義中のクラスは incomplete とみなされるので,たとえばやっているように dependent にして PoI まで解決を遅延する必要はあるかと.

2012-03-19 03:23:39
でちまるさん(実際かわいい) @decimalbloat

C++の闇鉱脈広すぎるし,多分まだ謎の資源いっぱい埋まってる.

2012-03-19 03:36:32
でちまるさん(実際かわいい) @decimalbloat

さて,昨晩C(ryさんから提供していただいた闇資源をもとにSCOPE_EXITをいじるか…

2012-03-19 14:20:51
Akso de la Malbono @Cryolite

@decimalbloat std::uncaught_exception 使えば良い気がしてきました.(いきなり振出しに戻る)

2012-03-19 21:28:05
Akso de la Malbono @Cryolite

@decimalbloat いや,要するに dynamic scope に unwind のデストラクタがあったら rollback 黙らせればよいんですよね?

2012-03-19 21:31:04
Akso de la Malbono @Cryolite

@decimalbloat std::uncaught_exception 使えば判定できるじゃないですか!

2012-03-19 21:42:32
でちまるさん(実際かわいい) @decimalbloat

@Cryolite はい.しかしそれだと何か問題的なものがあったから闇資源を採掘しようとしていたのでは

2012-03-19 21:43:31
Akso de la Malbono @Cryolite

@decimalbloat はい! std::uncaught_exception だけで判定すると問題があるので,まず std::uncaught_exception で判定するんですよ!

2012-03-19 21:45:40
でちまるさん(実際かわいい) @decimalbloat

@Cryolite はい,ではあと何か判定に使えそうなものありました?

2012-03-19 21:48:50
Akso de la Malbono @Cryolite

@decimalbloat はい! std::uncaught_exception ですよ!

2012-03-19 21:50:01
Akso de la Malbono @Cryolite

@decimalbloat SG のデストラクタで std::uncaught_exception 使うと, SG が宣言されているスコープの途中で例外が飛んできたのか,そもそも SG が宣言されている関数が unwinding で呼ばれて正常終了したのか分からないのが問題で,

2012-03-19 21:55:04
Akso de la Malbono @Cryolite

@decimalbloat しかし!!! ここで SG の宣言文の位置で std::uncaught_exception を使うと……!!!

2012-03-19 21:56:46
でちまるさん(実際かわいい) @decimalbloat

@Cryolite 宣言して初期化しようとしているまさにその瞬間に,既にuncaught_exceptionが真だったらそれはunwindingの途中!!!!!!

2012-03-19 22:02:16
でちまるさん(実際かわいい) @decimalbloat

@Cryolite やりました!!!!!!ありがとうございます!!!!!!!!

2012-03-19 22:05:01
Akso de la Malbono @Cryolite

@decimalbloat unwind 中であることを判定するための std::uncaught_exception の呼び出しは, lexical で最初のときだけ呼び出してその値を記録すれば十分です.「lexical で最初のときだけ呼び出してその値を記録」

2012-03-19 22:08:15