#define cddir (curinterp->Icddir)
#define colors (curinterp->Icolors)
#define colorset (curinterp->Icolorset)
+#define compcv (curinterp->Icompcv)
+#define compiling (curinterp->Icompiling)
+#define comppad (curinterp->Icomppad)
+#define comppad_name (curinterp->Icomppad_name)
+#define comppad_name_fill (curinterp->Icomppad_name_fill)
+#define comppad_name_floor (curinterp->Icomppad_name_floor)
#define copline (curinterp->Icopline)
#define curcopdb (curinterp->Icurcopdb)
#define curstname (curinterp->Icurstname)
#define preambleav (curinterp->Ipreambleav)
#define preambled (curinterp->Ipreambled)
#define preprocess (curinterp->Ipreprocess)
+#define profiledata (curinterp->Iprofiledata)
#define reg_eval_set (curinterp->Ireg_eval_set)
#define reg_flags (curinterp->Ireg_flags)
#define reg_start_tmp (curinterp->Ireg_start_tmp)
#define regxend (curinterp->Iregxend)
#define replgv (curinterp->Ireplgv)
#define rightgv (curinterp->Irightgv)
+#define rsfp (curinterp->Irsfp)
+#define rsfp_filters (curinterp->Irsfp_filters)
#define sawampersand (curinterp->Isawampersand)
#define sawstudy (curinterp->Isawstudy)
#define sawvec (curinterp->Isawvec)
#define Icddir cddir
#define Icolors colors
#define Icolorset colorset
+#define Icompcv compcv
+#define Icompiling compiling
+#define Icomppad comppad
+#define Icomppad_name comppad_name
+#define Icomppad_name_fill comppad_name_fill
+#define Icomppad_name_floor comppad_name_floor
#define Icopline copline
#define Icurcopdb curcopdb
#define Icurstname curstname
#define Ipreambleav preambleav
#define Ipreambled preambled
#define Ipreprocess preprocess
+#define Iprofiledata profiledata
#define Ireg_eval_set reg_eval_set
#define Ireg_flags reg_flags
#define Ireg_start_tmp reg_start_tmp
#define Iregxend regxend
#define Ireplgv replgv
#define Irightgv rightgv
+#define Irsfp rsfp
+#define Irsfp_filters rsfp_filters
#define Isawampersand sawampersand
#define Isawstudy sawstudy
#define Isawvec sawvec
#define cddir Perl_cddir
#define colors Perl_colors
#define colorset Perl_colorset
+#define compcv Perl_compcv
+#define compiling Perl_compiling
+#define comppad Perl_comppad
+#define comppad_name Perl_comppad_name
+#define comppad_name_fill Perl_comppad_name_fill
+#define comppad_name_floor Perl_comppad_name_floor
#define copline Perl_copline
#define curcopdb Perl_curcopdb
#define curstname Perl_curstname
#define preambleav Perl_preambleav
#define preambled Perl_preambled
#define preprocess Perl_preprocess
+#define profiledata Perl_profiledata
#define reg_eval_set Perl_reg_eval_set
#define reg_flags Perl_reg_flags
#define reg_start_tmp Perl_reg_start_tmp
#define regxend Perl_regxend
#define replgv Perl_replgv
#define rightgv Perl_rightgv
+#define rsfp Perl_rsfp
+#define rsfp_filters Perl_rsfp_filters
#define sawampersand Perl_sawampersand
#define sawstudy Perl_sawstudy
#define sawvec Perl_sawvec
#define collation_standard (Perl_Vars.Gcollation_standard)
#define collxfrm_base (Perl_Vars.Gcollxfrm_base)
#define collxfrm_mult (Perl_Vars.Gcollxfrm_mult)
-#define compcv (Perl_Vars.Gcompcv)
-#define compiling (Perl_Vars.Gcompiling)
-#define comppad (Perl_Vars.Gcomppad)
-#define comppad_name (Perl_Vars.Gcomppad_name)
-#define comppad_name_fill (Perl_Vars.Gcomppad_name_fill)
-#define comppad_name_floor (Perl_Vars.Gcomppad_name_floor)
#define cop_seqmax (Perl_Vars.Gcop_seqmax)
#define cryptseen (Perl_Vars.Gcryptseen)
#define cshlen (Perl_Vars.Gcshlen)
#define nextval (Perl_Vars.Gnextval)
#define nice_chunk (Perl_Vars.Gnice_chunk)
#define nice_chunk_size (Perl_Vars.Gnice_chunk_size)
+#define ninterps (Perl_Vars.Gninterps)
#define nomemok (Perl_Vars.Gnomemok)
#define nthreads (Perl_Vars.Gnthreads)
#define nthreads_cond (Perl_Vars.Gnthreads_cond)
#define padix_floor (Perl_Vars.Gpadix_floor)
#define patleave (Perl_Vars.Gpatleave)
#define pidstatus (Perl_Vars.Gpidstatus)
-#define profiledata (Perl_Vars.Gprofiledata)
-#define rsfp (Perl_Vars.Grsfp)
-#define rsfp_filters (Perl_Vars.Grsfp_filters)
#define runops (Perl_Vars.Grunops)
#define sh_path (Perl_Vars.Gsh_path)
#define sighandlerp (Perl_Vars.Gsighandlerp)
#define Gcollation_standard collation_standard
#define Gcollxfrm_base collxfrm_base
#define Gcollxfrm_mult collxfrm_mult
-#define Gcompcv compcv
-#define Gcompiling compiling
-#define Gcomppad comppad
-#define Gcomppad_name comppad_name
-#define Gcomppad_name_fill comppad_name_fill
-#define Gcomppad_name_floor comppad_name_floor
#define Gcop_seqmax cop_seqmax
#define Gcryptseen cryptseen
#define Gcshlen cshlen
#define Gnextval nextval
#define Gnice_chunk nice_chunk
#define Gnice_chunk_size nice_chunk_size
+#define Gninterps ninterps
#define Gnomemok nomemok
#define Gnthreads nthreads
#define Gnthreads_cond nthreads_cond
#define Gpadix_floor padix_floor
#define Gpatleave patleave
#define Gpidstatus pidstatus
-#define Gprofiledata profiledata
-#define Grsfp rsfp
-#define Grsfp_filters rsfp_filters
#define Grunops runops
#define Gsh_path sh_path
#define Gsighandlerp sighandlerp
#define collation_standard Perl_collation_standard
#define collxfrm_base Perl_collxfrm_base
#define collxfrm_mult Perl_collxfrm_mult
-#define compcv Perl_compcv
-#define compiling Perl_compiling
-#define comppad Perl_comppad
-#define comppad_name Perl_comppad_name
-#define comppad_name_fill Perl_comppad_name_fill
-#define comppad_name_floor Perl_comppad_name_floor
#define cop_seqmax Perl_cop_seqmax
#define cryptseen Perl_cryptseen
#define cshlen Perl_cshlen
#define nextval Perl_nextval
#define nice_chunk Perl_nice_chunk
#define nice_chunk_size Perl_nice_chunk_size
+#define ninterps Perl_ninterps
#define nomemok Perl_nomemok
#define nthreads Perl_nthreads
#define nthreads_cond Perl_nthreads_cond
#define padix_floor Perl_padix_floor
#define patleave Perl_patleave
#define pidstatus Perl_pidstatus
-#define profiledata Perl_profiledata
-#define rsfp Perl_rsfp
-#define rsfp_filters Perl_rsfp_filters
#define runops Perl_runops
#define sh_path Perl_sh_path
#define sighandlerp Perl_sighandlerp
chopset
colors
colorset
+compcv
+compiling
+comppad
+comppad_name
+comppad_name_fill
+comppad_name_floor
copline
curcop
curcopdb
preambled
preambleav
preprocess
+profiledata
reg_eval_set
reg_flags
reg_start_tmp
restartop
rightgv
rs
+rsfp
+rsfp_filters
regcomp_rx
sawampersand
sawstudy
/* Global only to current interpreter instance */
/***********************************************/
+/* Don't forget to re-run embed.pl to propagate changes! */
+
+/* The 'I' prefix is only needed for vars that need appropriate #defines
+ * generated when built with or without MULTIPLICITY. It is also used
+ * to generate the appropriate export list for win32.
+ *
+ * When building without MULTIPLICITY, these variables will be truly global.
+ *
+ * Avoid build-specific #ifdefs here, like DEBUGGING. That way,
+ * we can keep binary compatibility of the curinterp structure */
+
/* pseudo environmental stuff */
-PERLVAR(Iorigargc, int)
-PERLVAR(Iorigargv, char **)
-PERLVAR(Ienvgv, GV *)
-PERLVAR(Isiggv, GV *)
-PERLVAR(Iincgv, GV *)
-PERLVAR(Iorigfilename, char *)
-PERLVAR(Idiehook, SV *)
-PERLVAR(Iwarnhook, SV *)
-PERLVAR(Iparsehook, SV *)
+PERLVAR(Iorigargc, int)
+PERLVAR(Iorigargv, char **)
+PERLVAR(Ienvgv, GV *)
+PERLVAR(Isiggv, GV *)
+PERLVAR(Iincgv, GV *)
+PERLVAR(Iorigfilename, char *)
+PERLVAR(Idiehook, SV *)
+PERLVAR(Iwarnhook, SV *)
+PERLVAR(Iparsehook, SV *)
PERLVAR(Icddir, char *) /* switches */
-PERLVAR(Iminus_c, bool)
-PERLVAR(Ipatchlevel[10],char)
-PERLVAR(Ilocalpatches, char **)
-PERLVARI(Isplitstr, char *, " ")
-PERLVAR(Ipreprocess, bool)
-PERLVAR(Iminus_n, bool)
-PERLVAR(Iminus_p, bool)
-PERLVAR(Iminus_l, bool)
-PERLVAR(Iminus_a, bool)
-PERLVAR(Iminus_F, bool)
-PERLVAR(Idoswitches, bool)
-PERLVAR(Idowarn, bool)
-PERLVAR(Idoextract, bool)
+PERLVAR(Iminus_c, bool)
+PERLVAR(Ipatchlevel[10],char)
+PERLVAR(Ilocalpatches, char **)
+PERLVARI(Isplitstr, char *, " ")
+PERLVAR(Ipreprocess, bool)
+PERLVAR(Iminus_n, bool)
+PERLVAR(Iminus_p, bool)
+PERLVAR(Iminus_l, bool)
+PERLVAR(Iminus_a, bool)
+PERLVAR(Iminus_F, bool)
+PERLVAR(Idoswitches, bool)
+PERLVAR(Idowarn, bool)
+PERLVAR(Idoextract, bool)
PERLVAR(Isawampersand, bool) /* must save all match strings */
PERLVAR(Isawstudy, bool) /* do fbm_instr on all strings */
-PERLVAR(Isawvec, bool)
-PERLVAR(Iunsafe, bool)
-PERLVAR(Iinplace, char *)
-PERLVAR(Ie_script, SV *)
-PERLVAR(Iperldb, U32)
+PERLVAR(Isawvec, bool)
+PERLVAR(Iunsafe, bool)
+PERLVAR(Iinplace, char *)
+PERLVAR(Ie_script, SV *)
+PERLVAR(Iperldb, U32)
/* This value may be raised by extensions for testing purposes */
/* 0=none, 1=full, 2=full with checks */
-PERLVARI(Iperl_destruct_level, int, 0)
+PERLVARI(Iperl_destruct_level, int, 0)
/* magical thingies */
PERLVAR(Ibasetime, Time_t) /* $^T */
PERLVAR(Iformfeed, SV *) /* $^L */
-PERLVARI(Imaxsysfd, I32, MAXSYSFD) /* top fd to pass to subprocesses */
+PERLVARI(Imaxsysfd, I32, MAXSYSFD)
+ /* top fd to pass to subprocesses */
PERLVAR(Imultiline, int) /* $*--do strings hold >1 line? */
PERLVAR(Istatusvalue, I32) /* $? */
#ifdef VMS
-PERLVAR(Istatusvalue_vms, U32)
+PERLVAR(Istatusvalue_vms,U32)
#endif
-PERLVAR(Istatcache, Stat_t) /* _ */
-PERLVAR(Istatgv, GV *)
-PERLVARI(Istatname, SV *, Nullsv)
+PERLVAR(Istatcache, Stat_t) /* _ */
+PERLVAR(Istatgv, GV *)
+PERLVARI(Istatname, SV *, Nullsv)
/* shortcuts to various I/O objects */
-PERLVAR(Istdingv, GV *)
-PERLVAR(Idefgv, GV *)
-PERLVAR(Iargvgv, GV *)
-PERLVAR(Iargvoutgv, GV *)
+PERLVAR(Istdingv, GV *)
+PERLVAR(Idefgv, GV *)
+PERLVAR(Iargvgv, GV *)
+PERLVAR(Iargvoutgv, GV *)
/* shortcuts to regexp stuff */
-PERLVAR(Ileftgv, GV *)
-PERLVAR(Iampergv, GV *)
-PERLVAR(Irightgv, GV *)
-PERLVAR(Iscreamfirst, I32 *)
-PERLVAR(Iscreamnext, I32 *)
-PERLVARI(Imaxscream, I32, -1)
-PERLVAR(Ilastscream, SV *)
-PERLVAR(Ireplgv, GV *)
+PERLVAR(Ileftgv, GV *)
+PERLVAR(Iampergv, GV *)
+PERLVAR(Irightgv, GV *)
+PERLVAR(Iscreamfirst, I32 *)
+PERLVAR(Iscreamnext, I32 *)
+PERLVARI(Imaxscream, I32, -1)
+PERLVAR(Ilastscream, SV *)
+PERLVAR(Ireplgv, GV *)
/* shortcuts to misc objects */
-PERLVAR(Ierrgv, GV *)
+PERLVAR(Ierrgv, GV *)
/* shortcuts to debugging objects */
-PERLVAR(IDBgv, GV *)
-PERLVAR(IDBline, GV *)
-PERLVAR(IDBsub, GV *)
-PERLVAR(IDBsingle, SV *)
-PERLVAR(IDBtrace, SV *)
-PERLVAR(IDBsignal, SV *)
+PERLVAR(IDBgv, GV *)
+PERLVAR(IDBline, GV *)
+PERLVAR(IDBsub, GV *)
+PERLVAR(IDBsingle, SV *)
+PERLVAR(IDBtrace, SV *)
+PERLVAR(IDBsignal, SV *)
PERLVAR(Ilineary, AV *) /* lines of script for debugger */
PERLVAR(Idbargs, AV *) /* args to call listed by caller function */
PERLVAR(Isv_arenaroot, SV*) /* list of areas for garbage collection */
/* funky return mechanisms */
-PERLVAR(Ilastspbase, I32)
-PERLVAR(Ilastsize, I32)
+PERLVAR(Ilastspbase, I32)
+PERLVAR(Ilastsize, I32)
PERLVAR(Iforkprocess, int) /* so do_open |- can return proc# */
/* subprocess state */
PERLVAR(Ilast_proto, char *) /* Prototype of last sub seen. */
/* trace state */
-PERLVAR(Idlevel, I32)
-PERLVARI(Idlmax, I32, 128)
-PERLVAR(Idebname, char *)
-PERLVAR(Idebdelim, char *)
+PERLVAR(Idlevel, I32)
+PERLVARI(Idlmax, I32, 128)
+PERLVAR(Idebname, char *)
+PERLVAR(Idebdelim, char *)
/* current interpreter roots */
-PERLVAR(Imain_cv, CV *)
-PERLVAR(Imain_root, OP *)
-PERLVAR(Imain_start, OP *)
-PERLVAR(Ieval_root, OP *)
-PERLVAR(Ieval_start, OP *)
+PERLVAR(Imain_cv, CV *)
+PERLVAR(Imain_root, OP *)
+PERLVAR(Imain_start, OP *)
+PERLVAR(Ieval_root, OP *)
+PERLVAR(Ieval_start, OP *)
/* runtime control stuff */
-PERLVARI(Icurcopdb, COP *, NULL)
-PERLVARI(Icopline, line_t, NOLINE)
+PERLVARI(Icurcopdb, COP *, NULL)
+PERLVARI(Icopline, line_t, NOLINE)
/* statics moved here for shared library purposes */
PERLVAR(Istrchop, SV) /* return value from chop */
PERLVAR(Isecondgv, GV *) /* $b */
PERLVAR(Imystrk, SV *) /* temp key string for do_each() */
PERLVAR(Idumplvl, I32) /* indentation level on syntax tree dump */
-PERLVAR(Ioldlastpm, PMOP *) /* for saving regexp context during debugger */
+PERLVAR(Ioldlastpm, PMOP *) /* for saving regexp context in debugger */
PERLVAR(Igensym, I32) /* next symbol for getsym() to define */
-PERLVAR(Ipreambled, bool)
-PERLVAR(Ipreambleav, AV *)
-PERLVARI(Ilaststatval, int, -1)
-PERLVARI(Ilaststype, I32, OP_STAT)
-PERLVAR(Imess_sv, SV *)
+PERLVAR(Ipreambled, bool)
+PERLVAR(Ipreambleav, AV *)
+PERLVARI(Ilaststatval, int, -1)
+PERLVARI(Ilaststype, I32, OP_STAT)
+PERLVAR(Imess_sv, SV *)
-PERLVAR(Iors, char *) /* $\ */
-PERLVAR(Iorslen, STRLEN)
-PERLVAR(Iofmt, char *) /* $# */
+/* XXX shouldn't these be per-thread? --GSAR */
+PERLVAR(Iors, char *) /* output record separator $\ */
+PERLVAR(Iorslen, STRLEN)
+PERLVAR(Iofmt, char *) /* output format for numbers $# */
/* interpreter atexit processing */
-PERLVARI(Iexitlist, PerlExitListEntry *, NULL) /* list of exit functions */
-PERLVARI(Iexitlistlen, I32, 0) /* length of same */
-PERLVAR(Imodglobal, HV *) /* per-interp module data */
+PERLVARI(Iexitlist, PerlExitListEntry *, NULL)
+ /* list of exit functions */
+PERLVARI(Iexitlistlen, I32, 0) /* length of same */
+PERLVAR(Imodglobal, HV *) /* per-interp module data */
+
+/* these used to be in global before 5.004_68 */
+PERLVARI(Iprofiledata, U32 *, NULL) /* table of ops, counts */
+PERLVARI(Irsfp, PerlIO * VOL, Nullfp) /* current source file pointer */
+PERLVARI(Irsfp_filters, AV *, Nullav) /* keeps active source filters */
+
+PERLVAR(Icompiling, COP) /* compiling/done executing marker */
+
+PERLVAR(Icompcv, CV *) /* currently compiling subroutine */
+PERLVAR(Icomppad, AV *) /* storage for lexically scoped temporaries */
+PERLVAR(Icomppad_name, AV *) /* variable names for "my" variables */
+PERLVAR(Icomppad_name_fill, I32) /* last "introduced" variable offset */
+PERLVAR(Icomppad_name_floor, I32) /* start of vars in innermost block */
#ifdef HAVE_INTERP_INTERN
-PERLVAR(Isys_intern, struct interp_intern) /* platform internals */
+PERLVAR(Isys_intern, struct interp_intern)
+ /* platform internals */
#endif
/* more statics moved here */
PERLVAR(Iregdummy, regnode) /* from regcomp.c */
PERLVAR(Iregcomp_parse, char*) /* Input-scan pointer. */
PERLVAR(Iregxend, char*) /* End of input for compile */
-PERLVAR(Iregcode, regnode*) /* Code-emit pointer; ®dummy = don't. */
+PERLVAR(Iregcode, regnode*) /* Code-emit pointer; ®dummy = don't */
PERLVAR(Iregnaughty, I32) /* How bad is this pattern? */
PERLVAR(Iregsawback, I32) /* Did we see \1, ...? */
PERLVAR(Iseen_zerolen, I32) /* from regcomp.c */
PERLVAR(Iregcomp_rx, regexp *) /* from regcomp.c */
PERLVAR(Iextralen, I32) /* from regcomp.c */
-/* #ifdef DEBUGGING -- keep the structure the same with/without DEBUGGING defined */
PERLVAR(Icolorset, int) /* from regcomp.c */
PERLVAR(Icolors[4], char *) /* from regcomp.c */
-/* #endif */
PERLVAR(Ireginput, char *) /* String-input pointer. */
PERLVAR(Iregbol, char *) /* Beginning of input, for ^ check. */
PERLVAR(Ireg_start_tmp, char **) /* from regexec.c */
PERLVAR(Ireg_start_tmpl,U32) /* from regexec.c */
-PERLVAR(Iregdata, struct reg_data *) /* from regexec.c renamed was data */
+PERLVAR(Iregdata, struct reg_data *)
+ /* from regexec.c renamed was data */
PERLVAR(Ibostr, char *) /* from regexec.c */
PERLVAR(Ireg_flags, U32) /* from regexec.c */
PERLVAR(Ireg_eval_set, I32) /* from regexec.c */
-/* #ifdef DEBUGGING -- keep the structure the same with/without DEBUGGING defined */
PERLVAR(Iregnarrate, I32) /* from regexec.c */
PERLVAR(Iregprogram, regnode *) /* from regexec.c */
PERLVARI(Iregindent, int, 0) /* from regexec.c */
-/* #endif */
PERLVAR(Iregcc, CURCUR *) /* from regexec.c */
-PERLVARI(Iin_clean_objs,bool, FALSE) /* from sv.c */
-PERLVARI(Iin_clean_all, bool, FALSE) /* from sv.c */
+PERLVARI(Iin_clean_objs,bool, FALSE) /* from sv.c */
+PERLVARI(Iin_clean_all, bool, FALSE) /* from sv.c */
PERLVAR(Ilinestart, char *) /* beg. of most recently read line */
PERLVAR(Ipending_ident, char) /* pending identifier lookup */
PERLVAR(Isublex_info, SUBLEXINFO) /* from toke.c */
#ifdef USE_THREADS
-PERLVAR(Ithrsv, SV *) /* holds struct perl_thread for main thread */
+PERLVAR(Ithrsv, SV *) /* struct perl_thread for main thread */
PERLVARI(Ithreadnum, U32, 0) /* incremented each thread creation */
#endif /* USE_THREADS */
#endif
#endif
-#define I_REINIT \
- STMT_START { \
- chopset = " \n-"; \
- copline = NOLINE; \
- curcop = &compiling; \
- curcopdb = NULL; \
- dbargs = 0; \
- dlmax = 128; \
- laststatval = -1; \
- laststype = OP_STAT; \
- maxscream = -1; \
- maxsysfd = MAXSYSFD; \
- statname = Nullsv; \
- tmps_floor = -1; \
- tmps_ix = -1; \
- op_mask = NULL; \
- dlmax = 128; \
- laststatval = -1; \
- laststype = OP_STAT; \
- mess_sv = Nullsv; \
- splitstr = " "; \
- generation = 100; \
- exitlist = NULL; \
- exitlistlen = 0; \
- regindent = 0; \
- in_clean_objs = FALSE; \
- in_clean_all= FALSE; \
- } STMT_END
-
#ifdef PERL_OBJECT
static I32 read_e_script _((CPerlObj* pPerl, int idx, SV *buf_sv, int maxlen));
#else
static void find_beginning _((void));
static void forbid_setid _((char *));
static void incpush _((char *, int));
+static void init_interp _((void));
static void init_ids _((void));
static void init_debugger _((void));
static void init_lexer _((void));
#endif
#ifdef MULTIPLICITY
+ ++ninterps;
Zero(sv_interp, 1, PerlInterpreter);
#endif
init_stacks(ARGS);
#ifdef MULTIPLICITY
- I_REINIT;
+ init_interp();
perl_destruct_level = 1;
#else
- if(perl_destruct_level > 0)
- I_REINIT;
+ if (perl_destruct_level > 0)
+ init_interp();
#endif
init_ids();
LEAVE;
FREETMPS;
+#ifdef MULTIPLICITY
+ --ninterps;
+#endif
+
/* We must account for everything. */
/* Destroy the main CV and syntax tree */
#endif
}
+/* initialize curinterp */
+STATIC void
+init_interp(void)
+{
+
+#if 0
+#define I_REINIT \
+ STMT_START { \
+ chopset = " \n-"; \
+ copline = NOLINE; \
+ curcop = &compiling; \
+ curcopdb = NULL; \
+ dbargs = 0; \
+ dlmax = 128; \
+ laststatval = -1; \
+ laststype = OP_STAT; \
+ maxscream = -1; \
+ maxsysfd = MAXSYSFD; \
+ statname = Nullsv; \
+ tmps_floor = -1; \
+ tmps_ix = -1; \
+ op_mask = NULL; \
+ dlmax = 128; \
+ laststatval = -1; \
+ laststype = OP_STAT; \
+ mess_sv = Nullsv; \
+ splitstr = " "; \
+ generation = 100; \
+ exitlist = NULL; \
+ exitlistlen = 0; \
+ regindent = 0; \
+ in_clean_objs = FALSE; \
+ in_clean_all= FALSE; \
+ profiledata = NULL; \
+ rsfp = Nullfp; \
+ rsfp_filters= Nullav; \
+ } STMT_END
+#endif
+
+#define PERLVAR(var,type)
+#define PERLVARI(var,type,init) curinterp->var = init;
+#define PERLVARIC(var,type,init) curinterp->var = init;
+#include "intrpvar.h"
+#ifndef USE_THREADS
+# include "thrdvar.h"
+#endif
+#undef PERLVAR
+#undef PERLVARI
+#undef PERLVARIC
+
+}
+
STATIC void
init_main_stash(void)
{
tmps_ix = -1;
tmps_max = REASONABLE(128);
- /*
- * The following stacks almost certainly should be per-interpreter,
- * but for now they're not. XXX
- */
-
- if (markstack) {
- markstack_ptr = markstack;
- } else {
- New(54,markstack,REASONABLE(32),I32);
- markstack_ptr = markstack;
- markstack_max = markstack + REASONABLE(32);
- }
+ New(54,markstack,REASONABLE(32),I32);
+ markstack_ptr = markstack;
+ markstack_max = markstack + REASONABLE(32);
SET_MARKBASE;
- if (scopestack) {
- scopestack_ix = 0;
- } else {
- New(54,scopestack,REASONABLE(32),I32);
- scopestack_ix = 0;
- scopestack_max = REASONABLE(32);
- }
+ New(54,scopestack,REASONABLE(32),I32);
+ scopestack_ix = 0;
+ scopestack_max = REASONABLE(32);
- if (savestack) {
- savestack_ix = 0;
- } else {
- New(54,savestack,REASONABLE(128),ANY);
- savestack_ix = 0;
- savestack_max = REASONABLE(128);
- }
+ New(54,savestack,REASONABLE(128),ANY);
+ savestack_ix = 0;
+ savestack_max = REASONABLE(128);
- if (retstack) {
- retstack_ix = 0;
- } else {
- New(54,retstack,REASONABLE(16),OP*);
- retstack_ix = 0;
- retstack_max = REASONABLE(16);
- }
+ New(54,retstack,REASONABLE(16),OP*);
+ retstack_ix = 0;
+ retstack_max = REASONABLE(16);
}
#undef REASONABLE
curstackinfo = p;
}
Safefree(tmps_stack);
- /* XXX refcount interpreters to determine when to free global data
Safefree(markstack);
Safefree(scopestack);
Safefree(savestack);
Safefree(retstack);
- */
DEBUG( {
Safefree(debname);
Safefree(debdelim);
-/* This file describes the "global" variables used by perl */
-/* This used to be in perl.h directly but we want to */
-/* abstract out which are per-thread per-interpreter really */
-/* global and how initialized into one file */
-
/****************/
/* Truly global */
/****************/
+/* Don't forget to re-run embed.pl to propagate changes! */
+
+/* This file describes the "global" variables used by perl
+ * This used to be in perl.h directly but we want to abstract out into
+ * distinct files which are per-thread, per-interpreter or really global,
+ * and how they're initialized.
+ *
+ * The 'G' prefix is only needed for vars that need appropriate #defines
+ * generated when built with or without EMBED. It is also used to generate
+ * the appropriate export list for win32.
+ *
+ * Avoid build-specific #ifdefs here, like DEBUGGING. That way,
+ * we can keep binary compatibility of the curinterp structure */
+
+
/* global state */
-PERLVAR(Gcurinterp, PerlInterpreter *) /* currently running interpreter */
+PERLVAR(Gcurinterp, PerlInterpreter *)
+ /* currently running interpreter */
#ifdef USE_THREADS
-PERLVAR(Gthr_key, perl_key) /* For per-thread struct perl_thread* */
-PERLVAR(Gsv_mutex, perl_mutex) /* Mutex for allocating SVs in sv.c */
-PERLVAR(Gmalloc_mutex, perl_mutex) /* Mutex for malloc */
-PERLVAR(Geval_mutex, perl_mutex) /* Mutex for doeval */
-PERLVAR(Geval_cond, perl_cond) /* Condition variable for doeval */
-PERLVAR(Geval_owner, struct perl_thread *) /* Owner thread for doeval */
+PERLVAR(Gthr_key, perl_key) /* For per-thread struct perl_thread* */
+PERLVAR(Gsv_mutex, perl_mutex) /* Mutex for allocating SVs in sv.c */
+PERLVAR(Gmalloc_mutex, perl_mutex) /* Mutex for malloc */
+PERLVAR(Geval_mutex, perl_mutex) /* Mutex for doeval */
+PERLVAR(Geval_cond, perl_cond) /* Condition variable for doeval */
+PERLVAR(Geval_owner, struct perl_thread *)
+ /* Owner thread for doeval */
PERLVAR(Gnthreads, int) /* Number of threads currently */
-PERLVAR(Gthreads_mutex, perl_mutex) /* Mutex for nthreads and thread list */
-PERLVAR(Gnthreads_cond, perl_cond) /* Condition variable for nthreads */
-PERLVAR(Gsvref_mutex, perl_mutex) /* Mutex for SvREFCNT_{inc,dec} */
-PERLVARI(Gthreadsv_names, char *, THREADSV_NAMES)
+PERLVAR(Gthreads_mutex, perl_mutex) /* Mutex for nthreads and thread list */
+PERLVAR(Gnthreads_cond, perl_cond) /* Condition variable for nthreads */
+PERLVAR(Gsvref_mutex, perl_mutex) /* Mutex for SvREFCNT_{inc,dec} */
+PERLVARI(Gthreadsv_names,char *, THREADSV_NAMES)
#ifdef FAKE_THREADS
-PERLVAR(Gcurthr, struct perl_thread *) /* Currently executing (fake) thread */
+PERLVAR(Gcurthr, struct perl_thread *)
+ /* Currently executing (fake) thread */
#endif
#endif /* USE_THREADS */
-PERLVAR(Guid, int) /* current real user id */
-PERLVAR(Geuid, int) /* current effective user id */
-PERLVAR(Ggid, int) /* current real group id */
-PERLVAR(Gegid, int) /* current effective group id */
+PERLVAR(Gninterps, int) /* number of active interpreters */
+
+PERLVAR(Guid, int) /* current real user id */
+PERLVAR(Geuid, int) /* current effective user id */
+PERLVAR(Ggid, int) /* current real group id */
+PERLVAR(Gegid, int) /* current effective group id */
PERLVAR(Gnomemok, bool) /* let malloc context handle nomem */
-PERLVAR(Gan, U32) /* malloc sequence number */
+PERLVAR(Gan, U32) /* malloc sequence number */
PERLVAR(Gcop_seqmax, U32) /* statement sequence number */
PERLVAR(Gop_seqmax, U16) /* op sequence number */
PERLVAR(Gevalseq, U32) /* eval sequence number */
-PERLVAR(Gsub_generation, U32) /* inc to force methods to be looked up again */
-PERLVAR(Gorigenviron, char **)
-PERLVAR(Gorigalen, U32)
+PERLVAR(Gsub_generation,U32) /* incr to invalidate method cache */
+PERLVAR(Gorigenviron, char **)
+PERLVAR(Gorigalen, U32)
PERLVAR(Gpidstatus, HV *) /* pid-to-status mappings for waitpid */
-PERLVAR(Gprofiledata, U32 *)
-PERLVARI(Gmaxo, int, MAXO) /* Number of ops */
+PERLVARI(Gmaxo, int, MAXO) /* maximum number of ops */
PERLVAR(Gosname, char *) /* operating system */
-PERLVARI(Gsh_path, char *, SH_PATH) /* full path of shell */
-PERLVAR(Gsighandlerp, Sighandler_t)
+PERLVARI(Gsh_path, char *, SH_PATH)/* full path of shell */
+PERLVAR(Gsighandlerp, Sighandler_t)
PERLVAR(Gxiv_arenaroot, XPV*) /* list of allocated xiv areas */
PERLVAR(Gxiv_root, IV **) /* free xiv list--shared by interpreters */
-PERLVAR(Gxnv_root, double *) /* free xnv list--shared by interpreters */
+PERLVAR(Gxnv_root, double *) /* free xnv list--shared by interpreters */
PERLVAR(Gxrv_root, XRV *) /* free xrv list--shared by interpreters */
PERLVAR(Gxpv_root, XPV *) /* free xpv list--shared by interpreters */
PERLVAR(Ghe_root, HE *) /* free he list--shared by interpreters */
PERLVAR(Gnice_chunk, char *) /* a nice chunk of memory to reuse */
-PERLVAR(Gnice_chunk_size, U32) /* how nice the chunk of memory is */
+PERLVAR(Gnice_chunk_size, U32) /* how nice the chunk of memory is */
#ifdef PERL_OBJECT
-PERLVARI(Grunops, runops_proc_t, FUNC_NAME_TO_PTR(RUNOPS_DEFAULT))
+PERLVARI(Grunops, runops_proc_t, FUNC_NAME_TO_PTR(RUNOPS_DEFAULT))
#else
-PERLVARI(Grunops, runops_proc_t *, RUNOPS_DEFAULT)
+PERLVARI(Grunops, runops_proc_t *, RUNOPS_DEFAULT)
#endif
-PERLVAR(Gtokenbuf[256], char)
-PERLVAR(Gna, STRLEN) /* for use in SvPV when length is Not Applicable */
+PERLVAR(Gtokenbuf[256], char)
+PERLVAR(Gna, STRLEN) /* for use in SvPV when length is
+ Not Applicable */
-PERLVAR(Gsv_undef, SV)
-PERLVAR(Gsv_no, SV)
-PERLVAR(Gsv_yes, SV)
+PERLVAR(Gsv_undef, SV)
+PERLVAR(Gsv_no, SV)
+PERLVAR(Gsv_yes, SV)
#ifdef CSH
-PERLVARI(Gcshname, char *, CSH)
-PERLVAR(Gcshlen, I32)
+PERLVARI(Gcshname, char *, CSH)
+PERLVAR(Gcshlen, I32)
#endif
PERLVAR(Glex_state, U32) /* next token is determined */
PERLVAR(Glex_defer, U32) /* state after determined token */
-PERLVAR(Glex_expect, expectation) /* expect after determined token */
+PERLVAR(Glex_expect, expectation) /* expect after determined token */
PERLVAR(Glex_brackets, I32) /* bracket count */
PERLVAR(Glex_formbrack, I32) /* bracket count at outer format level */
PERLVAR(Glex_fakebrack, I32) /* outer bracket is mere delimiter */
PERLVAR(Glex_op, OP *) /* extra info to pass back on op */
PERLVAR(Glex_inpat, OP *) /* in pattern $) and $| are special */
PERLVAR(Glex_inwhat, I32) /* what kind of quoting are we in */
-PERLVAR(Glex_brackstack, char *) /* what kind of brackets to pop */
+PERLVAR(Glex_brackstack,char *) /* what kind of brackets to pop */
PERLVAR(Glex_casestack, char *) /* what kind of case mods in effect */
/* What we know when we're in LEX_KNOWNEXT state. */
-PERLVAR(Gnextval[5], YYSTYPE) /* value of next token, if any */
+PERLVAR(Gnextval[5], YYSTYPE) /* value of next token, if any */
PERLVAR(Gnexttype[5], I32) /* type of next token */
-PERLVAR(Gnexttoke, I32)
+PERLVAR(Gnexttoke, I32)
-PERLVARI(Grsfp, PerlIO * VOL, Nullfp)
-PERLVAR(Glinestr, SV *)
-PERLVAR(Gbufptr, char *)
-PERLVAR(Goldbufptr, char *)
-PERLVAR(Goldoldbufptr, char *)
-PERLVAR(Gbufend, char *)
-PERLVARI(Gexpect, expectation, XSTATE) /* how to interpret ambiguous tokens */
-PERLVAR(Grsfp_filters, AV *)
+PERLVAR(Glinestr, SV *)
+PERLVAR(Gbufptr, char *)
+PERLVAR(Goldbufptr, char *)
+PERLVAR(Goldoldbufptr, char *)
+PERLVAR(Gbufend, char *)
+PERLVARI(Gexpect,expectation, XSTATE) /* how to interpret ambiguous tokens */
PERLVAR(Gmulti_start, I32) /* 1st line of multi-line string */
PERLVAR(Gmulti_end, I32) /* last line of multi-line string */
PERLVAR(Gsubline, I32) /* line this subroutine began on */
PERLVAR(Gsubname, SV *) /* name of current subroutine */
-PERLVAR(Gcompcv, CV *) /* currently compiling subroutine */
-PERLVAR(Gcomppad, AV *) /* storage for lexically scoped temporaries */
-PERLVAR(Gcomppad_name, AV *) /* variable names for "my" variables */
-PERLVAR(Gcomppad_name_fill, I32) /* last "introduced" variable offset */
-PERLVAR(Gcomppad_name_floor, I32) /* start of vars in innermost block */
-PERLVAR(Gmin_intro_pending, I32) /* start of vars to introduce */
-PERLVAR(Gmax_intro_pending, I32) /* end of vars to introduce */
-PERLVAR(Gpadix, I32) /* max used index in current "register" pad */
+PERLVAR(Gmin_intro_pending, I32) /* start of vars to introduce */
+PERLVAR(Gmax_intro_pending, I32) /* end of vars to introduce */
+PERLVAR(Gpadix, I32) /* max used index in current "register" pad */
PERLVAR(Gpadix_floor, I32) /* how low may inner block reset padix */
-PERLVAR(Gpad_reset_pending, I32) /* reset pad on next attempted alloc */
-PERLVAR(Gcompiling, COP)
+PERLVAR(Gpad_reset_pending, I32) /* reset pad on next attempted alloc */
PERLVAR(Gthisexpr, I32) /* name id for nothing_in_common() */
-PERLVAR(Glast_uni, char *) /* position of last named-unary operator */
+PERLVAR(Glast_uni, char *) /* position of last named-unary op */
PERLVAR(Glast_lop, char *) /* position of last list operator */
PERLVAR(Glast_lop_op, OPCODE) /* last list operator */
-PERLVAR(Gin_my, bool) /* we're compiling a "my" declaration */
+PERLVAR(Gin_my, bool) /* we're compiling a "my" declaration */
PERLVAR(Gin_my_stash, HV *) /* declared class of this "my" declaration */
#ifdef FCRYPT
PERLVAR(Gcryptseen, I32) /* has fast crypt() been initialized? */
#endif
-PERLVAR(Ghints, U32) /* various compilation flags */
+PERLVAR(Ghints, U32) /* pragma-tic compile-time flags */
PERLVAR(Gdo_undump, bool) /* -u or dump seen? */
-PERLVAR(Gdebug, VOL U32)
+PERLVAR(Gdebug, VOL U32) /* flags given to -D switch */
#ifdef OVERLOAD
-PERLVAR(Gamagic_generation, long)
+PERLVAR(Gamagic_generation, long)
#endif
#ifdef USE_LOCALE_COLLATE
PERLVAR(Gcollation_ix, U32) /* Collation generation index */
-PERLVAR(Gcollation_name, char *) /* Name of current collation */
-PERLVARI(Gcollation_standard, bool, TRUE) /* Assume simple collation */
+PERLVAR(Gcollation_name,char *) /* Name of current collation */
+PERLVARI(Gcollation_standard, bool, TRUE)
+ /* Assume simple collation */
PERLVAR(Gcollxfrm_base, Size_t) /* Basic overhead in *xfrm() */
-PERLVARI(Gcollxfrm_mult, Size_t, 2) /* Expansion factor in *xfrm() */
+PERLVARI(Gcollxfrm_mult,Size_t, 2) /* Expansion factor in *xfrm() */
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
PERLVAR(Gnumeric_name, char *) /* Name of current numeric locale */
-PERLVARI(Gnumeric_standard, bool, TRUE) /* Assume simple numerics */
-PERLVARI(Gnumeric_local, bool, TRUE) /* Assume local numerics */
+PERLVARI(Gnumeric_standard, bool, TRUE)
+ /* Assume simple numerics */
+PERLVARI(Gnumeric_local, bool, TRUE)
+ /* Assume local numerics */
#endif /* !USE_LOCALE_NUMERIC */
PERLVARIC(Ghexdigit, char *, "0123456789abcdef0123456789ABCDEFx")
PERLVARIC(Gpatleave, char *, "\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}")
-PERLVAR(Gspecialsv_list[4], SV *) /* from byterun.h */
+PERLVAR(Gspecialsv_list[4],SV *) /* from byterun.h */
void find_beginning _((void));
void forbid_setid _((char *));
void incpush _((char *, int));
+void init_interp _((void));
void init_ids _((void));
void init_debugger _((void));
void init_lexer _((void));
+/***********************************************/
+/* Global only to current thread */
+/***********************************************/
+
/* Don't forget to re-run embed.pl to propagate changes! */
-/* Per-thread variables
- The 'T' prefix is only needed for vars that need appropriate #defines
-generated when built with or without USE_THREADS. (It is also used
-to generate the appropriate the export list for win32.) */
+/* The 'T' prefix is only needed for vars that need appropriate #defines
+ * generated when built with or without USE_THREADS. It is also used
+ * to generate the appropriate export list for win32.
+ *
+ * When building without USE_THREADS, these variables will be truly global.
+ * When building without USE_THREADS but with MULTIPLICITY, these variables
+ * will be global per-interpreter.
+ *
+ * Avoid build-specific #ifdefs here, like DEBUGGING. That way,
+ * we can keep binary compatibility of the curinterp structure */
/* Important ones in the first cache line (if alignment is done right) */
-PERLVAR(Tstack_sp, SV **)
+PERLVAR(Tstack_sp, SV **) /* top of the stack */
#ifdef OP_IN_REGISTER
-PERLVAR(Topsave, OP *)
+PERLVAR(Topsave, OP *)
#else
-PERLVAR(Top, OP *)
+PERLVAR(Top, OP *) /* currently executing op */
#endif
-PERLVAR(Tcurpad, SV **)
+PERLVAR(Tcurpad, SV **) /* active pad (lexicals+tmps) */
+
+PERLVAR(Tstack_base, SV **)
+PERLVAR(Tstack_max, SV **)
+
+PERLVAR(Tscopestack, I32 *) /* scopes we've ENTERed */
+PERLVAR(Tscopestack_ix, I32)
+PERLVAR(Tscopestack_max,I32)
-PERLVAR(Tstack_base, SV **)
-PERLVAR(Tstack_max, SV **)
+PERLVAR(Tsavestack, ANY *) /* items that need to be restored
+ when LEAVEing scopes we've ENTERed */
+PERLVAR(Tsavestack_ix, I32)
+PERLVAR(Tsavestack_max, I32)
-PERLVAR(Tscopestack, I32 *)
-PERLVAR(Tscopestack_ix, I32)
-PERLVAR(Tscopestack_max,I32)
+PERLVAR(Ttmps_stack, SV **) /* mortals we've made */
+PERLVARI(Ttmps_ix, I32, -1)
+PERLVARI(Ttmps_floor, I32, -1)
+PERLVAR(Ttmps_max, I32)
-PERLVAR(Tsavestack, ANY *)
-PERLVAR(Tsavestack_ix, I32)
-PERLVAR(Tsavestack_max, I32)
+PERLVAR(Tmarkstack, I32 *) /* stack_sp locations we're remembering */
+PERLVAR(Tmarkstack_ptr, I32 *)
+PERLVAR(Tmarkstack_max, I32 *)
-PERLVAR(Tretstack, OP **)
-PERLVAR(Tretstack_ix, I32)
-PERLVAR(Tretstack_max, I32)
+PERLVAR(Tretstack, OP **) /* OPs we have postponed executing */
+PERLVAR(Tretstack_ix, I32)
+PERLVAR(Tretstack_max, I32)
-PERLVAR(Tmarkstack, I32 *)
-PERLVAR(Tmarkstack_ptr, I32 *)
-PERLVAR(Tmarkstack_max, I32 *)
+PERLVAR(TSv, SV *) /* used to hold temporary values */
+PERLVAR(TXpv, XPV *) /* used to hold temporary values */
-PERLVAR(TSv, SV *)
-PERLVAR(TXpv, XPV *)
-PERLVAR(Tstatbuf, Stat_t)
+PERLVAR(Tstatbuf, Stat_t)
#ifdef HAS_TIMES
-PERLVAR(Ttimesbuf, struct tms)
+PERLVAR(Ttimesbuf, struct tms)
#endif
-
-/* Now the fields that used to be "per interpreter" (even when global) */
/* Fields used by magic variables such as $@, $/ and so on */
PERLVAR(Ttainted, bool) /* using variables controlled by $< */
-PERLVAR(Tcurpm, PMOP *) /* what to do \ interps from */
-PERLVAR(Tnrs, SV *)
-PERLVAR(Trs, SV *) /* $/ */
-PERLVAR(Tlast_in_gv, GV *)
-PERLVAR(Tofs, char *) /* $, */
-PERLVAR(Tofslen, STRLEN)
-PERLVAR(Tdefoutgv, GV *)
+PERLVAR(Tcurpm, PMOP *) /* what to do \ interps in REs from */
+PERLVAR(Tnrs, SV *)
+PERLVAR(Trs, SV *) /* input record separator $/ */
+PERLVAR(Tlast_in_gv, GV *) /* GV used in last <FH> */
+PERLVAR(Tofs, char *) /* output field separator $, */
+PERLVAR(Tofslen, STRLEN)
+PERLVAR(Tdefoutgv, GV *) /* default FH for output */
PERLVARI(Tchopset, char *, " \n-") /* $: */
-PERLVAR(Tformtarget, SV *)
-PERLVAR(Tbodytarget, SV *)
-PERLVAR(Ttoptarget, SV *)
+PERLVAR(Tformtarget, SV *)
+PERLVAR(Tbodytarget, SV *)
+PERLVAR(Ttoptarget, SV *)
/* Stashes */
PERLVAR(Tdefstash, HV *) /* main symbol table */
PERLVAR(Tcurstash, HV *) /* symbol table for current package */
-/* Stacks */
-PERLVAR(Ttmps_stack, SV **)
-PERLVARI(Ttmps_ix, I32, -1)
-PERLVARI(Ttmps_floor, I32, -1)
-PERLVAR(Ttmps_max, I32)
-
-PERLVAR(Trestartop, OP *) /* Are we propagating an error from croak? */
-PERLVARI(Tcurcop, COP * VOL, &compiling)
+PERLVAR(Trestartop, OP *) /* propagating an error from croak? */
+PERLVARI(Tcurcop, COP * VOL, &compiling)
PERLVAR(Tin_eval, VOL int) /* trap "fatal" errors? */
PERLVAR(Tdelaymagic, int) /* ($<,$>) = ... */
-PERLVAR(Tdirty, bool) /* In the middle of tearing things down? */
+PERLVAR(Tdirty, bool) /* in the middle of tearing things down? */
PERLVAR(Tlocalizing, int) /* are we processing a local() list? */
-PERLVAR(Tcurstack, AV *) /* THE STACK */
-PERLVAR(Tcurstackinfo, PERL_SI *) /* current stack + context */
-PERLVAR(Tmainstack, AV *) /* the stack when nothing funny is happening */
-PERLVAR(Ttop_env, JMPENV *) /* ptr. to current sigjmp() environment */
-PERLVAR(Tstart_env, JMPENV) /* empty startup sigjmp() environment */
+PERLVAR(Tcurstack, AV *) /* THE STACK */
+PERLVAR(Tcurstackinfo, PERL_SI *) /* current stack + context */
+PERLVAR(Tmainstack, AV *) /* the stack when nothing funny is happening */
+PERLVAR(Ttop_env, JMPENV *) /* ptr. to current sigjmp() environment */
+PERLVAR(Tstart_env, JMPENV) /* empty startup sigjmp() environment */
/* statics "owned" by various functions */
-PERLVAR(Tav_fetch_sv, SV *)
-PERLVAR(Thv_fetch_sv, SV *)
-PERLVAR(Thv_fetch_ent_mh, HE)
-PERLVAR(Tmodcount, I32)
+PERLVAR(Tav_fetch_sv, SV *) /* owned by av_fetch() */
+PERLVAR(Thv_fetch_sv, SV *) /* owned by hv_fetch() */
+PERLVAR(Thv_fetch_ent_mh, HE) /* owned by hv_fetch_ent() */
+
+PERLVAR(Tmodcount, I32) /* how much mod()ification in assignment? */
/* XXX Sort stuff, firstgv secongv and so on? */
/* XXX What about regexp stuff? */
/* Note that the variables below are all explicitly referenced in the code
-as thr->whatever and therefore don't need the 'T' prefix. */
+ * as thr->whatever and therefore don't need the 'T' prefix. */
#ifdef USE_THREADS
-PERLVAR(oursv, SV *)
-PERLVAR(cvcache, HV *)
-PERLVAR(self, perl_os_thread) /* Underlying thread object */
-PERLVAR(flags, U32)
-PERLVAR(threadsv, AV *) /* Per-thread SVs ($_, $@ etc.) */
-PERLVAR(threadsvp, SV **) /* AvARRAY(threadsv) */
-PERLVAR(specific, AV *) /* Thread-specific user data */
-PERLVAR(errsv, SV *) /* Backing SV for $@ */
-PERLVAR(errhv, HV *) /* HV for what was %@ in pp_ctl.c */
-PERLVAR(mutex, perl_mutex) /* For the fields others can change */
-PERLVAR(tid, U32)
+PERLVAR(oursv, SV *)
+PERLVAR(cvcache, HV *)
+PERLVAR(self, perl_os_thread) /* Underlying thread object */
+PERLVAR(flags, U32)
+PERLVAR(threadsv, AV *) /* Per-thread SVs ($_, $@ etc.) */
+PERLVAR(threadsvp, SV **) /* AvARRAY(threadsv) */
+PERLVAR(specific, AV *) /* Thread-specific user data */
+PERLVAR(errsv, SV *) /* Backing SV for $@ */
+PERLVAR(errhv, HV *) /* HV for what was %@ in pp_ctl.c */
+PERLVAR(mutex, perl_mutex) /* For the fields others can change */
+PERLVAR(tid, U32)
PERLVAR(prev, struct perl_thread *)
-PERLVAR(next, struct perl_thread *) /* Circular linked list of threads */
+PERLVAR(next, struct perl_thread *)
+ /* Circular linked list of threads */
#ifdef HAVE_THREAD_INTERN
-PERLVAR(i, struct thread_intern) /* Platform-dependent internals */
+PERLVAR(i, struct thread_intern)
+ /* Platform-dependent internals */
#endif
-PERLVAR(trailing_nul, char) /* For the sake of thrsv and oursv */
+PERLVAR(trailing_nul, char) /* For the sake of thrsv and oursv */
#endif /* USE_THREADS */