dist/ExtUtils-ParseXS/t/105-valid_proto_string.t ExtUtils::ParseXS tests
dist/ExtUtils-ParseXS/t/106-process_typemaps.t ExtUtils::ParseXS tests
dist/ExtUtils-ParseXS/t/108-map_type.t ExtUtils::ParseXS tests
-dist/ExtUtils-ParseXS/t/109-standard_XS_defs.t ExtUtils::ParseXS tests
dist/ExtUtils-ParseXS/t/112-set_cond.t ExtUtils::ParseXS tests
dist/ExtUtils-ParseXS/t/113-check_cond_preproc_statements.t ExtUtils::ParseXS tests
dist/ExtUtils-ParseXS/t/114-blurt_death_Warn.t ExtUtils::ParseXS tests
# Emit boilerplate postamble following any code passed through from
# the 'C' part of the XS file
- ExtUtils::ParseXS::Utilities::standard_XS_defs();
+ print ExtUtils::ParseXS::Q(<<'EOF');
+ |#ifndef PERL_UNUSED_VAR
+ |# define PERL_UNUSED_VAR(var) if (0) var = var
+ |#endif
+ |
+ |#ifndef dVAR
+ |# define dVAR dNOOP
+ |#endif
+ |
+ |
+ |/* This stuff is not part of the API! You have been warned. */
+ |#ifndef PERL_VERSION_DECIMAL
+ |# define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
+ |#endif
+ |#ifndef PERL_DECIMAL_VERSION
+ |# define PERL_DECIMAL_VERSION \
+ | PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
+ |#endif
+ |#ifndef PERL_VERSION_GE
+ |# define PERL_VERSION_GE(r,v,s) \
+ | (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
+ |#endif
+ |#ifndef PERL_VERSION_LE
+ |# define PERL_VERSION_LE(r,v,s) \
+ | (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s))
+ |#endif
+ |
+ |/* XS_INTERNAL is the explicit static-linkage variant of the default
+ | * XS macro.
+ | *
+ | * XS_EXTERNAL is the same as XS_INTERNAL except it does not include
+ | * "STATIC", ie. it exports XSUB symbols. You probably don't want that
+ | * for anything but the BOOT XSUB.
+ | *
+ | * See XSUB.h in core!
+ | */
+ |
+ |
+ |/* TODO: This might be compatible further back than 5.10.0. */
+ |#if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1)
+ |# undef XS_EXTERNAL
+ |# undef XS_INTERNAL
+ |# if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
+ |# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
+ |# define XS_INTERNAL(name) STATIC XSPROTO(name)
+ |# endif
+ |# if defined(__SYMBIAN32__)
+ |# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name)
+ |# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name)
+ |# endif
+ |# ifndef XS_EXTERNAL
+ |# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
+ |# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__)
+ |# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__)
+ |# else
+ |# ifdef __cplusplus
+ |# define XS_EXTERNAL(name) extern "C" XSPROTO(name)
+ |# define XS_INTERNAL(name) static XSPROTO(name)
+ |# else
+ |# define XS_EXTERNAL(name) XSPROTO(name)
+ |# define XS_INTERNAL(name) STATIC XSPROTO(name)
+ |# endif
+ |# endif
+ |# endif
+ |#endif
+ |
+ |/* perl >= 5.10.0 && perl <= 5.15.1 */
+ |
+ |
+ |/* The XS_EXTERNAL macro is used for functions that must not be static
+ | * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL
+ | * macro defined, the best we can do is assume XS is the same.
+ | * Dito for XS_INTERNAL.
+ | */
+ |#ifndef XS_EXTERNAL
+ |# define XS_EXTERNAL(name) XS(name)
+ |#endif
+ |#ifndef XS_INTERNAL
+ |# define XS_INTERNAL(name) XS(name)
+ |#endif
+ |
+ |/* Now, finally, after all this mess, we want an ExtUtils::ParseXS
+ | * internal macro that we're free to redefine for varying linkage due
+ | * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use
+ | * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to!
+ | */
+ |
+ |#undef XS_EUPXS
+ |#if defined(PERL_EUPXS_ALWAYS_EXPORT)
+ |# define XS_EUPXS(name) XS_EXTERNAL(name)
+ |#else
+ | /* default to internal */
+ |# define XS_EUPXS(name) XS_INTERNAL(name)
+ |#endif
+ |
+ |#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
+ |#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
+ |
+ |/* prototype to pass -Wmissing-prototypes */
+ |STATIC void
+ |S_croak_xs_usage(const CV *const cv, const char *const params);
+ |
+ |STATIC void
+ |S_croak_xs_usage(const CV *const cv, const char *const params)
+ |{
+ | const GV *const gv = CvGV(cv);
+ |
+ | PERL_ARGS_ASSERT_CROAK_XS_USAGE;
+ |
+ | if (gv) {
+ | const char *const gvname = GvNAME(gv);
+ | const HV *const stash = GvSTASH(gv);
+ | const char *const hvname = stash ? HvNAME(stash) : NULL;
+ |
+ | if (hvname)
+ | Perl_croak_nocontext("Usage: %s::%s(%s)", hvname, gvname, params);
+ | else
+ | Perl_croak_nocontext("Usage: %s(%s)", gvname, params);
+ | } else {
+ | /* Pants. I don't think that it should be possible to get here. */
+ | Perl_croak_nocontext("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
+ | }
+ |}
+ |#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE
+ |
+ |#define croak_xs_usage S_croak_xs_usage
+ |
+ |#endif
+ |
+ |/* NOTE: the prototype of newXSproto() is different in versions of perls,
+ | * so we define a portable version of newXSproto()
+ | */
+ |#ifdef newXS_flags
+ |#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0)
+ |#else
+ |#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv)
+ |#endif /* !defined(newXS_flags) */
+ |
+ |#if PERL_VERSION_LE(5, 21, 5)
+ |# define newXS_deffile(a,b) Perl_newXS(aTHX_ a,b,file)
+ |#else
+ |# define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b)
+ |#endif
+ |
+ |/* simple backcompat versions of the TARGx() macros with no optimisation */
+ |#ifndef TARGi
+ |# define TARGi(iv, do_taint) sv_setiv_mg(TARG, iv)
+ |# define TARGu(uv, do_taint) sv_setuv_mg(TARG, uv)
+ |# define TARGn(nv, do_taint) sv_setnv_mg(TARG, nv)
+ |#endif
+ |
+EOF
+
+ # Fix up line number reckoning
print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n"
if $pxs->{config_WantLineNumbers};
valid_proto_string
process_typemaps
map_type
- standard_XS_defs
set_cond
Warn
WarnHint
valid_proto_string
process_typemaps
map_type
- standard_XS_defs
set_cond
Warn
blurt
}
-=head2 C<standard_XS_defs()>
-
-=over 4
-
-=item * Purpose
-
-Writes to the C<.c> output file certain preprocessor directives and function
-headers needed in all such files.
-
-=item * Arguments
-
-None.
-
-=item * Return Value
-
-Returns true.
-
-=back
-
-=cut
-
-sub standard_XS_defs {
- print <<"EOF";
-#ifndef PERL_UNUSED_VAR
-# define PERL_UNUSED_VAR(var) if (0) var = var
-#endif
-
-#ifndef dVAR
-# define dVAR dNOOP
-#endif
-
-
-/* This stuff is not part of the API! You have been warned. */
-#ifndef PERL_VERSION_DECIMAL
-# define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
-#endif
-#ifndef PERL_DECIMAL_VERSION
-# define PERL_DECIMAL_VERSION \\
- PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
-#endif
-#ifndef PERL_VERSION_GE
-# define PERL_VERSION_GE(r,v,s) \\
- (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
-#endif
-#ifndef PERL_VERSION_LE
-# define PERL_VERSION_LE(r,v,s) \\
- (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s))
-#endif
-
-/* XS_INTERNAL is the explicit static-linkage variant of the default
- * XS macro.
- *
- * XS_EXTERNAL is the same as XS_INTERNAL except it does not include
- * "STATIC", ie. it exports XSUB symbols. You probably don't want that
- * for anything but the BOOT XSUB.
- *
- * See XSUB.h in core!
- */
-
-
-/* TODO: This might be compatible further back than 5.10.0. */
-#if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1)
-# undef XS_EXTERNAL
-# undef XS_INTERNAL
-# if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
-# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
-# define XS_INTERNAL(name) STATIC XSPROTO(name)
-# endif
-# if defined(__SYMBIAN32__)
-# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name)
-# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name)
-# endif
-# ifndef XS_EXTERNAL
-# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
-# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__)
-# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__)
-# else
-# ifdef __cplusplus
-# define XS_EXTERNAL(name) extern "C" XSPROTO(name)
-# define XS_INTERNAL(name) static XSPROTO(name)
-# else
-# define XS_EXTERNAL(name) XSPROTO(name)
-# define XS_INTERNAL(name) STATIC XSPROTO(name)
-# endif
-# endif
-# endif
-#endif
-
-/* perl >= 5.10.0 && perl <= 5.15.1 */
-
-
-/* The XS_EXTERNAL macro is used for functions that must not be static
- * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL
- * macro defined, the best we can do is assume XS is the same.
- * Dito for XS_INTERNAL.
- */
-#ifndef XS_EXTERNAL
-# define XS_EXTERNAL(name) XS(name)
-#endif
-#ifndef XS_INTERNAL
-# define XS_INTERNAL(name) XS(name)
-#endif
-
-/* Now, finally, after all this mess, we want an ExtUtils::ParseXS
- * internal macro that we're free to redefine for varying linkage due
- * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use
- * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to!
- */
-
-#undef XS_EUPXS
-#if defined(PERL_EUPXS_ALWAYS_EXPORT)
-# define XS_EUPXS(name) XS_EXTERNAL(name)
-#else
- /* default to internal */
-# define XS_EUPXS(name) XS_INTERNAL(name)
-#endif
-
-EOF
-
- print <<"EOF";
-#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
-#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
-
-/* prototype to pass -Wmissing-prototypes */
-STATIC void
-S_croak_xs_usage(const CV *const cv, const char *const params);
-
-STATIC void
-S_croak_xs_usage(const CV *const cv, const char *const params)
-{
- const GV *const gv = CvGV(cv);
-
- PERL_ARGS_ASSERT_CROAK_XS_USAGE;
-
- if (gv) {
- const char *const gvname = GvNAME(gv);
- const HV *const stash = GvSTASH(gv);
- const char *const hvname = stash ? HvNAME(stash) : NULL;
-
- if (hvname)
- Perl_croak_nocontext("Usage: %s::%s(%s)", hvname, gvname, params);
- else
- Perl_croak_nocontext("Usage: %s(%s)", gvname, params);
- } else {
- /* Pants. I don't think that it should be possible to get here. */
- Perl_croak_nocontext("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
- }
-}
-#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE
-
-#define croak_xs_usage S_croak_xs_usage
-
-#endif
-
-/* NOTE: the prototype of newXSproto() is different in versions of perls,
- * so we define a portable version of newXSproto()
- */
-#ifdef newXS_flags
-#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0)
-#else
-#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv)
-#endif /* !defined(newXS_flags) */
-
-#if PERL_VERSION_LE(5, 21, 5)
-# define newXS_deffile(a,b) Perl_newXS(aTHX_ a,b,file)
-#else
-# define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b)
-#endif
-
-/* simple backcompat versions of the TARGx() macros with no optimisation */
-#ifndef TARGi
-# define TARGi(iv, do_taint) sv_setiv_mg(TARG, iv)
-# define TARGu(uv, do_taint) sv_setuv_mg(TARG, uv)
-# define TARGn(nv, do_taint) sv_setnv_mg(TARG, nv)
-#endif
-
-EOF
- return 1;
-}
-
=head2 C<set_cond()>
=over 4
+++ /dev/null
-#!/usr/bin/perl
-use strict;
-use warnings;
-$| = 1;
-use Test::More tests => 4;
-use File::Spec;
-use lib (-d 't' ? File::Spec->catdir(qw(t lib)) : 'lib');
-use ExtUtils::ParseXS::Utilities qw(
- standard_XS_defs
-);
-use PrimitiveCapture;
-
-my @statements = (
- '#ifndef PERL_UNUSED_VAR',
- '#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE',
- '#ifdef newXS_flags',
-);
-
-my $stdout = PrimitiveCapture::capture_stdout(sub {
- standard_XS_defs();
-});
-
-foreach my $s (@statements) {
- like( $stdout, qr/$s/s, "Printed <$s>" );
-}
-
-pass("Passed all tests in $0");