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