#endif
#define NOOP /*EMPTY*/(void)0
-#if !defined(HASATTRIBUTE_UNUSED) && defined(__cplusplus)
-#define dNOOP /*EMPTY*/(void)0 /* Older g++ has no __attribute((unused))__ */
-#else
-#define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
-#endif
+/* cea2e8a9dd23747f accidentally lost the comment originally from the first
+ check in of thread.h, explaining why we need dNOOP at all: */
+/* Rats: if dTHR is just blank then the subsequent ";" throws an error */
+/* Declaring a *function*, instead of a variable, ensures that we don't rely
+ on being able to suppress "unused" warnings. */
+#define dNOOP extern int Perl___notused()
#ifndef pTHX
/* Don't bother defining tTHX and sTHX; using them outside
# endif
#endif
+#define PERL_PATCHLEVEL_H_IMPLICIT
+#include "patchlevel.h"
+#undef PERL_PATCHLEVEL_H_IMPLICIT
+
+#define PERL_VERSION_STRING STRINGIFY(PERL_REVISION) "." \
+ STRINGIFY(PERL_VERSION) "." \
+ STRINGIFY(PERL_SUBVERSION)
+
+#define PERL_API_VERSION_STRING STRINGIFY(PERL_API_REVISION) "." \
+ STRINGIFY(PERL_API_VERSION) "." \
+ STRINGIFY(PERL_API_SUBVERSION)
+
START_EXTERN_C
/* handy constants */
EXTCONST char PL_memory_wrap[]
INIT("panic: memory wrap");
+EXTCONST char PL_Yes[]
+ INIT("1");
+EXTCONST char PL_No[]
+ INIT("");
+EXTCONST char PL_hexdigit[]
+ INIT("0123456789abcdef0123456789ABCDEF");
+
+/* This is constant on most architectures, a global on OS/2 */
+#ifndef OS2
+EXTCONST char PL_sh_path[]
+ INIT(SH_PATH); /* full path of shell */
+#endif
+
#ifdef CSH
EXTCONST char PL_cshname[]
INIT(CSH);
# define PL_cshlen (sizeof(CSH "") - 1)
#endif
+/* These are baked at compile time into any shared perl library.
+ In future releases this will allow us in main() to sanity test the
+ library we're linking against. */
+
+EXTCONST U8 PL_revision
+ INIT(PERL_REVISION);
+EXTCONST U8 PL_version
+ INIT(PERL_VERSION);
+EXTCONST U8 PL_subversion
+ INIT(PERL_SUBVERSION);
+
EXTCONST char PL_uuemap[65]
INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
EXTCONST char PL_bincompat_options[];
#endif
+#ifndef PERL_SET_PHASE
+# define PERL_SET_PHASE(new_phase) \
+ PHASE_CHANGE_PROBE(PL_phase_names[new_phase], PL_phase_names[PL_phase]); \
+ PL_phase = new_phase;
+#endif
+
/* The interpreter phases. If these ever change, PL_phase_names right below will
* need to be updated accordingly. */
enum perl_phase {
# define FAKE_DEFAULT_SIGNAL_HANDLERS
#endif
-#define PERL_PATCHLEVEL_H_IMPLICIT
-#include "patchlevel.h"
-#undef PERL_PATCHLEVEL_H_IMPLICIT
-
-#define PERL_VERSION_STRING STRINGIFY(PERL_REVISION) "." \
- STRINGIFY(PERL_VERSION) "." \
- STRINGIFY(PERL_SUBVERSION)
-
-#define PERL_API_VERSION_STRING STRINGIFY(PERL_API_REVISION) "." \
- STRINGIFY(PERL_API_VERSION) "." \
- STRINGIFY(PERL_API_SUBVERSION)
-
#if !defined(MULTIPLICITY)
struct interpreter {
# define PERLVARA(var,n,type) type var[n];
# define PERLVARI(var,type,init) type var;
# define PERLVARIC(var,type,init) type var;
-# define PERLVARISC(var,init) const char var[sizeof(init)];
struct interpreter {
# include "intrpvar.h"
};
+EXTCONST U16 PL_interp_size
+ INIT(sizeof(struct interpreter));
+
+# define PERL_INTERPRETER_SIZE_UPTO_MEMBER(member) \
+ STRUCT_OFFSET(struct interpreter, member) + \
+ sizeof(((struct interpreter*)0)->member)
+
+/* This will be useful for subsequent releases, because this has to be the
+ same in your libperl as in main(), else you have a mismatch and must abort.
+*/
+EXTCONST U16 PL_interp_size_5_16_0
+ INIT(PERL_INTERPRETER_SIZE_UPTO_MEMBER(PERL_LAST_5_16_0_INTERP_MEMBER));
+
+
# ifdef PERL_GLOBAL_STRUCT
/* MULTIPLICITY is automatically defined when PERL_GLOBAL_STRUCT is defined,
hence it's safe and sane to nest this within #ifdef MULTIPLICITY */
# include "perlvars.h"
};
+EXTCONST U16 PL_global_struct_size
+ INIT(sizeof(struct perl_vars));
+
# ifdef PERL_CORE
# ifndef PERL_GLOBAL_STRUCT_PRIVATE
EXT struct perl_vars PL_Vars;
# undef PERLVARA
# undef PERLVARI
# undef PERLVARIC
-# undef PERLVARISC
#endif /* MULTIPLICITY */
#define PERLVARA(var,n,type) EXT type PL_##var[n];
#define PERLVARI(var,type,init) EXT type PL_##var INIT(init);
#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
-#define PERLVARISC(var,init) EXTCONST char PL_##var[sizeof(init)] INIT(init);
#if !defined(MULTIPLICITY)
START_EXTERN_C
START_EXTERN_C
+/* dummy variables that hold pointers to both runops functions, thus forcing
+ * them *both* to get linked in (useful for Peek.xs, debugging etc) */
+
+EXTCONST runops_proc_t PL_runops_std
+ INIT(Perl_runops_standard);
+EXTCONST runops_proc_t PL_runops_dbg
+ INIT(Perl_runops_debug);
+
/* PERL_GLOBAL_STRUCT_PRIVATE wants to keep global data like the
* magic vtables const, but this is incompatible with SWIG which
* does want to modify the vtables. */
#define PERL_SCAN_ALLOW_UNDERSCORES 0x01 /* grok_??? accept _ in numbers */
#define PERL_SCAN_DISALLOW_PREFIX 0x02 /* grok_??? reject 0x in hex etc */
#define PERL_SCAN_SILENT_ILLDIGIT 0x04 /* grok_??? not warn about illegal digits */
+#define PERL_SCAN_SILENT_NON_PORTABLE 0x08 /* grok_??? not warn about very large
+ numbers which are <= UV_MAX */
/* Output flags: */
#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */