This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perlapi: Remove per-thread section; move to real scns
[perl5.git] / intrpvar.h
index 63bc4d1..67ff94c 100644 (file)
 
 #include "handy.h"
 
-/*
-=head1 Per-Interpreter Variables
-*/
-
 /* These variables are per-interpreter in threaded/multiplicity builds,
  * global otherwise.
 
@@ -21,7 +17,7 @@
 
 /* New variables must be added to the very end for binary compatibility. */
 
-/* Don't forget to add your variable also to perl_clone()! (in sv.c) */
+/* DON'T FORGET to add your variable also to perl_clone()! (in sv.c) */
 
 /* The 'I' prefix is only needed for vars that need appropriate #defines
  * generated when built with or without MULTIPLICITY.  It is also used
@@ -53,13 +49,13 @@ PERLVARI(I, tmps_ix,        SSize_t,        -1)
 PERLVARI(I, tmps_floor,        SSize_t,        -1)
 PERLVAR(I, tmps_max,   SSize_t)        /* first unalloced slot in tmps stack */
 
-PERLVARI(I, sub_generation, U32, 1)    /* incr to invalidate method cache */
-
 PERLVAR(I, markstack,  I32 *)          /* stack_sp locations we're
                                           remembering */
 PERLVAR(I, markstack_ptr, I32 *)
 PERLVAR(I, markstack_max, I32 *)
 
+PERLVARI(I, sub_generation, U32, 1)    /* incr to invalidate method cache */
+
 #ifdef PERL_HASH_RANDOMIZE_KEYS
 #ifdef USE_PERL_PERTURB_KEYS
 PERLVARI(I, hash_rand_bits_enabled, U8, 1) /* used to randomize hash stuff 0 == no-random, 1 == random, 2 == determinsitic */
@@ -73,8 +69,9 @@ PERLVAR(I, multideref_pc, UNOP_AUX_item *)
 
 /* Fields used by magic variables such as $@, $/ and so on */
 PERLVAR(I, curpm,      PMOP *)         /* what to do \ interps in REs from */
+PERLVAR(I, curpm_under,        PMOP *)                /* what to do \ interps in REs from */
 
-PERLVAR(I, tainting,   bool)           /* doing taint checks */
+PERLVAR(I, tainting,   bool)           /* doing taint checks */
 PERLVARI(I, tainted,   bool, FALSE)    /* using variables controlled by $< */
 
 /* PL_delaymagic is currently used for two purposes: to assure simultaneous
@@ -92,14 +89,17 @@ PERLVARI(I, tainted,        bool, FALSE)    /* using variables controlled by $< */
  */
 PERLVAR(I, delaymagic, U16)            /* ($<,$>) = ... */
 
-PERLVAR(I, localizing, U8)             /* are we processing a local() list? */
-PERLVAR(I, in_eval,    U8)             /* trap "fatal" errors? */
-PERLVAR(I, defgv,      GV *)           /* the *_ glob */
 /*
+=for apidoc_section $warning
+=for apidoc mn|U8|PL_dowarn
 
-=for apidoc mn|bool|PL_dowarn
+The C variable that roughly corresponds to Perl's C<$^W> warning variable.
+However, C<$^W> is treated as a boolean, whereas C<PL_dowarn> is a
+collection of flag bits.
 
-The C variable which corresponds to Perl's C<$^W> warning variable.
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
 
 =cut
 */
@@ -114,11 +114,51 @@ PERLVAR(I, dowarn,        U8)
 PERLVARI(I, utf8cache, I8, PERL___I)   /* Is the utf8 caching code enabled? */
 #undef PERL___I
 
+/*
+=for apidoc Amn|GV *|PL_defgv
+
+The GV representing C<*_>.  Useful for access to C<$_>.
+
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
+=cut
+*/
+
+PERLVAR(I, localizing, U8)             /* are we processing a local() list? */
+PERLVAR(I, in_eval,    U8)             /* trap "fatal" errors? */
+PERLVAR(I, defgv,      GV *)           /* the *_ glob */
+
+/*
+=for apidoc Amn|HV*|PL_curstash
+
+The stash for the package code will be compiled into.
+
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
+=cut
+*/
 
 /* Stashes */
 PERLVAR(I, defstash,   HV *)           /* main symbol table */
 PERLVAR(I, curstash,   HV *)           /* symbol table for current package */
 
