OP_GVの実際の型
warnings::methodがスレッドのない環境で動かなかったのは,OP_GVの型がUSE_ITHREADSの有無で変わるからだった。
/* op.c as of 5.10.0 */ OP * Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv) { dVAR; assert(gv); #ifdef USE_ITHREADS GvIN_PAD_on(gv); return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv)); #else return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv)); #endif }
したがって,当然OP_GVからGV*を取得する方法もUSE_ITHREADSの有無で異なる。だから,本当は直接GVOPの要素にアクセスするのではなく,op.hのGVOP_gvあたりのマクロを使うべきだったようだ。