ext/XS-APItest/t/xs_special_subs.t Test that XS BEGIN/CHECK/INIT/END work
ext/XS-APItest/t/xsub_h.t Tests for XSUB.h
ext/XS-APItest/typemap
+ext/XS-APItest/XSUB-redefined-macros.xs XS code needing redefined macros.
ext/XS-APItest/XSUB-undef-XS_VERSION.xs XS code needing #undef XS_VERSION
ext/XS-Typemap/Makefile.PL XS::Typemap extension
ext/XS-Typemap/README XS::Typemap extension
}
XS(XS_XS__APItest__XSUB_XS_VERSION_undef);
+XS(XS_XS__APItest__XSUB_XS_VERSION_empty);
#include "const-c.inc"
BOOT:
newXS("XS::APItest::XSUB::XS_VERSION_undef", XS_XS__APItest__XSUB_XS_VERSION_undef, __FILE__);
+ newXS("XS::APItest::XSUB::XS_VERSION_empty", XS_XS__APItest__XSUB_XS_VERSION_empty, __FILE__);
void
XS_VERSION_defined(...)
ABSTRACT_FROM => 'APItest.pm', # retrieve abstract from module
AUTHOR => 'Tim Jenness <t.jenness@jach.hawaii.edu>, Christian Soeller <csoelle@mph.auckland.ac.nz>, Hugo van der Sanden <hv@crypt.compulink.co.uk>, Andrew Main (Zefram) <zefram@fysh.org>',
'C' => ['exception.c', 'core.c', 'notcore.c'],
- 'OBJECT' => '$(BASEEXT)$(OBJ_EXT) XSUB-undef-XS_VERSION$(OBJ_EXT) $(O_FILES)',
+ 'OBJECT' => '$(BASEEXT)$(OBJ_EXT) XSUB-undef-XS_VERSION$(OBJ_EXT) XSUB-redefined-macros$(OBJ_EXT) $(O_FILES)',
realclean => {FILES => 'const-c.inc const-xs.inc'},
($Config{gccversion} && $Config{d_attribute_deprecated} ?
(CCFLAGS => $Config{ccflags} . ' -Wno-deprecated-declarations') : ()),
--- /dev/null
+#include "EXTERN.h"
+#include "perl.h"
+
+/* We have to be in a different .xs so that we can do this: */
+
+#undef XS_VERSION
+#define XS_VERSION ""
+#include "XSUB.h"
+
+/* This can't be "MODULE = XS::APItest" as then we get duplicate bootstraps. */
+MODULE = XS::APItest::XSUB1 PACKAGE = XS::APItest::XSUB
+
+PROTOTYPES: DISABLE
+
+void
+XS_VERSION_empty(...)
+ PPCODE:
+ XS_VERSION_BOOTCHECK;
+ XSRETURN_EMPTY;
}
}
+{
+ my $count = 0;
+ {
+ package Counter;
+ our @ISA = 'version';
+ sub new {
+ ++$count;
+ return version::new(@_);
+ }
+
+ sub DESTROY {
+ --$count;
+ }
+ }
+
+ {
+ my $var = Counter->new();
+ is ($count, 1, "1 object exists");
+ is (eval {XS_VERSION_empty('main', $var); 1}, undef);
+ like ($@, qr/Invalid version format \(version required\)/);
+ }
+
+ is ($count, 0, "no objects exist");
+}
+
done_testing();
}
if (sv) {
SV *xpt = NULL;
- SV *xssv = Perl_newSVpvn(aTHX_ xs_p, xs_len);
+ SV *xssv = Perl_newSVpvn_flags(aTHX_ xs_p, xs_len, SVs_TEMP);
SV *pmsv = sv_derived_from(sv, "version")
- ? SvREFCNT_inc_simple_NN(sv)
- : new_version(sv);
+ ? sv : sv_2mortal(new_version(sv));
xssv = upg_version(xssv, 0);
if ( vcmp(pmsv,xssv) ) {
xpt = Perl_newSVpvf(aTHX_ "%s object version %"SVf
vn ? vn : "bootstrap parameter",
SVfARG(Perl_sv_2mortal(aTHX_ vstringify(pmsv))));
Perl_sv_2mortal(aTHX_ xpt);
- }
- SvREFCNT_dec(xssv);
- SvREFCNT_dec(pmsv);
- if (xpt)
Perl_croak_sv(aTHX_ xpt);
+ }
}
}