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