/*
=head1 Global Variables
+
+These variables are global to an entire process. They are shared between
+all interpreters and all threads in a process.
+
+=cut
*/
/* Don't forget to re-run regen/embed.pl to propagate changes! */
/* global state */
#if defined(USE_ITHREADS)
-PERLVAR(Gop_mutex, perl_mutex) /* Mutex for op refcounting */
+PERLVAR(G, op_mutex, perl_mutex) /* Mutex for op refcounting */
#endif
-PERLVAR(Gcurinterp, PerlInterpreter *)
+PERLVARI(G, curinterp, PerlInterpreter *, NULL)
/* currently running interpreter
* (initial parent interpreter under
* useithreads) */
#if defined(USE_ITHREADS)
-PERLVAR(Gthr_key, perl_key) /* key to retrieve per-thread struct */
+PERLVAR(G, thr_key, perl_key) /* key to retrieve per-thread struct */
#endif
/* XXX does anyone even use this? */
-PERLVARI(Gdo_undump, bool, FALSE) /* -u or dump seen? */
+PERLVARI(G, do_undump, bool, FALSE) /* -u or dump seen? */
#ifndef PERL_USE_SAFE_PUTENV
-PERLVARI(Guse_safe_putenv, bool, TRUE)
+PERLVARI(G, use_safe_putenv, bool, TRUE)
#endif
#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
-PERLVARI(Gsig_handlers_initted, int, 0)
+PERLVARI(G, sig_handlers_initted, int, 0)
#endif
#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
-PERLVARA(Gsig_ignoring, SIG_SIZE, int) /* which signals we are ignoring */
+PERLVARA(G, sig_ignoring, SIG_SIZE, int)
+ /* which signals we are ignoring */
#endif
#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
-PERLVARA(Gsig_defaulting, SIG_SIZE, int)
+PERLVARA(G, sig_defaulting, SIG_SIZE, int)
#endif
/* XXX signals are process-wide anyway, so we
* ignore the implications of this for threading */
#ifndef HAS_SIGACTION
-PERLVARI(Gsig_trapped, int, 0)
+PERLVARI(G, sig_trapped, int, 0)
#endif
#ifndef PERL_MICRO
/* If Perl has to ignore SIGPFE, this is its saved state.
* See perl.h macros PERL_FPU_INIT and PERL_FPU_{PRE,POST}_EXEC. */
-PERLVAR(Gsigfpe_saved, Sighandler_t)
-PERLVARI(Gcsighandlerp, Sighandler_t, Perl_csighandler) /* Pointer to C-level sighandler */
+PERLVAR(G, sigfpe_saved, Sighandler_t)
+PERLVARI(G, csighandlerp, Sighandler_t, Perl_csighandler)
+ /* Pointer to C-level sighandler */
#endif
/* This is constant on most architectures, a global on OS/2 */
#ifdef OS2
-PERLVARI(Gsh_path, char *, SH_PATH) /* full path of shell */
+PERLVARI(G, sh_path, char *, SH_PATH) /* full path of shell */
#endif
#ifdef USE_PERLIO
# if defined(USE_ITHREADS)
-PERLVAR(Gperlio_mutex, perl_mutex) /* Mutex for perlio fd refcounts */
+PERLVAR(G, perlio_mutex, perl_mutex) /* Mutex for perlio fd refcounts */
# endif
-PERLVARI(Gperlio_fd_refcnt, int*, 0) /* Pointer to array of fd refcounts. */
-PERLVARI(Gperlio_fd_refcnt_size, int, 0) /* Size of the array */
-PERLVARI(Gperlio_debug_fd, int, 0) /* the fd to write perlio debug into, 0 means not set yet */
+PERLVARI(G, perlio_fd_refcnt, int *, 0) /* Pointer to array of fd refcounts. */
+PERLVARI(G, perlio_fd_refcnt_size, int, 0) /* Size of the array */
+PERLVARI(G, perlio_debug_fd, int, 0) /* the fd to write perlio debug into, 0 means not set yet */
#endif
#ifdef HAS_MMAP
-PERLVARI(Gmmap_page_size, IV, 0)
+PERLVARI(G, mmap_page_size, IV, 0)
#endif
#if defined(USE_ITHREADS)
-PERLVAR(Ghints_mutex, perl_mutex) /* Mutex for refcounted he refcounting */
+PERLVAR(G, hints_mutex, perl_mutex) /* Mutex for refcounted he refcounting */
#endif
#ifdef DEBUGGING
-PERLVAR(Gwatch_pvx, char*)
+PERLVARI(G, watch_pvx, char *, NULL)
#endif
+/*
+=for apidoc AmU|Perl_check_t *|PL_check
+
+Array, indexed by opcode, of functions that will be called for the "check"
+phase of optree building during compilation of Perl code. For most (but
+not all) types of op, once the op has been initially built and populated
+with child ops it will be filtered through the check function referenced
+by the appropriate element of this array. The new op is passed in as the
+sole argument to the check function, and the check function returns the
+completed op. The check function may (as the name suggests) check the op
+for validity and signal errors. It may also initialise or modify parts of
+the ops, or perform more radical surgery such as adding or removing child
+ops, or even throw the op away and return a different op in its place.
+
+This array of function pointers is a convenient place to hook into the
+compilation process. An XS module can put its own custom check function
+in place of any of the standard ones, to influence the compilation of a
+particular type of op. However, a custom check function must never fully
+replace a standard check function (or even a custom check function from
+another module). A module modifying checking must instead B<wrap> the
+preexisting check function. A custom check function must be selective
+about when to apply its custom behaviour. In the usual case where
+it decides not to do anything special with an op, it must chain the
+preexisting op function. Check functions are thus linked in a chain,
+with the core's base checker at the end.
+
+For thread safety, modules should not write directly to this array.
+Instead, use the function L</wrap_op_checker>.
+
+=cut
+*/
+
+#if defined(USE_ITHREADS)
+PERLVAR(G, check_mutex, perl_mutex) /* Mutex for PL_check */
+#endif
#ifdef PERL_GLOBAL_STRUCT
-PERLVAR(Gppaddr, Perl_ppaddr_t*) /* or opcode.h */
-PERLVAR(Gcheck, Perl_check_t *) /* or opcode.h */
-PERLVARA(Gfold_locale, 256, unsigned char) /* or perl.h */
+PERLVAR(G, ppaddr, Perl_ppaddr_t *) /* or opcode.h */
+PERLVAR(G, check, Perl_check_t *) /* or opcode.h */
+PERLVARA(G, fold_locale, 256, unsigned char) /* or perl.h */
#endif
#ifdef PERL_NEED_APPCTX
-PERLVAR(Gappctx, void*) /* the application context */
+PERLVAR(G, appctx, void*) /* the application context */
#endif
#if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
-PERLVAR(Gtimesbase, struct tms)
+PERLVAR(G, timesbase, struct tms)
#endif
/* allocate a unique index to every module that calls MY_CXT_INIT */
#ifdef PERL_IMPLICIT_CONTEXT
# ifdef USE_ITHREADS
-PERLVAR(Gmy_ctx_mutex, perl_mutex)
+PERLVAR(G, my_ctx_mutex, perl_mutex)
# endif
-PERLVARI(Gmy_cxt_index, int, 0)
+PERLVARI(G, my_cxt_index, int, 0)
#endif
/* this is currently set without MUTEX protection, so keep it a type which
* can be set atomically (ie not a bit field) */
-PERLVARI(Gveto_cleanup, int, FALSE) /* exit without cleanup */
+PERLVARI(G, veto_cleanup, int, FALSE) /* exit without cleanup */
/*
=for apidoc AmUx|Perl_keyword_plugin_t|PL_keyword_plugin
=cut
*/
-PERLVARI(Gkeyword_plugin, Perl_keyword_plugin_t, Perl_keyword_plugin_standard)
+PERLVARI(G, keyword_plugin, Perl_keyword_plugin_t, Perl_keyword_plugin_standard)
-PERLVAR(Gop_sequence, HV*) /* dump.c */
-PERLVARI(Gop_seq, UV, 0) /* dump.c */
+PERLVARI(G, op_sequence, HV *, NULL) /* dump.c */
+PERLVARI(G, op_seq, UV, 0) /* dump.c */
#ifdef USE_ITHREADS
-PERLVAR(Gdollarzero_mutex, perl_mutex) /* Modifying $0 */
+PERLVAR(G, dollarzero_mutex, perl_mutex) /* Modifying $0 */
#endif
/* Restricted hashes placeholder value.
- * The contents are never used, only the address. */
-PERLVAR(Gsv_placeholder, SV)
+ In theory, the contents are never used, only the address.
+ In practice, &PL_sv_placeholder is returned by some APIs, and the calling
+ code is checking SvOK(). */
+
+PERLVAR(G, sv_placeholder, SV)
#if defined(MYMALLOC) && defined(USE_ITHREADS)
-PERLVAR(Gmalloc_mutex, perl_mutex) /* Mutex for malloc */
+PERLVAR(G, malloc_mutex, perl_mutex) /* Mutex for malloc */
#endif
+
+PERLVARI(G, hash_seed_set, bool, FALSE) /* perl.c */
+PERLVARA(G, hash_seed, PERL_HASH_SEED_BYTES, unsigned char) /* perl.c and hv.h */