XS レベルで undef がわたされたかどうかを確認するには SvOK() をつかえばいいです。
SvOK Returns a U32 value indicating whether the value is an SV. It
also tells whether the value is defined or not.
U32 SvOK(SV* sv)これをつかって、
#define MYASSERT(expr) \
if (!(expr)) { \
if (SvTRUE(get_sv("TokyoCabinet::DEBUG", FALSE))) { \
Perl_croak(aTHX_ "TokyoCabinet: invalid parameter"); \
} \
XSRETURN_UNDEF; \
}などと定義しておくと、
MYASSERT( SvOK(key) && SvOK(val) );
のようにつかえます。これでもう安心です。
perl xs では、typemap という仕組みをつかって、変換表をもちいた型の自動変換を引数と返り値にかけられます。これをつかって
foo(const char *str)
などと定義してしまうと、typemap が勝手に SvPV を実行してしまって、undef かどうかをチェックできないので
foo(SV* _str) PREINIT: char *str; CODE: MYASSERT( SvOK(_str) ); str = SvPV_nolen(_str);
などという風に、引数では SV* をうけとるようにして、undef かどうかのチェックをしてから明示的に char * に変換するとよいです。
なお、引数の数は、xsubpp が勝手にチェックしてくれるので気にする必要はありません。