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