+/*
+=for apidoc Amn|COP*|PL_curcop
+
+The currently active COP (control op) roughly representing the current
+statement in the source.
+
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
+=cut
+*/
+
 PERLVAR(I, curcop,     COP *)
 PERLVAR(I, curstack,   AV *)           /* THE STACK */
 PERLVAR(I, curstackinfo, PERL_SI *)    /* current stack + context */
@@ -144,6 +184,7 @@ PERLVAR(I, regmatch_state, regmatch_state *)
 PERLVAR(I, comppad,    PAD *)          /* storage for lexically scoped temporaries */
 
 /*
+=for apidoc_section $SV
 =for apidoc Amn|SV|PL_sv_undef
 This is the C<undef> SV.  Always refer to this as C<&PL_sv_undef>.
 
@@ -155,15 +196,40 @@ C<&PL_sv_no>.
 This is the C<true> SV.  See C<L</PL_sv_no>>.  Always refer to this as
 C<&PL_sv_yes>.
 
+=for apidoc Amn|SV|PL_sv_zero
+This readonly SV has a zero numeric value and a C<"0"> string value. It's
+similar to C<L</PL_sv_no>> except for its string value. Can be used as a
+cheap alternative to C<mXPUSHi(0)> for example.  Always refer to this as
+C<&PL_sv_zero>. Introduced in 5.28.
+
 =cut
 */
 
+#ifdef MULTIPLICITY
+PERLVAR(I, sv_yes,     SV)
 PERLVAR(I, sv_undef,   SV)
 PERLVAR(I, sv_no,      SV)
-PERLVAR(I, sv_yes,     SV)
+PERLVAR(I, sv_zero,    SV)
+#else
+/* store the immortals as an array to ensure they are contiguous in
+ * memory: makes SvIMMORTAL_INTERP(sv) possible */
+PERLVARA(I, sv_immortals, 4, SV)
+#endif
+
 PERLVAR(I, padname_undef,      PADNAME)
 PERLVAR(I, padname_const,      PADNAME)
-PERLVAR(I, Sv,         SV *)           /* used to hold temporary values */
+
+/*
+=for apidoc Cmn||PL_Sv
+
+A scratch pad SV for whatever temporary use you need.  Chiefly used as a
+fallback by macros on platforms where L<perlapi/PERL_USE_GCC_BRACE_GROUPS>> is
+unavailable, and which would otherwise would evaluate their SV parameter more
+than once.
+
+=cut
+*/
+PERLVAR(I, Sv,         SV *)
 
 PERLVAR(I, parser,     yy_parser *)    /* current parser state */
 
@@ -185,24 +251,36 @@ PERLVAR(I, na,            STRLEN)         /* for use in SvPV when length is
                                           Not Applicable */
 
 /* stat stuff */
-PERLVAR(I, statbuf,    Stat_t)
 PERLVAR(I, statcache,  Stat_t)         /* _ */
 PERLVAR(I, statgv,     GV *)
 PERLVARI(I, statname,  SV *,   NULL)
 
 /*
+=for apidoc_section $io
 =for apidoc mn|SV*|PL_rs
 
 The input record separator - C<$/> in Perl space.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =for apidoc mn|GV*|PL_last_in_gv
 
 The GV which was last used for a filehandle input operation.  (C<< <FH> >>)
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =for apidoc mn|GV*|PL_ofsgv
 
 The glob containing the output field separator - C<*,> in Perl space.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =cut
 */
 
@@ -241,11 +319,58 @@ PERLVAR(I, efloatsize,    STRLEN)
 PERLVARI(I, dumpindent,        U16,    4)      /* number of blanks per dump
                                           indentation level */
 
