This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Provisional version bump for NEXT.pm
[perl5.git] / perl.c
1 #line 2 "perl.c"
2 /*    perl.c
3  *
4  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
5  *    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
6  *    2013, 2014, 2015, 2016, 2017 by Larry Wall and others
7  *
8  *    You may distribute under the terms of either the GNU General Public
9  *    License or the Artistic License, as specified in the README file.
10  *
11  */
12
13 /*
14  *      A ship then new they built for him
15  *      of mithril and of elven-glass
16  *              --from Bilbo's song of EƤrendil
17  *
18  *     [p.236 of _The Lord of the Rings_, II/i: "Many Meetings"]
19  */
20
21 /* This file contains the top-level functions that are used to create, use
22  * and destroy a perl interpreter, plus the functions used by XS code to
23  * call back into perl. Note that it does not contain the actual main()
24  * function of the interpreter; that can be found in perlmain.c
25  *
26  * Note that at build time this file is also linked to as perlmini.c,
27  * and perlmini.o is then built with PERL_IS_MINIPERL defined, which is
28  * then used to create the miniperl executable, rather than perl.o.
29  */
30
31 #if defined(PERL_IS_MINIPERL) && !defined(USE_SITECUSTOMIZE)
32 #  define USE_SITECUSTOMIZE
33 #endif
34
35 #include "EXTERN.h"
36 #define PERL_IN_PERL_C
37 #include "perl.h"
38 #include "patchlevel.h"                 /* for local_patches */
39 #include "XSUB.h"
40
41 #ifdef NETWARE
42 #include "nwutil.h"     
43 #endif
44
45 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
46 #  ifdef I_SYSUIO
47 #    include <sys/uio.h>
48 #  endif
49
50 union control_un {
51   struct cmsghdr cm;
52   char control[CMSG_SPACE(sizeof(int))];
53 };
54
55 #endif
56
57 #ifndef HZ
58 #  ifdef CLK_TCK
59 #    define HZ CLK_TCK
60 #  else
61 #    define HZ 60
62 #  endif
63 #endif
64
65 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO)
66 char *getenv (char *); /* Usually in <stdlib.h> */
67 #endif
68
69 static I32 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen);
70
71 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
72 #  define validate_suid(rsfp) NOOP
73 #else
74 #  define validate_suid(rsfp) S_validate_suid(aTHX_ rsfp)
75 #endif
76
77 #define CALL_BODY_SUB(myop) \
78     if (PL_op == (myop)) \
79         PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); \
80     if (PL_op) \
81         CALLRUNOPS(aTHX);
82
83 #define CALL_LIST_BODY(cv) \
84     PUSHMARK(PL_stack_sp); \
85     call_sv(MUTABLE_SV((cv)), G_EVAL|G_DISCARD|G_VOID);
86
87 static void
88 S_init_tls_and_interp(PerlInterpreter *my_perl)
89 {
90     dVAR;
91     if (!PL_curinterp) {                        
92         PERL_SET_INTERP(my_perl);
93 #if defined(USE_ITHREADS)
94         INIT_THREADS;
95         ALLOC_THREAD_KEY;
96         PERL_SET_THX(my_perl);
97         OP_REFCNT_INIT;
98         OP_CHECK_MUTEX_INIT;
99         HINTS_REFCNT_INIT;
100         LOCALE_INIT;
101         MUTEX_INIT(&PL_dollarzero_mutex);
102         MUTEX_INIT(&PL_my_ctx_mutex);
103 #  endif
104     }
105 #if defined(USE_ITHREADS)
106     else
107 #else
108     /* This always happens for non-ithreads  */
109 #endif
110     {
111         PERL_SET_THX(my_perl);
112     }
113 }
114
115
116 /* these implement the PERL_SYS_INIT, PERL_SYS_INIT3, PERL_SYS_TERM macros */
117
118 void
119 Perl_sys_init(int* argc, char*** argv)
120 {
121     dVAR;
122
123     PERL_ARGS_ASSERT_SYS_INIT;
124
125     PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
126     PERL_UNUSED_ARG(argv);
127     PERL_SYS_INIT_BODY(argc, argv);
128 }
129
130 void
131 Perl_sys_init3(int* argc, char*** argv, char*** env)
132 {
133     dVAR;
134
135     PERL_ARGS_ASSERT_SYS_INIT3;
136
137     PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
138     PERL_UNUSED_ARG(argv);
139     PERL_UNUSED_ARG(env);
140     PERL_SYS_INIT3_BODY(argc, argv, env);
141 }
142
143 void
144 Perl_sys_term(void)
145 {
146     dVAR;
147     if (!PL_veto_cleanup) {
148         PERL_SYS_TERM_BODY();
149     }
150 }
151
152
153 #ifdef PERL_IMPLICIT_SYS
154 PerlInterpreter *
155 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
156                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
157                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
158                  struct IPerlDir* ipD, struct IPerlSock* ipS,
159                  struct IPerlProc* ipP)
160 {
161     PerlInterpreter *my_perl;
162
163     PERL_ARGS_ASSERT_PERL_ALLOC_USING;
164
165     /* Newx() needs interpreter, so call malloc() instead */
166     my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
167     S_init_tls_and_interp(my_perl);
168     Zero(my_perl, 1, PerlInterpreter);
169     PL_Mem = ipM;
170     PL_MemShared = ipMS;
171     PL_MemParse = ipMP;
172     PL_Env = ipE;
173     PL_StdIO = ipStd;
174     PL_LIO = ipLIO;
175     PL_Dir = ipD;
176     PL_Sock = ipS;
177     PL_Proc = ipP;
178     INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
179
180     return my_perl;
181 }
182 #else
183
184 /*
185 =head1 Embedding Functions
186
187 =for apidoc perl_alloc
188
189 Allocates a new Perl interpreter.  See L<perlembed>.
190
191 =cut
192 */
193
194 PerlInterpreter *
195 perl_alloc(void)
196 {
197     PerlInterpreter *my_perl;
198
199     /* Newx() needs interpreter, so call malloc() instead */
200     my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
201
202     S_init_tls_and_interp(my_perl);
203 #ifndef PERL_TRACK_MEMPOOL
204     return (PerlInterpreter *) ZeroD(my_perl, 1, PerlInterpreter);
205 #else
206     Zero(my_perl, 1, PerlInterpreter);
207     INIT_TRACK_MEMPOOL(PL_memory_debug_header, my_perl);
208     return my_perl;
209 #endif
210 }
211 #endif /* PERL_IMPLICIT_SYS */
212
213 /*
214 =for apidoc perl_construct
215
216 Initializes a new Perl interpreter.  See L<perlembed>.
217
218 =cut
219 */
220
221 static void
222 S_fixup_platform_bugs(void)
223 {
224 #if defined(__GLIBC__) && IVSIZE == 8 \
225     && ( __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 8))
226     {
227         IV l =   3;
228         IV r = -10;
229         /* Cannot do this check with inlined IV constants since
230          * that seems to work correctly even with the buggy glibc. */
231         if (l % r == -3) {
232             dTHX;
233             /* Yikes, we have the bug.
234              * Patch in the workaround version. */
235             PL_ppaddr[OP_I_MODULO] = &Perl_pp_i_modulo_glibc_bugfix;
236         }
237     }
238 #endif
239 }
240
241 void
242 perl_construct(pTHXx)
243 {
244     dVAR;
245
246     PERL_ARGS_ASSERT_PERL_CONSTRUCT;
247
248 #ifdef MULTIPLICITY
249     init_interp();
250     PL_perl_destruct_level = 1;
251 #else
252     PERL_UNUSED_ARG(my_perl);
253    if (PL_perl_destruct_level > 0)
254        init_interp();
255 #endif
256     PL_curcop = &PL_compiling;  /* needed by ckWARN, right away */
257
258 #ifdef PERL_TRACE_OPS
259     Zero(PL_op_exec_cnt, OP_max+2, UV);
260 #endif
261
262     init_constants();
263
264     SvREADONLY_on(&PL_sv_placeholder);
265     SvREFCNT(&PL_sv_placeholder) = SvREFCNT_IMMORTAL;
266
267     PL_sighandlerp = (Sighandler_t) Perl_sighandler;
268 #ifdef PERL_USES_PL_PIDSTATUS
269     PL_pidstatus = newHV();
270 #endif
271
272     PL_rs = newSVpvs("\n");
273
274     init_stacks();
275
276 /* The PERL_INTERNAL_RAND_SEED set-up must be after init_stacks because it calls
277  * things that may put SVs on the stack.
278  */
279
280 #ifdef NO_PERL_INTERNAL_RAND_SEED
281     Perl_drand48_init_r(&PL_internal_random_state, seed());
282 #else
283     {
284         UV seed;
285         const char *env_pv;
286         if (PerlProc_getuid() != PerlProc_geteuid() ||
287             PerlProc_getgid() != PerlProc_getegid() ||
288             !(env_pv = PerlEnv_getenv("PERL_INTERNAL_RAND_SEED")) ||
289             grok_number(env_pv, strlen(env_pv), &seed) != IS_NUMBER_IN_UV) {
290             seed = seed();
291         }
292         Perl_drand48_init_r(&PL_internal_random_state, (U32)seed);
293     }
294 #endif
295
296     init_ids();
297
298     S_fixup_platform_bugs();
299
300     JMPENV_BOOTSTRAP;
301     STATUS_ALL_SUCCESS;
302
303     init_i18nl10n(1);
304
305 #if defined(LOCAL_PATCH_COUNT)
306     PL_localpatches = local_patches;    /* For possible -v */
307 #endif
308
309 #if defined(LIBM_LIB_VERSION)
310     /*
311      * Some BSDs and Cygwin default to POSIX math instead of IEEE.
312      * This switches them over to IEEE.
313      */
314     _LIB_VERSION = _IEEE_;
315 #endif
316
317 #ifdef HAVE_INTERP_INTERN
318     sys_intern_init();
319 #endif
320
321     PerlIO_init(aTHX);                  /* Hook to IO system */
322
323     PL_fdpid = newAV();                 /* for remembering popen pids by fd */
324     PL_modglobal = newHV();             /* pointers to per-interpreter module globals */
325     PL_errors = newSVpvs("");
326     SvPVCLEAR(PERL_DEBUG_PAD(0));        /* For regex debugging. */
327     SvPVCLEAR(PERL_DEBUG_PAD(1));        /* ext/re needs these */
328     SvPVCLEAR(PERL_DEBUG_PAD(2));        /* even without DEBUGGING. */
329 #ifdef USE_ITHREADS
330     /* First entry is a list of empty elements. It needs to be initialised
331        else all hell breaks loose in S_find_uninit_var().  */
332     Perl_av_create_and_push(aTHX_ &PL_regex_padav, newSVpvs(""));
333     PL_regex_pad = AvARRAY(PL_regex_padav);
334     Newxz(PL_stashpad, PL_stashpadmax, HV *);
335 #endif
336 #ifdef USE_REENTRANT_API
337     Perl_reentrant_init(aTHX);
338 #endif
339     if (PL_hash_seed_set == FALSE) {
340         /* Initialize the hash seed and state at startup. This must be
341          * done very early, before ANY hashes are constructed, and once
342          * setup is fixed for the lifetime of the process.
343          *
344          * If you decide to disable the seeding process you should choose
345          * a suitable seed yourself and define PERL_HASH_SEED to a well chosen
346          * string. See hv_func.h for details.
347          */
348 #if defined(USE_HASH_SEED)
349         /* get the hash seed from the environment or from an RNG */
350         Perl_get_hash_seed(aTHX_ PL_hash_seed);
351 #else
352         /* they want a hard coded seed, check that it is long enough */
353         assert( strlen(PERL_HASH_SEED) >= PERL_HASH_SEED_BYTES );
354 #endif
355
356         /* now we use the chosen seed to initialize the state -
357          * in some configurations this may be a relatively speaking
358          * expensive operation, but we only have to do it once at startup */
359         PERL_HASH_SEED_STATE(PERL_HASH_SEED,PL_hash_state);
360
361 #ifdef PERL_USE_SINGLE_CHAR_HASH_CACHE
362         /* we can build a special cache for 0/1 byte keys, if people choose
363          * I suspect most of the time it is not worth it */
364         {
365             char str[2]="\0";
366             int i;
367             for (i=0;i<256;i++) {
368                 str[0]= i;
369                 PERL_HASH_WITH_STATE(PL_hash_state,PL_hash_chars[i],str,1);
370             }
371             PERL_HASH_WITH_STATE(PL_hash_state,PL_hash_chars[256],str,0);
372         }
373 #endif
374         /* at this point we have initialezed the hash function, and we can start
375          * constructing hashes */
376         PL_hash_seed_set= TRUE;
377     }
378     /* Note that strtab is a rather special HV.  Assumptions are made
379        about not iterating on it, and not adding tie magic to it.
380        It is properly deallocated in perl_destruct() */
381     PL_strtab = newHV();
382
383     /* SHAREKEYS tells us that the hash has its keys shared with PL_strtab,
384      * which is not the case with PL_strtab itself */
385     HvSHAREKEYS_off(PL_strtab);                 /* mandatory */
386     hv_ksplit(PL_strtab, 1 << 11);
387
388     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
389
390 #ifndef PERL_MICRO
391 #   ifdef  USE_ENVIRON_ARRAY
392     PL_origenviron = environ;
393 #   endif
394 #endif
395
396     /* Use sysconf(_SC_CLK_TCK) if available, if not
397      * available or if the sysconf() fails, use the HZ.
398      * The HZ if not originally defined has been by now
399      * been defined as CLK_TCK, if available. */
400 #if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK)
401     PL_clocktick = sysconf(_SC_CLK_TCK);
402     if (PL_clocktick <= 0)
403 #endif
404          PL_clocktick = HZ;
405
406     PL_stashcache = newHV();
407
408     PL_patchlevel = newSVpvs("v" PERL_VERSION_STRING);
409
410 #ifdef HAS_MMAP
411     if (!PL_mmap_page_size) {
412 #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_MMAP_PAGE_SIZE))
413       {
414         SETERRNO(0, SS_NORMAL);
415 #   ifdef _SC_PAGESIZE
416         PL_mmap_page_size = sysconf(_SC_PAGESIZE);
417 #   else
418         PL_mmap_page_size = sysconf(_SC_MMAP_PAGE_SIZE);
419 #   endif
420         if ((long) PL_mmap_page_size < 0) {
421           if (errno) {
422             SV * const error = ERRSV;
423             SvUPGRADE(error, SVt_PV);
424             Perl_croak(aTHX_ "panic: sysconf: %s", SvPV_nolen_const(error));
425           }
426           else
427             Perl_croak(aTHX_ "panic: sysconf: pagesize unknown");
428         }
429       }
430 #else
431 #   ifdef HAS_GETPAGESIZE
432       PL_mmap_page_size = getpagesize();
433 #   else
434 #       if defined(I_SYS_PARAM) && defined(PAGESIZE)
435       PL_mmap_page_size = PAGESIZE;       /* compiletime, bad */
436 #       endif
437 #   endif
438 #endif
439       if (PL_mmap_page_size <= 0)
440         Perl_croak(aTHX_ "panic: bad pagesize %" IVdf,
441                    (IV) PL_mmap_page_size);
442     }
443 #endif /* HAS_MMAP */
444
445 #if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
446     PL_timesbase.tms_utime  = 0;
447     PL_timesbase.tms_stime  = 0;
448     PL_timesbase.tms_cutime = 0;
449     PL_timesbase.tms_cstime = 0;
450 #endif
451
452     PL_osname = Perl_savepvn(aTHX_ STR_WITH_LEN(OSNAME));
453
454     PL_registered_mros = newHV();
455     /* Start with 1 bucket, for DFS.  It's unlikely we'll need more.  */
456     HvMAX(PL_registered_mros) = 0;
457
458     PL_XPosix_ptrs[_CC_ASCII] = _new_invlist_C_array(ASCII_invlist);
459     PL_XPosix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(XPosixAlnum_invlist);
460     PL_XPosix_ptrs[_CC_ALPHA] = _new_invlist_C_array(XPosixAlpha_invlist);
461     PL_XPosix_ptrs[_CC_BLANK] = _new_invlist_C_array(XPosixBlank_invlist);
462     PL_XPosix_ptrs[_CC_CASED] =  _new_invlist_C_array(Cased_invlist);
463     PL_XPosix_ptrs[_CC_CNTRL] = _new_invlist_C_array(XPosixCntrl_invlist);
464     PL_XPosix_ptrs[_CC_DIGIT] = _new_invlist_C_array(XPosixDigit_invlist);
465     PL_XPosix_ptrs[_CC_GRAPH] = _new_invlist_C_array(XPosixGraph_invlist);
466     PL_XPosix_ptrs[_CC_LOWER] = _new_invlist_C_array(XPosixLower_invlist);
467     PL_XPosix_ptrs[_CC_PRINT] = _new_invlist_C_array(XPosixPrint_invlist);
468     PL_XPosix_ptrs[_CC_PUNCT] = _new_invlist_C_array(XPosixPunct_invlist);
469     PL_XPosix_ptrs[_CC_SPACE] = _new_invlist_C_array(XPerlSpace_invlist);
470     PL_XPosix_ptrs[_CC_UPPER] = _new_invlist_C_array(XPosixUpper_invlist);
471     PL_XPosix_ptrs[_CC_VERTSPACE] = _new_invlist_C_array(VertSpace_invlist);
472     PL_XPosix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(XPosixWord_invlist);
473     PL_XPosix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(XPosixXDigit_invlist);
474     PL_GCB_invlist = _new_invlist_C_array(_Perl_GCB_invlist);
475     PL_SB_invlist = _new_invlist_C_array(_Perl_SB_invlist);
476     PL_WB_invlist = _new_invlist_C_array(_Perl_WB_invlist);
477     PL_LB_invlist = _new_invlist_C_array(_Perl_LB_invlist);
478     PL_Assigned_invlist = _new_invlist_C_array(Assigned_invlist);
479 #ifdef HAS_POSIX_2008_LOCALE
480     PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", NULL);
481 #endif
482
483     ENTER;
484 }
485
486 /*
487 =for apidoc nothreadhook
488
489 Stub that provides thread hook for perl_destruct when there are
490 no threads.
491
492 =cut
493 */
494
495 int
496 Perl_nothreadhook(pTHX)
497 {
498     PERL_UNUSED_CONTEXT;
499     return 0;
500 }
501
502 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
503 void
504 Perl_dump_sv_child(pTHX_ SV *sv)
505 {
506     ssize_t got;
507     const int sock = PL_dumper_fd;
508     const int debug_fd = PerlIO_fileno(Perl_debug_log);
509     union control_un control;
510     struct msghdr msg;
511     struct iovec vec[2];
512     struct cmsghdr *cmptr;
513     int returned_errno;
514     unsigned char buffer[256];
515
516     PERL_ARGS_ASSERT_DUMP_SV_CHILD;
517
518     if(sock == -1 || debug_fd == -1)
519         return;
520
521     PerlIO_flush(Perl_debug_log);
522
523     /* All these shenanigans are to pass a file descriptor over to our child for
524        it to dump out to.  We can't let it hold open the file descriptor when it
525        forks, as the file descriptor it will dump to can turn out to be one end
526        of pipe that some other process will wait on for EOF. (So as it would
527        be open, the wait would be forever.)  */
528
529     msg.msg_control = control.control;
530     msg.msg_controllen = sizeof(control.control);
531     /* We're a connected socket so we don't need a destination  */
532     msg.msg_name = NULL;
533     msg.msg_namelen = 0;
534     msg.msg_iov = vec;
535     msg.msg_iovlen = 1;
536
537     cmptr = CMSG_FIRSTHDR(&msg);
538     cmptr->cmsg_len = CMSG_LEN(sizeof(int));
539     cmptr->cmsg_level = SOL_SOCKET;
540     cmptr->cmsg_type = SCM_RIGHTS;
541     *((int *)CMSG_DATA(cmptr)) = 1;
542
543     vec[0].iov_base = (void*)&sv;
544     vec[0].iov_len = sizeof(sv);
545     got = sendmsg(sock, &msg, 0);
546
547     if(got < 0) {
548         perror("Debug leaking scalars parent sendmsg failed");
549         abort();
550     }
551     if(got < sizeof(sv)) {
552         perror("Debug leaking scalars parent short sendmsg");
553         abort();
554     }
555
556     /* Return protocol is
557        int:             errno value
558        unsigned char:   length of location string (0 for empty)
559        unsigned char*:  string (not terminated)
560     */
561     vec[0].iov_base = (void*)&returned_errno;
562     vec[0].iov_len = sizeof(returned_errno);
563     vec[1].iov_base = buffer;
564     vec[1].iov_len = 1;
565
566     got = readv(sock, vec, 2);
567
568     if(got < 0) {
569         perror("Debug leaking scalars parent read failed");
570         PerlIO_flush(PerlIO_stderr());
571         abort();
572     }
573     if(got < sizeof(returned_errno) + 1) {
574         perror("Debug leaking scalars parent short read");
575         PerlIO_flush(PerlIO_stderr());
576         abort();
577     }
578
579     if (*buffer) {
580         got = read(sock, buffer + 1, *buffer);
581         if(got < 0) {
582             perror("Debug leaking scalars parent read 2 failed");
583             PerlIO_flush(PerlIO_stderr());
584             abort();
585         }
586
587         if(got < *buffer) {
588             perror("Debug leaking scalars parent short read 2");
589             PerlIO_flush(PerlIO_stderr());
590             abort();
591         }
592     }
593
594     if (returned_errno || *buffer) {
595         Perl_warn(aTHX_ "Debug leaking scalars child failed%s%.*s with errno"
596                   " %d: %s", (*buffer ? " at " : ""), (int) *buffer, buffer + 1,
597                   returned_errno, Strerror(returned_errno));
598     }
599 }
600 #endif
601
602 /*
603 =for apidoc perl_destruct
604
605 Shuts down a Perl interpreter.  See L<perlembed>.
606
607 =cut
608 */
609
610 int
611 perl_destruct(pTHXx)
612 {
613     dVAR;
614     VOL signed char destruct_level;  /* see possible values in intrpvar.h */
615     HV *hv;
616 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
617     pid_t child;
618 #endif
619     int i;
620
621     PERL_ARGS_ASSERT_PERL_DESTRUCT;
622 #ifndef MULTIPLICITY
623     PERL_UNUSED_ARG(my_perl);
624 #endif
625
626     assert(PL_scopestack_ix == 1);
627
628     /* wait for all pseudo-forked children to finish */
629     PERL_WAIT_FOR_CHILDREN;
630
631     destruct_level = PL_perl_destruct_level;
632 #if defined(DEBUGGING) || defined(PERL_TRACK_MEMPOOL)
633     {
634         const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
635         if (s) {
636             int i;
637             if (strEQ(s, "-1")) { /* Special case: modperl folklore. */
638                 i = -1;
639             } else {
640                 UV uv;
641                 if (grok_atoUV(s, &uv, NULL) && uv <= INT_MAX)
642                     i = (int)uv;
643                 else
644                     i = 0;
645             }
646 #ifdef DEBUGGING
647             if (destruct_level < i) destruct_level = i;
648 #endif
649 #ifdef PERL_TRACK_MEMPOOL
650             /* RT #114496, for perl_free */
651             PL_perl_destruct_level = i;
652 #endif
653         }
654     }
655 #endif
656
657     if (PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
658         dJMPENV;
659         int x = 0;
660
661         JMPENV_PUSH(x);
662         PERL_UNUSED_VAR(x);
663         if (PL_endav && !PL_minus_c) {
664             PERL_SET_PHASE(PERL_PHASE_END);
665             call_list(PL_scopestack_ix, PL_endav);
666         }
667         JMPENV_POP;
668     }
669     LEAVE;
670     FREETMPS;
671     assert(PL_scopestack_ix == 0);
672
673     /* Need to flush since END blocks can produce output */
674     /* flush stdout separately, since we can identify it */
675 #ifdef USE_PERLIO
676     {
677         PerlIO *stdo = PerlIO_stdout();
678         if (*stdo && PerlIO_flush(stdo)) {
679             PerlIO_restore_errno(stdo);
680             if (errno)
681                 PerlIO_printf(PerlIO_stderr(), "Unable to flush stdout: %s",
682                     Strerror(errno));
683             if (!STATUS_UNIX)
684                 STATUS_ALL_FAILURE;
685         }
686     }
687 #endif
688     my_fflush_all();
689
690 #ifdef PERL_TRACE_OPS
691     /* dump OP-counts if $ENV{PERL_TRACE_OPS} > 0 */
692     {
693         const char * const ptoenv = PerlEnv_getenv("PERL_TRACE_OPS");
694         UV uv;
695
696         if (!ptoenv || !Perl_grok_atoUV(ptoenv, &uv, NULL)
697             || !(uv > 0))
698         goto no_trace_out;
699     }
700     PerlIO_printf(Perl_debug_log, "Trace of all OPs executed:\n");
701     for (i = 0; i <= OP_max; ++i) {
702         if (PL_op_exec_cnt[i])
703             PerlIO_printf(Perl_debug_log, "  %s: %" UVuf "\n", PL_op_name[i], PL_op_exec_cnt[i]);
704     }
705     /* Utility slot for easily doing little tracing experiments in the runloop: */
706     if (PL_op_exec_cnt[OP_max+1] != 0)
707         PerlIO_printf(Perl_debug_log, "  SPECIAL: %" UVuf "\n", PL_op_exec_cnt[OP_max+1]);
708     PerlIO_printf(Perl_debug_log, "\n");
709  no_trace_out:
710 #endif
711
712
713     if (PL_threadhook(aTHX)) {
714         /* Threads hook has vetoed further cleanup */
715         PL_veto_cleanup = TRUE;
716         return STATUS_EXIT;
717     }
718
719 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
720     if (destruct_level != 0) {
721         /* Fork here to create a child. Our child's job is to preserve the
722            state of scalars prior to destruction, so that we can instruct it
723            to dump any scalars that we later find have leaked.
724            There's no subtlety in this code - it assumes POSIX, and it doesn't
725            fail gracefully  */
726         int fd[2];
727
728         if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
729             perror("Debug leaking scalars socketpair failed");
730             abort();
731         }
732
733         child = fork();
734         if(child == -1) {
735             perror("Debug leaking scalars fork failed");
736             abort();
737         }
738         if (!child) {
739             /* We are the child */
740             const int sock = fd[1];
741             const int debug_fd = PerlIO_fileno(Perl_debug_log);
742             int f;
743             const char *where;
744             /* Our success message is an integer 0, and a char 0  */
745             static const char success[sizeof(int) + 1] = {0};
746
747             close(fd[0]);
748
749             /* We need to close all other file descriptors otherwise we end up
750                with interesting hangs, where the parent closes its end of a
751                pipe, and sits waiting for (another) child to terminate. Only
752                that child never terminates, because it never gets EOF, because
753                we also have the far end of the pipe open.  We even need to
754                close the debugging fd, because sometimes it happens to be one
755                end of a pipe, and a process is waiting on the other end for
756                EOF. Normally it would be closed at some point earlier in
757                destruction, but if we happen to cause the pipe to remain open,
758                EOF never occurs, and we get an infinite hang. Hence all the
759                games to pass in a file descriptor if it's actually needed.  */
760
761             f = sysconf(_SC_OPEN_MAX);
762             if(f < 0) {
763                 where = "sysconf failed";
764                 goto abort;
765             }
766             while (f--) {
767                 if (f == sock)
768                     continue;
769                 close(f);
770             }
771
772             while (1) {
773                 SV *target;
774                 union control_un control;
775                 struct msghdr msg;
776                 struct iovec vec[1];
777                 struct cmsghdr *cmptr;
778                 ssize_t got;
779                 int got_fd;
780
781                 msg.msg_control = control.control;
782                 msg.msg_controllen = sizeof(control.control);
783                 /* We're a connected socket so we don't need a source  */
784                 msg.msg_name = NULL;
785                 msg.msg_namelen = 0;
786                 msg.msg_iov = vec;
787                 msg.msg_iovlen = C_ARRAY_LENGTH(vec);
788
789                 vec[0].iov_base = (void*)&target;
790                 vec[0].iov_len = sizeof(target);
791       
792                 got = recvmsg(sock, &msg, 0);
793
794                 if(got == 0)
795                     break;
796                 if(got < 0) {
797                     where = "recv failed";
798                     goto abort;
799                 }
800                 if(got < sizeof(target)) {
801                     where = "short recv";
802                     goto abort;
803                 }
804
805                 if(!(cmptr = CMSG_FIRSTHDR(&msg))) {
806                     where = "no cmsg";
807                     goto abort;
808                 }
809                 if(cmptr->cmsg_len != CMSG_LEN(sizeof(int))) {
810                     where = "wrong cmsg_len";
811                     goto abort;
812                 }
813                 if(cmptr->cmsg_level != SOL_SOCKET) {
814                     where = "wrong cmsg_level";
815                     goto abort;
816                 }
817                 if(cmptr->cmsg_type != SCM_RIGHTS) {
818                     where = "wrong cmsg_type";
819                     goto abort;
820                 }
821
822                 got_fd = *(int*)CMSG_DATA(cmptr);
823                 /* For our last little bit of trickery, put the file descriptor
824                    back into Perl_debug_log, as if we never actually closed it
825                 */
826                 if(got_fd != debug_fd) {
827                     if (dup2(got_fd, debug_fd) == -1) {
828                         where = "dup2";
829                         goto abort;
830                     }
831                 }
832                 sv_dump(target);
833
834                 PerlIO_flush(Perl_debug_log);
835
836                 got = write(sock, &success, sizeof(success));
837
838                 if(got < 0) {
839                     where = "write failed";
840                     goto abort;
841                 }
842                 if(got < sizeof(success)) {
843                     where = "short write";
844                     goto abort;
845                 }
846             }
847             _exit(0);
848         abort:
849             {
850                 int send_errno = errno;
851                 unsigned char length = (unsigned char) strlen(where);
852                 struct iovec failure[3] = {
853                     {(void*)&send_errno, sizeof(send_errno)},
854                     {&length, 1},
855                     {(void*)where, length}
856                 };
857                 int got = writev(sock, failure, 3);
858                 /* Bad news travels fast. Faster than data. We'll get a SIGPIPE
859                    in the parent if we try to read from the socketpair after the
860                    child has exited, even if there was data to read.
861                    So sleep a bit to give the parent a fighting chance of
862                    reading the data.  */
863                 sleep(2);
864                 _exit((got == -1) ? errno : 0);
865             }
866             /* End of child.  */
867         }
868         PL_dumper_fd = fd[0];
869         close(fd[1]);
870     }
871 #endif
872     
873     /* We must account for everything.  */
874
875     /* Destroy the main CV and syntax tree */
876     /* Set PL_curcop now, because destroying ops can cause new SVs
877        to be generated in Perl_pad_swipe, and when running with
878       -DDEBUG_LEAKING_SCALARS they expect PL_curcop to point to a valid
879        op from which the filename structure member is copied.  */
880     PL_curcop = &PL_compiling;
881     if (PL_main_root) {
882         /* ensure comppad/curpad to refer to main's pad */
883         if (CvPADLIST(PL_main_cv)) {
884             PAD_SET_CUR_NOSAVE(CvPADLIST(PL_main_cv), 1);
885             PL_comppad_name = PadlistNAMES(CvPADLIST(PL_main_cv));
886         }
887         op_free(PL_main_root);
888         PL_main_root = NULL;
889     }
890     PL_main_start = NULL;
891     /* note that  PL_main_cv isn't usually actually freed at this point,
892      * due to the CvOUTSIDE refs from subs compiled within it. It will
893      * get freed once all the subs are freed in sv_clean_all(), for
894      * destruct_level > 0 */
895     SvREFCNT_dec(PL_main_cv);
896     PL_main_cv = NULL;
897     PERL_SET_PHASE(PERL_PHASE_DESTRUCT);
898
899     /* Tell PerlIO we are about to tear things apart in case
900        we have layers which are using resources that should
901        be cleaned up now.
902      */
903
904     PerlIO_destruct(aTHX);
905
906     /*
907      * Try to destruct global references.  We do this first so that the
908      * destructors and destructees still exist.  Some sv's might remain.
909      * Non-referenced objects are on their own.
910      */
911     sv_clean_objs();
912
913     /* unhook hooks which will soon be, or use, destroyed data */
914     SvREFCNT_dec(PL_warnhook);
915     PL_warnhook = NULL;
916     SvREFCNT_dec(PL_diehook);
917     PL_diehook = NULL;
918
919     /* call exit list functions */
920     while (PL_exitlistlen-- > 0)
921         PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
922
923     Safefree(PL_exitlist);
924
925     PL_exitlist = NULL;
926     PL_exitlistlen = 0;
927
928     SvREFCNT_dec(PL_registered_mros);
929
930     /* jettison our possibly duplicated environment */
931     /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied
932      * so we certainly shouldn't free it here
933      */
934 #ifndef PERL_MICRO
935 #if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV)
936     if (environ != PL_origenviron && !PL_use_safe_putenv
937 #ifdef USE_ITHREADS
938         /* only main thread can free environ[0] contents */
939         && PL_curinterp == aTHX
940 #endif
941         )
942     {
943         I32 i;
944
945         for (i = 0; environ[i]; i++)
946             safesysfree(environ[i]);
947
948         /* Must use safesysfree() when working with environ. */
949         safesysfree(environ);           
950
951         environ = PL_origenviron;
952     }
953 #endif
954 #endif /* !PERL_MICRO */
955
956     if (destruct_level == 0) {
957
958         DEBUG_P(debprofdump());
959
960 #if defined(PERLIO_LAYERS)
961         /* No more IO - including error messages ! */
962         PerlIO_cleanup(aTHX);
963 #endif
964
965         CopFILE_free(&PL_compiling);
966
967         /* The exit() function will do everything that needs doing. */
968         return STATUS_EXIT;
969     }
970
971     /* Below, do clean up for when PERL_DESTRUCT_LEVEL is not 0 */
972
973 #ifdef USE_ITHREADS
974     /* the syntax tree is shared between clones
975      * so op_free(PL_main_root) only ReREFCNT_dec's
976      * REGEXPs in the parent interpreter
977      * we need to manually ReREFCNT_dec for the clones
978      */
979     {
980         I32 i = AvFILLp(PL_regex_padav);
981         SV **ary = AvARRAY(PL_regex_padav);
982
983         for (; i; i--) {
984             SvREFCNT_dec(ary[i]);
985             ary[i] = &PL_sv_undef;
986         }
987     }
988 #endif
989
990
991     SvREFCNT_dec(MUTABLE_SV(PL_stashcache));
992     PL_stashcache = NULL;
993
994     /* loosen bonds of global variables */
995
996     /* XXX can PL_parser still be non-null here? */
997     if(PL_parser && PL_parser->rsfp) {
998         (void)PerlIO_close(PL_parser->rsfp);
999         PL_parser->rsfp = NULL;
1000     }
1001
1002     if (PL_minus_F) {
1003         Safefree(PL_splitstr);
1004         PL_splitstr = NULL;
1005     }
1006
1007     /* switches */
1008     PL_minus_n      = FALSE;
1009     PL_minus_p      = FALSE;
1010     PL_minus_l      = FALSE;
1011     PL_minus_a      = FALSE;
1012     PL_minus_F      = FALSE;
1013     PL_doswitches   = FALSE;
1014     PL_dowarn       = G_WARN_OFF;
1015 #ifdef PERL_SAWAMPERSAND
1016     PL_sawampersand = 0;        /* must save all match strings */
1017 #endif
1018     PL_unsafe       = FALSE;
1019
1020     Safefree(PL_inplace);
1021     PL_inplace = NULL;
1022     SvREFCNT_dec(PL_patchlevel);
1023
1024     if (PL_e_script) {
1025         SvREFCNT_dec(PL_e_script);
1026         PL_e_script = NULL;
1027     }
1028
1029     PL_perldb = 0;
1030
1031     /* magical thingies */
1032
1033     SvREFCNT_dec(PL_ofsgv);     /* *, */
1034     PL_ofsgv = NULL;
1035
1036     SvREFCNT_dec(PL_ors_sv);    /* $\ */
1037     PL_ors_sv = NULL;
1038
1039     SvREFCNT_dec(PL_rs);        /* $/ */
1040     PL_rs = NULL;
1041
1042     Safefree(PL_osname);        /* $^O */
1043     PL_osname = NULL;
1044
1045     SvREFCNT_dec(PL_statname);
1046     PL_statname = NULL;
1047     PL_statgv = NULL;
1048
1049     /* defgv, aka *_ should be taken care of elsewhere */
1050
1051     /* float buffer */
1052     Safefree(PL_efloatbuf);
1053     PL_efloatbuf = NULL;
1054     PL_efloatsize = 0;
1055
1056     /* startup and shutdown function lists */
1057     SvREFCNT_dec(PL_beginav);
1058     SvREFCNT_dec(PL_beginav_save);
1059     SvREFCNT_dec(PL_endav);
1060     SvREFCNT_dec(PL_checkav);
1061     SvREFCNT_dec(PL_checkav_save);
1062     SvREFCNT_dec(PL_unitcheckav);
1063     SvREFCNT_dec(PL_unitcheckav_save);
1064     SvREFCNT_dec(PL_initav);
1065     PL_beginav = NULL;
1066     PL_beginav_save = NULL;
1067     PL_endav = NULL;
1068     PL_checkav = NULL;
1069     PL_checkav_save = NULL;
1070     PL_unitcheckav = NULL;
1071     PL_unitcheckav_save = NULL;
1072     PL_initav = NULL;
1073
1074     /* shortcuts just get cleared */
1075     PL_hintgv = NULL;
1076     PL_errgv = NULL;
1077     PL_argvoutgv = NULL;
1078     PL_stdingv = NULL;
1079     PL_stderrgv = NULL;
1080     PL_last_in_gv = NULL;
1081     PL_DBsingle = NULL;
1082     PL_DBtrace = NULL;
1083     PL_DBsignal = NULL;
1084     PL_DBsingle_iv = 0;
1085     PL_DBtrace_iv = 0;
1086     PL_DBsignal_iv = 0;
1087     PL_DBcv = NULL;
1088     PL_dbargs = NULL;
1089     PL_debstash = NULL;
1090
1091     SvREFCNT_dec(PL_envgv);
1092     SvREFCNT_dec(PL_incgv);
1093     SvREFCNT_dec(PL_argvgv);
1094     SvREFCNT_dec(PL_replgv);
1095     SvREFCNT_dec(PL_DBgv);
1096     SvREFCNT_dec(PL_DBline);
1097     SvREFCNT_dec(PL_DBsub);
1098     PL_envgv = NULL;
1099     PL_incgv = NULL;
1100     PL_argvgv = NULL;
1101     PL_replgv = NULL;
1102     PL_DBgv = NULL;
1103     PL_DBline = NULL;
1104     PL_DBsub = NULL;
1105
1106     SvREFCNT_dec(PL_argvout_stack);
1107     PL_argvout_stack = NULL;
1108
1109     SvREFCNT_dec(PL_modglobal);
1110     PL_modglobal = NULL;
1111     SvREFCNT_dec(PL_preambleav);
1112     PL_preambleav = NULL;
1113     SvREFCNT_dec(PL_subname);
1114     PL_subname = NULL;
1115 #ifdef PERL_USES_PL_PIDSTATUS
1116     SvREFCNT_dec(PL_pidstatus);
1117     PL_pidstatus = NULL;
1118 #endif
1119     SvREFCNT_dec(PL_toptarget);
1120     PL_toptarget = NULL;
1121     SvREFCNT_dec(PL_bodytarget);
1122     PL_bodytarget = NULL;
1123     PL_formtarget = NULL;
1124
1125     /* free locale stuff */
1126 #ifdef USE_LOCALE_COLLATE
1127     Safefree(PL_collation_name);
1128     PL_collation_name = NULL;
1129 #endif
1130
1131 #ifdef USE_LOCALE_NUMERIC
1132     Safefree(PL_numeric_name);
1133     PL_numeric_name = NULL;
1134     SvREFCNT_dec(PL_numeric_radix_sv);
1135     PL_numeric_radix_sv = NULL;
1136 #endif
1137
1138     if (PL_langinfo_buf) {
1139         Safefree(PL_langinfo_buf);
1140         PL_langinfo_buf = NULL;
1141     }
1142
1143     /* clear character classes  */
1144     for (i = 0; i < POSIX_SWASH_COUNT; i++) {
1145         SvREFCNT_dec(PL_utf8_swash_ptrs[i]);
1146         PL_utf8_swash_ptrs[i] = NULL;
1147     }
1148     SvREFCNT_dec(PL_utf8_mark);
1149     SvREFCNT_dec(PL_utf8_toupper);
1150     SvREFCNT_dec(PL_utf8_totitle);
1151     SvREFCNT_dec(PL_utf8_tolower);
1152     SvREFCNT_dec(PL_utf8_tofold);
1153     SvREFCNT_dec(PL_utf8_idstart);
1154     SvREFCNT_dec(PL_utf8_idcont);
1155     SvREFCNT_dec(PL_utf8_foldable);
1156     SvREFCNT_dec(PL_utf8_foldclosures);
1157     SvREFCNT_dec(PL_AboveLatin1);
1158     SvREFCNT_dec(PL_InBitmap);
1159     SvREFCNT_dec(PL_UpperLatin1);
1160     SvREFCNT_dec(PL_Latin1);
1161     SvREFCNT_dec(PL_NonL1NonFinalFold);
1162     SvREFCNT_dec(PL_HasMultiCharFold);
1163 #ifdef USE_LOCALE_CTYPE
1164     SvREFCNT_dec(PL_warn_locale);
1165 #endif
1166     PL_utf8_mark        = NULL;
1167     PL_utf8_toupper     = NULL;
1168     PL_utf8_totitle     = NULL;
1169     PL_utf8_tolower     = NULL;
1170     PL_utf8_tofold      = NULL;
1171     PL_utf8_idstart     = NULL;
1172     PL_utf8_idcont      = NULL;
1173     PL_utf8_foldclosures = NULL;
1174     PL_AboveLatin1       = NULL;
1175     PL_InBitmap          = NULL;
1176     PL_HasMultiCharFold  = NULL;
1177 #ifdef USE_LOCALE_CTYPE
1178     PL_warn_locale       = NULL;
1179 #endif
1180     PL_Latin1            = NULL;
1181     PL_NonL1NonFinalFold = NULL;
1182     PL_UpperLatin1       = NULL;
1183     for (i = 0; i < POSIX_CC_COUNT; i++) {
1184         SvREFCNT_dec(PL_XPosix_ptrs[i]);
1185         PL_XPosix_ptrs[i] = NULL;
1186     }
1187     PL_GCB_invlist = NULL;
1188     PL_LB_invlist = NULL;
1189     PL_SB_invlist = NULL;
1190     PL_WB_invlist = NULL;
1191     PL_Assigned_invlist = NULL;
1192
1193     if (!specialWARN(PL_compiling.cop_warnings))
1194         PerlMemShared_free(PL_compiling.cop_warnings);
1195     PL_compiling.cop_warnings = NULL;
1196     cophh_free(CopHINTHASH_get(&PL_compiling));
1197     CopHINTHASH_set(&PL_compiling, cophh_new_empty());
1198     CopFILE_free(&PL_compiling);
1199
1200     /* Prepare to destruct main symbol table.  */
1201
1202     hv = PL_defstash;
1203     /* break ref loop  *:: <=> %:: */
1204     (void)hv_deletes(hv, "main::", G_DISCARD);
1205     PL_defstash = 0;
1206     SvREFCNT_dec(hv);
1207     SvREFCNT_dec(PL_curstname);
1208     PL_curstname = NULL;
1209
1210     /* clear queued errors */
1211     SvREFCNT_dec(PL_errors);
1212     PL_errors = NULL;
1213
1214     SvREFCNT_dec(PL_isarev);
1215
1216     FREETMPS;
1217     if (destruct_level >= 2) {
1218         if (PL_scopestack_ix != 0)
1219             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
1220                              "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
1221                              (long)PL_scopestack_ix);
1222         if (PL_savestack_ix != 0)
1223             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
1224                              "Unbalanced saves: %ld more saves than restores\n",
1225                              (long)PL_savestack_ix);
1226         if (PL_tmps_floor != -1)
1227             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced tmps: %ld more allocs than frees\n",
1228                              (long)PL_tmps_floor + 1);
1229         if (cxstack_ix != -1)
1230             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),"Unbalanced context: %ld more PUSHes than POPs\n",
1231                              (long)cxstack_ix + 1);
1232     }
1233
1234 #ifdef USE_ITHREADS
1235     SvREFCNT_dec(PL_regex_padav);
1236     PL_regex_padav = NULL;
1237     PL_regex_pad = NULL;
1238 #endif
1239
1240 #ifdef PERL_IMPLICIT_CONTEXT
1241     /* the entries in this list are allocated via SV PVX's, so get freed
1242      * in sv_clean_all */
1243     Safefree(PL_my_cxt_list);
1244 #endif
1245
1246     /* Now absolutely destruct everything, somehow or other, loops or no. */
1247
1248     /* the 2 is for PL_fdpid and PL_strtab */
1249     while (sv_clean_all() > 2)
1250         ;
1251
1252 #ifdef USE_ITHREADS
1253     Safefree(PL_stashpad); /* must come after sv_clean_all */
1254 #endif
1255
1256     AvREAL_off(PL_fdpid);               /* no surviving entries */
1257     SvREFCNT_dec(PL_fdpid);             /* needed in io_close() */
1258     PL_fdpid = NULL;
1259
1260 #ifdef HAVE_INTERP_INTERN
1261     sys_intern_clear();
1262 #endif
1263
1264     /* constant strings */
1265     for (i = 0; i < SV_CONSTS_COUNT; i++) {
1266         SvREFCNT_dec(PL_sv_consts[i]);
1267         PL_sv_consts[i] = NULL;
1268     }
1269
1270     /* Destruct the global string table. */
1271     {
1272         /* Yell and reset the HeVAL() slots that are still holding refcounts,
1273          * so that sv_free() won't fail on them.
1274          * Now that the global string table is using a single hunk of memory
1275          * for both HE and HEK, we either need to explicitly unshare it the
1276          * correct way, or actually free things here.
1277          */
1278         I32 riter = 0;
1279         const I32 max = HvMAX(PL_strtab);
1280         HE * const * const array = HvARRAY(PL_strtab);
1281         HE *hent = array[0];
1282
1283         for (;;) {
1284             if (hent && ckWARN_d(WARN_INTERNAL)) {
1285                 HE * const next = HeNEXT(hent);
1286                 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
1287                      "Unbalanced string table refcount: (%ld) for \"%s\"",
1288                      (long)hent->he_valu.hent_refcount, HeKEY(hent));
1289                 Safefree(hent);
1290                 hent = next;
1291             }
1292             if (!hent) {
1293                 if (++riter > max)
1294                     break;
1295                 hent = array[riter];
1296             }
1297         }
1298
1299         Safefree(array);
1300         HvARRAY(PL_strtab) = 0;
1301         HvTOTALKEYS(PL_strtab) = 0;
1302     }
1303     SvREFCNT_dec(PL_strtab);
1304
1305 #ifdef USE_ITHREADS
1306     /* free the pointer tables used for cloning */
1307     ptr_table_free(PL_ptr_table);
1308     PL_ptr_table = (PTR_TBL_t*)NULL;
1309 #endif
1310
1311     /* free special SVs */
1312
1313     SvREFCNT(&PL_sv_yes) = 0;
1314     sv_clear(&PL_sv_yes);
1315     SvANY(&PL_sv_yes) = NULL;
1316     SvFLAGS(&PL_sv_yes) = 0;
1317
1318     SvREFCNT(&PL_sv_no) = 0;
1319     sv_clear(&PL_sv_no);
1320     SvANY(&PL_sv_no) = NULL;
1321     SvFLAGS(&PL_sv_no) = 0;
1322
1323     SvREFCNT(&PL_sv_zero) = 0;
1324     sv_clear(&PL_sv_zero);
1325     SvANY(&PL_sv_zero) = NULL;
1326     SvFLAGS(&PL_sv_zero) = 0;
1327
1328     {
1329         int i;
1330         for (i=0; i<=2; i++) {
1331             SvREFCNT(PERL_DEBUG_PAD(i)) = 0;
1332             sv_clear(PERL_DEBUG_PAD(i));
1333             SvANY(PERL_DEBUG_PAD(i)) = NULL;
1334             SvFLAGS(PERL_DEBUG_PAD(i)) = 0;
1335         }
1336     }
1337
1338     if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
1339         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Scalars leaked: %ld\n", (long)PL_sv_count);
1340
1341 #ifdef DEBUG_LEAKING_SCALARS
1342     if (PL_sv_count != 0) {
1343         SV* sva;
1344         SV* sv;
1345         SV* svend;
1346
1347         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
1348             svend = &sva[SvREFCNT(sva)];
1349             for (sv = sva + 1; sv < svend; ++sv) {
1350                 if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
1351                     PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p"
1352                         " flags=0x%"UVxf
1353                         " refcnt=%"UVuf pTHX__FORMAT "\n"
1354                         "\tallocated at %s:%d %s %s (parent 0x%" UVxf ");"
1355                         "serial %" UVuf "\n",
1356                         (void*)sv, (UV)sv->sv_flags, (UV)sv->sv_refcnt
1357                         pTHX__VALUE,
1358                         sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1359                         sv->sv_debug_line,
1360                         sv->sv_debug_inpad ? "for" : "by",
1361                         sv->sv_debug_optype ?
1362                             PL_op_name[sv->sv_debug_optype]: "(none)",
1363                         PTR2UV(sv->sv_debug_parent),
1364                         sv->sv_debug_serial
1365                     );
1366 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1367                     Perl_dump_sv_child(aTHX_ sv);
1368 #endif
1369                 }
1370             }
1371         }
1372     }
1373 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
1374     {
1375         int status;
1376         fd_set rset;
1377         /* Wait for up to 4 seconds for child to terminate.
1378            This seems to be the least effort way of timing out on reaping
1379            its exit status.  */
1380         struct timeval waitfor = {4, 0};
1381         int sock = PL_dumper_fd;
1382
1383         shutdown(sock, 1);
1384         FD_ZERO(&rset);
1385         FD_SET(sock, &rset);
1386         select(sock + 1, &rset, NULL, NULL, &waitfor);
1387         waitpid(child, &status, WNOHANG);
1388         close(sock);
1389     }
1390 #endif
1391 #endif
1392 #ifdef DEBUG_LEAKING_SCALARS_ABORT
1393     if (PL_sv_count)
1394         abort();
1395 #endif
1396     PL_sv_count = 0;
1397
1398 #if defined(PERLIO_LAYERS)
1399     /* No more IO - including error messages ! */
1400     PerlIO_cleanup(aTHX);
1401 #endif
1402
1403     /* sv_undef needs to stay immortal until after PerlIO_cleanup
1404        as currently layers use it rather than NULL as a marker
1405        for no arg - and will try and SvREFCNT_dec it.
1406      */
1407     SvREFCNT(&PL_sv_undef) = 0;
1408     SvREADONLY_off(&PL_sv_undef);
1409
1410     Safefree(PL_origfilename);
1411     PL_origfilename = NULL;
1412     Safefree(PL_reg_curpm);
1413     free_tied_hv_pool();
1414     Safefree(PL_op_mask);
1415     Safefree(PL_psig_name);
1416     PL_psig_name = (SV**)NULL;
1417     PL_psig_ptr = (SV**)NULL;
1418     {
1419         /* We need to NULL PL_psig_pend first, so that
1420            signal handlers know not to use it */
1421         int *psig_save = PL_psig_pend;
1422         PL_psig_pend = (int*)NULL;
1423         Safefree(psig_save);
1424     }
1425     nuke_stacks();
1426     TAINTING_set(FALSE);
1427     TAINT_WARN_set(FALSE);
1428     PL_hints = 0;               /* Reset hints. Should hints be per-interpreter ? */
1429
1430     DEBUG_P(debprofdump());
1431
1432     PL_debug = 0;
1433
1434 #ifdef USE_REENTRANT_API
1435     Perl_reentrant_free(aTHX);
1436 #endif
1437
1438     /* These all point to HVs that are about to be blown away.
1439        Code in core and on CPAN assumes that if the interpreter is re-started
1440        that they will be cleanly NULL or pointing to a valid HV.  */
1441     PL_custom_op_names = NULL;
1442     PL_custom_op_descs = NULL;
1443     PL_custom_ops = NULL;
1444
1445     sv_free_arenas();
1446
1447     while (PL_regmatch_slab) {
1448         regmatch_slab  *s = PL_regmatch_slab;
1449         PL_regmatch_slab = PL_regmatch_slab->next;
1450         Safefree(s);
1451     }
1452
1453     /* As the absolutely last thing, free the non-arena SV for mess() */
1454
1455     if (PL_mess_sv) {
1456         /* we know that type == SVt_PVMG */
1457
1458         /* it could have accumulated taint magic */
1459         MAGIC* mg;
1460         MAGIC* moremagic;
1461         for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
1462             moremagic = mg->mg_moremagic;
1463             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global
1464                 && mg->mg_len >= 0)
1465                 Safefree(mg->mg_ptr);
1466             Safefree(mg);
1467         }
1468
1469         /* we know that type >= SVt_PV */
1470         SvPV_free(PL_mess_sv);
1471         Safefree(SvANY(PL_mess_sv));
1472         Safefree(PL_mess_sv);
1473         PL_mess_sv = NULL;
1474     }
1475     return STATUS_EXIT;
1476 }
1477
1478 /*
1479 =for apidoc perl_free
1480
1481 Releases a Perl interpreter.  See L<perlembed>.
1482
1483 =cut
1484 */
1485
1486 void
1487 perl_free(pTHXx)
1488 {
1489     dVAR;
1490
1491     PERL_ARGS_ASSERT_PERL_FREE;
1492
1493     if (PL_veto_cleanup)
1494         return;
1495
1496 #ifdef PERL_TRACK_MEMPOOL
1497     {
1498         /*
1499          * Don't free thread memory if PERL_DESTRUCT_LEVEL is set to a non-zero
1500          * value as we're probably hunting memory leaks then
1501          */
1502         if (PL_perl_destruct_level == 0) {
1503             const U32 old_debug = PL_debug;
1504             /* Emulate the PerlHost behaviour of free()ing all memory allocated in this
1505                thread at thread exit.  */
1506             if (DEBUG_m_TEST) {
1507                 PerlIO_puts(Perl_debug_log, "Disabling memory debugging as we "
1508                             "free this thread's memory\n");
1509                 PL_debug &= ~ DEBUG_m_FLAG;
1510             }
1511             while(aTHXx->Imemory_debug_header.next != &(aTHXx->Imemory_debug_header)){
1512                 char * next = (char *)(aTHXx->Imemory_debug_header.next);
1513                 Malloc_t ptr = PERL_MEMORY_DEBUG_HEADER_SIZE + next;
1514                 safesysfree(ptr);
1515             }
1516             PL_debug = old_debug;
1517         }
1518     }
1519 #endif
1520
1521 #if defined(WIN32) || defined(NETWARE)
1522 #  if defined(PERL_IMPLICIT_SYS)
1523     {
1524 #    ifdef NETWARE
1525         void *host = nw_internal_host;
1526         PerlMem_free(aTHXx);
1527         nw_delete_internal_host(host);
1528 #    else
1529         void *host = w32_internal_host;
1530         PerlMem_free(aTHXx);
1531         win32_delete_internal_host(host);
1532 #    endif
1533     }
1534 #  else
1535     PerlMem_free(aTHXx);
1536 #  endif
1537 #else
1538     PerlMem_free(aTHXx);
1539 #endif
1540 }
1541
1542 #if defined(USE_ITHREADS)
1543 /* provide destructors to clean up the thread key when libperl is unloaded */
1544 #ifndef WIN32 /* handled during DLL_PROCESS_DETACH in win32/perllib.c */
1545
1546 #if defined(__hpux) && !(defined(__ux_version) && __ux_version <= 1020) && !defined(__GNUC__)
1547 #pragma fini "perl_fini"
1548 #elif defined(__sun) && !defined(__GNUC__)
1549 #pragma fini (perl_fini)
1550 #endif
1551
1552 static void
1553 #if defined(__GNUC__)
1554 __attribute__((destructor))
1555 #endif
1556 perl_fini(void)
1557 {
1558     dVAR;
1559     if (
1560 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
1561         my_vars &&
1562 #endif
1563         PL_curinterp && !PL_veto_cleanup)
1564         FREE_THREAD_KEY;
1565 }
1566
1567 #endif /* WIN32 */
1568 #endif /* THREADS */
1569
1570 void
1571 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
1572 {
1573     Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
1574     PL_exitlist[PL_exitlistlen].fn = fn;
1575     PL_exitlist[PL_exitlistlen].ptr = ptr;
1576     ++PL_exitlistlen;
1577 }
1578
1579 /*
1580 =for apidoc perl_parse
1581
1582 Tells a Perl interpreter to parse a Perl script.  See L<perlembed>.
1583
1584 =cut
1585 */
1586
1587 #define SET_CURSTASH(newstash)                       \
1588         if (PL_curstash != newstash) {                \
1589             SvREFCNT_dec(PL_curstash);                 \
1590             PL_curstash = (HV *)SvREFCNT_inc(newstash); \
1591         }
1592
1593 int
1594 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
1595 {
1596     dVAR;
1597     I32 oldscope;
1598     int ret;
1599     dJMPENV;
1600
1601     PERL_ARGS_ASSERT_PERL_PARSE;
1602 #ifndef MULTIPLICITY
1603     PERL_UNUSED_ARG(my_perl);
1604 #endif
1605 #if (defined(USE_HASH_SEED) || defined(USE_HASH_SEED_DEBUG)) && !defined(NO_PERL_HASH_SEED_DEBUG)
1606     {
1607         const char * const s = PerlEnv_getenv("PERL_HASH_SEED_DEBUG");
1608
1609         if (s && strEQ(s, "1")) {
1610             const unsigned char *seed= PERL_HASH_SEED;
1611             const unsigned char *seed_end= PERL_HASH_SEED + PERL_HASH_SEED_BYTES;
1612             PerlIO_printf(Perl_debug_log, "HASH_FUNCTION = %s HASH_SEED = 0x", PERL_HASH_FUNC);
1613             while (seed < seed_end) {
1614                 PerlIO_printf(Perl_debug_log, "%02x", *seed++);
1615             }
1616 #ifdef PERL_HASH_RANDOMIZE_KEYS
1617             PerlIO_printf(Perl_debug_log, " PERTURB_KEYS = %d (%s)",
1618                     PL_HASH_RAND_BITS_ENABLED,
1619                     PL_HASH_RAND_BITS_ENABLED == 0 ? "NO" : PL_HASH_RAND_BITS_ENABLED == 1 ? "RANDOM" : "DETERMINISTIC");
1620 #endif
1621             PerlIO_printf(Perl_debug_log, "\n");
1622         }
1623     }
1624 #endif /* #if (defined(USE_HASH_SEED) ... */
1625
1626 #ifdef __amigaos4__
1627     {
1628         struct NameTranslationInfo nti;
1629         __translate_amiga_to_unix_path_name(&argv[0],&nti); 
1630     }
1631 #endif
1632
1633     PL_origargc = argc;
1634     PL_origargv = argv;
1635
1636     if (PL_origalen != 0) {
1637         PL_origalen = 1; /* don't use old PL_origalen if perl_parse() is called again */
1638     }
1639     else {
1640         /* Set PL_origalen be the sum of the contiguous argv[]
1641          * elements plus the size of the env in case that it is
1642          * contiguous with the argv[].  This is used in mg.c:Perl_magic_set()
1643          * as the maximum modifiable length of $0.  In the worst case
1644          * the area we are able to modify is limited to the size of
1645          * the original argv[0].  (See below for 'contiguous', though.)
1646          * --jhi */
1647          const char *s = NULL;
1648          const UV mask = ~(UV)(PTRSIZE-1);
1649          /* Do the mask check only if the args seem like aligned. */
1650          const UV aligned =
1651            (mask < ~(UV)0) && ((PTR2UV(argv[0]) & mask) == PTR2UV(argv[0]));
1652
1653          /* See if all the arguments are contiguous in memory.  Note
1654           * that 'contiguous' is a loose term because some platforms
1655           * align the argv[] and the envp[].  If the arguments look
1656           * like non-aligned, assume that they are 'strictly' or
1657           * 'traditionally' contiguous.  If the arguments look like
1658           * aligned, we just check that they are within aligned
1659           * PTRSIZE bytes.  As long as no system has something bizarre
1660           * like the argv[] interleaved with some other data, we are
1661           * fine.  (Did I just evoke Murphy's Law?)  --jhi */
1662          if (PL_origargv && PL_origargc >= 1 && (s = PL_origargv[0])) {
1663               int i;
1664               while (*s) s++;
1665               for (i = 1; i < PL_origargc; i++) {
1666                    if ((PL_origargv[i] == s + 1
1667 #ifdef OS2
1668                         || PL_origargv[i] == s + 2
1669 #endif 
1670                             )
1671                        ||
1672                        (aligned &&
1673                         (PL_origargv[i] >  s &&
1674                          PL_origargv[i] <=
1675                          INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1676                         )
1677                    {
1678                         s = PL_origargv[i];
1679                         while (*s) s++;
1680                    }
1681                    else
1682                         break;
1683               }
1684          }
1685
1686 #ifndef PERL_USE_SAFE_PUTENV
1687          /* Can we grab env area too to be used as the area for $0? */
1688          if (s && PL_origenviron && !PL_use_safe_putenv) {
1689               if ((PL_origenviron[0] == s + 1)
1690                   ||
1691                   (aligned &&
1692                    (PL_origenviron[0] >  s &&
1693                     PL_origenviron[0] <=
1694                     INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1695                  )
1696               {
1697                    int i;
1698 #ifndef OS2             /* ENVIRON is read by the kernel too. */
1699                    s = PL_origenviron[0];
1700                    while (*s) s++;
1701 #endif
1702                    my_setenv("NoNe  SuCh", NULL);
1703                    /* Force copy of environment. */
1704                    for (i = 1; PL_origenviron[i]; i++) {
1705                         if (PL_origenviron[i] == s + 1
1706                             ||
1707                             (aligned &&
1708                              (PL_origenviron[i] >  s &&
1709                               PL_origenviron[i] <=
1710                               INT2PTR(char *, PTR2UV(s + PTRSIZE) & mask)))
1711                            )
1712                         {
1713                              s = PL_origenviron[i];
1714                              while (*s) s++;
1715                         }
1716                         else
1717                              break;
1718                    }
1719               }
1720          }
1721 #endif /* !defined(PERL_USE_SAFE_PUTENV) */
1722
1723          PL_origalen = s ? s - PL_origargv[0] + 1 : 0;
1724     }
1725
1726     if (PL_do_undump) {
1727
1728         /* Come here if running an undumped a.out. */
1729
1730         PL_origfilename = savepv(argv[0]);
1731         PL_do_undump = FALSE;
1732         cxstack_ix = -1;                /* start label stack again */
1733         init_ids();
1734         assert (!TAINT_get);
1735         TAINT;
1736         set_caret_X();
1737         TAINT_NOT;
1738         init_postdump_symbols(argc,argv,env);
1739         return 0;
1740     }
1741
1742     if (PL_main_root) {
1743         op_free(PL_main_root);
1744         PL_main_root = NULL;
1745     }
1746     PL_main_start = NULL;
1747     SvREFCNT_dec(PL_main_cv);
1748     PL_main_cv = NULL;
1749
1750     time(&PL_basetime);
1751     oldscope = PL_scopestack_ix;
1752     PL_dowarn = G_WARN_OFF;
1753
1754     JMPENV_PUSH(ret);
1755     switch (ret) {
1756     case 0:
1757         parse_body(env,xsinit);
1758         if (PL_unitcheckav) {
1759             call_list(oldscope, PL_unitcheckav);
1760         }
1761         if (PL_checkav) {
1762             PERL_SET_PHASE(PERL_PHASE_CHECK);
1763             call_list(oldscope, PL_checkav);
1764         }
1765         ret = 0;
1766         break;
1767     case 1:
1768         STATUS_ALL_FAILURE;
1769         /* FALLTHROUGH */
1770     case 2:
1771         /* my_exit() was called */
1772         while (PL_scopestack_ix > oldscope)
1773             LEAVE;
1774         FREETMPS;
1775         SET_CURSTASH(PL_defstash);
1776         if (PL_unitcheckav) {
1777             call_list(oldscope, PL_unitcheckav);
1778         }
1779         if (PL_checkav) {
1780             PERL_SET_PHASE(PERL_PHASE_CHECK);
1781             call_list(oldscope, PL_checkav);
1782         }
1783         ret = STATUS_EXIT;
1784         break;
1785     case 3:
1786         PerlIO_printf(Perl_error_log, "panic: top_env\n");
1787         ret = 1;
1788         break;
1789     }
1790     JMPENV_POP;
1791     return ret;
1792 }
1793
1794 /* This needs to stay in perl.c, as perl.c is compiled with different flags for
1795    miniperl, and we need to see those flags reflected in the values here.  */
1796
1797 /* What this returns is subject to change.  Use the public interface in Config.
1798  */
1799 static void
1800 S_Internals_V(pTHX_ CV *cv)
1801 {
1802     dXSARGS;
1803 #ifdef LOCAL_PATCH_COUNT
1804     const int local_patch_count = LOCAL_PATCH_COUNT;
1805 #else
1806     const int local_patch_count = 0;
1807 #endif
1808     const int entries = 3 + local_patch_count;
1809     int i;
1810     static const char non_bincompat_options[] = 
1811 #  ifdef DEBUGGING
1812                              " DEBUGGING"
1813 #  endif
1814 #  ifdef NO_MATHOMS
1815                              " NO_MATHOMS"
1816 #  endif
1817 #  ifdef NO_HASH_SEED
1818                              " NO_HASH_SEED"
1819 #  endif
1820 #  ifdef NO_TAINT_SUPPORT
1821                              " NO_TAINT_SUPPORT"
1822 #  endif
1823 #  ifdef PERL_BOOL_AS_CHAR
1824                              " PERL_BOOL_AS_CHAR"
1825 #  endif
1826 #  ifdef PERL_COPY_ON_WRITE
1827                              " PERL_COPY_ON_WRITE"
1828 #  endif
1829 #  ifdef PERL_DISABLE_PMC
1830                              " PERL_DISABLE_PMC"
1831 #  endif
1832 #  ifdef PERL_DONT_CREATE_GVSV
1833                              " PERL_DONT_CREATE_GVSV"
1834 #  endif
1835 #  ifdef PERL_EXTERNAL_GLOB
1836                              " PERL_EXTERNAL_GLOB"
1837 #  endif
1838 #  ifdef PERL_HASH_FUNC_SIPHASH
1839                              " PERL_HASH_FUNC_SIPHASH"
1840 #  endif
1841 #  ifdef PERL_HASH_FUNC_SDBM
1842                              " PERL_HASH_FUNC_SDBM"
1843 #  endif
1844 #  ifdef PERL_HASH_FUNC_DJB2
1845                              " PERL_HASH_FUNC_DJB2"
1846 #  endif
1847 #  ifdef PERL_HASH_FUNC_SUPERFAST
1848                              " PERL_HASH_FUNC_SUPERFAST"
1849 #  endif
1850 #  ifdef PERL_HASH_FUNC_MURMUR3
1851                              " PERL_HASH_FUNC_MURMUR3"
1852 #  endif
1853 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME
1854                              " PERL_HASH_FUNC_ONE_AT_A_TIME"
1855 #  endif
1856 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
1857                              " PERL_HASH_FUNC_ONE_AT_A_TIME_HARD"
1858 #  endif
1859 #  ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
1860                              " PERL_HASH_FUNC_ONE_AT_A_TIME_OLD"
1861 #  endif
1862 #  ifdef PERL_IS_MINIPERL
1863                              " PERL_IS_MINIPERL"
1864 #  endif
1865 #  ifdef PERL_MALLOC_WRAP
1866                              " PERL_MALLOC_WRAP"
1867 #  endif
1868 #  ifdef PERL_MEM_LOG
1869                              " PERL_MEM_LOG"
1870 #  endif
1871 #  ifdef PERL_MEM_LOG_NOIMPL
1872                              " PERL_MEM_LOG_NOIMPL"
1873 #  endif
1874 #  ifdef PERL_OP_PARENT
1875                              " PERL_OP_PARENT"
1876 #  endif
1877 #  ifdef PERL_PERTURB_KEYS_DETERMINISTIC
1878                              " PERL_PERTURB_KEYS_DETERMINISTIC"
1879 #  endif
1880 #  ifdef PERL_PERTURB_KEYS_DISABLED
1881                              " PERL_PERTURB_KEYS_DISABLED"
1882 #  endif
1883 #  ifdef PERL_PERTURB_KEYS_RANDOM
1884                              " PERL_PERTURB_KEYS_RANDOM"
1885 #  endif
1886 #  ifdef PERL_PRESERVE_IVUV
1887                              " PERL_PRESERVE_IVUV"
1888 #  endif
1889 #  ifdef PERL_RELOCATABLE_INCPUSH
1890                              " PERL_RELOCATABLE_INCPUSH"
1891 #  endif
1892 #  ifdef PERL_USE_DEVEL
1893                              " PERL_USE_DEVEL"
1894 #  endif
1895 #  ifdef PERL_USE_SAFE_PUTENV
1896                              " PERL_USE_SAFE_PUTENV"
1897 #  endif
1898 #  ifdef SILENT_NO_TAINT_SUPPORT
1899                              " SILENT_NO_TAINT_SUPPORT"
1900 #  endif
1901 #  ifdef UNLINK_ALL_VERSIONS
1902                              " UNLINK_ALL_VERSIONS"
1903 #  endif
1904 #  ifdef USE_ATTRIBUTES_FOR_PERLIO
1905                              " USE_ATTRIBUTES_FOR_PERLIO"
1906 #  endif
1907 #  ifdef USE_FAST_STDIO
1908                              " USE_FAST_STDIO"
1909 #  endif               
1910 #  ifdef USE_LOCALE
1911                              " USE_LOCALE"
1912 #  endif
1913 #  ifdef USE_LOCALE_CTYPE
1914                              " USE_LOCALE_CTYPE"
1915 #  endif
1916 #  ifdef WIN32_NO_REGISTRY
1917                              " USE_NO_REGISTRY"
1918 #  endif
1919 #  ifdef USE_PERL_ATOF
1920                              " USE_PERL_ATOF"
1921 #  endif               
1922 #  ifdef USE_SITECUSTOMIZE
1923                              " USE_SITECUSTOMIZE"
1924 #  endif               
1925         ;
1926     PERL_UNUSED_ARG(cv);
1927     PERL_UNUSED_VAR(items);
1928
1929     EXTEND(SP, entries);
1930
1931     PUSHs(sv_2mortal(newSVpv(PL_bincompat_options, 0)));
1932     PUSHs(Perl_newSVpvn_flags(aTHX_ non_bincompat_options,
1933                               sizeof(non_bincompat_options) - 1, SVs_TEMP));
1934
1935 #ifndef PERL_BUILD_DATE
1936 #  ifdef __DATE__
1937 #    ifdef __TIME__
1938 #      define PERL_BUILD_DATE __DATE__ " " __TIME__
1939 #    else
1940 #      define PERL_BUILD_DATE __DATE__
1941 #    endif
1942 #  endif
1943 #endif
1944
1945 #ifdef PERL_BUILD_DATE
1946     PUSHs(Perl_newSVpvn_flags(aTHX_
1947                               STR_WITH_LEN("Compiled at " PERL_BUILD_DATE),
1948                               SVs_TEMP));
1949 #else
1950     PUSHs(&PL_sv_undef);
1951 #endif
1952
1953     for (i = 1; i <= local_patch_count; i++) {
1954         /* This will be an undef, if PL_localpatches[i] is NULL.  */
1955         PUSHs(sv_2mortal(newSVpv(PL_localpatches[i], 0)));
1956     }
1957
1958     XSRETURN(entries);
1959 }
1960
1961 #define INCPUSH_UNSHIFT                 0x01
1962 #define INCPUSH_ADD_OLD_VERS            0x02
1963 #define INCPUSH_ADD_VERSIONED_SUB_DIRS  0x04
1964 #define INCPUSH_ADD_ARCHONLY_SUB_DIRS   0x08
1965 #define INCPUSH_NOT_BASEDIR             0x10
1966 #define INCPUSH_CAN_RELOCATE            0x20
1967 #define INCPUSH_ADD_SUB_DIRS    \
1968     (INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_ADD_ARCHONLY_SUB_DIRS)
1969
1970 STATIC void *
1971 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
1972 {
1973     dVAR;
1974     PerlIO *rsfp;
1975     int argc = PL_origargc;
1976     char **argv = PL_origargv;
1977     const char *scriptname = NULL;
1978     bool dosearch = FALSE;
1979     char c;
1980     bool doextract = FALSE;
1981     const char *cddir = NULL;
1982 #ifdef USE_SITECUSTOMIZE
1983     bool minus_f = FALSE;
1984 #endif
1985     SV *linestr_sv = NULL;
1986     bool add_read_e_script = FALSE;
1987     U32 lex_start_flags = 0;
1988
1989     PERL_SET_PHASE(PERL_PHASE_START);
1990
1991     init_main_stash();
1992
1993     {
1994         const char *s;
1995     for (argc--,argv++; argc > 0; argc--,argv++) {
1996         if (argv[0][0] != '-' || !argv[0][1])
1997             break;
1998         s = argv[0]+1;
1999       reswitch:
2000         switch ((c = *s)) {
2001         case 'C':
2002 #ifndef PERL_STRICT_CR
2003         case '\r':
2004 #endif
2005         case ' ':
2006         case '0':
2007         case 'F':
2008         case 'a':
2009         case 'c':
2010         case 'd':
2011         case 'D':
2012         case 'h':
2013         case 'i':
2014         case 'l':
2015         case 'M':
2016         case 'm':
2017         case 'n':
2018         case 'p':
2019         case 's':
2020         case 'u':
2021         case 'U':
2022         case 'v':
2023         case 'W':
2024         case 'X':
2025         case 'w':
2026             if ((s = moreswitches(s)))
2027                 goto reswitch;
2028             break;
2029
2030         case 't':
2031 #if defined(SILENT_NO_TAINT_SUPPORT)
2032             /* silently ignore */
2033 #elif defined(NO_TAINT_SUPPORT)
2034             Perl_croak_nocontext("This perl was compiled without taint support. "
2035                        "Cowardly refusing to run with -t or -T flags");
2036 #else
2037             CHECK_MALLOC_TOO_LATE_FOR('t');
2038             if( !TAINTING_get ) {
2039                  TAINT_WARN_set(TRUE);
2040                  TAINTING_set(TRUE);
2041             }
2042 #endif
2043             s++;
2044             goto reswitch;
2045         case 'T':
2046 #if defined(SILENT_NO_TAINT_SUPPORT)
2047             /* silently ignore */
2048 #elif defined(NO_TAINT_SUPPORT)
2049             Perl_croak_nocontext("This perl was compiled without taint support. "
2050                        "Cowardly refusing to run with -t or -T flags");
2051 #else
2052             CHECK_MALLOC_TOO_LATE_FOR('T');
2053             TAINTING_set(TRUE);
2054             TAINT_WARN_set(FALSE);
2055 #endif
2056             s++;
2057             goto reswitch;
2058
2059         case 'E':
2060             PL_minus_E = TRUE;
2061             /* FALLTHROUGH */
2062         case 'e':
2063             forbid_setid('e', FALSE);
2064             if (!PL_e_script) {
2065                 PL_e_script = newSVpvs("");
2066                 add_read_e_script = TRUE;
2067             }
2068             if (*++s)
2069                 sv_catpv(PL_e_script, s);
2070             else if (argv[1]) {
2071                 sv_catpv(PL_e_script, argv[1]);
2072                 argc--,argv++;
2073             }
2074             else
2075                 Perl_croak(aTHX_ "No code specified for -%c", c);
2076             sv_catpvs(PL_e_script, "\n");
2077             break;
2078
2079         case 'f':
2080 #ifdef USE_SITECUSTOMIZE
2081             minus_f = TRUE;
2082 #endif
2083             s++;
2084             goto reswitch;
2085
2086         case 'I':       /* -I handled both here and in moreswitches() */
2087             forbid_setid('I', FALSE);
2088             if (!*++s && (s=argv[1]) != NULL) {
2089                 argc--,argv++;
2090             }
2091             if (s && *s) {
2092                 STRLEN len = strlen(s);
2093                 incpush(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
2094             }
2095             else
2096                 Perl_croak(aTHX_ "No directory specified for -I");
2097             break;
2098         case 'S':
2099             forbid_setid('S', FALSE);
2100             dosearch = TRUE;
2101             s++;
2102             goto reswitch;
2103         case 'V':
2104             {
2105                 SV *opts_prog;
2106
2107                 if (*++s != ':')  {
2108                     opts_prog = newSVpvs("use Config; Config::_V()");
2109                 }
2110                 else {
2111                     ++s;
2112                     opts_prog = Perl_newSVpvf(aTHX_
2113                                               "use Config; Config::config_vars(qw%c%s%c)",
2114                                               0, s, 0);
2115                     s += strlen(s);
2116                 }
2117                 Perl_av_create_and_push(aTHX_ &PL_preambleav, opts_prog);
2118                 /* don't look for script or read stdin */
2119                 scriptname = BIT_BUCKET;
2120                 goto reswitch;
2121             }
2122         case 'x':
2123             doextract = TRUE;
2124             s++;
2125             if (*s)
2126                 cddir = s;
2127             break;
2128         case 0:
2129             break;
2130         case '-':
2131             if (!*++s || isSPACE(*s)) {
2132                 argc--,argv++;
2133                 goto switch_end;
2134             }
2135             /* catch use of gnu style long options.
2136                Both of these exit immediately.  */
2137             if (strEQ(s, "version"))
2138                 minus_v();
2139             if (strEQ(s, "help"))
2140                 usage();
2141             s--;
2142             /* FALLTHROUGH */
2143         default:
2144             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
2145         }
2146     }
2147     }
2148
2149   switch_end:
2150
2151     {
2152         char *s;
2153
2154     if (
2155 #ifndef SECURE_INTERNAL_GETENV
2156         !TAINTING_get &&
2157 #endif
2158         (s = PerlEnv_getenv("PERL5OPT")))
2159     {
2160         /* s points to static memory in getenv(), which may be overwritten at
2161          * any time; use a mortal copy instead */
2162         s = SvPVX(sv_2mortal(newSVpv(s, 0)));
2163
2164         while (isSPACE(*s))
2165             s++;
2166         if (*s == '-' && *(s+1) == 'T') {
2167 #if defined(SILENT_NO_TAINT_SUPPORT)
2168             /* silently ignore */
2169 #elif defined(NO_TAINT_SUPPORT)
2170             Perl_croak_nocontext("This perl was compiled without taint support. "
2171                        "Cowardly refusing to run with -t or -T flags");
2172 #else
2173             CHECK_MALLOC_TOO_LATE_FOR('T');
2174             TAINTING_set(TRUE);
2175             TAINT_WARN_set(FALSE);
2176 #endif
2177         }
2178         else {
2179             char *popt_copy = NULL;
2180             while (s && *s) {
2181                 const char *d;
2182                 while (isSPACE(*s))
2183                     s++;
2184                 if (*s == '-') {
2185                     s++;
2186                     if (isSPACE(*s))
2187                         continue;
2188                 }
2189                 d = s;
2190                 if (!*s)
2191                     break;
2192                 if (!strchr("CDIMUdmtwW", *s))
2193                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
2194                 while (++s && *s) {
2195                     if (isSPACE(*s)) {
2196                         if (!popt_copy) {
2197                             popt_copy = SvPVX(sv_2mortal(newSVpv(d,0)));
2198                             s = popt_copy + (s - d);
2199                             d = popt_copy;
2200                         }
2201                         *s++ = '\0';
2202                         break;
2203                     }
2204                 }
2205                 if (*d == 't') {
2206 #if defined(SILENT_NO_TAINT_SUPPORT)
2207             /* silently ignore */
2208 #elif defined(NO_TAINT_SUPPORT)
2209                     Perl_croak_nocontext("This perl was compiled without taint support. "
2210                                "Cowardly refusing to run with -t or -T flags");
2211 #else
2212                     if( !TAINTING_get) {
2213                         TAINT_WARN_set(TRUE);
2214                         TAINTING_set(TRUE);
2215                     }
2216 #endif
2217                 } else {
2218                     moreswitches(d);
2219                 }
2220             }
2221         }
2222     }
2223     }
2224
2225 #ifndef NO_PERL_INTERNAL_RAND_SEED
2226     /* If we're not set[ug]id, we might have honored
2227        PERL_INTERNAL_RAND_SEED in perl_construct().
2228        At this point command-line options have been parsed, so if
2229        we're now tainting and not set[ug]id re-seed.
2230        This could possibly be wasteful if PERL_INTERNAL_RAND_SEED is invalid,
2231        but avoids duplicating the logic from perl_construct().
2232     */
2233     if (PL_tainting &&
2234         PerlProc_getuid() == PerlProc_geteuid() &&
2235         PerlProc_getgid() == PerlProc_getegid()) {
2236         Perl_drand48_init_r(&PL_internal_random_state, seed());
2237     }
2238 #endif
2239
2240     /* Set $^X early so that it can be used for relocatable paths in @INC  */
2241     /* and for SITELIB_EXP in USE_SITECUSTOMIZE                            */
2242     assert (!TAINT_get);
2243     TAINT;
2244     set_caret_X();
2245     TAINT_NOT;
2246
2247 #if defined(USE_SITECUSTOMIZE)
2248     if (!minus_f) {
2249         /* The games with local $! are to avoid setting errno if there is no
2250            sitecustomize script.  "q%c...%c", 0, ..., 0 becomes "q\0...\0",
2251            ie a q() operator with a NUL byte as a the delimiter. This avoids
2252            problems with pathnames containing (say) '  */
2253 #  ifdef PERL_IS_MINIPERL
2254         AV *const inc = GvAV(PL_incgv);
2255         SV **const inc0 = inc ? av_fetch(inc, 0, FALSE) : NULL;
2256
2257         if (inc0) {
2258             /* if lib/buildcustomize.pl exists, it should not fail. If it does,
2259                it should be reported immediately as a build failure.  */
2260             (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2261                                                  Perl_newSVpvf(aTHX_
2262                 "BEGIN { my $f = q%c%s%" SVf "/buildcustomize.pl%c; "
2263                         "do {local $!; -f $f }"
2264                         " and do $f || die $@ || qq '$f: $!' }",
2265                                 0, (TAINTING_get ? "./" : ""), SVfARG(*inc0), 0));
2266         }
2267 #  else
2268         /* SITELIB_EXP is a function call on Win32.  */
2269         const char *const raw_sitelib = SITELIB_EXP;
2270         if (raw_sitelib) {
2271             /* process .../.. if PERL_RELOCATABLE_INC is defined */
2272             SV *sitelib_sv = mayberelocate(raw_sitelib, strlen(raw_sitelib),
2273                                            INCPUSH_CAN_RELOCATE);
2274             const char *const sitelib = SvPVX(sitelib_sv);
2275             (void)Perl_av_create_and_unshift_one(aTHX_ &PL_preambleav,
2276                                                  Perl_newSVpvf(aTHX_
2277                                                                "BEGIN { do {local $!; -f q%c%s/sitecustomize.pl%c} && do q%c%s/sitecustomize.pl%c }",
2278                                                                0, SVfARG(sitelib), 0,
2279                                                                0, SVfARG(sitelib), 0));
2280             assert (SvREFCNT(sitelib_sv) == 1);
2281             SvREFCNT_dec(sitelib_sv);
2282         }
2283 #  endif
2284     }
2285 #endif
2286
2287     if (!scriptname)
2288         scriptname = argv[0];
2289     if (PL_e_script) {
2290         argc++,argv--;
2291         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
2292     }
2293     else if (scriptname == NULL) {
2294 #ifdef MSDOS
2295         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
2296             moreswitches("h");
2297 #endif
2298         scriptname = "-";
2299     }
2300
2301     assert (!TAINT_get);
2302     init_perllib();
2303
2304     {
2305         bool suidscript = FALSE;
2306
2307         rsfp = open_script(scriptname, dosearch, &suidscript);
2308         if (!rsfp) {
2309             rsfp = PerlIO_stdin();
2310             lex_start_flags = LEX_DONT_CLOSE_RSFP;
2311         }
2312
2313         validate_suid(rsfp);
2314
2315 #ifndef PERL_MICRO
2316 #  if defined(SIGCHLD) || defined(SIGCLD)
2317         {
2318 #  ifndef SIGCHLD
2319 #    define SIGCHLD SIGCLD
2320 #  endif
2321             Sighandler_t sigstate = rsignal_state(SIGCHLD);
2322             if (sigstate == (Sighandler_t) SIG_IGN) {
2323                 Perl_ck_warner(aTHX_ packWARN(WARN_SIGNAL),
2324                                "Can't ignore signal CHLD, forcing to default");
2325                 (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
2326             }
2327         }
2328 #  endif
2329 #endif
2330
2331         if (doextract) {
2332
2333             /* This will croak if suidscript is true, as -x cannot be used with
2334                setuid scripts.  */
2335             forbid_setid('x', suidscript);
2336             /* Hence you can't get here if suidscript is true */
2337
2338             linestr_sv = newSV_type(SVt_PV);
2339             lex_start_flags |= LEX_START_COPIED;
2340             find_beginning(linestr_sv, rsfp);
2341             if (cddir && PerlDir_chdir( (char *)cddir ) < 0)
2342                 Perl_croak(aTHX_ "Can't chdir to %s",cddir);
2343         }
2344     }
2345
2346     PL_main_cv = PL_compcv = MUTABLE_CV(newSV_type(SVt_PVCV));
2347     CvUNIQUE_on(PL_compcv);
2348
2349     CvPADLIST_set(PL_compcv, pad_new(0));
2350
2351     PL_isarev = newHV();
2352
2353     boot_core_PerlIO();
2354     boot_core_UNIVERSAL();
2355     boot_core_mro();
2356     newXS("Internals::V", S_Internals_V, __FILE__);
2357
2358     if (xsinit)
2359         (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
2360 #ifndef PERL_MICRO
2361 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(SYMBIAN)
2362     init_os_extras();
2363 #endif
2364 #endif
2365
2366 #ifdef USE_SOCKS
2367 #   ifdef HAS_SOCKS5_INIT
2368     socks5_init(argv[0]);
2369 #   else
2370     SOCKSinit(argv[0]);
2371 #   endif
2372 #endif
2373
2374     init_predump_symbols();
2375     /* init_postdump_symbols not currently designed to be called */
2376     /* more than once (ENV isn't cleared first, for example)     */
2377     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
2378     if (!PL_do_undump)
2379         init_postdump_symbols(argc,argv,env);
2380
2381     /* PL_unicode is turned on by -C, or by $ENV{PERL_UNICODE},
2382      * or explicitly in some platforms.
2383      * PL_utf8locale is conditionally turned on by
2384      * locale.c:Perl_init_i18nl10n() if the environment
2385      * look like the user wants to use UTF-8. */
2386 #if defined(__SYMBIAN32__)
2387     PL_unicode = PERL_UNICODE_STD_FLAG; /* See PERL_SYMBIAN_CONSOLE_UTF8. */
2388 #endif
2389 #  ifndef PERL_IS_MINIPERL
2390     if (PL_unicode) {
2391          /* Requires init_predump_symbols(). */
2392          if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
2393               IO* io;
2394               PerlIO* fp;
2395               SV* sv;
2396
2397               /* Turn on UTF-8-ness on STDIN, STDOUT, STDERR
2398                * and the default open disciplines. */
2399               if ((PL_unicode & PERL_UNICODE_STDIN_FLAG) &&
2400                   PL_stdingv  && (io = GvIO(PL_stdingv)) &&
2401                   (fp = IoIFP(io)))
2402                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2403               if ((PL_unicode & PERL_UNICODE_STDOUT_FLAG) &&
2404                   PL_defoutgv && (io = GvIO(PL_defoutgv)) &&
2405                   (fp = IoOFP(io)))
2406                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2407               if ((PL_unicode & PERL_UNICODE_STDERR_FLAG) &&
2408                   PL_stderrgv && (io = GvIO(PL_stderrgv)) &&
2409                   (fp = IoOFP(io)))
2410                    PerlIO_binmode(aTHX_ fp, IoTYPE(io), 0, ":utf8");
2411               if ((PL_unicode & PERL_UNICODE_INOUT_FLAG) &&
2412                   (sv = GvSV(gv_fetchpvs("\017PEN", GV_ADD|GV_NOTQUAL,
2413                                          SVt_PV)))) {
2414                    U32 in  = PL_unicode & PERL_UNICODE_IN_FLAG;
2415                    U32 out = PL_unicode & PERL_UNICODE_OUT_FLAG;
2416                    if (in) {
2417                         if (out)
2418                              sv_setpvs(sv, ":utf8\0:utf8");
2419                         else
2420                              sv_setpvs(sv, ":utf8\0");
2421                    }
2422                    else if (out)
2423                         sv_setpvs(sv, "\0:utf8");
2424                    SvSETMAGIC(sv);
2425               }
2426          }
2427     }
2428 #endif
2429
2430     {
2431         const char *s;
2432     if ((s = PerlEnv_getenv("PERL_SIGNALS"))) {
2433          if (strEQ(s, "unsafe"))
2434               PL_signals |=  PERL_SIGNALS_UNSAFE_FLAG;
2435          else if (strEQ(s, "safe"))
2436               PL_signals &= ~PERL_SIGNALS_UNSAFE_FLAG;
2437          else
2438               Perl_croak(aTHX_ "PERL_SIGNALS illegal: \"%s\"", s);
2439     }
2440     }
2441
2442
2443     lex_start(linestr_sv, rsfp, lex_start_flags);
2444     SvREFCNT_dec(linestr_sv);
2445
2446     PL_subname = newSVpvs("main");
2447
2448     if (add_read_e_script)
2449         filter_add(read_e_script, NULL);
2450
2451     /* now parse the script */
2452
2453     SETERRNO(0,SS_NORMAL);
2454     if (yyparse(GRAMPROG) || PL_parser->error_count) {
2455         abort_execution("", PL_origfilename);
2456     }
2457     CopLINE_set(PL_curcop, 0);
2458     SET_CURSTASH(PL_defstash);
2459     if (PL_e_script) {
2460         SvREFCNT_dec(PL_e_script);
2461         PL_e_script = NULL;
2462     }
2463
2464     if (PL_do_undump)
2465         my_unexec();
2466
2467     if (isWARN_ONCE) {
2468         SAVECOPFILE(PL_curcop);
2469         SAVECOPLINE(PL_curcop);
2470         gv_check(PL_defstash);
2471     }
2472
2473     LEAVE;
2474     FREETMPS;
2475
2476 #ifdef MYMALLOC
2477     {
2478         const char *s;
2479         UV uv;
2480         s = PerlEnv_getenv("PERL_DEBUG_MSTATS");
2481         if (s && grok_atoUV(s, &uv, NULL) && uv >= 2)
2482             dump_mstats("after compilation:");
2483     }
2484 #endif
2485
2486     ENTER;
2487     PL_restartjmpenv = NULL;
2488     PL_restartop = 0;
2489     return NULL;
2490 }
2491
2492 /*
2493 =for apidoc perl_run
2494
2495 Tells a Perl interpreter to run.  See L<perlembed>.
2496
2497 =cut
2498 */
2499
2500 int
2501 perl_run(pTHXx)
2502 {
2503     I32 oldscope;
2504     int ret = 0;
2505     dJMPENV;
2506
2507     PERL_ARGS_ASSERT_PERL_RUN;
2508 #ifndef MULTIPLICITY
2509     PERL_UNUSED_ARG(my_perl);
2510 #endif
2511
2512     oldscope = PL_scopestack_ix;
2513 #ifdef VMS
2514     VMSISH_HUSHED = 0;
2515 #endif
2516
2517     JMPENV_PUSH(ret);
2518     switch (ret) {
2519     case 1:
2520         cxstack_ix = -1;                /* start context stack again */
2521         goto redo_body;
2522     case 0:                             /* normal completion */
2523  redo_body:
2524         run_body(oldscope);
2525         /* FALLTHROUGH */
2526     case 2:                             /* my_exit() */
2527         while (PL_scopestack_ix > oldscope)
2528             LEAVE;
2529         FREETMPS;
2530         SET_CURSTASH(PL_defstash);
2531         if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) &&
2532             PL_endav && !PL_minus_c) {
2533             PERL_SET_PHASE(PERL_PHASE_END);
2534             call_list(oldscope, PL_endav);
2535         }
2536 #ifdef MYMALLOC
2537         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
2538             dump_mstats("after execution:  ");
2539 #endif
2540         ret = STATUS_EXIT;
2541         break;
2542     case 3:
2543         if (PL_restartop) {
2544             POPSTACK_TO(PL_mainstack);
2545             goto redo_body;
2546         }
2547         PerlIO_printf(Perl_error_log, "panic: restartop in perl_run\n");
2548         FREETMPS;
2549         ret = 1;
2550         break;
2551     }
2552
2553     JMPENV_POP;
2554     return ret;
2555 }
2556
2557 STATIC void
2558 S_run_body(pTHX_ I32 oldscope)
2559 {
2560     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support (0x%x).\n",
2561                     PL_sawampersand ? "Enabling" : "Omitting",
2562                     (unsigned int)(PL_sawampersand)));
2563
2564     if (!PL_restartop) {
2565 #ifdef DEBUGGING
2566         if (DEBUG_x_TEST || DEBUG_B_TEST)
2567             dump_all_perl(!DEBUG_B_TEST);
2568         if (!DEBUG_q_TEST)
2569           PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
2570 #endif
2571
2572         if (PL_minus_c) {
2573             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
2574             my_exit(0);
2575         }
2576         if (PERLDB_SINGLE && PL_DBsingle)
2577             PL_DBsingle_iv = 1;
2578         if (PL_initav) {
2579             PERL_SET_PHASE(PERL_PHASE_INIT);
2580             call_list(oldscope, PL_initav);
2581         }
2582 #ifdef PERL_DEBUG_READONLY_OPS
2583         if (PL_main_root && PL_main_root->op_slabbed)
2584             Slab_to_ro(OpSLAB(PL_main_root));
2585 #endif
2586     }
2587
2588     /* do it */
2589
2590     PERL_SET_PHASE(PERL_PHASE_RUN);
2591
2592     if (PL_restartop) {
2593         PL_restartjmpenv = NULL;
2594         PL_op = PL_restartop;
2595         PL_restartop = 0;
2596         CALLRUNOPS(aTHX);
2597     }
2598     else if (PL_main_start) {
2599         CvDEPTH(PL_main_cv) = 1;
2600         PL_op = PL_main_start;
2601         CALLRUNOPS(aTHX);
2602     }
2603     my_exit(0);
2604     NOT_REACHED; /* NOTREACHED */
2605 }
2606
2607 /*
2608 =head1 SV Manipulation Functions
2609
2610 =for apidoc p||get_sv
2611
2612 Returns the SV of the specified Perl scalar.  C<flags> are passed to
2613 C<gv_fetchpv>.  If C<GV_ADD> is set and the
2614 Perl variable does not exist then it will be created.  If C<flags> is zero
2615 and the variable does not exist then NULL is returned.
2616
2617 =cut
2618 */
2619
2620 SV*
2621 Perl_get_sv(pTHX_ const char *name, I32 flags)
2622 {
2623     GV *gv;
2624
2625     PERL_ARGS_ASSERT_GET_SV;
2626
2627     gv = gv_fetchpv(name, flags, SVt_PV);
2628     if (gv)
2629         return GvSV(gv);
2630     return NULL;
2631 }
2632
2633 /*
2634 =head1 Array Manipulation Functions
2635
2636 =for apidoc p||get_av
2637
2638 Returns the AV of the specified Perl global or package array with the given
2639 name (so it won't work on lexical variables).  C<flags> are passed 
2640 to C<gv_fetchpv>.  If C<GV_ADD> is set and the
2641 Perl variable does not exist then it will be created.  If C<flags> is zero
2642 and the variable does not exist then NULL is returned.
2643
2644 Perl equivalent: C<@{"$name"}>.
2645
2646 =cut
2647 */
2648
2649 AV*
2650 Perl_get_av(pTHX_ const char *name, I32 flags)
2651 {
2652     GV* const gv = gv_fetchpv(name, flags, SVt_PVAV);
2653
2654     PERL_ARGS_ASSERT_GET_AV;
2655
2656     if (flags)
2657         return GvAVn(gv);
2658     if (gv)
2659         return GvAV(gv);
2660     return NULL;
2661 }
2662
2663 /*
2664 =head1 Hash Manipulation Functions
2665
2666 =for apidoc p||get_hv
2667
2668 Returns the HV of the specified Perl hash.  C<flags> are passed to
2669 C<gv_fetchpv>.  If C<GV_ADD> is set and the
2670 Perl variable does not exist then it will be created.  If C<flags> is zero
2671 and the variable does not exist then C<NULL> is returned.
2672
2673 =cut
2674 */
2675
2676 HV*
2677 Perl_get_hv(pTHX_ const char *name, I32 flags)
2678 {
2679     GV* const gv = gv_fetchpv(name, flags, SVt_PVHV);
2680
2681     PERL_ARGS_ASSERT_GET_HV;
2682
2683     if (flags)
2684         return GvHVn(gv);
2685     if (gv)
2686         return GvHV(gv);
2687     return NULL;
2688 }
2689
2690 /*
2691 =head1 CV Manipulation Functions
2692
2693 =for apidoc p||get_cvn_flags
2694
2695 Returns the CV of the specified Perl subroutine.  C<flags> are passed to
2696 C<gv_fetchpvn_flags>.  If C<GV_ADD> is set and the Perl subroutine does not
2697 exist then it will be declared (which has the same effect as saying
2698 C<sub name;>).  If C<GV_ADD> is not set and the subroutine does not exist
2699 then NULL is returned.
2700
2701 =for apidoc p||get_cv
2702
2703 Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
2704
2705 =cut
2706 */
2707
2708 CV*
2709 Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags)
2710 {
2711     GV* const gv = gv_fetchpvn_flags(name, len, flags, SVt_PVCV);
2712
2713     PERL_ARGS_ASSERT_GET_CVN_FLAGS;
2714
2715     /* XXX this is probably not what they think they're getting.
2716      * It has the same effect as "sub name;", i.e. just a forward
2717      * declaration! */
2718     if ((flags & ~GV_NOADD_MASK) && !GvCVu(gv)) {
2719         return newSTUB(gv,0);
2720     }
2721     if (gv)
2722         return GvCVu(gv);
2723     return NULL;
2724 }
2725
2726 /* Nothing in core calls this now, but we can't replace it with a macro and
2727    move it to mathoms.c as a macro would evaluate name twice.  */
2728 CV*
2729 Perl_get_cv(pTHX_ const char *name, I32 flags)
2730 {
2731     PERL_ARGS_ASSERT_GET_CV;
2732
2733     return get_cvn_flags(name, strlen(name), flags);
2734 }
2735
2736 /* Be sure to refetch the stack pointer after calling these routines. */
2737
2738 /*
2739
2740 =head1 Callback Functions
2741
2742 =for apidoc p||call_argv
2743
2744 Performs a callback to the specified named and package-scoped Perl subroutine 
2745 with C<argv> (a C<NULL>-terminated array of strings) as arguments.  See
2746 L<perlcall>.
2747
2748 Approximate Perl equivalent: C<&{"$sub_name"}(@$argv)>.
2749
2750 =cut
2751 */
2752
2753 I32
2754 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, char **argv)
2755
2756                         /* See G_* flags in cop.h */
2757                         /* null terminated arg list */
2758 {
2759     dSP;
2760
2761     PERL_ARGS_ASSERT_CALL_ARGV;
2762
2763     PUSHMARK(SP);
2764     while (*argv) {
2765         mXPUSHs(newSVpv(*argv,0));
2766         argv++;
2767     }
2768     PUTBACK;
2769     return call_pv(sub_name, flags);
2770 }
2771
2772 /*
2773 =for apidoc p||call_pv
2774
2775 Performs a callback to the specified Perl sub.  See L<perlcall>.
2776
2777 =cut
2778 */
2779
2780 I32
2781 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
2782                         /* name of the subroutine */
2783                         /* See G_* flags in cop.h */
2784 {
2785     PERL_ARGS_ASSERT_CALL_PV;
2786
2787     return call_sv(MUTABLE_SV(get_cv(sub_name, GV_ADD)), flags);
2788 }
2789
2790 /*
2791 =for apidoc p||call_method
2792
2793 Performs a callback to the specified Perl method.  The blessed object must
2794 be on the stack.  See L<perlcall>.
2795
2796 =cut
2797 */
2798
2799 I32
2800 Perl_call_method(pTHX_ const char *methname, I32 flags)
2801                         /* name of the subroutine */
2802                         /* See G_* flags in cop.h */
2803 {
2804     STRLEN len;
2805     SV* sv;
2806     PERL_ARGS_ASSERT_CALL_METHOD;
2807
2808     len = strlen(methname);
2809     sv = flags & G_METHOD_NAMED
2810         ? sv_2mortal(newSVpvn_share(methname, len,0))
2811         : newSVpvn_flags(methname, len, SVs_TEMP);
2812
2813     return call_sv(sv, flags | G_METHOD);
2814 }
2815
2816 /* May be called with any of a CV, a GV, or an SV containing the name. */
2817 /*
2818 =for apidoc p||call_sv
2819
2820 Performs a callback to the Perl sub specified by the SV.
2821
2822 If neither the C<G_METHOD> nor C<G_METHOD_NAMED> flag is supplied, the
2823 SV may be any of a CV, a GV, a reference to a CV, a reference to a GV
2824 or C<SvPV(sv)> will be used as the name of the sub to call.
2825
2826 If the C<G_METHOD> flag is supplied, the SV may be a reference to a CV or
2827 C<SvPV(sv)> will be used as the name of the method to call.
2828
2829 If the C<G_METHOD_NAMED> flag is supplied, C<SvPV(sv)> will be used as
2830 the name of the method to call.
2831
2832 Some other values are treated specially for internal use and should
2833 not be depended on.
2834
2835 See L<perlcall>.
2836
2837 =cut
2838 */
2839
2840 I32
2841 Perl_call_sv(pTHX_ SV *sv, VOL I32 flags)
2842                         /* See G_* flags in cop.h */
2843 {
2844     dVAR;
2845     LOGOP myop;         /* fake syntax tree node */
2846     METHOP method_op;
2847     I32 oldmark;
2848     VOL I32 retval = 0;
2849     bool oldcatch = CATCH_GET;
2850     int ret;
2851     OP* const oldop = PL_op;
2852     dJMPENV;
2853
2854     PERL_ARGS_ASSERT_CALL_SV;
2855
2856     if (flags & G_DISCARD) {
2857         ENTER;
2858         SAVETMPS;
2859     }
2860     if (!(flags & G_WANT)) {
2861         /* Backwards compatibility - as G_SCALAR was 0, it could be omitted.
2862          */
2863         flags |= G_SCALAR;
2864     }
2865
2866     Zero(&myop, 1, LOGOP);
2867     if (!(flags & G_NOARGS))
2868         myop.op_flags |= OPf_STACKED;
2869     myop.op_flags |= OP_GIMME_REVERSE(flags);
2870     SAVEOP();
2871     PL_op = (OP*)&myop;
2872
2873     if (!(flags & G_METHOD_NAMED)) {
2874         dSP;
2875         EXTEND(SP, 1);
2876         PUSHs(sv);
2877         PUTBACK;
2878     }
2879     oldmark = TOPMARK;
2880
2881     if (PERLDB_SUB && PL_curstash != PL_debstash
2882            /* Handle first BEGIN of -d. */
2883           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
2884            /* Try harder, since this may have been a sighandler, thus
2885             * curstash may be meaningless. */
2886           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((const CV *)sv) != PL_debstash)
2887           && !(flags & G_NODEBUG))
2888         myop.op_private |= OPpENTERSUB_DB;
2889
2890     if (flags & (G_METHOD|G_METHOD_NAMED)) {
2891         Zero(&method_op, 1, METHOP);
2892         method_op.op_next = (OP*)&myop;
2893         PL_op = (OP*)&method_op;
2894         if ( flags & G_METHOD_NAMED ) {
2895             method_op.op_ppaddr = PL_ppaddr[OP_METHOD_NAMED];
2896             method_op.op_type = OP_METHOD_NAMED;
2897             method_op.op_u.op_meth_sv = sv;
2898         } else {
2899             method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
2900             method_op.op_type = OP_METHOD;
2901         }
2902         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
2903         myop.op_type = OP_ENTERSUB;
2904     }
2905
2906     if (!(flags & G_EVAL)) {
2907         CATCH_SET(TRUE);
2908         CALL_BODY_SUB((OP*)&myop);
2909         retval = PL_stack_sp - (PL_stack_base + oldmark);
2910         CATCH_SET(oldcatch);
2911     }
2912     else {
2913         I32 old_cxix;
2914         myop.op_other = (OP*)&myop;
2915         (void)POPMARK;
2916         old_cxix = cxstack_ix;
2917         create_eval_scope(NULL, flags|G_FAKINGEVAL);
2918         INCMARK;
2919
2920         JMPENV_PUSH(ret);
2921
2922         switch (ret) {
2923         case 0:
2924  redo_body:
2925             CALL_BODY_SUB((OP*)&myop);
2926             retval = PL_stack_sp - (PL_stack_base + oldmark);
2927             if (!(flags & G_KEEPERR)) {
2928                 CLEAR_ERRSV();
2929             }
2930             break;
2931         case 1:
2932             STATUS_ALL_FAILURE;
2933             /* FALLTHROUGH */
2934         case 2:
2935             /* my_exit() was called */
2936             SET_CURSTASH(PL_defstash);
2937             FREETMPS;
2938             JMPENV_POP;
2939             my_exit_jump();
2940             NOT_REACHED; /* NOTREACHED */
2941         case 3:
2942             if (PL_restartop) {
2943                 PL_restartjmpenv = NULL;
2944                 PL_op = PL_restartop;
2945                 PL_restartop = 0;
2946                 goto redo_body;
2947             }
2948             PL_stack_sp = PL_stack_base + oldmark;
2949             if ((flags & G_WANT) == G_ARRAY)
2950                 retval = 0;
2951             else {
2952                 retval = 1;
2953                 *++PL_stack_sp = &PL_sv_undef;
2954             }
2955             break;
2956         }
2957
2958         /* if we croaked, depending on how we croaked the eval scope
2959          * may or may not have already been popped */
2960         if (cxstack_ix > old_cxix) {
2961             assert(cxstack_ix == old_cxix + 1);
2962             assert(CxTYPE(CX_CUR()) == CXt_EVAL);
2963             delete_eval_scope();
2964         }
2965         JMPENV_POP;
2966     }
2967
2968     if (flags & G_DISCARD) {
2969         PL_stack_sp = PL_stack_base + oldmark;
2970         retval = 0;
2971         FREETMPS;
2972         LEAVE;
2973     }
2974     PL_op = oldop;
2975     return retval;
2976 }
2977
2978 /* Eval a string. The G_EVAL flag is always assumed. */
2979
2980 /*
2981 =for apidoc p||eval_sv
2982
2983 Tells Perl to C<eval> the string in the SV.  It supports the same flags
2984 as C<call_sv>, with the obvious exception of C<G_EVAL>.  See L<perlcall>.
2985
2986 =cut
2987 */
2988
2989 I32
2990 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
2991
2992                         /* See G_* flags in cop.h */
2993 {
2994     dVAR;
2995     UNOP myop;          /* fake syntax tree node */
2996     VOL I32 oldmark;
2997     VOL I32 retval = 0;
2998     int ret;
2999     OP* const oldop = PL_op;
3000     dJMPENV;
3001
3002     PERL_ARGS_ASSERT_EVAL_SV;
3003
3004     if (flags & G_DISCARD) {
3005         ENTER;
3006         SAVETMPS;
3007     }
3008
3009     SAVEOP();
3010     PL_op = (OP*)&myop;
3011     Zero(&myop, 1, UNOP);
3012     {
3013         dSP;
3014         oldmark = SP - PL_stack_base;
3015         EXTEND(SP, 1);
3016         PUSHs(sv);
3017         PUTBACK;
3018     }
3019
3020     if (!(flags & G_NOARGS))
3021         myop.op_flags = OPf_STACKED;
3022     myop.op_type = OP_ENTEREVAL;
3023     myop.op_flags |= OP_GIMME_REVERSE(flags);
3024     if (flags & G_KEEPERR)
3025         myop.op_flags |= OPf_SPECIAL;
3026
3027     if (flags & G_RE_REPARSING)
3028         myop.op_private = (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING);
3029
3030     /* fail now; otherwise we could fail after the JMPENV_PUSH but
3031      * before a cx_pusheval(), which corrupts the stack after a croak */
3032     TAINT_PROPER("eval_sv()");
3033
3034     JMPENV_PUSH(ret);
3035     switch (ret) {
3036     case 0:
3037  redo_body:
3038         if (PL_op == (OP*)(&myop)) {
3039             PL_op = PL_ppaddr[OP_ENTEREVAL](aTHX);
3040             if (!PL_op)
3041                 goto fail; /* failed in compilation */
3042         }
3043         CALLRUNOPS(aTHX);
3044         retval = PL_stack_sp - (PL_stack_base + oldmark);
3045         if (!(flags & G_KEEPERR)) {
3046             CLEAR_ERRSV();
3047         }
3048         break;
3049     case 1:
3050         STATUS_ALL_FAILURE;
3051         /* FALLTHROUGH */
3052     case 2:
3053         /* my_exit() was called */
3054         SET_CURSTASH(PL_defstash);
3055         FREETMPS;
3056         JMPENV_POP;
3057         my_exit_jump();
3058         NOT_REACHED; /* NOTREACHED */
3059     case 3:
3060         if (PL_restartop) {
3061             PL_restartjmpenv = NULL;
3062             PL_op = PL_restartop;
3063             PL_restartop = 0;
3064             goto redo_body;
3065         }
3066       fail:
3067         PL_stack_sp = PL_stack_base + oldmark;
3068         if ((flags & G_WANT) == G_ARRAY)
3069             retval = 0;
3070         else {
3071             retval = 1;
3072             *++PL_stack_sp = &PL_sv_undef;
3073         }
3074         break;
3075     }
3076
3077     JMPENV_POP;
3078     if (flags & G_DISCARD) {
3079         PL_stack_sp = PL_stack_base + oldmark;
3080         retval = 0;
3081         FREETMPS;
3082         LEAVE;
3083     }
3084     PL_op = oldop;
3085     return retval;
3086 }
3087
3088 /*
3089 =for apidoc p||eval_pv
3090
3091 Tells Perl to C<eval> the given string in scalar context and return an SV* result.
3092
3093 =cut
3094 */
3095
3096 SV*
3097 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
3098 {
3099     SV* sv = newSVpv(p, 0);
3100
3101     PERL_ARGS_ASSERT_EVAL_PV;
3102
3103     eval_sv(sv, G_SCALAR);
3104     SvREFCNT_dec(sv);
3105
3106     {
3107         dSP;
3108         sv = POPs;
3109         PUTBACK;
3110     }
3111
3112     /* just check empty string or undef? */
3113     if (croak_on_error) {
3114         SV * const errsv = ERRSV;
3115         if(SvTRUE_NN(errsv))
3116             /* replace with croak_sv? */
3117             Perl_croak_nocontext("%s", SvPV_nolen_const(errsv));
3118     }
3119
3120     return sv;
3121 }
3122
3123 /* Require a module. */
3124
3125 /*
3126 =head1 Embedding Functions
3127
3128 =for apidoc p||require_pv
3129
3130 Tells Perl to C<require> the file named by the string argument.  It is
3131 analogous to the Perl code C<eval "require '$file'">.  It's even
3132 implemented that way; consider using load_module instead.
3133
3134 =cut */
3135
3136 void
3137 Perl_require_pv(pTHX_ const char *pv)
3138 {
3139     dSP;
3140     SV* sv;
3141
3142     PERL_ARGS_ASSERT_REQUIRE_PV;
3143
3144     PUSHSTACKi(PERLSI_REQUIRE);
3145     sv = Perl_newSVpvf(aTHX_ "require q%c%s%c", 0, pv, 0);
3146     eval_sv(sv_2mortal(sv), G_DISCARD);
3147     POPSTACK;
3148 }
3149
3150 STATIC void
3151 S_usage(pTHX)           /* XXX move this out into a module ? */
3152 {
3153     /* This message really ought to be max 23 lines.
3154      * Removed -h because the user already knows that option. Others? */
3155
3156     /* Grouped as 6 lines per C string literal, to keep under the ANSI C 89
3157        minimum of 509 character string literals.  */
3158     static const char * const usage_msg[] = {
3159 "  -0[octal]         specify record separator (\\0, if no argument)\n"
3160 "  -a                autosplit mode with -n or -p (splits $_ into @F)\n"
3161 "  -C[number/list]   enables the listed Unicode features\n"
3162 "  -c                check syntax only (runs BEGIN and CHECK blocks)\n"
3163 "  -d[:debugger]     run program under debugger\n"
3164 "  -D[number/list]   set debugging flags (argument is a bit mask or alphabets)\n",
3165 "  -e program        one line of program (several -e's allowed, omit programfile)\n"
3166 "  -E program        like -e, but enables all optional features\n"
3167 "  -f                don't do $sitelib/sitecustomize.pl at startup\n"
3168 "  -F/pattern/       split() pattern for -a switch (//'s are optional)\n"
3169 "  -i[extension]     edit <> files in place (makes backup if extension supplied)\n"
3170 "  -Idirectory       specify @INC/#include directory (several -I's allowed)\n",
3171 "  -l[octal]         enable line ending processing, specifies line terminator\n"
3172 "  -[mM][-]module    execute \"use/no module...\" before executing program\n"
3173 "  -n                assume \"while (<>) { ... }\" loop around program\n"
3174 "  -p                assume loop like -n but print line also, like sed\n"
3175 "  -s                enable rudimentary parsing for switches after programfile\n"
3176 "  -S                look for programfile using PATH environment variable\n",
3177 "  -t                enable tainting warnings\n"
3178 "  -T                enable tainting checks\n"
3179 "  -u                dump core after parsing program\n"
3180 "  -U                allow unsafe operations\n"
3181 "  -v                print version, patchlevel and license\n"
3182 "  -V[:variable]     print configuration summary (or a single Config.pm variable)\n",
3183 "  -w                enable many useful warnings\n"
3184 "  -W                enable all warnings\n"
3185 "  -x[directory]     ignore text before #!perl line (optionally cd to directory)\n"
3186 "  -X                disable all warnings\n"
3187 "  \n"
3188 "Run 'perldoc perl' for more help with Perl.\n\n",
3189 NULL
3190 };
3191     const char * const *p = usage_msg;
3192     PerlIO *out = PerlIO_stdout();
3193
3194     PerlIO_printf(out,
3195                   "\nUsage: %s [switches] [--] [programfile] [arguments]\n",
3196                   PL_origargv[0]);
3197     while (*p)
3198         PerlIO_puts(out, *p++);
3199     my_exit(0);
3200 }
3201
3202 /* convert a string of -D options (or digits) into an int.
3203  * sets *s to point to the char after the options */
3204
3205 #ifdef DEBUGGING
3206 int
3207 Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
3208 {
3209     static const char * const usage_msgd[] = {
3210       " Debugging flag values: (see also -d)\n"
3211       "  p  Tokenizing and parsing (with v, displays parse stack)\n"
3212       "  s  Stack snapshots (with v, displays all stacks)\n"
3213       "  l  Context (loop) stack processing\n"
3214       "  t  Trace execution\n"
3215       "  o  Method and overloading resolution\n",
3216       "  c  String/numeric conversions\n"
3217       "  P  Print profiling info, source file input state\n"
3218       "  m  Memory and SV allocation\n"
3219       "  f  Format processing\n"
3220       "  r  Regular expression parsing and execution\n"
3221       "  x  Syntax tree dump\n",
3222       "  u  Tainting checks\n"
3223       "  H  Hash dump -- usurps values()\n"
3224       "  X  Scratchpad allocation\n"
3225       "  D  Cleaning up\n"
3226       "  S  Op slab allocation\n"
3227       "  T  Tokenising\n"
3228       "  R  Include reference counts of dumped variables (eg when using -Ds)\n",
3229       "  J  Do not s,t,P-debug (Jump over) opcodes within package DB\n"
3230       "  v  Verbose: use in conjunction with other flags\n"
3231       "  C  Copy On Write\n"
3232       "  A  Consistency checks on internal structures\n"
3233       "  q  quiet - currently only suppresses the 'EXECUTING' message\n"
3234       "  M  trace smart match resolution\n"
3235       "  B  dump suBroutine definitions, including special Blocks like BEGIN\n",
3236       "  L  trace some locale setting information--for Perl core development\n",
3237       "  i  trace PerlIO layer processing\n",
3238       NULL
3239     };
3240     UV uv = 0;
3241
3242     PERL_ARGS_ASSERT_GET_DEBUG_OPTS;
3243
3244     if (isALPHA(**s)) {
3245         /* if adding extra options, remember to update DEBUG_MASK */
3246         static const char debopts[] = "psltocPmfrxuUHXDSTRJvCAqMBLi";
3247
3248         for (; isWORDCHAR(**s); (*s)++) {
3249             const char * const d = strchr(debopts,**s);
3250             if (d)
3251                 uv |= 1 << (d - debopts);
3252             else if (ckWARN_d(WARN_DEBUGGING))
3253                 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3254                     "invalid option -D%c, use -D'' to see choices\n", **s);
3255         }
3256     }
3257     else if (isDIGIT(**s)) {
3258         const char* e;
3259         if (grok_atoUV(*s, &uv, &e))
3260             *s = e;
3261         for (; isWORDCHAR(**s); (*s)++) ;
3262     }
3263     else if (givehelp) {
3264       const char *const *p = usage_msgd;
3265       while (*p) PerlIO_puts(PerlIO_stdout(), *p++);
3266     }
3267     return (int)uv; /* ignore any UV->int conversion loss */
3268 }
3269 #endif
3270
3271 /* This routine handles any switches that can be given during run */
3272
3273 const char *
3274 Perl_moreswitches(pTHX_ const char *s)
3275 {
3276     dVAR;
3277     UV rschar;
3278     const char option = *s; /* used to remember option in -m/-M code */
3279
3280     PERL_ARGS_ASSERT_MORESWITCHES;
3281
3282     switch (*s) {
3283     case '0':
3284     {
3285          I32 flags = 0;
3286          STRLEN numlen;
3287
3288          SvREFCNT_dec(PL_rs);
3289          if (s[1] == 'x' && s[2]) {
3290               const char *e = s+=2;
3291               U8 *tmps;
3292
3293               while (*e)
3294                 e++;
3295               numlen = e - s;
3296               flags = PERL_SCAN_SILENT_ILLDIGIT;
3297               rschar = (U32)grok_hex(s, &numlen, &flags, NULL);
3298               if (s + numlen < e) {
3299                    rschar = 0; /* Grandfather -0xFOO as -0 -xFOO. */
3300                    numlen = 0;
3301                    s--;
3302               }
3303               PL_rs = newSVpvs("");
3304               tmps = (U8*) SvGROW(PL_rs, (STRLEN)(UVCHR_SKIP(rschar) + 1));
3305               uvchr_to_utf8(tmps, rschar);
3306               SvCUR_set(PL_rs, UVCHR_SKIP(rschar));
3307               SvUTF8_on(PL_rs);
3308          }
3309          else {
3310               numlen = 4;
3311               rschar = (U32)grok_oct(s, &numlen, &flags, NULL);
3312               if (rschar & ~((U8)~0))
3313                    PL_rs = &PL_sv_undef;
3314               else if (!rschar && numlen >= 2)
3315                    PL_rs = newSVpvs("");
3316               else {
3317                    char ch = (char)rschar;
3318                    PL_rs = newSVpvn(&ch, 1);
3319               }
3320          }
3321          sv_setsv(get_sv("/", GV_ADD), PL_rs);
3322          return s + numlen;
3323     }
3324     case 'C':
3325         s++;
3326         PL_unicode = parse_unicode_opts( (const char **)&s );
3327         if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3328             PL_utf8cache = -1;
3329         return s;
3330     case 'F':
3331         PL_minus_a = TRUE;
3332         PL_minus_F = TRUE;
3333         PL_minus_n = TRUE;
3334         PL_splitstr = ++s;
3335         while (*s && !isSPACE(*s)) ++s;
3336         PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr);
3337         return s;
3338     case 'a':
3339         PL_minus_a = TRUE;
3340         PL_minus_n = TRUE;
3341         s++;
3342         return s;
3343     case 'c':
3344         PL_minus_c = TRUE;
3345         s++;
3346         return s;
3347     case 'd':
3348         forbid_setid('d', FALSE);
3349         s++;
3350
3351         /* -dt indicates to the debugger that threads will be used */
3352         if (*s == 't' && !isWORDCHAR(s[1])) {
3353             ++s;
3354             my_setenv("PERL5DB_THREADED", "1");
3355         }
3356
3357         /* The following permits -d:Mod to accepts arguments following an =
3358            in the fashion that -MSome::Mod does. */
3359         if (*s == ':' || *s == '=') {
3360             const char *start;
3361             const char *end;
3362             SV *sv;
3363
3364             if (*++s == '-') {
3365                 ++s;
3366                 sv = newSVpvs("no Devel::");
3367             } else {
3368                 sv = newSVpvs("use Devel::");
3369             }
3370
3371             start = s;
3372             end = s + strlen(s);
3373
3374             /* We now allow -d:Module=Foo,Bar and -d:-Module */
3375             while(isWORDCHAR(*s) || *s==':') ++s;
3376             if (*s != '=')
3377                 sv_catpvn(sv, start, end - start);
3378             else {
3379                 sv_catpvn(sv, start, s-start);
3380                 /* Don't use NUL as q// delimiter here, this string goes in the
3381                  * environment. */
3382                 Perl_sv_catpvf(aTHX_ sv, " split(/,/,q{%s});", ++s);
3383             }
3384             s = end;
3385             my_setenv("PERL5DB", SvPV_nolen_const(sv));
3386             SvREFCNT_dec(sv);
3387         }
3388         if (!PL_perldb) {
3389             PL_perldb = PERLDB_ALL;
3390             init_debugger();
3391         }
3392         return s;
3393     case 'D':
3394     {   
3395 #ifdef DEBUGGING
3396         forbid_setid('D', FALSE);
3397         s++;
3398         PL_debug = get_debug_opts( (const char **)&s, 1) | DEBUG_TOP_FLAG;
3399 #else /* !DEBUGGING */
3400         if (ckWARN_d(WARN_DEBUGGING))
3401             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
3402                    "Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)\n");
3403         for (s++; isWORDCHAR(*s); s++) ;
3404 #endif
3405         return s;
3406         NOT_REACHED; /* NOTREACHED */
3407     }   
3408     case 'h':
3409         usage();
3410         NOT_REACHED; /* NOTREACHED */
3411
3412     case 'i':
3413         Safefree(PL_inplace);
3414         {
3415             const char * const start = ++s;
3416             while (*s && !isSPACE(*s))
3417                 ++s;
3418
3419             PL_inplace = savepvn(start, s - start);
3420         }
3421         return s;
3422     case 'I':   /* -I handled both here and in parse_body() */
3423         forbid_setid('I', FALSE);
3424         ++s;
3425         while (*s && isSPACE(*s))
3426             ++s;
3427         if (*s) {
3428             const char *e, *p;
3429             p = s;
3430             /* ignore trailing spaces (possibly followed by other switches) */
3431             do {
3432                 for (e = p; *e && !isSPACE(*e); e++) ;
3433                 p = e;
3434                 while (isSPACE(*p))
3435                     p++;
3436             } while (*p && *p != '-');
3437             incpush(s, e-s,
3438                     INCPUSH_ADD_SUB_DIRS|INCPUSH_ADD_OLD_VERS|INCPUSH_UNSHIFT);
3439             s = p;
3440             if (*s == '-')
3441                 s++;
3442         }
3443         else
3444             Perl_croak(aTHX_ "No directory specified for -I");
3445         return s;
3446     case 'l':
3447         PL_minus_l = TRUE;
3448         s++;
3449         if (PL_ors_sv) {
3450             SvREFCNT_dec(PL_ors_sv);
3451             PL_ors_sv = NULL;
3452         }
3453         if (isDIGIT(*s)) {
3454             I32 flags = 0;
3455             STRLEN numlen;
3456             PL_ors_sv = newSVpvs("\n");
3457             numlen = 3 + (*s == '0');
3458             *SvPVX(PL_ors_sv) = (char)grok_oct(s, &numlen, &flags, NULL);
3459             s += numlen;
3460         }
3461         else {
3462             if (RsPARA(PL_rs)) {
3463                 PL_ors_sv = newSVpvs("\n\n");
3464             }
3465             else {
3466                 PL_ors_sv = newSVsv(PL_rs);
3467             }
3468         }
3469         return s;
3470     case 'M':
3471         forbid_setid('M', FALSE);       /* XXX ? */
3472         /* FALLTHROUGH */
3473     case 'm':
3474         forbid_setid('m', FALSE);       /* XXX ? */
3475         if (*++s) {
3476             const char *start;
3477             const char *end;
3478             SV *sv;
3479             const char *use = "use ";
3480             bool colon = FALSE;
3481             /* -M-foo == 'no foo'       */
3482             /* Leading space on " no " is deliberate, to make both
3483                possibilities the same length.  */
3484             if (*s == '-') { use = " no "; ++s; }
3485             sv = newSVpvn(use,4);
3486             start = s;
3487             /* We allow -M'Module qw(Foo Bar)'  */
3488             while(isWORDCHAR(*s) || *s==':') {
3489                 if( *s++ == ':' ) {
3490                     if( *s == ':' ) 
3491                         s++;
3492                     else
3493                         colon = TRUE;
3494                 }
3495             }
3496             if (s == start)
3497                 Perl_croak(aTHX_ "Module name required with -%c option",
3498                                     option);
3499             if (colon) 
3500                 Perl_croak(aTHX_ "Invalid module name %.*s with -%c option: "
3501                                     "contains single ':'",
3502                                     (int)(s - start), start, option);
3503             end = s + strlen(s);
3504             if (*s != '=') {
3505                 sv_catpvn(sv, start, end - start);
3506                 if (option == 'm') {
3507                     if (*s != '\0')
3508                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
3509                     sv_catpvs( sv, " ()");
3510                 }
3511             } else {
3512                 sv_catpvn(sv, start, s-start);
3513                 /* Use NUL as q''-delimiter.  */
3514                 sv_catpvs(sv, " split(/,/,q\0");
3515                 ++s;
3516                 sv_catpvn(sv, s, end - s);
3517                 sv_catpvs(sv,  "\0)");
3518             }
3519             s = end;
3520             Perl_av_create_and_push(aTHX_ &PL_preambleav, sv);
3521         }
3522         else
3523             Perl_croak(aTHX_ "Missing argument to -%c", option);
3524         return s;
3525     case 'n':
3526         PL_minus_n = TRUE;
3527         s++;
3528         return s;
3529     case 'p':
3530         PL_minus_p = TRUE;
3531         s++;
3532         return s;
3533     case 's':
3534         forbid_setid('s', FALSE);
3535         PL_doswitches = TRUE;
3536         s++;
3537         return s;
3538     case 't':
3539     case 'T':
3540 #if defined(SILENT_NO_TAINT_SUPPORT)
3541             /* silently ignore */
3542 #elif defined(NO_TAINT_SUPPORT)
3543         Perl_croak_nocontext("This perl was compiled without taint support. "
3544                    "Cowardly refusing to run with -t or -T flags");
3545 #else
3546         if (!TAINTING_get)
3547             TOO_LATE_FOR(*s);
3548 #endif
3549         s++;
3550         return s;
3551     case 'u':
3552         PL_do_undump = TRUE;
3553         s++;
3554         return s;
3555     case 'U':
3556         PL_unsafe = TRUE;
3557         s++;
3558         return s;
3559     case 'v':
3560         minus_v();
3561     case 'w':
3562         if (! (PL_dowarn & G_WARN_ALL_MASK)) {
3563             PL_dowarn |= G_WARN_ON;
3564         }
3565         s++;
3566         return s;
3567     case 'W':
3568         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
3569         if (!specialWARN(PL_compiling.cop_warnings))
3570             PerlMemShared_free(PL_compiling.cop_warnings);
3571         PL_compiling.cop_warnings = pWARN_ALL ;
3572         s++;
3573         return s;
3574     case 'X':
3575         PL_dowarn = G_WARN_ALL_OFF;
3576         if (!specialWARN(PL_compiling.cop_warnings))
3577             PerlMemShared_free(PL_compiling.cop_warnings);
3578         PL_compiling.cop_warnings = pWARN_NONE ;
3579         s++;
3580         return s;
3581     case '*':
3582     case ' ':
3583         while( *s == ' ' )
3584           ++s;
3585         if (s[0] == '-')        /* Additional switches on #! line. */
3586             return s+1;
3587         break;
3588     case '-':
3589     case 0:
3590 #if defined(WIN32) || !defined(PERL_STRICT_CR)
3591     case '\r':
3592 #endif
3593     case '\n':
3594     case '\t':
3595         break;
3596 #ifdef ALTERNATE_SHEBANG
3597     case 'S':                   /* OS/2 needs -S on "extproc" line. */
3598         break;
3599 #endif
3600     case 'e': case 'f': case 'x': case 'E':
3601 #ifndef ALTERNATE_SHEBANG
3602     case 'S':
3603 #endif
3604     case 'V':
3605         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
3606     default:
3607         Perl_croak(aTHX_
3608             "Unrecognized switch: -%.1s  (-h will show valid options)",s
3609         );
3610     }
3611     return NULL;
3612 }
3613
3614
3615 STATIC void
3616 S_minus_v(pTHX)
3617 {
3618         PerlIO * PIO_stdout;
3619         {
3620             const char * const level_str = "v" PERL_VERSION_STRING;
3621             const STRLEN level_len = sizeof("v" PERL_VERSION_STRING)-1;
3622 #ifdef PERL_PATCHNUM
3623             SV* level;
3624 #  ifdef PERL_GIT_UNCOMMITTED_CHANGES
3625             static const char num [] = PERL_PATCHNUM "*";
3626 #  else
3627             static const char num [] = PERL_PATCHNUM;
3628 #  endif
3629             {
3630                 const STRLEN num_len = sizeof(num)-1;
3631                 /* A very advanced compiler would fold away the strnEQ
3632                    and this whole conditional, but most (all?) won't do it.
3633                    SV level could also be replaced by with preprocessor
3634                    catenation.
3635                 */
3636                 if (num_len >= level_len && strnEQ(num,level_str,level_len)) {
3637                     /* per 46807d8e80, PERL_PATCHNUM is outside of the control
3638                        of the interp so it might contain format characters
3639                     */
3640                     level = newSVpvn(num, num_len);
3641                 } else {
3642                     level = Perl_newSVpvf_nocontext("%s (%s)", level_str, num);
3643                 }
3644             }
3645 #else
3646         SV* level = newSVpvn(level_str, level_len);
3647 #endif /* #ifdef PERL_PATCHNUM */
3648         PIO_stdout =  PerlIO_stdout();
3649             PerlIO_printf(PIO_stdout,
3650                 "\nThis is perl "       STRINGIFY(PERL_REVISION)
3651                 ", version "            STRINGIFY(PERL_VERSION)
3652                 ", subversion "         STRINGIFY(PERL_SUBVERSION)
3653                 " (%" SVf ") built for "        ARCHNAME, SVfARG(level)
3654                 );
3655             SvREFCNT_dec_NN(level);
3656         }
3657 #if defined(LOCAL_PATCH_COUNT)
3658         if (LOCAL_PATCH_COUNT > 0)
3659             PerlIO_printf(PIO_stdout,
3660                           "\n(with %d registered patch%s, "
3661                           "see perl -V for more detail)",
3662                           LOCAL_PATCH_COUNT,
3663                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
3664 #endif
3665
3666         PerlIO_printf(PIO_stdout,
3667                       "\n\nCopyright 1987-2017, Larry Wall\n");
3668 #ifdef MSDOS
3669         PerlIO_printf(PIO_stdout,
3670                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
3671 #endif
3672 #ifdef DJGPP
3673         PerlIO_printf(PIO_stdout,
3674                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
3675                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
3676 #endif
3677 #ifdef OS2
3678         PerlIO_printf(PIO_stdout,
3679                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
3680                       "Version 5 port Copyright (c) 1994-2002, Andreas Kaiser, Ilya Zakharevich\n");
3681 #endif
3682 #ifdef OEMVS
3683         PerlIO_printf(PIO_stdout,
3684                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
3685 #endif
3686 #ifdef __VOS__
3687         PerlIO_printf(PIO_stdout,
3688                       "Stratus OpenVOS port by Paul.Green@stratus.com, 1997-2013\n");
3689 #endif
3690 #ifdef POSIX_BC
3691         PerlIO_printf(PIO_stdout,
3692                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
3693 #endif
3694 #ifdef UNDER_CE
3695         PerlIO_printf(PIO_stdout,
3696                         "WINCE port by Rainer Keuchel, 2001-2002\n"
3697                         "Built on " __DATE__ " " __TIME__ "\n\n");
3698         wce_hitreturn();
3699 #endif
3700 #ifdef __SYMBIAN32__
3701         PerlIO_printf(PIO_stdout,
3702                       "Symbian port by Nokia, 2004-2005\n");
3703 #endif
3704 #ifdef BINARY_BUILD_NOTICE
3705         BINARY_BUILD_NOTICE;
3706 #endif
3707         PerlIO_printf(PIO_stdout,
3708                       "\n\
3709 Perl may be copied only under the terms of either the Artistic License or the\n\
3710 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
3711 Complete documentation for Perl, including FAQ lists, should be found on\n\
3712 this system using \"man perl\" or \"perldoc perl\".  If you have access to the\n\
3713 Internet, point your browser at http://www.perl.org/, the Perl Home Page.\n\n");
3714         my_exit(0);
3715 }
3716
3717 /* compliments of Tom Christiansen */
3718
3719 /* unexec() can be found in the Gnu emacs distribution */
3720 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
3721
3722 #ifdef VMS
3723 #include <lib$routines.h>
3724 #endif
3725
3726 void
3727 Perl_my_unexec(pTHX)
3728 {
3729 #ifdef UNEXEC
3730     SV *    prog = newSVpv(BIN_EXP, 0);
3731     SV *    file = newSVpv(PL_origfilename, 0);
3732     int    status = 1;
3733     extern int etext;
3734
3735     sv_catpvs(prog, "/perl");
3736     sv_catpvs(file, ".perldump");
3737
3738     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
3739     /* unexec prints msg to stderr in case of failure */
3740     PerlProc_exit(status);
3741 #else
3742     PERL_UNUSED_CONTEXT;
3743 #  ifdef VMS
3744      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
3745 #  elif defined(WIN32) || defined(__CYGWIN__)
3746     Perl_croak_nocontext("dump is not supported");
3747 #  else
3748     ABORT();            /* for use with undump */
3749 #  endif
3750 #endif
3751 }
3752
3753 /* initialize curinterp */
3754 STATIC void
3755 S_init_interp(pTHX)
3756 {
3757 #ifdef MULTIPLICITY
3758 #  define PERLVAR(prefix,var,type)
3759 #  define PERLVARA(prefix,var,n,type)
3760 #  if defined(PERL_IMPLICIT_CONTEXT)
3761 #    define PERLVARI(prefix,var,type,init)      aTHX->prefix##var = init;
3762 #    define PERLVARIC(prefix,var,type,init)     aTHX->prefix##var = init;
3763 #  else
3764 #    define PERLVARI(prefix,var,type,init)      PERL_GET_INTERP->var = init;
3765 #    define PERLVARIC(prefix,var,type,init)     PERL_GET_INTERP->var = init;
3766 #  endif
3767 #  include "intrpvar.h"
3768 #  undef PERLVAR
3769 #  undef PERLVARA
3770 #  undef PERLVARI
3771 #  undef PERLVARIC
3772 #else
3773 #  define PERLVAR(prefix,var,type)
3774 #  define PERLVARA(prefix,var,n,type)
3775 #  define PERLVARI(prefix,var,type,init)        PL_##var = init;
3776 #  define PERLVARIC(prefix,var,type,init)       PL_##var = init;
3777 #  include "intrpvar.h"
3778 #  undef PERLVAR
3779 #  undef PERLVARA
3780 #  undef PERLVARI
3781 #  undef PERLVARIC
3782 #endif
3783
3784 }
3785
3786 STATIC void
3787 S_init_main_stash(pTHX)
3788 {
3789     GV *gv;
3790
3791     PL_curstash = PL_defstash = (HV *)SvREFCNT_inc_simple_NN(newHV());
3792     /* We know that the string "main" will be in the global shared string
3793        table, so it's a small saving to use it rather than allocate another
3794        8 bytes.  */
3795     PL_curstname = newSVpvs_share("main");
3796     gv = gv_fetchpvs("main::", GV_ADD|GV_NOTQUAL, SVt_PVHV);
3797     /* If we hadn't caused another reference to "main" to be in the shared
3798        string table above, then it would be worth reordering these two,
3799        because otherwise all we do is delete "main" from it as a consequence
3800        of the SvREFCNT_dec, only to add it again with hv_name_set */
3801     SvREFCNT_dec(GvHV(gv));
3802     hv_name_sets(PL_defstash, "main", 0);
3803     GvHV(gv) = MUTABLE_HV(SvREFCNT_inc_simple(PL_defstash));
3804     SvREADONLY_on(gv);
3805     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpvs("INC", GV_ADD|GV_NOTQUAL,
3806                                              SVt_PVAV)));
3807     SvREFCNT_inc_simple_void(PL_incgv); /* Don't allow it to be freed */
3808     GvMULTI_on(PL_incgv);
3809     PL_hintgv = gv_fetchpvs("\010", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^H */
3810     SvREFCNT_inc_simple_void(PL_hintgv);
3811     GvMULTI_on(PL_hintgv);
3812     PL_defgv = gv_fetchpvs("_", GV_ADD|GV_NOTQUAL, SVt_PVAV);
3813     SvREFCNT_inc_simple_void(PL_defgv);
3814     PL_errgv = gv_fetchpvs("@", GV_ADD|GV_NOTQUAL, SVt_PV);
3815     SvREFCNT_inc_simple_void(PL_errgv);
3816     GvMULTI_on(PL_errgv);
3817     PL_replgv = gv_fetchpvs("\022", GV_ADD|GV_NOTQUAL, SVt_PV); /* ^R */
3818     SvREFCNT_inc_simple_void(PL_replgv);
3819     GvMULTI_on(PL_replgv);
3820     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
3821 #ifdef PERL_DONT_CREATE_GVSV
3822     (void)gv_SVadd(PL_errgv);
3823 #endif
3824     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
3825     CLEAR_ERRSV();
3826     CopSTASH_set(&PL_compiling, PL_defstash);
3827     PL_debstash = GvHV(gv_fetchpvs("DB::", GV_ADDMULTI, SVt_PVHV));
3828     PL_globalstash = GvHV(gv_fetchpvs("CORE::GLOBAL::", GV_ADDMULTI,
3829                                       SVt_PVHV));
3830     /* We must init $/ before switches are processed. */
3831     sv_setpvs(get_sv("/", GV_ADD), "\n");
3832 }
3833
3834 STATIC PerlIO *
3835 S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript)
3836 {
3837     int fdscript = -1;
3838     PerlIO *rsfp = NULL;
3839     Stat_t tmpstatbuf;
3840     int fd;
3841
3842     PERL_ARGS_ASSERT_OPEN_SCRIPT;
3843
3844     if (PL_e_script) {
3845         PL_origfilename = savepvs("-e");
3846     }
3847     else {
3848         const char *s;
3849         UV uv;
3850         /* if find_script() returns, it returns a malloc()-ed value */
3851         scriptname = PL_origfilename = find_script(scriptname, dosearch, NULL, 1);
3852
3853         if (strEQs(scriptname, "/dev/fd/")
3854             && isDIGIT(scriptname[8])
3855             && grok_atoUV(scriptname + 8, &uv, &s)
3856             && uv <= PERL_INT_MAX
3857         ) {
3858             fdscript = (int)uv;
3859             if (*s) {
3860                 /* PSz 18 Feb 04
3861                  * Tell apart "normal" usage of fdscript, e.g.
3862                  * with bash on FreeBSD:
3863                  *   perl <( echo '#!perl -DA'; echo 'print "$0\n"')
3864                  * from usage in suidperl.
3865                  * Does any "normal" usage leave garbage after the number???
3866                  * Is it a mistake to use a similar /dev/fd/ construct for
3867                  * suidperl?
3868                  */
3869                 *suidscript = TRUE;
3870                 /* PSz 20 Feb 04  
3871                  * Be supersafe and do some sanity-checks.
3872                  * Still, can we be sure we got the right thing?
3873                  */
3874                 if (*s != '/') {
3875                     Perl_croak(aTHX_ "Wrong syntax (suid) fd script name \"%s\"\n", s);
3876                 }
3877                 if (! *(s+1)) {
3878                     Perl_croak(aTHX_ "Missing (suid) fd script name\n");
3879                 }
3880                 scriptname = savepv(s + 1);
3881                 Safefree(PL_origfilename);
3882                 PL_origfilename = (char *)scriptname;
3883             }
3884         }
3885     }
3886
3887     CopFILE_free(PL_curcop);
3888     CopFILE_set(PL_curcop, PL_origfilename);
3889     if (*PL_origfilename == '-' && PL_origfilename[1] == '\0')
3890         scriptname = (char *)"";
3891     if (fdscript >= 0) {
3892         rsfp = PerlIO_fdopen(fdscript,PERL_SCRIPT_MODE);
3893     }
3894     else if (!*scriptname) {
3895         forbid_setid(0, *suidscript);
3896         return NULL;
3897     }
3898     else {
3899 #ifdef FAKE_BIT_BUCKET
3900         /* This hack allows one not to have /dev/null (or BIT_BUCKET as it
3901          * is called) and still have the "-e" work.  (Believe it or not,
3902          * a /dev/null is required for the "-e" to work because source
3903          * filter magic is used to implement it. ) This is *not* a general
3904          * replacement for a /dev/null.  What we do here is create a temp
3905          * file (an empty file), open up that as the script, and then
3906          * immediately close and unlink it.  Close enough for jazz. */ 
3907 #define FAKE_BIT_BUCKET_PREFIX "/tmp/perlnull-"
3908 #define FAKE_BIT_BUCKET_SUFFIX "XXXXXXXX"
3909 #define FAKE_BIT_BUCKET_TEMPLATE FAKE_BIT_BUCKET_PREFIX FAKE_BIT_BUCKET_SUFFIX
3910         char tmpname[sizeof(FAKE_BIT_BUCKET_TEMPLATE)] = {
3911             FAKE_BIT_BUCKET_TEMPLATE
3912         };
3913         const char * const err = "Failed to create a fake bit bucket";
3914         if (strEQ(scriptname, BIT_BUCKET)) {
3915 #ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */
3916             int old_umask = umask(0177);
3917             int tmpfd = mkstemp(tmpname);
3918             umask(old_umask);
3919             if (tmpfd > -1) {
3920                 scriptname = tmpname;
3921                 close(tmpfd);
3922             } else
3923                 Perl_croak(aTHX_ err);
3924 #else
3925 #  ifdef HAS_MKTEMP
3926             scriptname = mktemp(tmpname);
3927             if (!scriptname)
3928                 Perl_croak(aTHX_ err);
3929 #  endif
3930 #endif
3931         }
3932 #endif
3933         rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
3934 #ifdef FAKE_BIT_BUCKET
3935         if (memEQ(scriptname, FAKE_BIT_BUCKET_PREFIX,
3936                   sizeof(FAKE_BIT_BUCKET_PREFIX) - 1)
3937             && strlen(scriptname) == sizeof(tmpname) - 1) {
3938             unlink(scriptname);
3939         }
3940         scriptname = BIT_BUCKET;
3941 #endif
3942     }
3943     if (!rsfp) {
3944         /* PSz 16 Sep 03  Keep neat error message */
3945         if (PL_e_script)
3946             Perl_croak(aTHX_ "Can't open " BIT_BUCKET ": %s\n", Strerror(errno));
3947         else
3948             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3949                     CopFILE(PL_curcop), Strerror(errno));
3950     }
3951     fd = PerlIO_fileno(rsfp);
3952 #if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
3953     if (fd >= 0) {
3954         /* ensure close-on-exec */
3955         if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) {
3956             Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3957                        CopFILE(PL_curcop), Strerror(errno));
3958         }
3959     }
3960 #endif
3961
3962     if (fd < 0 ||
3963         (PerlLIO_fstat(fd, &tmpstatbuf) >= 0
3964          && S_ISDIR(tmpstatbuf.st_mode)))
3965         Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
3966             CopFILE(PL_curcop),
3967             Strerror(EISDIR));
3968
3969     return rsfp;
3970 }
3971
3972 /* Mention
3973  * I_SYSSTATVFS HAS_FSTATVFS
3974  * I_SYSMOUNT
3975  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
3976  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
3977  * here so that metaconfig picks them up. */
3978
3979
3980 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
3981 /* Don't even need this function.  */
3982 #else
3983 STATIC void
3984 S_validate_suid(pTHX_ PerlIO *rsfp)
3985 {
3986     const Uid_t  my_uid = PerlProc_getuid();
3987     const Uid_t my_euid = PerlProc_geteuid();
3988     const Gid_t  my_gid = PerlProc_getgid();
3989     const Gid_t my_egid = PerlProc_getegid();
3990
3991     PERL_ARGS_ASSERT_VALIDATE_SUID;
3992
3993     if (my_euid != my_uid || my_egid != my_gid) {       /* (suidperl doesn't exist, in fact) */
3994         dVAR;
3995         int fd = PerlIO_fileno(rsfp);
3996         Stat_t statbuf;
3997         if (fd < 0 || PerlLIO_fstat(fd, &statbuf) < 0) { /* may be either wrapped or real suid */
3998             Perl_croak_nocontext( "Illegal suidscript");
3999         }
4000         if ((my_euid != my_uid && my_euid == statbuf.st_uid && statbuf.st_mode & S_ISUID)
4001             ||
4002             (my_egid != my_gid && my_egid == statbuf.st_gid && statbuf.st_mode & S_ISGID)
4003             )
4004             if (!PL_do_undump)
4005                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
4006 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
4007         /* not set-id, must be wrapped */
4008     }
4009 }
4010 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4011
4012 STATIC void
4013 S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
4014 {
4015     const char *s;
4016     const char *s2;
4017
4018     PERL_ARGS_ASSERT_FIND_BEGINNING;
4019
4020     /* skip forward in input to the real script? */
4021
4022     do {
4023         if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
4024             Perl_croak(aTHX_ "No Perl script found in input\n");
4025         s2 = s;
4026     } while (!(*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))));
4027     PerlIO_ungetc(rsfp, '\n');          /* to keep line count right */
4028     while (*s && !(isSPACE (*s) || *s == '#')) s++;
4029     s2 = s;
4030     while (*s == ' ' || *s == '\t') s++;
4031     if (*s++ == '-') {
4032         while (isDIGIT(s2[-1]) || s2[-1] == '-' || s2[-1] == '.'
4033                || s2[-1] == '_') s2--;
4034         if (strEQs(s2-4,"perl"))
4035             while ((s = moreswitches(s)))
4036                 ;
4037     }
4038 }
4039
4040
4041 STATIC void
4042 S_init_ids(pTHX)
4043 {
4044     /* no need to do anything here any more if we don't
4045      * do tainting. */
4046 #ifndef NO_TAINT_SUPPORT
4047     const Uid_t my_uid = PerlProc_getuid();
4048     const Uid_t my_euid = PerlProc_geteuid();
4049     const Gid_t my_gid = PerlProc_getgid();
4050     const Gid_t my_egid = PerlProc_getegid();
4051
4052     PERL_UNUSED_CONTEXT;
4053
4054     /* Should not happen: */
4055     CHECK_MALLOC_TAINT(my_uid && (my_euid != my_uid || my_egid != my_gid));
4056     TAINTING_set( TAINTING_get | (my_uid && (my_euid != my_uid || my_egid != my_gid)) );
4057 #endif
4058     /* BUG */
4059     /* PSz 27 Feb 04
4060      * Should go by suidscript, not uid!=euid: why disallow
4061      * system("ls") in scripts run from setuid things?
4062      * Or, is this run before we check arguments and set suidscript?
4063      * What about SETUID_SCRIPTS_ARE_SECURE_NOW: could we use fdscript then?
4064      * (We never have suidscript, can we be sure to have fdscript?)
4065      * Or must then go by UID checks? See comments in forbid_setid also.
4066      */
4067 }
4068
4069 /* This is used very early in the lifetime of the program,
4070  * before even the options are parsed, so PL_tainting has
4071  * not been initialized properly.  */
4072 bool
4073 Perl_doing_taint(int argc, char *argv[], char *envp[])
4074 {
4075 #ifndef PERL_IMPLICIT_SYS
4076     /* If we have PERL_IMPLICIT_SYS we can't call getuid() et alia
4077      * before we have an interpreter-- and the whole point of this
4078      * function is to be called at such an early stage.  If you are on
4079      * a system with PERL_IMPLICIT_SYS but you do have a concept of
4080      * "tainted because running with altered effective ids', you'll
4081      * have to add your own checks somewhere in here.  The two most
4082      * known samples of 'implicitness' are Win32 and NetWare, neither
4083      * of which has much of concept of 'uids'. */
4084     Uid_t uid  = PerlProc_getuid();
4085     Uid_t euid = PerlProc_geteuid();
4086     Gid_t gid  = PerlProc_getgid();
4087     Gid_t egid = PerlProc_getegid();
4088     (void)envp;
4089
4090 #ifdef VMS
4091     uid  |=  gid << 16;
4092     euid |= egid << 16;
4093 #endif
4094     if (uid && (euid != uid || egid != gid))
4095         return 1;
4096 #endif /* !PERL_IMPLICIT_SYS */
4097     /* This is a really primitive check; environment gets ignored only
4098      * if -T are the first chars together; otherwise one gets
4099      *  "Too late" message. */
4100     if ( argc > 1 && argv[1][0] == '-'
4101          && isALPHA_FOLD_EQ(argv[1][1], 't'))
4102         return 1;
4103     return 0;
4104 }
4105
4106 /* Passing the flag as a single char rather than a string is a slight space
4107    optimisation.  The only message that isn't /^-.$/ is
4108    "program input from stdin", which is substituted in place of '\0', which
4109    could never be a command line flag.  */
4110 STATIC void
4111 S_forbid_setid(pTHX_ const char flag, const bool suidscript) /* g */
4112 {
4113     char string[3] = "-x";
4114     const char *message = "program input from stdin";
4115
4116     PERL_UNUSED_CONTEXT;
4117     if (flag) {
4118         string[1] = flag;
4119         message = string;
4120     }
4121
4122 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
4123     if (PerlProc_getuid() != PerlProc_geteuid())
4124         Perl_croak(aTHX_ "No %s allowed while running setuid", message);
4125     if (PerlProc_getgid() != PerlProc_getegid())
4126         Perl_croak(aTHX_ "No %s allowed while running setgid", message);
4127 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
4128     if (suidscript)
4129         Perl_croak(aTHX_ "No %s allowed with (suid) fdscript", message);
4130 }
4131
4132 void
4133 Perl_init_dbargs(pTHX)
4134 {
4135     AV *const args = PL_dbargs = GvAV(gv_AVadd((gv_fetchpvs("DB::args",
4136                                                             GV_ADDMULTI,
4137                                                             SVt_PVAV))));
4138
4139     if (AvREAL(args)) {
4140         /* Someone has already created it.
4141            It might have entries, and if we just turn off AvREAL(), they will
4142            "leak" until global destruction.  */
4143         av_clear(args);
4144         if (SvTIED_mg((const SV *)args, PERL_MAGIC_tied))
4145             Perl_croak(aTHX_ "Cannot set tied @DB::args");
4146     }
4147     AvREIFY_only(PL_dbargs);
4148 }
4149
4150 void
4151 Perl_init_debugger(pTHX)
4152 {
4153     HV * const ostash = PL_curstash;
4154     MAGIC *mg;
4155
4156     PL_curstash = (HV *)SvREFCNT_inc_simple(PL_debstash);
4157
4158     Perl_init_dbargs(aTHX);
4159     PL_DBgv = MUTABLE_GV(
4160         SvREFCNT_inc(gv_fetchpvs("DB::DB", GV_ADDMULTI, SVt_PVGV))
4161     );
4162     PL_DBline = MUTABLE_GV(
4163         SvREFCNT_inc(gv_fetchpvs("DB::dbline", GV_ADDMULTI, SVt_PVAV))
4164     );
4165     PL_DBsub = MUTABLE_GV(SvREFCNT_inc(
4166         gv_HVadd(gv_fetchpvs("DB::sub", GV_ADDMULTI, SVt_PVHV))
4167     ));
4168     PL_DBsingle = GvSV((gv_fetchpvs("DB::single", GV_ADDMULTI, SVt_PV)));
4169     if (!SvIOK(PL_DBsingle))
4170         sv_setiv(PL_DBsingle, 0);
4171     mg = sv_magicext(PL_DBsingle, NULL, PERL_MAGIC_debugvar, &PL_vtbl_debugvar, 0, 0);
4172     mg->mg_private = DBVARMG_SINGLE;
4173     SvSETMAGIC(PL_DBsingle);
4174
4175     PL_DBtrace = GvSV((gv_fetchpvs("DB::trace", GV_ADDMULTI, SVt_PV)));
4176     if (!SvIOK(PL_DBtrace))
4177         sv_setiv(PL_DBtrace, 0);
4178     mg = sv_magicext(PL_DBtrace, NULL, PERL_MAGIC_debugvar, &PL_vtbl_debugvar, 0, 0);
4179     mg->mg_private = DBVARMG_TRACE;
4180     SvSETMAGIC(PL_DBtrace);
4181
4182     PL_DBsignal = GvSV((gv_fetchpvs("DB::signal", GV_ADDMULTI, SVt_PV)));
4183     if (!SvIOK(PL_DBsignal))
4184         sv_setiv(PL_DBsignal, 0);
4185     mg = sv_magicext(PL_DBsignal, NULL, PERL_MAGIC_debugvar, &PL_vtbl_debugvar, 0, 0);
4186     mg->mg_private = DBVARMG_SIGNAL;
4187     SvSETMAGIC(PL_DBsignal);
4188
4189     SvREFCNT_dec(PL_curstash);
4190     PL_curstash = ostash;
4191 }
4192
4193 #ifndef STRESS_REALLOC
4194 #define REASONABLE(size) (size)
4195 #define REASONABLE_but_at_least(size,min) (size)
4196 #else
4197 #define REASONABLE(size) (1) /* unreasonable */
4198 #define REASONABLE_but_at_least(size,min) (min)
4199 #endif
4200
4201 void
4202 Perl_init_stacks(pTHX)
4203 {
4204     SSize_t size;
4205
4206     /* start with 128-item stack and 8K cxstack */
4207     PL_curstackinfo = new_stackinfo(REASONABLE(128),
4208                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
4209     PL_curstackinfo->si_type = PERLSI_MAIN;
4210 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
4211     PL_curstackinfo->si_stack_hwm = 0;
4212 #endif
4213     PL_curstack = PL_curstackinfo->si_stack;
4214     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
4215
4216     PL_stack_base = AvARRAY(PL_curstack);
4217     PL_stack_sp = PL_stack_base;
4218     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
4219
4220     Newx(PL_tmps_stack,REASONABLE(128),SV*);
4221     PL_tmps_floor = -1;
4222     PL_tmps_ix = -1;
4223     PL_tmps_max = REASONABLE(128);
4224
4225     Newx(PL_markstack,REASONABLE(32),I32);
4226     PL_markstack_ptr = PL_markstack;
4227     PL_markstack_max = PL_markstack + REASONABLE(32);
4228
4229     SET_MARK_OFFSET;
4230
4231     Newx(PL_scopestack,REASONABLE(32),I32);
4232 #ifdef DEBUGGING
4233     Newx(PL_scopestack_name,REASONABLE(32),const char*);
4234 #endif
4235     PL_scopestack_ix = 0;
4236     PL_scopestack_max = REASONABLE(32);
4237
4238     size = REASONABLE_but_at_least(128,SS_MAXPUSH);
4239     Newx(PL_savestack, size, ANY);
4240     PL_savestack_ix = 0;
4241     /*PL_savestack_max lies: it always has SS_MAXPUSH more than it claims */
4242     PL_savestack_max = size - SS_MAXPUSH;
4243 }
4244
4245 #undef REASONABLE
4246
4247 STATIC void
4248 S_nuke_stacks(pTHX)
4249 {
4250     while (PL_curstackinfo->si_next)
4251         PL_curstackinfo = PL_curstackinfo->si_next;
4252     while (PL_curstackinfo) {
4253         PERL_SI *p = PL_curstackinfo->si_prev;
4254         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
4255         Safefree(PL_curstackinfo->si_cxstack);
4256         Safefree(PL_curstackinfo);
4257         PL_curstackinfo = p;
4258     }
4259     Safefree(PL_tmps_stack);
4260     Safefree(PL_markstack);
4261     Safefree(PL_scopestack);
4262 #ifdef DEBUGGING
4263     Safefree(PL_scopestack_name);
4264 #endif
4265     Safefree(PL_savestack);
4266 }
4267
4268 void
4269 Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...)
4270 {
4271     GV *const gv = gv_fetchpvn(name, len, GV_ADD | GV_ADDMULTI, SVt_PVAV);
4272     AV *const isa = GvAVn(gv);
4273     va_list args;
4274
4275     PERL_ARGS_ASSERT_POPULATE_ISA;
4276
4277     if(AvFILLp(isa) != -1)
4278         return;
4279
4280     /* NOTE: No support for tied ISA */
4281
4282     va_start(args, len);
4283     do {
4284         const char *const parent = va_arg(args, const char*);
4285         size_t parent_len;
4286
4287         if (!parent)
4288             break;
4289         parent_len = va_arg(args, size_t);
4290
4291         /* Arguments are supplied with a trailing ::  */
4292         assert(parent_len > 2);
4293         assert(parent[parent_len - 1] == ':');
4294         assert(parent[parent_len - 2] == ':');
4295         av_push(isa, newSVpvn(parent, parent_len - 2));
4296         (void) gv_fetchpvn(parent, parent_len, GV_ADD, SVt_PVGV);
4297     } while (1);
4298     va_end(args);
4299 }
4300
4301
4302 STATIC void
4303 S_init_predump_symbols(pTHX)
4304 {
4305     GV *tmpgv;
4306     IO *io;
4307
4308     sv_setpvs(get_sv("\"", GV_ADD), " ");
4309     PL_ofsgv = (GV*)SvREFCNT_inc(gv_fetchpvs(",", GV_ADD|GV_NOTQUAL, SVt_PV));
4310
4311
4312     /* Historically, PVIOs were blessed into IO::Handle, unless
4313        FileHandle was loaded, in which case they were blessed into
4314        that. Action at a distance.
4315        However, if we simply bless into IO::Handle, we break code
4316        that assumes that PVIOs will have (among others) a seek
4317        method. IO::File inherits from IO::Handle and IO::Seekable,
4318        and provides the needed methods. But if we simply bless into
4319        it, then we break code that assumed that by loading
4320        IO::Handle, *it* would work.
4321        So a compromise is to set up the correct @IO::File::ISA,
4322        so that code that does C<use IO::Handle>; will still work.
4323     */
4324                    
4325     Perl_populate_isa(aTHX_ STR_WITH_LEN("IO::File::ISA"),
4326                       STR_WITH_LEN("IO::Handle::"),
4327                       STR_WITH_LEN("IO::Seekable::"),
4328                       STR_WITH_LEN("Exporter::"),
4329                       NULL);
4330
4331     PL_stdingv = gv_fetchpvs("STDIN", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4332     GvMULTI_on(PL_stdingv);
4333     io = GvIOp(PL_stdingv);
4334     IoTYPE(io) = IoTYPE_RDONLY;
4335     IoIFP(io) = PerlIO_stdin();
4336     tmpgv = gv_fetchpvs("stdin", GV_ADD|GV_NOTQUAL, SVt_PV);
4337     GvMULTI_on(tmpgv);
4338     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4339
4340     tmpgv = gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4341     GvMULTI_on(tmpgv);
4342     io = GvIOp(tmpgv);
4343     IoTYPE(io) = IoTYPE_WRONLY;
4344     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
4345     setdefout(tmpgv);
4346     tmpgv = gv_fetchpvs("stdout", GV_ADD|GV_NOTQUAL, SVt_PV);
4347     GvMULTI_on(tmpgv);
4348     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4349
4350     PL_stderrgv = gv_fetchpvs("STDERR", GV_ADD|GV_NOTQUAL, SVt_PVIO);
4351     GvMULTI_on(PL_stderrgv);
4352     io = GvIOp(PL_stderrgv);
4353     IoTYPE(io) = IoTYPE_WRONLY;
4354     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
4355     tmpgv = gv_fetchpvs("stderr", GV_ADD|GV_NOTQUAL, SVt_PV);
4356     GvMULTI_on(tmpgv);
4357     GvIOp(tmpgv) = MUTABLE_IO(SvREFCNT_inc_simple(io));
4358
4359     PL_statname = newSVpvs("");         /* last filename we did stat on */
4360 }
4361
4362 void
4363 Perl_init_argv_symbols(pTHX_ int argc, char **argv)
4364 {
4365     PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS;
4366
4367     argc--,argv++;      /* skip name of script */
4368     if (PL_doswitches) {
4369         for (; argc > 0 && **argv == '-'; argc--,argv++) {
4370             char *s;
4371             if (!argv[0][1])
4372                 break;
4373             if (argv[0][1] == '-' && !argv[0][2]) {
4374                 argc--,argv++;
4375                 break;
4376             }
4377             if ((s = strchr(argv[0], '='))) {
4378                 const char *const start_name = argv[0] + 1;
4379                 sv_setpv(GvSV(gv_fetchpvn_flags(start_name, s - start_name,
4380                                                 TRUE, SVt_PV)), s + 1);
4381             }
4382             else
4383                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1, GV_ADD, SVt_PV)),1);
4384         }
4385     }
4386     if ((PL_argvgv = gv_fetchpvs("ARGV", GV_ADD|GV_NOTQUAL, SVt_PVAV))) {
4387         SvREFCNT_inc_simple_void_NN(PL_argvgv);
4388         GvMULTI_on(PL_argvgv);
4389         av_clear(GvAVn(PL_argvgv));
4390         for (; argc > 0; argc--,argv++) {
4391             SV * const sv = newSVpv(argv[0],0);
4392             av_push(GvAV(PL_argvgv),sv);
4393             if (!(PL_unicode & PERL_UNICODE_LOCALE_FLAG) || PL_utf8locale) {
4394                  if (PL_unicode & PERL_UNICODE_ARGV_FLAG)
4395                       SvUTF8_on(sv);
4396             }
4397             if (PL_unicode & PERL_UNICODE_WIDESYSCALLS_FLAG) /* Sarathy? */
4398                  (void)sv_utf8_decode(sv);
4399         }
4400     }
4401
4402     if (PL_inplace && (!PL_argvgv || AvFILL(GvAV(PL_argvgv)) == -1))
4403         Perl_ck_warner_d(aTHX_ packWARN(WARN_INPLACE),
4404                          "-i used with no filenames on the command line, "
4405                          "reading from STDIN");
4406 }
4407
4408 STATIC void
4409 S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
4410 {
4411 #ifdef USE_ITHREADS
4412     dVAR;
4413 #endif
4414     GV* tmpgv;
4415
4416     PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS;
4417
4418     PL_toptarget = newSV_type(SVt_PVIV);
4419     SvPVCLEAR(PL_toptarget);
4420     PL_bodytarget = newSV_type(SVt_PVIV);
4421     SvPVCLEAR(PL_bodytarget);
4422     PL_formtarget = PL_bodytarget;
4423
4424     TAINT;
4425
4426     init_argv_symbols(argc,argv);
4427
4428     if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
4429         sv_setpv(GvSV(tmpgv),PL_origfilename);
4430     }
4431     if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
4432         HV *hv;
4433         bool env_is_not_environ;
4434         SvREFCNT_inc_simple_void_NN(PL_envgv);
4435         GvMULTI_on(PL_envgv);
4436         hv = GvHVn(PL_envgv);
4437         hv_magic(hv, NULL, PERL_MAGIC_env);
4438 #ifndef PERL_MICRO
4439 #ifdef USE_ENVIRON_ARRAY
4440         /* Note that if the supplied env parameter is actually a copy
4441            of the global environ then it may now point to free'd memory
4442            if the environment has been modified since. To avoid this
4443            problem we treat env==NULL as meaning 'use the default'
4444         */
4445         if (!env)
4446             env = environ;
4447         env_is_not_environ = env != environ;
4448         if (env_is_not_environ
4449 #  ifdef USE_ITHREADS
4450             && PL_curinterp == aTHX
4451 #  endif
4452            )
4453         {
4454             environ[0] = NULL;
4455         }
4456         if (env) {
4457           char *s, *old_var;
4458           STRLEN nlen;
4459           SV *sv;
4460           HV *dups = newHV();
4461
4462           for (; *env; env++) {
4463             old_var = *env;
4464
4465             if (!(s = strchr(old_var,'=')) || s == old_var)
4466                 continue;
4467             nlen = s - old_var;
4468
4469 #if defined(MSDOS) && !defined(DJGPP)
4470             *s = '\0';
4471             (void)strupr(old_var);
4472             *s = '=';
4473 #endif
4474             if (hv_exists(hv, old_var, nlen)) {
4475                 const char *name = savepvn(old_var, nlen);
4476
4477                 /* make sure we use the same value as getenv(), otherwise code that
4478                    uses getenv() (like setlocale()) might see a different value to %ENV
4479                  */
4480                 sv = newSVpv(PerlEnv_getenv(name), 0);
4481
4482                 /* keep a count of the dups of this name so we can de-dup environ later */
4483                 if (hv_exists(dups, name, nlen))
4484                     ++SvIVX(*hv_fetch(dups, name, nlen, 0));
4485                 else
4486                     (void)hv_store(dups, name, nlen, newSViv(1), 0);
4487
4488                 Safefree(name);
4489             }
4490             else {
4491                 sv = newSVpv(s+1, 0);
4492             }
4493             (void)hv_store(hv, old_var, nlen, sv, 0);
4494             if (env_is_not_environ)
4495                 mg_set(sv);
4496           }
4497           if (HvKEYS(dups)) {
4498               /* environ has some duplicate definitions, remove them */
4499               HE *entry;
4500               hv_iterinit(dups);
4501               while ((entry = hv_iternext_flags(dups, 0))) {
4502                   STRLEN nlen;
4503                   const char *name = HePV(entry, nlen);
4504                   IV count = SvIV(HeVAL(entry));
4505                   IV i;
4506                   SV **valp = hv_fetch(hv, name, nlen, 0);
4507
4508                   assert(valp);
4509
4510                   /* try to remove any duplicate names, depending on the
4511                    * implementation used in my_setenv() the iteration might
4512                    * not be necessary, but let's be safe.
4513                    */
4514                   for (i = 0; i < count; ++i)
4515                       my_setenv(name, 0);
4516
4517                   /* and set it back to the value we set $ENV{name} to */
4518                   my_setenv(name, SvPV_nolen(*valp));
4519               }
4520           }
4521           SvREFCNT_dec_NN(dups);
4522       }
4523 #endif /* USE_ENVIRON_ARRAY */
4524 #endif /* !PERL_MICRO */
4525     }
4526     TAINT_NOT;
4527
4528     /* touch @F array to prevent spurious warnings 20020415 MJD */
4529     if (PL_minus_a) {
4530       (void) get_av("main::F", GV_ADD | GV_ADDMULTI);
4531     }
4532 }
4533
4534 STATIC void
4535 S_init_perllib(pTHX)
4536 {
4537 #ifndef VMS
4538     const char *perl5lib = NULL;
4539 #endif
4540     const char *s;
4541 #if defined(WIN32) && !defined(PERL_IS_MINIPERL)
4542     STRLEN len;
4543 #endif
4544
4545     if (!TAINTING_get) {
4546 #ifndef VMS
4547         perl5lib = PerlEnv_getenv("PERL5LIB");
4548 /*
4549  * It isn't possible to delete an environment variable with
4550  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4551  * case we treat PERL5LIB as undefined if it has a zero-length value.
4552  */
4553 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4554         if (perl5lib && *perl5lib != '\0')
4555 #else
4556         if (perl5lib)
4557 #endif
4558             incpush_use_sep(perl5lib, 0, INCPUSH_ADD_SUB_DIRS);
4559         else {
4560             s = PerlEnv_getenv("PERLLIB");
4561             if (s)
4562                 incpush_use_sep(s, 0, 0);
4563         }
4564 #else /* VMS */
4565         /* Treat PERL5?LIB as a possible search list logical name -- the
4566          * "natural" VMS idiom for a Unix path string.  We allow each
4567          * element to be a set of |-separated directories for compatibility.
4568          */
4569         char buf[256];
4570         int idx = 0;
4571         if (vmstrnenv("PERL5LIB",buf,0,NULL,0))
4572             do {
4573                 incpush_use_sep(buf, 0, INCPUSH_ADD_SUB_DIRS);
4574             } while (vmstrnenv("PERL5LIB",buf,++idx,NULL,0));
4575         else {
4576             while (vmstrnenv("PERLLIB",buf,idx++,NULL,0))
4577                 incpush_use_sep(buf, 0, 0);
4578         }
4579 #endif /* VMS */
4580     }
4581
4582 #ifndef PERL_IS_MINIPERL
4583     /* miniperl gets just -I..., the split of $ENV{PERL5LIB}, and "." in @INC
4584        (and not the architecture specific directories from $ENV{PERL5LIB}) */
4585
4586 /* Use the ~-expanded versions of APPLLIB (undocumented),
4587     SITEARCH, SITELIB, VENDORARCH, VENDORLIB, ARCHLIB and PRIVLIB
4588 */
4589 #ifdef APPLLIB_EXP
4590     S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP),
4591                       INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4592 #endif
4593
4594 #ifdef SITEARCH_EXP
4595     /* sitearch is always relative to sitelib on Windows for
4596      * DLL-based path intuition to work correctly */
4597 #  if !defined(WIN32)
4598         S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITEARCH_EXP),
4599                           INCPUSH_CAN_RELOCATE);
4600 #  endif
4601 #endif
4602
4603 #ifdef SITELIB_EXP
4604 #  if defined(WIN32)
4605     /* this picks up sitearch as well */
4606         s = PerlEnv_sitelib_path(PERL_FS_VERSION, &len);
4607         if (s)
4608             incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4609 #  else
4610         S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_EXP), INCPUSH_CAN_RELOCATE);
4611 #  endif
4612 #endif
4613
4614 #ifdef PERL_VENDORARCH_EXP
4615     /* vendorarch is always relative to vendorlib on Windows for
4616      * DLL-based path intuition to work correctly */
4617 #  if !defined(WIN32)
4618     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORARCH_EXP),
4619                       INCPUSH_CAN_RELOCATE);
4620 #  endif
4621 #endif
4622
4623 #ifdef PERL_VENDORLIB_EXP
4624 #  if defined(WIN32)
4625     /* this picks up vendorarch as well */
4626         s = PerlEnv_vendorlib_path(PERL_FS_VERSION, &len);
4627         if (s)
4628             incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4629 #  else
4630         S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_EXP),
4631                           INCPUSH_CAN_RELOCATE);
4632 #  endif
4633 #endif
4634
4635 #ifdef ARCHLIB_EXP
4636     S_incpush_use_sep(aTHX_ STR_WITH_LEN(ARCHLIB_EXP), INCPUSH_CAN_RELOCATE);
4637 #endif
4638
4639 #ifndef PRIVLIB_EXP
4640 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
4641 #endif
4642
4643 #if defined(WIN32)
4644     s = PerlEnv_lib_path(PERL_FS_VERSION, &len);
4645     if (s)
4646         incpush_use_sep(s, len, INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
4647 #else
4648 #  ifdef NETWARE
4649     S_incpush_use_sep(aTHX_ PRIVLIB_EXP, 0, INCPUSH_CAN_RELOCATE);
4650 #  else
4651     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PRIVLIB_EXP), INCPUSH_CAN_RELOCATE);
4652 #  endif
4653 #endif
4654
4655 #ifdef PERL_OTHERLIBDIRS
4656     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4657                       INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_NOT_BASEDIR
4658                       |INCPUSH_CAN_RELOCATE);
4659 #endif
4660
4661     if (!TAINTING_get) {
4662 #ifndef VMS
4663 /*
4664  * It isn't possible to delete an environment variable with
4665  * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that
4666  * case we treat PERL5LIB as undefined if it has a zero-length value.
4667  */
4668 #if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV)
4669         if (perl5lib && *perl5lib != '\0')
4670 #else
4671         if (perl5lib)
4672 #endif
4673             incpush_use_sep(perl5lib, 0,
4674                             INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
4675 #else /* VMS */
4676         /* Treat PERL5?LIB as a possible search list logical name -- the
4677          * "natural" VMS idiom for a Unix path string.  We allow each
4678          * element to be a set of |-separated directories for compatibility.
4679          */
4680         char buf[256];
4681         int idx = 0;
4682         if (vmstrnenv("PERL5LIB",buf,0,NULL,0))
4683             do {
4684                 incpush_use_sep(buf, 0,
4685                                 INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR);
4686             } while (vmstrnenv("PERL5LIB",buf,++idx,NULL,0));
4687 #endif /* VMS */
4688     }
4689
4690 /* Use the ~-expanded versions of APPLLIB (undocumented),
4691     SITELIB and VENDORLIB for older versions
4692 */
4693 #ifdef APPLLIB_EXP
4694     S_incpush_use_sep(aTHX_ STR_WITH_LEN(APPLLIB_EXP), INCPUSH_ADD_OLD_VERS
4695                       |INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
4696 #endif
4697
4698 #if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
4699     /* Search for version-specific dirs below here */
4700     S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_STEM),
4701                       INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
4702 #endif
4703
4704
4705 #if defined(PERL_VENDORLIB_STEM) && defined(PERL_INC_VERSION_LIST)
4706     /* Search for version-specific dirs below here */
4707     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_VENDORLIB_STEM),
4708                       INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
4709 #endif
4710
4711 #ifdef PERL_OTHERLIBDIRS
4712     S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS),
4713                       INCPUSH_ADD_OLD_VERS|INCPUSH_ADD_ARCHONLY_SUB_DIRS
4714                       |INCPUSH_CAN_RELOCATE);
4715 #endif
4716 #endif /* !PERL_IS_MINIPERL */
4717
4718     if (!TAINTING_get) {
4719 #if !defined(PERL_IS_MINIPERL) && defined(DEFAULT_INC_EXCLUDES_DOT)
4720         const char * const unsafe = PerlEnv_getenv("PERL_USE_UNSAFE_INC");
4721         if (unsafe && strEQ(unsafe, "1"))
4722 #endif
4723           S_incpush(aTHX_ STR_WITH_LEN("."), 0);
4724     }
4725 }
4726
4727 #if defined(DOSISH) || defined(__SYMBIAN32__)
4728 #    define PERLLIB_SEP ';'
4729 #else
4730 #  if defined(__VMS)
4731 #    define PERLLIB_SEP PL_perllib_sep
4732 #  else
4733 #    define PERLLIB_SEP ':'
4734 #  endif
4735 #endif
4736 #ifndef PERLLIB_MANGLE
4737 #  define PERLLIB_MANGLE(s,n) (s)
4738 #endif
4739
4740 #ifndef PERL_IS_MINIPERL
4741 /* Push a directory onto @INC if it exists.
4742    Generate a new SV if we do this, to save needing to copy the SV we push
4743    onto @INC  */
4744 STATIC SV *
4745 S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem)
4746 {
4747     Stat_t tmpstatbuf;
4748
4749     PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS;
4750
4751     if (PerlLIO_stat(SvPVX_const(dir), &tmpstatbuf) >= 0 &&
4752         S_ISDIR(tmpstatbuf.st_mode)) {
4753         av_push(av, dir);
4754         dir = newSVsv(stem);
4755     } else {
4756         /* Truncate dir back to stem.  */
4757         SvCUR_set(dir, SvCUR(stem));
4758     }
4759     return dir;
4760 }
4761 #endif
4762
4763 STATIC SV *
4764 S_mayberelocate(pTHX_ const char *const dir, STRLEN len, U32 flags)
4765 {
4766     const U8 canrelocate = (U8)flags & INCPUSH_CAN_RELOCATE;
4767     SV *libdir;
4768
4769     PERL_ARGS_ASSERT_MAYBERELOCATE;
4770     assert(len > 0);
4771
4772     /* I am not convinced that this is valid when PERLLIB_MANGLE is
4773        defined to so something (in os2/os2.c), but the code has been
4774        this way, ignoring any possible changed of length, since
4775        760ac839baf413929cd31cc32ffd6dba6b781a81 (5.003_02) so I'll leave
4776        it be.  */
4777     libdir = newSVpvn(PERLLIB_MANGLE(dir, len), len);
4778
4779 #ifdef VMS
4780     {
4781         char *unix;
4782
4783         if ((unix = tounixspec_ts(SvPV(libdir,len),NULL)) != NULL) {
4784             len = strlen(unix);
4785             while (len > 1 && unix[len-1] == '/') len--;  /* Cosmetic */
4786             sv_usepvn(libdir,unix,len);
4787         }
4788         else
4789             PerlIO_printf(Perl_error_log,
4790                           "Failed to unixify @INC element \"%s\"\n",
4791                           SvPV_nolen_const(libdir));
4792     }
4793 #endif
4794
4795         /* Do the if() outside the #ifdef to avoid warnings about an unused
4796            parameter.  */
4797         if (canrelocate) {
4798 #ifdef PERL_RELOCATABLE_INC
4799         /*
4800          * Relocatable include entries are marked with a leading .../
4801          *
4802          * The algorithm is
4803          * 0: Remove that leading ".../"
4804          * 1: Remove trailing executable name (anything after the last '/')
4805          *    from the perl path to give a perl prefix
4806          * Then
4807          * While the @INC element starts "../" and the prefix ends with a real
4808          * directory (ie not . or ..) chop that real directory off the prefix
4809          * and the leading "../" from the @INC element. ie a logical "../"
4810          * cleanup
4811          * Finally concatenate the prefix and the remainder of the @INC element
4812          * The intent is that /usr/local/bin/perl and .../../lib/perl5
4813          * generates /usr/local/lib/perl5
4814          */
4815             const char *libpath = SvPVX(libdir);
4816             STRLEN libpath_len = SvCUR(libdir);
4817             if (libpath_len >= 4 && memEQ (libpath, ".../", 4)) {
4818                 /* Game on!  */
4819                 SV * const caret_X = get_sv("\030", 0);
4820                 /* Going to use the SV just as a scratch buffer holding a C
4821                    string:  */
4822                 SV *prefix_sv;
4823                 char *prefix;
4824                 char *lastslash;
4825
4826                 /* $^X is *the* source of taint if tainting is on, hence
4827                    SvPOK() won't be true.  */
4828                 assert(caret_X);
4829                 assert(SvPOKp(caret_X));
4830                 prefix_sv = newSVpvn_flags(SvPVX(caret_X), SvCUR(caret_X),
4831                                            SvUTF8(caret_X));
4832                 /* Firstly take off the leading .../
4833                    If all else fail we'll do the paths relative to the current
4834                    directory.  */
4835                 sv_chop(libdir, libpath + 4);
4836                 /* Don't use SvPV as we're intentionally bypassing taining,
4837                    mortal copies that the mg_get of tainting creates, and
4838                    corruption that seems to come via the save stack.
4839                    I guess that the save stack isn't correctly set up yet.  */
4840                 libpath = SvPVX(libdir);
4841                 libpath_len = SvCUR(libdir);
4842
4843                 /* This would work more efficiently with memrchr, but as it's
4844                    only a GNU extension we'd need to probe for it and
4845                    implement our own. Not hard, but maybe not worth it?  */
4846
4847                 prefix = SvPVX(prefix_sv);
4848                 lastslash = strrchr(prefix, '/');
4849
4850                 /* First time in with the *lastslash = '\0' we just wipe off
4851                    the trailing /perl from (say) /usr/foo/bin/perl
4852                 */
4853                 if (lastslash) {
4854                     SV *tempsv;
4855                     while ((*lastslash = '\0'), /* Do that, come what may.  */
4856                            (libpath_len >= 3 && _memEQs(libpath, "../")
4857                             && (lastslash = strrchr(prefix, '/')))) {
4858                         if (lastslash[1] == '\0'
4859                             || (lastslash[1] == '.'
4860                                 && (lastslash[2] == '/' /* ends "/."  */
4861                                     || (lastslash[2] == '/'
4862                                         && lastslash[3] == '/' /* or "/.."  */
4863                                         )))) {
4864                             /* Prefix ends "/" or "/." or "/..", any of which
4865                                are fishy, so don't do any more logical cleanup.
4866                             */
4867                             break;
4868                         }
4869                         /* Remove leading "../" from path  */
4870                         libpath += 3;
4871                         libpath_len -= 3;
4872                         /* Next iteration round the loop removes the last
4873                            directory name from prefix by writing a '\0' in
4874                            the while clause.  */
4875                     }
4876                     /* prefix has been terminated with a '\0' to the correct
4877                        length. libpath points somewhere into the libdir SV.
4878                        We need to join the 2 with '/' and drop the result into
4879                        libdir.  */
4880                     tempsv = Perl_newSVpvf(aTHX_ "%s/%s", prefix, libpath);
4881                     SvREFCNT_dec(libdir);
4882                     /* And this is the new libdir.  */
4883                     libdir = tempsv;
4884                     if (TAINTING_get &&
4885                         (PerlProc_getuid() != PerlProc_geteuid() ||
4886                          PerlProc_getgid() != PerlProc_getegid())) {
4887                         /* Need to taint relocated paths if running set ID  */
4888                         SvTAINTED_on(libdir);
4889                     }
4890                 }
4891                 SvREFCNT_dec(prefix_sv);
4892             }
4893 #endif
4894         }
4895     return libdir;
4896 }
4897
4898 STATIC void
4899 S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
4900 {
4901 #ifndef PERL_IS_MINIPERL
4902     const U8 using_sub_dirs
4903         = (U8)flags & (INCPUSH_ADD_VERSIONED_SUB_DIRS
4904                        |INCPUSH_ADD_ARCHONLY_SUB_DIRS|INCPUSH_ADD_OLD_VERS);
4905     const U8 add_versioned_sub_dirs
4906         = (U8)flags & INCPUSH_ADD_VERSIONED_SUB_DIRS;
4907     const U8 add_archonly_sub_dirs
4908         = (U8)flags & INCPUSH_ADD_ARCHONLY_SUB_DIRS;
4909 #ifdef PERL_INC_VERSION_LIST
4910     const U8 addoldvers  = (U8)flags & INCPUSH_ADD_OLD_VERS;
4911 #endif
4912 #endif
4913     const U8 unshift     = (U8)flags & INCPUSH_UNSHIFT;
4914     const U8 push_basedir = (flags & INCPUSH_NOT_BASEDIR) ? 0 : 1;
4915     AV *const inc = GvAVn(PL_incgv);
4916
4917     PERL_ARGS_ASSERT_INCPUSH;
4918     assert(len > 0);
4919
4920     /* Could remove this vestigial extra block, if we don't mind a lot of
4921        re-indenting diff noise.  */
4922     {
4923         SV *const libdir = mayberelocate(dir, len, flags);
4924         /* Change 20189146be79a0596543441fa369c6bf7f85103f, to fix RT#6665,
4925            arranged to unshift #! line -I onto the front of @INC. However,
4926            -I can add version and architecture specific libraries, and they
4927            need to go first. The old code assumed that it was always
4928            pushing. Hence to make it work, need to push the architecture
4929            (etc) libraries onto a temporary array, then "unshift" that onto
4930            the front of @INC.  */
4931 #ifndef PERL_IS_MINIPERL
4932         AV *const av = (using_sub_dirs) ? (unshift ? newAV() : inc) : NULL;
4933
4934         /*
4935          * BEFORE pushing libdir onto @INC we may first push version- and
4936          * archname-specific sub-directories.
4937          */
4938         if (using_sub_dirs) {
4939             SV *subdir = newSVsv(libdir);
4940 #ifdef PERL_INC_VERSION_LIST
4941             /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
4942             const char * const incverlist[] = { PERL_INC_VERSION_LIST };
4943             const char * const *incver;
4944 #endif
4945
4946             if (add_versioned_sub_dirs) {
4947                 /* .../version/archname if -d .../version/archname */
4948                 sv_catpvs(subdir, "/" PERL_FS_VERSION "/" ARCHNAME);
4949                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4950
4951                 /* .../version if -d .../version */
4952                 sv_catpvs(subdir, "/" PERL_FS_VERSION);
4953                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4954             }
4955
4956 #ifdef PERL_INC_VERSION_LIST
4957             if (addoldvers) {
4958                 for (incver = incverlist; *incver; incver++) {
4959                     /* .../xxx if -d .../xxx */
4960                     Perl_sv_catpvf(aTHX_ subdir, "/%s", *incver);
4961                     subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4962                 }
4963             }
4964 #endif
4965
4966             if (add_archonly_sub_dirs) {
4967                 /* .../archname if -d .../archname */
4968                 sv_catpvs(subdir, "/" ARCHNAME);
4969                 subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
4970
4971             }
4972
4973             assert (SvREFCNT(subdir) == 1);
4974             SvREFCNT_dec(subdir);
4975         }
4976 #endif /* !PERL_IS_MINIPERL */
4977         /* finally add this lib directory at the end of @INC */
4978         if (unshift) {
4979 #ifdef PERL_IS_MINIPERL
4980             const Size_t extra = 0;
4981 #else
4982             Size_t extra = av_tindex(av) + 1;
4983 #endif
4984             av_unshift(inc, extra + push_basedir);
4985             if (push_basedir)
4986                 av_store(inc, extra, libdir);
4987 #ifndef PERL_IS_MINIPERL
4988             while (extra--) {
4989                 /* av owns a reference, av_store() expects to be donated a
4990                    reference, and av expects to be sane when it's cleared.
4991                    If I wanted to be naughty and wrong, I could peek inside the
4992                    implementation of av_clear(), realise that it uses
4993                    SvREFCNT_dec() too, so av's array could be a run of NULLs,
4994                    and so directly steal from it (with a memcpy() to inc, and
4995                    then memset() to NULL them out. But people copy code from the
4996                    core expecting it to be best practise, so let's use the API.
4997                    Although studious readers will note that I'm not checking any
4998                    return codes.  */
4999                 av_store(inc, extra, SvREFCNT_inc(*av_fetch(av, extra, FALSE)));
5000             }
5001             SvREFCNT_dec(av);
5002 #endif
5003         }
5004         else if (push_basedir) {
5005             av_push(inc, libdir);
5006         }
5007
5008         if (!push_basedir) {
5009             assert (SvREFCNT(libdir) == 1);
5010             SvREFCNT_dec(libdir);
5011         }
5012     }
5013 }
5014
5015 STATIC void
5016 S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags)
5017 {
5018     const char *s;
5019     const char *end;
5020     /* This logic has been broken out from S_incpush(). It may be possible to
5021        simplify it.  */
5022
5023     PERL_ARGS_ASSERT_INCPUSH_USE_SEP;
5024
5025     /* perl compiled with -DPERL_RELOCATABLE_INCPUSH will ignore the len
5026      * argument to incpush_use_sep.  This allows creation of relocatable
5027      * Perl distributions that patch the binary at install time.  Those
5028      * distributions will have to provide their own relocation tools; this
5029      * is not a feature otherwise supported by core Perl.
5030      */
5031 #ifndef PERL_RELOCATABLE_INCPUSH
5032     if (!len)
5033 #endif
5034         len = strlen(p);
5035
5036     end = p + len;
5037
5038     /* Break at all separators */
5039     while ((s = (const char*)memchr(p, PERLLIB_SEP, end - p))) {
5040         if (s == p) {
5041             /* skip any consecutive separators */
5042
5043             /* Uncomment the next line for PATH semantics */
5044             /* But you'll need to write tests */
5045             /* av_push(GvAVn(PL_incgv), newSVpvs(".")); */
5046         } else {
5047             incpush(p, (STRLEN)(s - p), flags);
5048         }
5049         p = s + 1;
5050     }
5051     if (p != end)
5052         incpush(p, (STRLEN)(end - p), flags);
5053
5054 }
5055
5056 void
5057 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
5058 {
5059     SV *atsv;
5060     VOL const line_t oldline = PL_curcop ? CopLINE(PL_curcop) : 0;
5061     CV *cv;
5062     STRLEN len;
5063     int ret;
5064     dJMPENV;
5065
5066     PERL_ARGS_ASSERT_CALL_LIST;
5067
5068     while (av_tindex(paramList) >= 0) {
5069         cv = MUTABLE_CV(av_shift(paramList));
5070         if (PL_savebegin) {
5071             if (paramList == PL_beginav) {
5072                 /* save PL_beginav for compiler */
5073                 Perl_av_create_and_push(aTHX_ &PL_beginav_save, MUTABLE_SV(cv));
5074             }
5075             else if (paramList == PL_checkav) {
5076                 /* save PL_checkav for compiler */
5077                 Perl_av_create_and_push(aTHX_ &PL_checkav_save, MUTABLE_SV(cv));
5078             }
5079             else if (paramList == PL_unitcheckav) {
5080                 /* save PL_unitcheckav for compiler */
5081                 Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, MUTABLE_SV(cv));
5082             }
5083         } else {
5084             SAVEFREESV(cv);
5085         }
5086         JMPENV_PUSH(ret);
5087         switch (ret) {
5088         case 0:
5089             CALL_LIST_BODY(cv);
5090             atsv = ERRSV;
5091             (void)SvPV_const(atsv, len);
5092             if (len) {
5093                 PL_curcop = &PL_compiling;
5094                 CopLINE_set(PL_curcop, oldline);
5095                 if (paramList == PL_beginav)
5096                     sv_catpvs(atsv, "BEGIN failed--compilation aborted");
5097                 else
5098                     Perl_sv_catpvf(aTHX_ atsv,
5099                                    "%s failed--call queue aborted",
5100                                    paramList == PL_checkav ? "CHECK"
5101                                    : paramList == PL_initav ? "INIT"
5102                                    : paramList == PL_unitcheckav ? "UNITCHECK"
5103                                    : "END");
5104                 while (PL_scopestack_ix > oldscope)
5105                     LEAVE;
5106                 JMPENV_POP;
5107                 Perl_croak(aTHX_ "%" SVf, SVfARG(atsv));
5108             }
5109             break;
5110         case 1:
5111             STATUS_ALL_FAILURE;
5112             /* FALLTHROUGH */
5113         case 2:
5114             /* my_exit() was called */
5115             while (PL_scopestack_ix > oldscope)
5116                 LEAVE;
5117             FREETMPS;
5118             SET_CURSTASH(PL_defstash);
5119             PL_curcop = &PL_compiling;
5120             CopLINE_set(PL_curcop, oldline);
5121             JMPENV_POP;
5122             my_exit_jump();
5123             NOT_REACHED; /* NOTREACHED */
5124         case 3:
5125             if (PL_restartop) {
5126                 PL_curcop = &PL_compiling;
5127                 CopLINE_set(PL_curcop, oldline);
5128                 JMPENV_JUMP(3);
5129             }
5130             PerlIO_printf(Perl_error_log, "panic: restartop in call_list\n");
5131             FREETMPS;
5132             break;
5133         }
5134         JMPENV_POP;
5135     }
5136 }
5137
5138 void
5139 Perl_my_exit(pTHX_ U32 status)
5140 {
5141     if (PL_exit_flags & PERL_EXIT_ABORT) {
5142         abort();
5143     }
5144     if (PL_exit_flags & PERL_EXIT_WARN) {
5145         PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
5146         Perl_warn(aTHX_ "Unexpected exit %lu", (unsigned long)status);
5147         PL_exit_flags &= ~PERL_EXIT_ABORT;
5148     }
5149     switch (status) {
5150     case 0:
5151         STATUS_ALL_SUCCESS;
5152         break;
5153     case 1:
5154         STATUS_ALL_FAILURE;
5155         break;
5156     default:
5157         STATUS_EXIT_SET(status);
5158         break;
5159     }
5160     my_exit_jump();
5161 }
5162
5163 void
5164 Perl_my_failure_exit(pTHX)
5165 {
5166 #ifdef VMS
5167      /* We have been called to fall on our sword.  The desired exit code
5168       * should be already set in STATUS_UNIX, but could be shifted over
5169       * by 8 bits.  STATUS_UNIX_EXIT_SET will handle the cases where a
5170       * that code is set.
5171       *
5172       * If an error code has not been set, then force the issue.
5173       */
5174     if (MY_POSIX_EXIT) {
5175
5176         /* According to the die_exit.t tests, if errno is non-zero */
5177         /* It should be used for the error status. */
5178
5179         if (errno == EVMSERR) {
5180             STATUS_NATIVE = vaxc$errno;
5181         } else {
5182
5183             /* According to die_exit.t tests, if the child_exit code is */
5184             /* also zero, then we need to exit with a code of 255 */
5185             if ((errno != 0) && (errno < 256))
5186                 STATUS_UNIX_EXIT_SET(errno);
5187             else if (STATUS_UNIX < 255) {
5188                 STATUS_UNIX_EXIT_SET(255);
5189             }
5190
5191         }
5192
5193         /* The exit code could have been set by $? or vmsish which
5194          * means that it may not have fatal set.  So convert
5195          * success/warning codes to fatal with out changing
5196          * the POSIX status code.  The severity makes VMS native
5197          * status handling work, while UNIX mode programs use the
5198          * the POSIX exit codes.
5199          */
5200          if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0) {
5201             STATUS_NATIVE &= STS$M_COND_ID;
5202             STATUS_NATIVE |= STS$K_ERROR | STS$M_INHIB_MSG;
5203          }
5204     }
5205     else {
5206         /* Traditionally Perl on VMS always expects a Fatal Error. */
5207         if (vaxc$errno & 1) {
5208
5209             /* So force success status to failure */
5210             if (STATUS_NATIVE & 1)
5211                 STATUS_ALL_FAILURE;
5212         }
5213         else {
5214             if (!vaxc$errno) {
5215                 STATUS_UNIX = EINTR; /* In case something cares */
5216                 STATUS_ALL_FAILURE;
5217             }
5218             else {
5219                 int severity;
5220                 STATUS_NATIVE = vaxc$errno; /* Should already be this */
5221
5222                 /* Encode the severity code */
5223                 severity = STATUS_NATIVE & STS$M_SEVERITY;
5224                 STATUS_UNIX = (severity ? severity : 1) << 8;
5225
5226                 /* Perl expects this to be a fatal error */
5227                 if (severity != STS$K_SEVERE)
5228                     STATUS_ALL_FAILURE;
5229             }
5230         }
5231     }
5232
5233 #else
5234     int exitstatus;
5235     if (errno & 255)
5236         STATUS_UNIX_SET(errno);
5237     else {
5238         exitstatus = STATUS_UNIX >> 8;
5239         if (exitstatus & 255)
5240             STATUS_UNIX_SET(exitstatus);
5241         else
5242             STATUS_UNIX_SET(255);
5243     }
5244 #endif
5245     if (PL_exit_flags & PERL_EXIT_ABORT) {
5246         abort();
5247     }
5248     if (PL_exit_flags & PERL_EXIT_WARN) {
5249         PL_exit_flags |= PERL_EXIT_ABORT; /* Protect against reentrant calls */
5250         Perl_warn(aTHX_ "Unexpected exit failure %ld", (long)PL_statusvalue);
5251         PL_exit_flags &= ~PERL_EXIT_ABORT;
5252     }
5253     my_exit_jump();
5254 }
5255
5256 STATIC void
5257 S_my_exit_jump(pTHX)
5258 {
5259     if (PL_e_script) {
5260         SvREFCNT_dec(PL_e_script);
5261         PL_e_script = NULL;
5262     }
5263
5264     POPSTACK_TO(PL_mainstack);
5265     if (cxstack_ix >= 0) {
5266         dounwind(-1);
5267         cx_popblock(cxstack);
5268     }
5269     LEAVE_SCOPE(0);
5270
5271     JMPENV_JUMP(2);
5272 }
5273
5274 static I32
5275 read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
5276 {
5277     const char * const p  = SvPVX_const(PL_e_script);
5278     const char *nl = strchr(p, '\n');
5279
5280     PERL_UNUSED_ARG(idx);
5281     PERL_UNUSED_ARG(maxlen);
5282
5283     nl = (nl) ? nl+1 : SvEND(PL_e_script);
5284     if (nl-p == 0) {
5285         filter_del(read_e_script);
5286         return 0;
5287     }
5288     sv_catpvn(buf_sv, p, nl-p);
5289     sv_chop(PL_e_script, nl);
5290     return 1;
5291 }
5292
5293 /* removes boilerplate code at the end of each boot_Module xsub */
5294 void
5295 Perl_xs_boot_epilog(pTHX_ const I32 ax)
5296 {
5297   if (PL_unitcheckav)
5298         call_list(PL_scopestack_ix, PL_unitcheckav);
5299     XSRETURN_YES;
5300 }
5301
5302 /*
5303  * ex: set ts=8 sts=4 sw=4 et:
5304  */