C++

N2179エミュレーション

N2179のg++での実装は諦めて、汎用のエミュレーション実装を追加しました。 <hamigaki/exception/common/exception.hpp> まだ、多重例外時のbad_allocには未対応です。 実装はおおよそN2179提案者のPeter Dimov氏のものと同じです。 http://www.pdimov.com/cpp/N2179/exception_ptr.cpp 相違点は、 例</hamigaki/exception/common/exception.hpp>…

コピーコンストラクタを無理やり探索→失敗

C++

g++で例外をコピーするのにコピーコンストラクタのアドレスがどうしても必要なので、無理やり探す方法を考えてみました。 struct copy { copy(); copy(const copy&); }; void bar(const copy& e) { throw e; } みたいなコードがあった場合、 __Z3barRK4copy:…

current_exception()の失敗

current_exception()が失敗したら、std::bad_alloc用のexception_ptrを返すようにしました。 <hamigaki/exception/msvc/exception.hpp>の差分 std::bad_alloc用のexception_ptrをstaticに持つ方法もありますが、ヘッダonlyで済ませたかったこともあり、exception_ptrに特殊な状態を追加して、これでs</hamigaki/exception/msvc/exception.hpp>…

N2179: Language Support for Transporting Exceptions between Threads

よく見たらC++0xのドラフトにはN2179で提案された例外の転送機能が含まれていたので、実装してみました。 今日の差分 とりあえずVC++だけ対応です。まだ、一部多重例外になる箇所が残っています。 こんな感じに使えます。 #include <hamigaki/exception.hpp> struct my_exception{}; </hamigaki/exception.hpp>…

スレッドを超えて例外を伝播させる その2

例外伝播テストをVC++に対応させました。 差分 あと、g++でスタック巻き戻し中で保留中の例外がある間に別の例外を投げて、その例外を伝播させようとするとクラッシュしていたので修正しました。 差分 まだ細かいバグは残ってると思うんですが、一応g++とVC+…

VC++の例外処理の仕組みを追う その4

C++

今度は退避しておいた例外オブジェクトの再スローです。 例外を送出するには、 スタックに例外オブジェクトのサイズ分の領域を確保する コピーコンストラクタを呼び出して例外オブジェクトを初期化する _CxxThrowException()を呼ぶ という手順を踏むことにな…

VC++の例外処理の仕組みを追う その2

C++

id:rayfillさんに教えてもらった「How a C++ compiler implements exception handling」を途中まで読んだんですが、実装がg++と随分違うことが分かりました。 例外オブジェクトはスタック上に配置され、スタックの巻き戻し中もスタックに残ったままになる ス…

VC++の例外処理の仕組みを追う その3

C++

catchした任意のオブジェクトをコピーするところまで出来ました。

VC++の例外処理の仕組みを追う

C++

昨日はg++の例外処理を追ったので、今日はVC++も調べてみました。 適当な例外を送出するコードを逆アセンブルすると、_CxxThrowException()という関数が呼ばれていたので、これをキーワードに調べてみたところ、CRunTinyというプロジェクトがVC++用簡易ラン…

空クラスのnew

C++

http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/Isoparametric/20080124/1201185062 のid:sankasekiさんのコメントに関して補足。 「空クラスをnewしたらNULLになるんじゃないの?」という意見ですが、規格では、 5.3.4/10 A new-expression passes the…

スレッドを超えて例外を伝播させる

今日は少し脱線して、以前から試してみたかった、スレッドを超えて例外を伝播させることに挑戦してみました。 propagate_test.cpp とりあえず、g++限定です。 例外オブジェクトはスタックに置くことはできないので、ヒープや自由領域と似たメモリに置かれて…

続 PODと集成体の静的初期化

C++

昨日の調査の続きです。 関連する項目を読んでみて文脈から推測するに、最初の考え方で合っていたようです。 6.7/4は静的記憶域期間(static storage duration)をもつ局所(local)オブジェクトについての記述 6.7/4の「定数式による初期化」とは定数式のみをメ…

PODと集成体の静的初期化

C++

http://d.hatena.ne.jp/y-hamigaki/comment?date=20080102#c 話が二転三転してますが、 struct hoge { int n; }; void func() { static int a = 1; // 静的初期化とは限らない static hoge b = { 2 }; // 静的初期化? } このaとbの初期化タイミングが違うっ…

pre-commitフックでコピーライトをチェックする

というわけで、コピーライトのチェックをするSubversion pre-commitフックを書いてみました。 Windowsのバッチファイル中でコマンド置換する方法が分からなかったのでC++で書きました。

abnormal_exit

吉里吉里のW.DeeさんからBoost.Coroutineだとabnormal_exitが送出される場面で、Hamigaki.Coroutineだとcoroutine_exitedが送出されるとの指摘を受けたので、abnormal_exitを実装してみました。 差分 abnormal_exitはコルーチン内で例外を捕捉しなかった場合…