+/*
+=for apidoc_section $embedding
+=for apidoc Amn|U8|PL_exit_flags
+
+Contains flags controlling perl's behaviour on exit():
+
+=over
+
+=item * C<PERL_EXIT_DESTRUCT_END>
+
+If set, END blocks are executed when the interpreter is destroyed.
+This is normally set by perl itself after the interpreter is
+constructed.
+
+=item * C<PERL_EXIT_ABORT>
+
+Call C<abort()> on exit.  This is used internally by perl itself to
+abort if exit is called while processing exit.
+
+=item * C<PERL_EXIT_WARN>
+
+Warn on exit.
+
+=item * C<PERL_EXIT_EXPECTED>
+
+Set by the L<perlfunc/exit> operator.
+
+=back
+
+=for apidoc Amnh||PERL_EXIT_EXPECTED
+=for apidoc Amnh||PERL_EXIT_ABORT
+=for apidoc Amnh||PERL_EXIT_DESTRUCT_END
+=for apidoc Amnh||PERL_EXIT_WARN
+
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
+=cut
+*/
+
 PERLVAR(I, exit_flags, U8)             /* was exit() unexpected, etc. */
 
 PERLVAR(I, utf8locale, bool)           /* utf8 locale detected */
 PERLVAR(I, in_utf8_CTYPE_locale, bool)
 PERLVAR(I, in_utf8_COLLATE_locale, bool)
+PERLVAR(I, in_utf8_turkic_locale, bool)
+#if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE)
+PERLVARI(I, lc_numeric_mutex_depth, int, 0)   /* Emulate general semaphore */
+#endif
+PERLVARA(I, locale_utf8ness, 256, char)
+
 #ifdef USE_LOCALE_CTYPE
     PERLVAR(I, warn_locale, SV *)
 #endif
@@ -253,6 +378,7 @@ PERLVAR(I, in_utf8_COLLATE_locale, bool)
 PERLVARA(I, colors,6,  char *)         /* values from PERL_RE_COLORS env var */
 
 /*
+=for apidoc_section $optree_construction
 =for apidoc Amn|peep_t|PL_peepp
 
 Pointer to the per-subroutine peephole optimiser.  This is a function
@@ -270,6 +396,10 @@ If the new code wishes to operate on ops throughout the subroutine's
 structure, rather than just at the top level, it is likely to be more
 convenient to wrap the L</PL_rpeepp> hook.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =cut
 */
 
@@ -294,6 +424,10 @@ If the new code wishes to operate only on ops at a subroutine's top level,
 rather than throughout the structure, it is likely to be more convenient
 to wrap the L</PL_peepp> hook.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =cut
 */
 
@@ -308,6 +442,10 @@ It is also assured to first fire for the parent OP and then for its kids.
 
 When you replace this variable, it is considered a good practice to store the possibly previously installed hook and that you recall it inside your own.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =cut
 */
 
@@ -382,12 +520,17 @@ PERLVAR(I, DBgv,  GV *)           /*  *DB::DB     */
 PERLVAR(I, DBline,     GV *)           /*  *DB::line   */
 
 /*
+=for apidoc_section $debugging
 =for apidoc mn|GV *|PL_DBsub
 When Perl is run in debugging mode, with the B<-d> switch, this GV contains
 the SV which holds the name of the sub being debugged.  This is the C
 variable which corresponds to Perl's $DB::sub variable.  See
 C<L</PL_DBsingle>>.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =for apidoc mn|SV *|PL_DBsingle
 When Perl is run in debugging mode, with the B<-d> switch, this SV is a
 boolean which indicates whether subs are being single-stepped.
@@ -395,11 +538,19 @@ Single-stepping is automatically turned on after every step.  This is the C
 variable which corresponds to Perl's $DB::single variable.  See
 C<L</PL_DBsub>>.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =for apidoc mn|SV *|PL_DBtrace
 Trace variable used when Perl is run in debugging mode, with the B<-d>
 switch.  This is the C variable which corresponds to Perl's $DB::trace
 variable.  See C<L</PL_DBsingle>>.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =cut
 */
 
@@ -440,8 +591,6 @@ PERLVARI(I, curcopdb,       COP *,  NULL)
 PERLVAR(I, filemode,   int)            /* so nextargv() can preserve mode */
 PERLVAR(I, lastfd,     int)            /* what to preserve mode on */
 PERLVAR(I, oldname,    char *)         /* what to preserve mode on */
