いち。
Optimized zend_try/zend_catch macros by eliminating memcpy(3). (Dmitry)
やく by どらたん http://d.hatena.ne.jp/wiz-zil/20061108/1162959788
zend_try/zend_catchマクロを、memcpy(3)をなくすことにより最適化. (Dmitry)
………はぁ?
チェックしてみましたよ。比較は5.1.6と5.2.0。
あ、一応。可読性とかよくするために、ある程度整形したり、¥省いたりしてます。
#define zend_try() { jmp_buf orig_bailout; zend_bool orig_bailout_set=EG(bailout_set); EG(bailout_set) = 1; memcpy(&orig_bailout, &EG(bailout), sizeof(jmp_buf)); if (setjmp(EG(bailout))==0) -中略- #define zend_end_try() memcpy(&EG(bailout), &orig_bailout, sizeof(jmp_buf)); EG(bailout_set) = orig_bailout_set; } #define zend_first_try EG(bailout_set)=0; zend_try
5.2.0
#define zend_try() { jmp_buf *__orig_bailout = EG(bailout); jmp_buf __bailout; EG(bailout) = &__bailout; if (setjmp(__bailout)==0) { -中略- #define zend_end_try() } EG(bailout) = __orig_bailout; } #define zend_first_try EG(bailout)=NULL; zend_try
………まぁわかる。何してるかは。
っつか、throw使いたいなら普通にC++使えよって思うのはだめ?
あと。ちと気になって
grep bailout_set *
した。
5.2.0はなし。これはいい。
5.1.6の結果。
zend.c: if (!EG(bailout_set)) { zend.h: zend_bool orig_bailout_set=EG(bailout_set); zend.h: EG(bailout_set) = 1; zend.h: EG(bailout_set) = orig_bailout_set; zend.h:#define zend_first_try EG(bailout_set)=0; zend_try zend_globals.h: zend_bool bailout_set;
……………。
はい、先生質問です。
zend_globals.h ってなんだよ? zend_globals.h って!!
このヘッダの中見てください。蕁麻疹でること請け合いです。