]> perl5.git.perl.org Git - perl5.git/commitdiff This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ParseXS: refactor: inline and rm standard_XS_defs
authorDavid Mitchell <[email protected]>
Fri, 24 Oct 2025 13:09:18 +0000 (14:09 +0100)
committerDavid Mitchell <[email protected]>
Wed, 17 Dec 2025 13:14:37 +0000 (13:14 +0000)
(This commit is part of a series which will extend the AST parse tree
from just representing individual XSUBs to representing the whole XS
file.)

The ExtUtils::ParseXS::Utilities::standard_XS_defs() function
just returns a big string containing all the standard boilerplate code
that gets added to the C file. Delete this function, and instead
include the text directly within C_part_postamble::as_code().

MANIFEST
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Node.pm
dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm
dist/ExtUtils-ParseXS/t/109-standard_XS_defs.t [deleted file]

index 7d68079ef10b655ff5bc39a26ad2fb25d608aa20..1c2ff2a8e05a1f6615a6e6220e96d34651c2cdaf 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -4211,7 +4211,6 @@ dist/ExtUtils-ParseXS/t/104-map_type.t                            ExtUtils::ParseXS tests
 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
index bf28b42a15562f723acd7e77205771fc0b2b4a0c..af4f4c82b1798cdda82b8ef4c804e8fcab0afdd2 100644 (file)
@@ -825,7 +825,160 @@ sub as_code {
     # 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};
index 86da930c48caf1c4d65d0a0e821752732b3b7c3a..f45a0b1d69eba4493854a0884310bae83bf10e3b 100644 (file)
@@ -16,7 +16,6 @@ our (@ISA, @EXPORT_OK);
   valid_proto_string
   process_typemaps
   map_type
-  standard_XS_defs
   set_cond
   Warn
   WarnHint
@@ -41,7 +40,6 @@ ExtUtils::ParseXS::Utilities - Subroutines used with ExtUtils::ParseXS
     valid_proto_string
     process_typemaps
     map_type
-    standard_XS_defs
     set_cond
     Warn
     blurt
@@ -301,186 +299,6 @@ sub map_type {
 }
 
 
-=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
diff --git a/dist/ExtUtils-ParseXS/t/109-standard_XS_defs.t b/dist/ExtUtils-ParseXS/t/109-standard_XS_defs.t
deleted file mode 100644 (file)
index da03920..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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");