-PERLVAR(I, Argv,       const char **)  /* stuff to free from do_aexec, vfork safe */
-PERLVAR(I, Cmd,                char *)         /* stuff to free from do_aexec, vfork safe */
 /* Elements in this array have ';' appended and are injected as a single line
    into the tokeniser. You can't put any (literal) newlines into any program
    you stuff in into this array, as the point where it's injected is expecting
@@ -470,6 +619,7 @@ PERLVARI(I, exitlist,       PerlExitListEntry *, NULL)
                                        /* list of exit functions */
 
 /*
+=for apidoc_section $HV
 =for apidoc Amn|HV*|PL_modglobal
 
 C<PL_modglobal> is a general purpose, interpreter global HV for use by
@@ -478,6 +628,10 @@ In a pinch, it can also be used as a symbol table for extensions
 to share data among each other.  It is a good idea to use keys
 prefixed by the package name of the extension that owns the data.
 
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
 =cut
 */
 
@@ -537,11 +691,15 @@ PERLVAR(I, pidstatus,     HV *)           /* pid-to-status mappings for waitpid */
 #endif
 PERLVAR(I, osname,     char *)         /* operating system */
 
-PERLVAR(I, sighandlerp,        Sighandler_t)
+PERLVAR(I, sighandlerp,         Sighandler_t)
+/* these two are provided only to solve library linkage issues; they
+ * should not be hooked by user code */
+PERLVAR(I, sighandler1p, Sighandler1_t)
+PERLVAR(I, sighandler3p, Sighandler3_t)
 
 PERLVARA(I, body_roots,        PERL_ARENA_ROOTS_SIZE, void*) /* array of body roots */
 
-PERLVAR(I, debug,      VOL U32)        /* flags given to -D switch */
+PERLVAR(I, debug,      volatile U32)   /* flags given to -D switch */
 
 PERLVARI(I, padlist_generation, U32, 1)        /* id to identify padlist clones */
 
@@ -559,12 +717,20 @@ PERLVAR(I, constpadix,    PADOFFSET)      /* lowest unused for constants */
 
 PERLVAR(I, padix_floor,        PADOFFSET)      /* how low may inner block reset padix */
 
+#if defined(USE_POSIX_2008_LOCALE)          \
+ && defined(USE_THREAD_SAFE_LOCALE)         \
+ && ! defined(HAS_QUERYLOCALE)
+
+PERLVARA(I, curlocales, 12, char *)
+
+#endif
 #ifdef USE_LOCALE_COLLATE
+
 PERLVAR(I, collation_name, char *)     /* Name of current collation */
 PERLVAR(I, collxfrm_base, Size_t)      /* Basic overhead in *xfrm() */
 PERLVARI(I, collxfrm_mult,Size_t, 2)   /* Expansion factor in *xfrm() */
 PERLVARI(I, collation_ix, U32, 0)      /* Collation generation index */
-PERLVARA(I, strxfrm_min_char, 3, char)
+PERLVARI(I, strxfrm_NUL_replacement, U8, 0)  /* Code point to replace NULs */
 PERLVARI(I, strxfrm_is_behaved, bool, TRUE)
                             /* Assume until proven otherwise that it works */
 PERLVARI(I, strxfrm_max_cp, U8, 0)      /* Highest collating cp in locale */
@@ -572,13 +738,15 @@ PERLVARI(I, collation_standard, bool, TRUE)
                                        /* Assume simple collation */
 #endif /* USE_LOCALE_COLLATE */
 
+PERLVARI(I, langinfo_buf, char *, NULL)
+PERLVARI(I, langinfo_bufsize, Size_t, 0)
+PERLVARI(I, setlocale_buf, char *, NULL)
+PERLVARI(I, setlocale_bufsize, Size_t, 0)
+
 #ifdef PERL_SAWAMPERSAND
 PERLVAR(I, sawampersand, U8)           /* must save all match strings */
 #endif
 
-PERLVAR(I, unsafe,     bool)
-PERLVAR(I, colorset,   bool)           /* PERL_RE_COLORS env var is in use */
-
 /* current phase the interpreter is in
    for ordering this structure to remove holes, we're assuming that this is 4
    bytes.  */
@@ -586,63 +754,61 @@ PERLVARI(I, phase,        enum perl_phase, PERL_PHASE_CONSTRUCT)
 
 PERLVARI(I, in_load_module, bool, FALSE)       /* to prevent recursions in PerlIO_find_layer */
 
