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あたりのマクロを使うべきだったようだ。