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