diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs index 2f6a2bd54639..e351f167b8a4 100644 --- a/ext/XS-APItest/APItest.xs +++ b/ext/XS-APItest/APItest.xs @@ -1388,6 +1388,61 @@ XS_APIVERSION_valid(...) XS_APIVERSION_BOOTCHECK; XSRETURN_EMPTY; +void +xsreturn( int len ) + PPCODE: + int i = 0; + EXTEND( SP, len ); + for ( ; i < len; i++ ) { + ST(i) = sv_2mortal( newSViv(i) ); + } + XSRETURN( len ); + +void +xsreturn_iv() + PPCODE: + XSRETURN_IV( (1<<31) + 1 ); + +void +xsreturn_uv() + PPCODE: + XSRETURN_UV( (U32)((1<<31) + 1) ); + +void +xsreturn_nv() + PPCODE: + XSRETURN_NV(0.1); + +void +xsreturn_pv() + PPCODE: + XSRETURN_PV("returned"); + +void +xsreturn_pvn() + PPCODE: + XSRETURN_PVN("returned too much",8); + +void +xsreturn_no() + PPCODE: + XSRETURN_NO; + +void +xsreturn_yes() + PPCODE: + XSRETURN_YES; + +void +xsreturn_undef() + PPCODE: + XSRETURN_UNDEF; + +void +xsreturn_empty() + PPCODE: + XSRETURN_EMPTY; + MODULE = XS::APItest:Hash PACKAGE = XS::APItest::Hash void diff --git a/ext/XS-APItest/t/xsub_h.t b/ext/XS-APItest/t/xsub_h.t index 9bf0710fa2e1..855fb4eaf1aa 100644 --- a/ext/XS-APItest/t/xsub_h.t +++ b/ext/XS-APItest/t/xsub_h.t @@ -120,4 +120,35 @@ is(eval {XS_APIVERSION_invalid("Pie"); 1}, undef, like($@, qr/Perl API version v1.0.16 of Pie does not match v5\.\d+\.\d+/, "expected error"); +my @xsreturn; +@xsreturn = XS::APItest::XSUB::xsreturn(2); +is scalar @xsreturn, 2, 'returns a list of 2 elements'; +is $xsreturn[0], 0; +is $xsreturn[1], 1; + +my $xsreturn = XS::APItest::XSUB::xsreturn(3); +is $xsreturn, 2, 'returns the last item on the stack'; + +( $xsreturn ) = XS::APItest::XSUB::xsreturn(3); +is $xsreturn, 0, 'gets the first item on the stack'; + +is XS::APItest::XSUB::xsreturn_iv(), -2**31+1, 'XSRETURN_IV returns signed int'; +is XS::APItest::XSUB::xsreturn_uv(), 2**31+1, 'XSRETURN_UV returns unsigned int'; +is XS::APItest::XSUB::xsreturn_nv(), 0.1, 'XSRETURN_NV returns double'; +is XS::APItest::XSUB::xsreturn_pv(), "returned", 'XSRETURN_PV returns string'; +is XS::APItest::XSUB::xsreturn_pvn(), "returned", 'XSRETURN_PVN returns string with length'; +ok !XS::APItest::XSUB::xsreturn_no(), 'XSRETURN_NO returns falsey'; +ok XS::APItest::XSUB::xsreturn_yes(), 'XSRETURN_YES returns truthy'; + +is XS::APItest::XSUB::xsreturn_undef(), undef, 'XSRETURN_UNDEF returns undef in scalar context'; +my @xs_undef = XS::APItest::XSUB::xsreturn_undef(); +is scalar @xs_undef, 1, 'XSRETURN_UNDEF returns a single-element list'; +is $xs_undef[0], undef, 'XSRETURN_UNDEF returns undef in list context'; + +my @xs_empty = XS::APItest::XSUB::xsreturn_empty(); +is scalar @xs_empty, 0, 'XSRETURN_EMPTY returns empty list in array context'; +my $xs_empty = XS::APItest::XSUB::xsreturn_empty(); +is $xs_empty, undef, 'XSRETURN_EMPTY returns undef in scalar context'; + + done_testing();