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