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