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