-/* This value may be set when embedding for full cleanup  */
-/* 0=none, 1=full, 2=full with checks */
-/* mod_perl is special, and also assigns a meaning -1 */
-PERLVARI(I, perl_destruct_level, signed char,  0)
+PERLVAR(I, unsafe,     bool)
+PERLVAR(I, colorset,   bool)           /* PERL_RE_COLORS env var is in use */
 
-#ifdef USE_LOCALE_NUMERIC
+/*
+=for apidoc_section $embedding
+=for apidoc Amn|signed char|PL_perl_destruct_level
 
-PERLVARI(I, numeric_standard, int, TRUE)
-                                       /* Assume simple numerics */
-PERLVARI(I, numeric_local, bool, TRUE)
-                                       /* Assume local numerics */
-PERLVAR(I, numeric_name, char *)       /* Name of current numeric locale */
-PERLVAR(I, numeric_radix_sv, SV *)     /* The radix separator if not '.' */
+This value may be set when embedding for full cleanup.
 
-#endif /* !USE_LOCALE_NUMERIC */
+Possible values:
 
-/* Unicode inversion lists */
-PERLVAR(I, Latin1,     SV *)
-PERLVAR(I, UpperLatin1,        SV *)   /* Code points 128 - 255 */
-PERLVAR(I, AboveLatin1,        SV *)
-PERLVAR(I, InBitmap,   SV *)
+=over
 
-PERLVAR(I, NonL1NonFinalFold,   SV *)
-PERLVAR(I, HasMultiCharFold,   SV *)
+=item * 0 - none
 
-/* utf8 character class swashes */
-PERLVAR(I, utf8_mark,  SV *)
-PERLVAR(I, utf8_toupper, SV *)
-PERLVAR(I, utf8_totitle, SV *)
-PERLVAR(I, utf8_tolower, SV *)
-PERLVAR(I, utf8_tofold,        SV *)
-PERLVAR(I, utf8_charname_begin, SV *)
-PERLVAR(I, utf8_charname_continue, SV *)
+=item * 1 - full
 
-PERLVARA(I, utf8_swash_ptrs, POSIX_SWASH_COUNT, SV *)
-PERLVARA(I, Posix_ptrs, POSIX_CC_COUNT, SV *)
-PERLVARA(I, XPosix_ptrs, POSIX_CC_COUNT, SV *)
-PERLVAR(I, GCB_invlist, SV *)
-PERLVAR(I, LB_invlist, SV *)
-PERLVAR(I, SB_invlist, SV *)
-PERLVAR(I, WB_invlist, SV *)
+=item * 2 or greater - full with checks.
 
-PERLVAR(I, last_swash_hv, HV *)
-PERLVAR(I, last_swash_tmps, U8 *)
-PERLVAR(I, last_swash_slen, STRLEN)
-PERLVARA(I, last_swash_key,UTF8_MAXBYTES-1, U8)
-PERLVAR(I, last_swash_klen, U8)                /* Only needs to store 0-12  */
+=back
 
-#ifdef FCRYPT
-PERLVARI(I, cryptseen, bool,   FALSE)  /* has fast crypt() been initialized? */
-#else
-/* One byte hole in the interpreter structure.  */
-#endif
+If C<$ENV{PERL_DESTRUCT_LEVEL}> is set to an integer greater than the
+value of C<PL_perl_destruct_level> its value is used instead.
+
+On threaded perls, each thread has an independent copy of this variable;
+each initialized at creation time with the current value of the creating
+thread's copy.
+
+=cut
+*/
+/* mod_perl is special, and also assigns a meaning -1 */
+PERLVARI(I, perl_destruct_level, signed char,  0)
 
 PERLVAR(I, pad_reset_pending, bool)    /* reset pad on next attempted alloc */
