From: macke...@animalhead.com <macke...@animalhead.com>
Subject: Re: Call variable length argument function from perl -> C
using autogenerated code from xsubpp
To: "Harakiri" <harakiri...@yahoo.com>
Cc: perl-xs@perl.org
Date: Wednesday, March 2, 2011, 12:41 PM
var arg lists are supported in perl
-> c.
Here is an interface routine (from a .xs file) that
implements
pushing into an array:
UV
mm_array_push (array, ...)
mm_array *array
ALIAS:
mma_array_push=1
PREINIT:
int add_count = items - 1;
SV *addSVs[add_count];
int i;
CODE:
for (i=0; i < add_count; i++) addSVs[i] = ST(i+1);
if (!mm_array_splice (array, array->entries, 0, NULL,
add_count, addSVs, ix) && PL_dowarn && mm_error())
warn ("IPC::MMA: %s", mm_error());
RETVAL = array->entries;
OUTPUT:
RETVAL
This routine is converted by xsubpp into the one below by
the
following automatic step in the module's 'make' stage:
/usr/bin/perl /usr/local/lib/perl5/5.10.1/ExtUtils/xsubpp
-typemap /usr/local/lib/perl5/5.10.1/ExtUtils/typemap
-typemap typemap MMA.xs > MMA.xsc && mv
MMA.xsc MMA.c
XS(XS_IPC__MMA_mm_array_push)
{
#ifdef dVAR
dVAR; dXSARGS;
#else
dXSARGS;
#endif
dXSI32;
if (items < 1)
croak_xs_usage(cv,
"array, ...");
{
mm_array * array;
#line 1771 "MMA.xs"
int add_count = items - 1;
SV *addSVs[add_count];
int i;
#line 2427 "MMA.c"
UV RETVAL;
dXSTARG;
if (sv_derived_from(ST(0),
"mm_arrayPtr")) {
IV tmp =
SvIV((SV*)SvRV(ST(0)));
array = INT2PTR(mm_array
*,tmp);
}
else
Perl_croak(aTHX_ "%s: %s
is not of type %s",
GvNAME(CvGV(cv)),
"array", "mm_arrayPtr");
#line 1775 "MMA.xs"
for (i=0; i < add_count;
i++) addSVs[i] = ST(i+1);
if (!mm_array_splice (array,
array->entries, 0, NULL, add_count, addSVs, ix)
&& PL_dowarn
&& mm_error()) warn ("IPC::MMA: %s", mm_error());
RETVAL = array->entries;
#line 2444 "MMA.c"
XSprePUSH; PUSHu((UV)RETVAL);
}
XSRETURN(1);
}
On Mar 2, 2011, at 8:19 AM, Harakiri wrote:
Hello,
i've searched the mailing list and found an entry from
2001 that var arg list were not supported in perl -> c :
http://www.mail-archive.com/perl-xs@perl.org/msg00345.html
Has this changed?
Im using the xsubpp util to create my glue cpp
classes.
Example:
static int Random( int Count, ... );
turns into
XS(XS_MyClass_Random)
{
dXSARGS;
if (items <
2)
Perl_croak(aTHX_ "Usage:
MyClass::Random(CLASS, Count, ...)");
{
char *
CLASS = (char *)SvPV_nolen(ST(0));
int
RETVAL;
dXSTARG;
int
Count = (int)SvIV(ST(1));
RETVAL = MyClass::Random(Count);
XSprePUSH; PUSHi((IV)RETVAL);
}
XSRETURN(1);
}
as you can see the "..." is not honored, only the
first argument is used. I know i could manually glue this
somehow but i DONT want that because i have alot of method
signatures which always have been converted fine using
xsubpp - i dont want to manually alter the generated file
just for one method.
Is there a way?
Thank you!