VC9のストリームとロケール

C++

http://d.hatena.ne.jp/y-hamigaki/20070211#1171206100 VC9EE日本語版が出たのでようやく試してみました。 #include <cassert> #include <clocale> #include <fstream> #include <iostream> #include <locale> int main() { std::locale loc(""); // ofstreamのため必要 std::setlocale(LC_ALL, ""); std:</locale></iostream></fstream></clocale></cassert>…

可変長配列メンバ

C++

http://d.hatena.ne.jp/yotto-k/20071216#1197816102 元ネタはこちら(っとid:yotto-kさんの代わりにトラバ) http://d.hatena.ne.jp/higepon/20071215/1197733211 この問題、確かBoostMLでDavid Abrahams氏がポストしてたよなぁと思ったら、id:Cryoliteさんの…

関数がインライン化されるか確かめる

C++

http://d.hatena.ne.jp/shinichiro_h/20071216#1197793386 libcとかリンクすると探しにくいので、自分は「gcc -S」派です。 struct S { explicit S(int x) : x_(x) {} int x() const { return x_; } int x_; }; int hoge(const S& s) { return s.x(); } main…

フォルダ選択ダイアログ

プロジェクトディレクトリの作成時に標準のフォルダ選択ダイアログを使おうと思って、テストしてました。 使い方忘れがちなのでメモ。

まさにバグ

C++

char bug[128]; ::wsprintfA(buf, "%d %d %d", info.nMin, info.nMax, info.nPos);

続 libpng

パレットカラーと透過色に対応しました。 png_loader.cppの差分 libpngにはよく使用されるフォーマット変換用のフィルタが用意されているので、これを使って常に32ビットカラー(BGRA)で読み込むようにしています。 実は昨日のコードにも組み込んではいたので…

libpng

action_game.exeでPNGの読み込みにBoost.GILを使っていたのですが、パレットモードや透過色に対応していないため、仕方なく24/32ビットカラーのみをサポートしていました。 やっぱりこれだと不便なので、直接libpngを呼ぶように書き換えました。 png_loader.…

std::list::sort()

C++

昨日、Zソートに使ったstd::list<T,A>::sort()ですが、安定(stable)ソートじゃないとマズいことに気が付いて規格を確認しました。 23.2.2.4/31 Notes: Stable: the relative order of the equivalent elements is preserved. ISO/IEC 14882/2003 セーフ。 std::li</t,a>…

mutableな参照を返さないために

C++

えーと、今日は作業はほとんど進まず、設計を少し弄っただけです。 前から気になっていた問題なんですが、コンテナをメンバに持つクラスで、そのコンテナを外部から自由に弄らせたい場合、よく void bar_check(int x); // 何かのチェック関数 class hoge { p…

例外フレーム

今日は、MinGW版action_gameが終了時にクラッシュすることに気が付いてデバッグしていました。 デバッグ中にSjLj例外の環境でコルーチン側の例外フレームがリークするバグが見つかったので修正しました。 coroutine_template.hppの差分 問題の箇所はココです…

Hamigaki.System

とりあえず、Hamigakiライブラリ版system_errorを実装しました。 今日の差分 よく考えたらsystem_errorは既にC++0xのドラフトに入っていて、what()の実装例がBoostのそれとほぼ同じになっていました。 なので、データの持ち方としてはこの方法を採用しました…

system_error

C++

次のネタの準備として、C++TR2候補のsystem_errorもどきを実装しています。 ↓system_errorの定義はこれです。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2066.html ↓Boostでの実装はこちら http://boost.cvs.sourceforge.net/boost/boost/b…

shared_ptrでCOW

昨日はベクタのコピーを避けるようにしたわけですが、bjam_grammarでクロージャを使い出すとどうしてもコピーが発生してしまうので、Copy On Write(COW)の最適化を施すことにしました。 <hamigaki/bjam/util/list.hpp> 実装にはboost::shared_ptrを使っていて、必要に応じてオブジェクトを</hamigaki/bjam/util/list.hpp>…

stringのpop_back()

C++

C++のstringにはpush_back()はあるのにpop_back()がないので、大抵「s.resize(s.size()-1)」で代用していたのですが、これって効率いいのか疑問に思ってちょっと実験してみました。 式 msvc-8.0 gcc-mingw-3.4.2 cw-8.3 borland-5.8.2 s.resize(s.size()-1) …

pattern_match

case文と組み込みのGLOBルール用にbjamのパターンマッチを実装しました。 bjamで使えるパターンはワイルドカード("*","?")とキャラクタークラス("[a-z]"等)で、一般的な正規表現と表記が異なるためBoost.Regexをそのまま使うことは出来ません。 http://artic…