+
 PERLVAR(I, srand_called, bool)
 
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVARI(I, numeric_underlying, bool, TRUE)
+                                       /* Assume underlying locale numerics */
+PERLVARI(I, numeric_underlying_is_standard, bool, TRUE)
+
+PERLVARI(I, numeric_standard, int, TRUE)
+                                       /* Assume C locale numerics */
+PERLVAR(I, numeric_name, char *)       /* Name of current numeric locale */
+PERLVAR(I, numeric_radix_sv, SV *)     /* The radix separator if not '.' */
+
+#  ifdef HAS_POSIX_2008_LOCALE
+
+PERLVARI(I, underlying_numeric_obj, locale_t, NULL)
+
+#  endif
+#endif /* !USE_LOCALE_NUMERIC */
+
 /* Array of signal handlers, indexed by signal number, through which the C
    signal handler dispatches.  */
 PERLVAR(I, psig_ptr,   SV **)
@@ -695,15 +861,6 @@ PERLVARI(I, known_layers, PerlIO_list_t *, NULL)
 PERLVARI(I, def_layerlist, PerlIO_list_t *, NULL)
 #endif
 
-PERLVAR(I, utf8_idstart, SV *)
-PERLVAR(I, utf8_idcont,        SV *)
-PERLVAR(I, utf8_xidstart, SV *)
-PERLVAR(I, utf8_perl_idstart, SV *)
-PERLVAR(I, utf8_perl_idcont, SV *)
-PERLVAR(I, utf8_xidcont, SV *)
-
-PERLVAR(I, sort_RealCmp, SVCOMPARE_t)
-
 PERLVARI(I, checkav_save, AV *, NULL)  /* save CHECK{}s when compiling */
 PERLVARI(I, unitcheckav_save, AV *, NULL)
                                        /* save UNITCHECK{}s when compiling */
@@ -713,6 +870,8 @@ PERLVARI(I, clocktick,      long,   0)      /* this many times() ticks in a second */
 /* Hooks to shared SVs and locks. */
 PERLVARI(I, sharehook, share_proc_t, Perl_sv_nosharing)
 PERLVARI(I, lockhook,  share_proc_t, Perl_sv_nosharing)
+
+GCC_DIAG_IGNORE(-Wdeprecated-declarations)
 #ifdef NO_MATHOMS
 #  define PERL_UNLOCK_HOOK Perl_sv_nosharing
 #else
@@ -721,6 +880,8 @@ PERLVARI(I, lockhook,       share_proc_t, Perl_sv_nosharing)
 #endif
 PERLVARI(I, unlockhook,        share_proc_t, PERL_UNLOCK_HOOK)
 
+GCC_DIAG_RESTORE
+
 PERLVARI(I, threadhook,        thrhook_proc_t, Perl_nothreadhook)
 
 /* Can shared object be destroyed */
@@ -741,14 +902,6 @@ PERLVAR(I, registered_mros, HV *)
 /* Compile-time block start/end hooks */
 PERLVAR(I, blockhooks, AV *)
 
-/* Everything that folds to a given character, for case insensitivity regex
- * matching */
-PERLVARI(I, utf8_foldclosures, HV *, NULL)
-
-/* List of characters that participate in folds (except marks, etc in
- * multi-char folds) */
-PERLVARI(I, utf8_foldable, SV *, NULL)
-
 PERLVAR(I, custom_ops, HV *)           /* custom op registrations */
 
 PERLVAR(I, Xpv,                XPV *)          /* (unused) held temporary value */
@@ -762,18 +915,17 @@ PERLVAR(I, debug_pad,     struct perl_debug_pad)  /* always needed because of the re
 /* Hook for File::Glob */
 PERLVARI(I, globhook,  globhook_t, NULL)
 
+#if defined(MULTIPLICITY)
 /* The last unconditional member of the interpreter structure when 5.18.0 was
    released. The offset of the end of this is baked into a global variable in 
    any shared perl library which will allow a sanity test in future perl
    releases.  */
-#define PERL_LAST_5_18_0_INTERP_MEMBER Iglobhook
+#  define PERL_LAST_5_18_0_INTERP_MEMBER       Iglobhook
+#endif
 
 #ifdef PERL_IMPLICIT_CONTEXT
 PERLVARI(I, my_cxt_list, void **, NULL) /* per-module array of MY_CXT pointers */
 PERLVARI(I, my_cxt_size, int,  0)      /* size of PL_my_cxt_list */
