がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

………おなかいっぱい2 ;;

いち。
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 って!!


このヘッダの中見てください。蕁麻疹でること請け合いです。