如何将 C NULL 传递给基于 XS 的函数?

How to pass C NULL to XS based function?

我正在尝试使用 Crypt::OpenSSL::EC 模块中的 Crypt::OpenSSL::EC::EC_POINT::mul() 函数。它有这样的C原型:

int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *n, const EC_POINT *q, const BIGNUM *m, BN_CTX *ctx)

而且我需要传递 NULL,NULL 而不是 EC_POINT *qconst BIGNUM *m,因为它在这里制作:

但是这个模块有这样的类型映射:

INPUT
BIGNUM
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_METHOD
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_GROUP
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_POINT
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

EC_KEY
    if( ! SvROK( $arg ) ) { croak( \"argument is not an object\" ); }
    $var = (${type}) SvIV( SvRV( $arg ) );

因此,如果我传递 undef 或 0,我将得到 "argument is not an object" 错误。 是否可以在不更改此模块的情况下制作我想要的东西?也许我可以以某种方式创建基于 NULL 的对象?

根据类型映射,将引用传递给零 [=11=] 应该可行:

Crypt::OpenSSL::EC::EC_POINT::mul($group, $r, $n, [=10=], [=10=], $ctx);