-#  ifdef PERL_GLOBAL_STRUCT_PRIVATE
-PERLVARI(I, my_cxt_keys, const char **, NULL) /* per-module array of pointers to MY_CXT_KEY constants */
-#  endif
 #endif
 
 #if defined(PERL_IMPLICIT_CONTEXT) || defined(PERL_DEBUG_READONLY_COW)
@@ -807,7 +959,66 @@ PERLVARA(I, op_exec_cnt, OP_max+2, UV)     /* Counts of executed OPs of the given ty
 
 PERLVAR(I, random_state, PL_RANDOM_STATE_TYPE)
 
-PERLVARI(I, dump_re_max_len, STRLEN, 0)
+PERLVARI(I, dump_re_max_len, STRLEN, 60)
+
+/* For internal uses of randomness, this ensures the sequence of
+ * random numbers returned by rand() isn't modified by perl's internal
+ * use of randomness.
+ * This is important if the user has called srand() with a seed.
+ */
+
+PERLVAR(I, internal_random_state, PL_RANDOM_STATE_TYPE)
+
+PERLVARA(I, TR_SPECIAL_HANDLING_UTF8, UTF8_MAXBYTES, char)
+
+PERLVAR(I, AboveLatin1,        SV *)
+PERLVAR(I, Assigned_invlist, SV *)
+PERLVAR(I, GCB_invlist, SV *)
+PERLVAR(I, HasMultiCharFold,   SV *)
+PERLVAR(I, InMultiCharFold,   SV *)
+PERLVAR(I, Latin1,     SV *)
+PERLVAR(I, LB_invlist, SV *)
+PERLVAR(I, SB_invlist, SV *)
+PERLVAR(I, SCX_invlist, SV *)
+PERLVAR(I, UpperLatin1,        SV *)   /* Code points 128 - 255 */
+
+/* List of characters that participate in any fold defined by Unicode */
+PERLVAR(I, in_some_fold, SV *)
+
+/* Everything that folds to a given character, for case insensitivity regex
+ * matching */
+PERLVAR(I, utf8_foldclosures, SV *)
+
+PERLVAR(I, utf8_idcont,        SV *)
+PERLVAR(I, utf8_idstart, SV *)
+PERLVAR(I, utf8_perl_idcont, SV *)
+PERLVAR(I, utf8_perl_idstart, SV *)
+PERLVAR(I, utf8_xidcont, SV *)
+PERLVAR(I, utf8_xidstart, SV *)
+PERLVAR(I, WB_invlist, SV *)
+PERLVARA(I, XPosix_ptrs, POSIX_CC_COUNT, SV *)
+PERLVARA(I,  Posix_ptrs, POSIX_CC_COUNT, SV *)
+PERLVAR(I, utf8_toupper, SV *)
+PERLVAR(I, utf8_totitle, SV *)
+PERLVAR(I, utf8_tolower, SV *)
+PERLVAR(I, utf8_tofold,        SV *)
+PERLVAR(I, utf8_tosimplefold,  SV *)
+PERLVAR(I, utf8_charname_begin, SV *)
+PERLVAR(I, utf8_charname_continue, SV *)
+PERLVAR(I, utf8_mark,  SV *)
+PERLVARI(I, InBitmap,  SV *, NULL)
+PERLVAR(I, CCC_non0_non230,    SV *)
+PERLVAR(I, Private_Use,        SV *)
+
+#ifdef HAS_MBRLEN
+PERLVAR(I, mbrlen_ps, mbstate_t)
+#endif
+#ifdef HAS_MBRTOWC
+PERLVAR(I, mbrtowc_ps, mbstate_t)
+#endif
+#ifdef HAS_WCRTOMB
+PERLVAR(I, wcrtomb_ps, mbstate_t)
+#endif
 
 /* If you are adding a U8 or U16, check to see if there are 'Space' comments
  * above on where there are gaps which currently will be structure padding.  */
@@ -816,6 +1027,4 @@ PERLVARI(I, dump_re_max_len, STRLEN, 0)
  * this comment, for binary compatibility (the offsets of the old members must
  *  not change).
  * (Don't forget to add your variable also to perl_clone()!)
- * XSUB.h provides wrapper functions via perlapi.h that make this
- * irrelevant, but not all code may be expected to #include XSUB.h.
  */