Minor naming change UTF8_IS_ASCII => UTF8_IS_INVARIANT
[p5sagit/p5-mst-13.2.git] / perl.c
1 /*    perl.c
2  *
3  *    Copyright (c) 1987-2001 Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 /*
11  * "A ship then new they built for him/of mithril and of elven glass" --Bilbo
12  */
13
14 #include "EXTERN.h"
15 #define PERL_IN_PERL_C
16 #include "perl.h"
17 #include "patchlevel.h"                 /* for local_patches */
18
19 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
20 #ifdef I_UNISTD
21 #include <unistd.h>
22 #endif
23
24 #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE)
25 char *getenv (char *); /* Usually in <stdlib.h> */
26 #endif
27
28 static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
29
30 #ifdef IAMSUID
31 #ifndef DOSUID
32 #define DOSUID
33 #endif
34 #endif
35
36 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
37 #ifdef DOSUID
38 #undef DOSUID
39 #endif
40 #endif
41
42 #ifdef PERL_OBJECT
43 #define perl_construct  Perl_construct
44 #define perl_parse      Perl_parse
45 #define perl_run        Perl_run
46 #define perl_destruct   Perl_destruct
47 #define perl_free       Perl_free
48 #endif
49
50 #if defined(USE_THREADS)
51 #  define INIT_TLS_AND_INTERP \
52     STMT_START {                                \
53         if (!PL_curinterp) {                    \
54             PERL_SET_INTERP(my_perl);           \
55             INIT_THREADS;                       \
56             ALLOC_THREAD_KEY;                   \
57         }                                       \
58     } STMT_END
59 #else
60 #  if defined(USE_ITHREADS)
61 #  define INIT_TLS_AND_INTERP \
62     STMT_START {                                \
63         if (!PL_curinterp) {                    \
64             PERL_SET_INTERP(my_perl);           \
65             INIT_THREADS;                       \
66             ALLOC_THREAD_KEY;                   \
67             PERL_SET_THX(my_perl);              \
68             OP_REFCNT_INIT;                     \
69         }                                       \
70         else {                                  \
71             PERL_SET_THX(my_perl);              \
72         }                                       \
73     } STMT_END
74 #  else
75 #  define INIT_TLS_AND_INTERP \
76     STMT_START {                                \
77         if (!PL_curinterp) {                    \
78             PERL_SET_INTERP(my_perl);           \
79         }                                       \
80         PERL_SET_THX(my_perl);                  \
81     } STMT_END
82 #  endif
83 #endif
84
85 #ifdef PERL_IMPLICIT_SYS
86 PerlInterpreter *
87 perl_alloc_using(struct IPerlMem* ipM, struct IPerlMem* ipMS,
88                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
89                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
90                  struct IPerlDir* ipD, struct IPerlSock* ipS,
91                  struct IPerlProc* ipP)
92 {
93     PerlInterpreter *my_perl;
94 #ifdef PERL_OBJECT
95     my_perl = (PerlInterpreter*)new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd,
96                                                   ipLIO, ipD, ipS, ipP);
97     INIT_TLS_AND_INTERP;
98 #else
99     /* New() needs interpreter, so call malloc() instead */
100     my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
101     INIT_TLS_AND_INTERP;
102     Zero(my_perl, 1, PerlInterpreter);
103     PL_Mem = ipM;
104     PL_MemShared = ipMS;
105     PL_MemParse = ipMP;
106     PL_Env = ipE;
107     PL_StdIO = ipStd;
108     PL_LIO = ipLIO;
109     PL_Dir = ipD;
110     PL_Sock = ipS;
111     PL_Proc = ipP;
112 #endif
113
114     return my_perl;
115 }
116 #else
117
118 /*
119 =for apidoc perl_alloc
120
121 Allocates a new Perl interpreter.  See L<perlembed>.
122
123 =cut
124 */
125
126 PerlInterpreter *
127 perl_alloc(void)
128 {
129     PerlInterpreter *my_perl;
130
131     /* New() needs interpreter, so call malloc() instead */
132     my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
133
134     INIT_TLS_AND_INTERP;
135     Zero(my_perl, 1, PerlInterpreter);
136     return my_perl;
137 }
138 #endif /* PERL_IMPLICIT_SYS */
139
140 /*
141 =for apidoc perl_construct
142
143 Initializes a new Perl interpreter.  See L<perlembed>.
144
145 =cut
146 */
147
148 void
149 perl_construct(pTHXx)
150 {
151 #ifdef USE_THREADS
152     int i;
153 #ifndef FAKE_THREADS
154     struct perl_thread *thr = NULL;
155 #endif /* FAKE_THREADS */
156 #endif /* USE_THREADS */
157
158 #ifdef MULTIPLICITY
159     init_interp();
160     PL_perl_destruct_level = 1;
161 #else
162    if (PL_perl_destruct_level > 0)
163        init_interp();
164 #endif
165
166    /* Init the real globals (and main thread)? */
167     if (!PL_linestr) {
168 #ifdef USE_THREADS
169         MUTEX_INIT(&PL_sv_mutex);
170         /*
171          * Safe to use basic SV functions from now on (though
172          * not things like mortals or tainting yet).
173          */
174         MUTEX_INIT(&PL_eval_mutex);
175         COND_INIT(&PL_eval_cond);
176         MUTEX_INIT(&PL_threads_mutex);
177         COND_INIT(&PL_nthreads_cond);
178 #  ifdef EMULATE_ATOMIC_REFCOUNTS
179         MUTEX_INIT(&PL_svref_mutex);
180 #  endif /* EMULATE_ATOMIC_REFCOUNTS */
181         
182         MUTEX_INIT(&PL_cred_mutex);
183         MUTEX_INIT(&PL_sv_lock_mutex);
184         MUTEX_INIT(&PL_fdpid_mutex);
185
186         thr = init_main_thread();
187 #endif /* USE_THREADS */
188
189 #ifdef PERL_FLEXIBLE_EXCEPTIONS
190         PL_protect = MEMBER_TO_FPTR(Perl_default_protect); /* for exceptions */
191 #endif
192
193         PL_curcop = &PL_compiling;      /* needed by ckWARN, right away */
194
195         PL_linestr = NEWSV(65,79);
196         sv_upgrade(PL_linestr,SVt_PVIV);
197
198         if (!SvREADONLY(&PL_sv_undef)) {
199             /* set read-only and try to insure than we wont see REFCNT==0
200                very often */
201
202             SvREADONLY_on(&PL_sv_undef);
203             SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
204
205             sv_setpv(&PL_sv_no,PL_No);
206             SvNV(&PL_sv_no);
207             SvREADONLY_on(&PL_sv_no);
208             SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
209
210             sv_setpv(&PL_sv_yes,PL_Yes);
211             SvNV(&PL_sv_yes);
212             SvREADONLY_on(&PL_sv_yes);
213             SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
214         }
215
216 #ifdef PERL_OBJECT
217         /* TODO: */
218         /* PL_sighandlerp = sighandler; */
219 #else
220         PL_sighandlerp = Perl_sighandler;
221 #endif
222         PL_pidstatus = newHV();
223
224 #ifdef MSDOS
225         /*
226          * There is no way we can refer to them from Perl so close them to save
227          * space.  The other alternative would be to provide STDAUX and STDPRN
228          * filehandles.
229          */
230         (void)fclose(stdaux);
231         (void)fclose(stdprn);
232 #endif
233     }
234
235     PL_nrs = newSVpvn("\n", 1);
236     PL_rs = SvREFCNT_inc(PL_nrs);
237
238     init_stacks();
239
240     init_ids();
241     PL_lex_state = LEX_NOTPARSING;
242
243     JMPENV_BOOTSTRAP;
244     STATUS_ALL_SUCCESS;
245
246     init_i18nl10n(1);
247     SET_NUMERIC_STANDARD();
248
249     {
250         U8 *s;
251         PL_patchlevel = NEWSV(0,4);
252         (void)SvUPGRADE(PL_patchlevel, SVt_PVNV);
253         if (PERL_REVISION > 127 || PERL_VERSION > 127 || PERL_SUBVERSION > 127)
254             SvGROW(PL_patchlevel, UTF8_MAXLEN*3+1);
255         s = (U8*)SvPVX(PL_patchlevel);
256         /* Build version strings using "native" characters */
257         s = uvchr_to_utf8(s, (UV)PERL_REVISION);
258         s = uvchr_to_utf8(s, (UV)PERL_VERSION);
259         s = uvchr_to_utf8(s, (UV)PERL_SUBVERSION);
260         *s = '\0';
261         SvCUR_set(PL_patchlevel, s - (U8*)SvPVX(PL_patchlevel));
262         SvPOK_on(PL_patchlevel);
263         SvNVX(PL_patchlevel) = (NV)PERL_REVISION
264                                 + ((NV)PERL_VERSION / (NV)1000)
265 #if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
266                                 + ((NV)PERL_SUBVERSION / (NV)1000000)
267 #endif
268                                 ;
269         SvNOK_on(PL_patchlevel);        /* dual valued */
270         SvUTF8_on(PL_patchlevel);
271         SvREADONLY_on(PL_patchlevel);
272     }
273
274 #if defined(LOCAL_PATCH_COUNT)
275     PL_localpatches = local_patches;    /* For possible -v */
276 #endif
277
278 #ifdef HAVE_INTERP_INTERN
279     sys_intern_init();
280 #endif
281
282     PerlIO_init();                      /* Hook to IO system */
283
284     PL_fdpid = newAV();                 /* for remembering popen pids by fd */
285     PL_modglobal = newHV();             /* pointers to per-interpreter module globals */
286     PL_errors = newSVpvn("",0);
287
288     ENTER;
289 }
290
291 /*
292 =for apidoc perl_destruct
293
294 Shuts down a Perl interpreter.  See L<perlembed>.
295
296 =cut
297 */
298
299 void
300 perl_destruct(pTHXx)
301 {
302     int destruct_level;  /* 0=none, 1=full, 2=full with checks */
303     I32 last_sv_count;
304     HV *hv;
305 #ifdef USE_THREADS
306     Thread t;
307     dTHX;
308 #endif /* USE_THREADS */
309
310     /* wait for all pseudo-forked children to finish */
311     PERL_WAIT_FOR_CHILDREN;
312
313 #ifdef USE_THREADS
314 #ifndef FAKE_THREADS
315     /* Pass 1 on any remaining threads: detach joinables, join zombies */
316   retry_cleanup:
317     MUTEX_LOCK(&PL_threads_mutex);
318     DEBUG_S(PerlIO_printf(Perl_debug_log,
319                           "perl_destruct: waiting for %d threads...\n",
320                           PL_nthreads - 1));
321     for (t = thr->next; t != thr; t = t->next) {
322         MUTEX_LOCK(&t->mutex);
323         switch (ThrSTATE(t)) {
324             AV *av;
325         case THRf_ZOMBIE:
326             DEBUG_S(PerlIO_printf(Perl_debug_log,
327                                   "perl_destruct: joining zombie %p\n", t));
328             ThrSETSTATE(t, THRf_DEAD);
329             MUTEX_UNLOCK(&t->mutex);
330             PL_nthreads--;
331             /*
332              * The SvREFCNT_dec below may take a long time (e.g. av
333              * may contain an object scalar whose destructor gets
334              * called) so we have to unlock threads_mutex and start
335              * all over again.
336              */
337             MUTEX_UNLOCK(&PL_threads_mutex);
338             JOIN(t, &av);
339             SvREFCNT_dec((SV*)av);
340             DEBUG_S(PerlIO_printf(Perl_debug_log,
341                                   "perl_destruct: joined zombie %p OK\n", t));
342             goto retry_cleanup;
343         case THRf_R_JOINABLE:
344             DEBUG_S(PerlIO_printf(Perl_debug_log,
345                                   "perl_destruct: detaching thread %p\n", t));
346             ThrSETSTATE(t, THRf_R_DETACHED);
347             /*
348              * We unlock threads_mutex and t->mutex in the opposite order
349              * from which we locked them just so that DETACH won't
350              * deadlock if it panics. It's only a breach of good style
351              * not a bug since they are unlocks not locks.
352              */
353             MUTEX_UNLOCK(&PL_threads_mutex);
354             DETACH(t);
355             MUTEX_UNLOCK(&t->mutex);
356             goto retry_cleanup;
357         default:
358             DEBUG_S(PerlIO_printf(Perl_debug_log,
359                                   "perl_destruct: ignoring %p (state %u)\n",
360                                   t, ThrSTATE(t)));
361             MUTEX_UNLOCK(&t->mutex);
362             /* fall through and out */
363         }
364     }
365     /* We leave the above "Pass 1" loop with threads_mutex still locked */
366
367     /* Pass 2 on remaining threads: wait for the thread count to drop to one */
368     while (PL_nthreads > 1)
369     {
370         DEBUG_S(PerlIO_printf(Perl_debug_log,
371                               "perl_destruct: final wait for %d threads\n",
372                               PL_nthreads - 1));
373         COND_WAIT(&PL_nthreads_cond, &PL_threads_mutex);
374     }
375     /* At this point, we're the last thread */
376     MUTEX_UNLOCK(&PL_threads_mutex);
377     DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
378     MUTEX_DESTROY(&PL_threads_mutex);
379     COND_DESTROY(&PL_nthreads_cond);
380     PL_nthreads--;
381 #endif /* !defined(FAKE_THREADS) */
382 #endif /* USE_THREADS */
383
384     destruct_level = PL_perl_destruct_level;
385 #ifdef DEBUGGING
386     {
387         char *s;
388         if ((s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"))) {
389             int i = atoi(s);
390             if (destruct_level < i)
391                 destruct_level = i;
392         }
393     }
394 #endif
395
396     LEAVE;
397     FREETMPS;
398
399     /* We must account for everything.  */
400
401     /* Destroy the main CV and syntax tree */
402     if (PL_main_root) {
403         PL_curpad = AvARRAY(PL_comppad);
404         op_free(PL_main_root);
405         PL_main_root = Nullop;
406     }
407     PL_curcop = &PL_compiling;
408     PL_main_start = Nullop;
409     SvREFCNT_dec(PL_main_cv);
410     PL_main_cv = Nullcv;
411     PL_dirty = TRUE;
412
413     if (PL_sv_objcount) {
414         /*
415          * Try to destruct global references.  We do this first so that the
416          * destructors and destructees still exist.  Some sv's might remain.
417          * Non-referenced objects are on their own.
418          */
419         sv_clean_objs();
420     }
421
422     /* unhook hooks which will soon be, or use, destroyed data */
423     SvREFCNT_dec(PL_warnhook);
424     PL_warnhook = Nullsv;
425     SvREFCNT_dec(PL_diehook);
426     PL_diehook = Nullsv;
427
428     /* call exit list functions */
429     while (PL_exitlistlen-- > 0)
430         PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
431
432     Safefree(PL_exitlist);
433
434     if (destruct_level == 0){
435
436         DEBUG_P(debprofdump());
437
438         /* The exit() function will do everything that needs doing. */
439         return;
440     }
441
442     /* jettison our possibly duplicated environment */
443
444 #ifdef USE_ENVIRON_ARRAY
445     if (environ != PL_origenviron) {
446         I32 i;
447
448         for (i = 0; environ[i]; i++)
449             safesysfree(environ[i]);
450         /* Must use safesysfree() when working with environ. */
451         safesysfree(environ);           
452
453         environ = PL_origenviron;
454     }
455 #endif
456
457     /* loosen bonds of global variables */
458
459     if(PL_rsfp) {
460         (void)PerlIO_close(PL_rsfp);
461         PL_rsfp = Nullfp;
462     }
463
464     /* Filters for program text */
465     SvREFCNT_dec(PL_rsfp_filters);
466     PL_rsfp_filters = Nullav;
467
468     /* switches */
469     PL_preprocess   = FALSE;
470     PL_minus_n      = FALSE;
471     PL_minus_p      = FALSE;
472     PL_minus_l      = FALSE;
473     PL_minus_a      = FALSE;
474     PL_minus_F      = FALSE;
475     PL_doswitches   = FALSE;
476     PL_dowarn       = G_WARN_OFF;
477     PL_doextract    = FALSE;
478     PL_sawampersand = FALSE;    /* must save all match strings */
479     PL_unsafe       = FALSE;
480
481     Safefree(PL_inplace);
482     PL_inplace = Nullch;
483     SvREFCNT_dec(PL_patchlevel);
484
485     if (PL_e_script) {
486         SvREFCNT_dec(PL_e_script);
487         PL_e_script = Nullsv;
488     }
489
490     /* magical thingies */
491
492     SvREFCNT_dec(PL_ofs_sv);    /* $, */
493     PL_ofs_sv = Nullsv;
494
495     SvREFCNT_dec(PL_ors_sv);    /* $\ */
496     PL_ors_sv = Nullsv;
497
498     SvREFCNT_dec(PL_rs);        /* $/ */
499     PL_rs = Nullsv;
500
501     SvREFCNT_dec(PL_nrs);       /* $/ helper */
502     PL_nrs = Nullsv;
503
504     PL_multiline = 0;           /* $* */
505     Safefree(PL_osname);        /* $^O */
506     PL_osname = Nullch;
507
508     SvREFCNT_dec(PL_statname);
509     PL_statname = Nullsv;
510     PL_statgv = Nullgv;
511
512     /* defgv, aka *_ should be taken care of elsewhere */
513
514     /* clean up after study() */
515     SvREFCNT_dec(PL_lastscream);
516     PL_lastscream = Nullsv;
517     Safefree(PL_screamfirst);
518     PL_screamfirst = 0;
519     Safefree(PL_screamnext);
520     PL_screamnext  = 0;
521
522     /* float buffer */
523     Safefree(PL_efloatbuf);
524     PL_efloatbuf = Nullch;
525     PL_efloatsize = 0;
526
527     /* startup and shutdown function lists */
528     SvREFCNT_dec(PL_beginav);
529     SvREFCNT_dec(PL_endav);
530     SvREFCNT_dec(PL_checkav);
531     SvREFCNT_dec(PL_initav);
532     PL_beginav = Nullav;
533     PL_endav = Nullav;
534     PL_checkav = Nullav;
535     PL_initav = Nullav;
536
537     /* shortcuts just get cleared */
538     PL_envgv = Nullgv;
539     PL_incgv = Nullgv;
540     PL_hintgv = Nullgv;
541     PL_errgv = Nullgv;
542     PL_argvgv = Nullgv;
543     PL_argvoutgv = Nullgv;
544     PL_stdingv = Nullgv;
545     PL_stderrgv = Nullgv;
546     PL_last_in_gv = Nullgv;
547     PL_replgv = Nullgv;
548     PL_debstash = Nullhv;
549
550     /* reset so print() ends up where we expect */
551     setdefout(Nullgv);
552
553     SvREFCNT_dec(PL_argvout_stack);
554     PL_argvout_stack = Nullav;
555
556     SvREFCNT_dec(PL_modglobal);
557     PL_modglobal = Nullhv;
558     SvREFCNT_dec(PL_preambleav);
559     PL_preambleav = Nullav;
560     SvREFCNT_dec(PL_subname);
561     PL_subname = Nullsv;
562     SvREFCNT_dec(PL_linestr);
563     PL_linestr = Nullsv;
564     SvREFCNT_dec(PL_pidstatus);
565     PL_pidstatus = Nullhv;
566     SvREFCNT_dec(PL_toptarget);
567     PL_toptarget = Nullsv;
568     SvREFCNT_dec(PL_bodytarget);
569     PL_bodytarget = Nullsv;
570     PL_formtarget = Nullsv;
571
572     /* free locale stuff */
573 #ifdef USE_LOCALE_COLLATE
574     Safefree(PL_collation_name);
575     PL_collation_name = Nullch;
576 #endif
577
578 #ifdef USE_LOCALE_NUMERIC
579     Safefree(PL_numeric_name);
580     PL_numeric_name = Nullch;
581     SvREFCNT_dec(PL_numeric_radix);
582 #endif
583
584     /* clear utf8 character classes */
585     SvREFCNT_dec(PL_utf8_alnum);
586     SvREFCNT_dec(PL_utf8_alnumc);
587     SvREFCNT_dec(PL_utf8_ascii);
588     SvREFCNT_dec(PL_utf8_alpha);
589     SvREFCNT_dec(PL_utf8_space);
590     SvREFCNT_dec(PL_utf8_cntrl);
591     SvREFCNT_dec(PL_utf8_graph);
592     SvREFCNT_dec(PL_utf8_digit);
593     SvREFCNT_dec(PL_utf8_upper);
594     SvREFCNT_dec(PL_utf8_lower);
595     SvREFCNT_dec(PL_utf8_print);
596     SvREFCNT_dec(PL_utf8_punct);
597     SvREFCNT_dec(PL_utf8_xdigit);
598     SvREFCNT_dec(PL_utf8_mark);
599     SvREFCNT_dec(PL_utf8_toupper);
600     SvREFCNT_dec(PL_utf8_tolower);
601     PL_utf8_alnum       = Nullsv;
602     PL_utf8_alnumc      = Nullsv;
603     PL_utf8_ascii       = Nullsv;
604     PL_utf8_alpha       = Nullsv;
605     PL_utf8_space       = Nullsv;
606     PL_utf8_cntrl       = Nullsv;
607     PL_utf8_graph       = Nullsv;
608     PL_utf8_digit       = Nullsv;
609     PL_utf8_upper       = Nullsv;
610     PL_utf8_lower       = Nullsv;
611     PL_utf8_print       = Nullsv;
612     PL_utf8_punct       = Nullsv;
613     PL_utf8_xdigit      = Nullsv;
614     PL_utf8_mark        = Nullsv;
615     PL_utf8_toupper     = Nullsv;
616     PL_utf8_totitle     = Nullsv;
617     PL_utf8_tolower     = Nullsv;
618
619     if (!specialWARN(PL_compiling.cop_warnings))
620         SvREFCNT_dec(PL_compiling.cop_warnings);
621     PL_compiling.cop_warnings = Nullsv;
622     if (!specialCopIO(PL_compiling.cop_io))
623         SvREFCNT_dec(PL_compiling.cop_io);
624     PL_compiling.cop_io = Nullsv;
625 #ifdef USE_ITHREADS
626     Safefree(CopFILE(&PL_compiling));
627     CopFILE(&PL_compiling) = Nullch;
628     Safefree(CopSTASHPV(&PL_compiling));
629 #else
630     SvREFCNT_dec(CopFILEGV(&PL_compiling));
631     CopFILEGV(&PL_compiling) = Nullgv;
632     /* cop_stash is not refcounted */
633 #endif
634
635     /* Prepare to destruct main symbol table.  */
636
637     hv = PL_defstash;
638     PL_defstash = 0;
639     SvREFCNT_dec(hv);
640     SvREFCNT_dec(PL_curstname);
641     PL_curstname = Nullsv;
642
643     /* clear queued errors */
644     SvREFCNT_dec(PL_errors);
645     PL_errors = Nullsv;
646
647     FREETMPS;
648     if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
649         if (PL_scopestack_ix != 0)
650             Perl_warner(aTHX_ WARN_INTERNAL,
651                  "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
652                  (long)PL_scopestack_ix);
653         if (PL_savestack_ix != 0)
654             Perl_warner(aTHX_ WARN_INTERNAL,
655                  "Unbalanced saves: %ld more saves than restores\n",
656                  (long)PL_savestack_ix);
657         if (PL_tmps_floor != -1)
658             Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
659                  (long)PL_tmps_floor + 1);
660         if (cxstack_ix != -1)
661             Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
662                  (long)cxstack_ix + 1);
663     }
664
665     /* Now absolutely destruct everything, somehow or other, loops or no. */
666     last_sv_count = 0;
667     SvFLAGS(PL_fdpid) |= SVTYPEMASK;            /* don't clean out pid table now */
668     SvFLAGS(PL_strtab) |= SVTYPEMASK;           /* don't clean out strtab now */
669     while (PL_sv_count != 0 && PL_sv_count != last_sv_count) {
670         last_sv_count = PL_sv_count;
671         sv_clean_all();
672     }
673     SvFLAGS(PL_fdpid) &= ~SVTYPEMASK;
674     SvFLAGS(PL_fdpid) |= SVt_PVAV;
675     SvFLAGS(PL_strtab) &= ~SVTYPEMASK;
676     SvFLAGS(PL_strtab) |= SVt_PVHV;
677
678     AvREAL_off(PL_fdpid);               /* no surviving entries */
679     SvREFCNT_dec(PL_fdpid);             /* needed in io_close() */
680     PL_fdpid = Nullav;
681
682 #ifdef HAVE_INTERP_INTERN
683     sys_intern_clear();
684 #endif
685
686     /* Destruct the global string table. */
687     {
688         /* Yell and reset the HeVAL() slots that are still holding refcounts,
689          * so that sv_free() won't fail on them.
690          */
691         I32 riter;
692         I32 max;
693         HE *hent;
694         HE **array;
695
696         riter = 0;
697         max = HvMAX(PL_strtab);
698         array = HvARRAY(PL_strtab);
699         hent = array[0];
700         for (;;) {
701             if (hent && ckWARN_d(WARN_INTERNAL)) {
702                 Perl_warner(aTHX_ WARN_INTERNAL,
703                      "Unbalanced string table refcount: (%d) for \"%s\"",
704                      HeVAL(hent) - Nullsv, HeKEY(hent));
705                 HeVAL(hent) = Nullsv;
706                 hent = HeNEXT(hent);
707             }
708             if (!hent) {
709                 if (++riter > max)
710                     break;
711                 hent = array[riter];
712             }
713         }
714     }
715     SvREFCNT_dec(PL_strtab);
716
717 #ifdef USE_ITHREADS
718     /* free the pointer table used for cloning */
719     ptr_table_free(PL_ptr_table);
720 #endif
721
722     /* free special SVs */
723
724     SvREFCNT(&PL_sv_yes) = 0;
725     sv_clear(&PL_sv_yes);
726     SvANY(&PL_sv_yes) = NULL;
727     SvFLAGS(&PL_sv_yes) = 0;
728
729     SvREFCNT(&PL_sv_no) = 0;
730     sv_clear(&PL_sv_no);
731     SvANY(&PL_sv_no) = NULL;
732     SvFLAGS(&PL_sv_no) = 0;
733
734     SvREFCNT(&PL_sv_undef) = 0;
735     SvREADONLY_off(&PL_sv_undef);
736
737     if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
738         Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
739
740     Safefree(PL_origfilename);
741     Safefree(PL_reg_start_tmp);
742     if (PL_reg_curpm)
743         Safefree(PL_reg_curpm);
744     Safefree(PL_reg_poscache);
745     Safefree(HeKEY_hek(&PL_hv_fetch_ent_mh));
746     Safefree(PL_op_mask);
747     Safefree(PL_psig_ptr);
748     Safefree(PL_psig_name);
749     Safefree(PL_bitcount);
750     Safefree(PL_psig_pend);
751     nuke_stacks();
752     PL_hints = 0;               /* Reset hints. Should hints be per-interpreter ? */
753
754     DEBUG_P(debprofdump());
755 #ifdef USE_THREADS
756     MUTEX_DESTROY(&PL_strtab_mutex);
757     MUTEX_DESTROY(&PL_sv_mutex);
758     MUTEX_DESTROY(&PL_eval_mutex);
759     MUTEX_DESTROY(&PL_cred_mutex);
760     MUTEX_DESTROY(&PL_fdpid_mutex);
761     COND_DESTROY(&PL_eval_cond);
762 #ifdef EMULATE_ATOMIC_REFCOUNTS
763     MUTEX_DESTROY(&PL_svref_mutex);
764 #endif /* EMULATE_ATOMIC_REFCOUNTS */
765
766     /* As the penultimate thing, free the non-arena SV for thrsv */
767     Safefree(SvPVX(PL_thrsv));
768     Safefree(SvANY(PL_thrsv));
769     Safefree(PL_thrsv);
770     PL_thrsv = Nullsv;
771 #endif /* USE_THREADS */
772
773     sv_free_arenas();
774
775     /* As the absolutely last thing, free the non-arena SV for mess() */
776
777     if (PL_mess_sv) {
778         /* it could have accumulated taint magic */
779         if (SvTYPE(PL_mess_sv) >= SVt_PVMG) {
780             MAGIC* mg;
781             MAGIC* moremagic;
782             for (mg = SvMAGIC(PL_mess_sv); mg; mg = moremagic) {
783                 moremagic = mg->mg_moremagic;
784                 if (mg->mg_ptr && mg->mg_type != 'g' && mg->mg_len >= 0)
785                     Safefree(mg->mg_ptr);
786                 Safefree(mg);
787             }
788         }
789         /* we know that type >= SVt_PV */
790         (void)SvOOK_off(PL_mess_sv);
791         Safefree(SvPVX(PL_mess_sv));
792         Safefree(SvANY(PL_mess_sv));
793         Safefree(PL_mess_sv);
794         PL_mess_sv = Nullsv;
795     }
796 }
797
798 /*
799 =for apidoc perl_free
800
801 Releases a Perl interpreter.  See L<perlembed>.
802
803 =cut
804 */
805
806 void
807 perl_free(pTHXx)
808 {
809 #if defined(PERL_OBJECT)
810     PerlMem_free(this);
811 #else
812 #  if defined(WIN32)
813 #  if defined(PERL_IMPLICIT_SYS)
814     void *host = w32_internal_host;
815     if (PerlProc_lasthost()) {
816         PerlIO_cleanup();
817     }
818     PerlMem_free(aTHXx);
819     win32_delete_internal_host(host);
820 #else
821     PerlIO_cleanup();
822     PerlMem_free(aTHXx);
823 #endif
824 #  else
825     PerlMem_free(aTHXx);
826 #  endif
827 #endif
828 }
829
830 void
831 Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
832 {
833     Renew(PL_exitlist, PL_exitlistlen+1, PerlExitListEntry);
834     PL_exitlist[PL_exitlistlen].fn = fn;
835     PL_exitlist[PL_exitlistlen].ptr = ptr;
836     ++PL_exitlistlen;
837 }
838
839 /*
840 =for apidoc perl_parse
841
842 Tells a Perl interpreter to parse a Perl script.  See L<perlembed>.
843
844 =cut
845 */
846
847 int
848 perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
849 {
850     I32 oldscope;
851     int ret;
852     dJMPENV;
853 #ifdef USE_THREADS
854     dTHX;
855 #endif
856
857 #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
858 #ifdef IAMSUID
859 #undef IAMSUID
860     Perl_croak(aTHX_ "suidperl is no longer needed since the kernel can now execute\n\
861 setuid perl scripts securely.\n");
862 #endif
863 #endif
864
865 #if defined(__DYNAMIC__) && (defined(NeXT) || defined(__NeXT__))
866     _dyld_lookup_and_bind
867         ("__environ", (unsigned long *) &environ_pointer, NULL);
868 #endif /* environ */
869
870     PL_origargv = argv;
871     PL_origargc = argc;
872 #ifdef  USE_ENVIRON_ARRAY
873     PL_origenviron = environ;
874 #endif
875
876     if (PL_do_undump) {
877
878         /* Come here if running an undumped a.out. */
879
880         PL_origfilename = savepv(argv[0]);
881         PL_do_undump = FALSE;
882         cxstack_ix = -1;                /* start label stack again */
883         init_ids();
884         init_postdump_symbols(argc,argv,env);
885         return 0;
886     }
887
888     if (PL_main_root) {
889         PL_curpad = AvARRAY(PL_comppad);
890         op_free(PL_main_root);
891         PL_main_root = Nullop;
892     }
893     PL_main_start = Nullop;
894     SvREFCNT_dec(PL_main_cv);
895     PL_main_cv = Nullcv;
896
897     time(&PL_basetime);
898     oldscope = PL_scopestack_ix;
899     PL_dowarn = G_WARN_OFF;
900
901 #ifdef PERL_FLEXIBLE_EXCEPTIONS
902     CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vparse_body), env, xsinit);
903 #else
904     JMPENV_PUSH(ret);
905 #endif
906     switch (ret) {
907     case 0:
908 #ifndef PERL_FLEXIBLE_EXCEPTIONS
909         parse_body(env,xsinit);
910 #endif
911         if (PL_checkav)
912             call_list(oldscope, PL_checkav);
913         ret = 0;
914         break;
915     case 1:
916         STATUS_ALL_FAILURE;
917         /* FALL THROUGH */
918     case 2:
919         /* my_exit() was called */
920         while (PL_scopestack_ix > oldscope)
921             LEAVE;
922         FREETMPS;
923         PL_curstash = PL_defstash;
924         if (PL_checkav)
925             call_list(oldscope, PL_checkav);
926         ret = STATUS_NATIVE_EXPORT;
927         break;
928     case 3:
929         PerlIO_printf(Perl_error_log, "panic: top_env\n");
930         ret = 1;
931         break;
932     }
933     JMPENV_POP;
934     return ret;
935 }
936
937 #ifdef PERL_FLEXIBLE_EXCEPTIONS
938 STATIC void *
939 S_vparse_body(pTHX_ va_list args)
940 {
941     char **env = va_arg(args, char**);
942     XSINIT_t xsinit = va_arg(args, XSINIT_t);
943
944     return parse_body(env, xsinit);
945 }
946 #endif
947
948 STATIC void *
949 S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
950 {
951     int argc = PL_origargc;
952     char **argv = PL_origargv;
953     char *scriptname = NULL;
954     int fdscript = -1;
955     VOL bool dosearch = FALSE;
956     char *validarg = "";
957     AV* comppadlist;
958     register SV *sv;
959     register char *s;
960     char *cddir = Nullch;
961
962     sv_setpvn(PL_linestr,"",0);
963     sv = newSVpvn("",0);                /* first used for -I flags */
964     SAVEFREESV(sv);
965     init_main_stash();
966
967     for (argc--,argv++; argc > 0; argc--,argv++) {
968         if (argv[0][0] != '-' || !argv[0][1])
969             break;
970 #ifdef DOSUID
971     if (*validarg)
972         validarg = " PHOOEY ";
973     else
974         validarg = argv[0];
975 #endif
976         s = argv[0]+1;
977       reswitch:
978         switch (*s) {
979         case 'C':
980 #ifdef  WIN32
981             win32_argv2utf8(argc-1, argv+1);
982             /* FALL THROUGH */
983 #endif
984 #ifndef PERL_STRICT_CR
985         case '\r':
986 #endif
987         case ' ':
988         case '0':
989         case 'F':
990         case 'a':
991         case 'c':
992         case 'd':
993         case 'D':
994         case 'h':
995         case 'i':
996         case 'l':
997         case 'M':
998         case 'm':
999         case 'n':
1000         case 'p':
1001         case 's':
1002         case 'u':
1003         case 'U':
1004         case 'v':
1005         case 'W':
1006         case 'X':
1007         case 'w':
1008             if ((s = moreswitches(s)))
1009                 goto reswitch;
1010             break;
1011
1012         case 'T':
1013             PL_tainting = TRUE;
1014             s++;
1015             goto reswitch;
1016
1017         case 'e':
1018 #ifdef MACOS_TRADITIONAL
1019             /* ignore -e for Dev:Pseudo argument */
1020             if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
1021                 break;
1022 #endif
1023             if (PL_euid != PL_uid || PL_egid != PL_gid)
1024                 Perl_croak(aTHX_ "No -e allowed in setuid scripts");
1025             if (!PL_e_script) {
1026                 PL_e_script = newSVpvn("",0);
1027                 filter_add(read_e_script, NULL);
1028             }
1029             if (*++s)
1030                 sv_catpv(PL_e_script, s);
1031             else if (argv[1]) {
1032                 sv_catpv(PL_e_script, argv[1]);
1033                 argc--,argv++;
1034             }
1035             else
1036                 Perl_croak(aTHX_ "No code specified for -e");
1037             sv_catpv(PL_e_script, "\n");
1038             break;
1039
1040         case 'I':       /* -I handled both here and in moreswitches() */
1041             forbid_setid("-I");
1042             if (!*++s && (s=argv[1]) != Nullch) {
1043                 argc--,argv++;
1044             }
1045             if (s && *s) {
1046                 char *p;
1047                 STRLEN len = strlen(s);
1048                 p = savepvn(s, len);
1049                 incpush(p, TRUE, TRUE);
1050                 sv_catpvn(sv, "-I", 2);
1051                 sv_catpvn(sv, p, len);
1052                 sv_catpvn(sv, " ", 1);
1053                 Safefree(p);
1054             }
1055             else
1056                 Perl_croak(aTHX_ "No directory specified for -I");
1057             break;
1058         case 'P':
1059             forbid_setid("-P");
1060             PL_preprocess = TRUE;
1061             s++;
1062             goto reswitch;
1063         case 'S':
1064             forbid_setid("-S");
1065             dosearch = TRUE;
1066             s++;
1067             goto reswitch;
1068         case 'V':
1069             if (!PL_preambleav)
1070                 PL_preambleav = newAV();
1071             av_push(PL_preambleav, newSVpv("use Config qw(myconfig config_vars)",0));
1072             if (*++s != ':')  {
1073                 PL_Sv = newSVpv("print myconfig();",0);
1074 #ifdef VMS
1075                 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this PERLSHR image: \\n\",");
1076 #else
1077                 sv_catpv(PL_Sv,"print \"\\nCharacteristics of this binary (from libperl): \\n\",");
1078 #endif
1079                 sv_catpv(PL_Sv,"\"  Compile-time options:");
1080 #  ifdef DEBUGGING
1081                 sv_catpv(PL_Sv," DEBUGGING");
1082 #  endif
1083 #  ifdef MULTIPLICITY
1084                 sv_catpv(PL_Sv," MULTIPLICITY");
1085 #  endif
1086 #  ifdef USE_THREADS
1087                 sv_catpv(PL_Sv," USE_THREADS");
1088 #  endif
1089 #  ifdef USE_ITHREADS
1090                 sv_catpv(PL_Sv," USE_ITHREADS");
1091 #  endif
1092 #  ifdef USE_64_BIT_INT
1093                 sv_catpv(PL_Sv," USE_64_BIT_INT");
1094 #  endif
1095 #  ifdef USE_64_BIT_ALL
1096                 sv_catpv(PL_Sv," USE_64_BIT_ALL");
1097 #  endif
1098 #  ifdef USE_LONG_DOUBLE
1099                 sv_catpv(PL_Sv," USE_LONG_DOUBLE");
1100 #  endif
1101 #  ifdef USE_LARGE_FILES
1102                 sv_catpv(PL_Sv," USE_LARGE_FILES");
1103 #  endif
1104 #  ifdef USE_SOCKS
1105                 sv_catpv(PL_Sv," USE_SOCKS");
1106 #  endif
1107 #  ifdef PERL_OBJECT
1108                 sv_catpv(PL_Sv," PERL_OBJECT");
1109 #  endif
1110 #  ifdef PERL_IMPLICIT_CONTEXT
1111                 sv_catpv(PL_Sv," PERL_IMPLICIT_CONTEXT");
1112 #  endif
1113 #  ifdef PERL_IMPLICIT_SYS
1114                 sv_catpv(PL_Sv," PERL_IMPLICIT_SYS");
1115 #  endif
1116                 sv_catpv(PL_Sv,"\\n\",");
1117
1118 #if defined(LOCAL_PATCH_COUNT)
1119                 if (LOCAL_PATCH_COUNT > 0) {
1120                     int i;
1121                     sv_catpv(PL_Sv,"\"  Locally applied patches:\\n\",");
1122                     for (i = 1; i <= LOCAL_PATCH_COUNT; i++) {
1123                         if (PL_localpatches[i])
1124                             Perl_sv_catpvf(aTHX_ PL_Sv,"q\"  \t%s\n\",",PL_localpatches[i]);
1125                     }
1126                 }
1127 #endif
1128                 Perl_sv_catpvf(aTHX_ PL_Sv,"\"  Built under %s\\n\"",OSNAME);
1129 #ifdef __DATE__
1130 #  ifdef __TIME__
1131                 Perl_sv_catpvf(aTHX_ PL_Sv,",\"  Compiled at %s %s\\n\"",__DATE__,__TIME__);
1132 #  else
1133                 Perl_sv_catpvf(aTHX_ PL_Sv,",\"  Compiled on %s\\n\"",__DATE__);
1134 #  endif
1135 #endif
1136                 sv_catpv(PL_Sv, "; \
1137 $\"=\"\\n    \"; \
1138 @env = map { \"$_=\\\"$ENV{$_}\\\"\" } sort grep {/^PERL/} keys %ENV; \
1139 print \"  \\%ENV:\\n    @env\\n\" if @env; \
1140 print \"  \\@INC:\\n    @INC\\n\";");
1141             }
1142             else {
1143                 PL_Sv = newSVpv("config_vars(qw(",0);
1144                 sv_catpv(PL_Sv, ++s);
1145                 sv_catpv(PL_Sv, "))");
1146                 s += strlen(s);
1147             }
1148             av_push(PL_preambleav, PL_Sv);
1149             scriptname = BIT_BUCKET;    /* don't look for script or read stdin */
1150             goto reswitch;
1151         case 'x':
1152             PL_doextract = TRUE;
1153             s++;
1154             if (*s)
1155                 cddir = s;
1156             break;
1157         case 0:
1158             break;
1159         case '-':
1160             if (!*++s || isSPACE(*s)) {
1161                 argc--,argv++;
1162                 goto switch_end;
1163             }
1164             /* catch use of gnu style long options */
1165             if (strEQ(s, "version")) {
1166                 s = "v";
1167                 goto reswitch;
1168             }
1169             if (strEQ(s, "help")) {
1170                 s = "h";
1171                 goto reswitch;
1172             }
1173             s--;
1174             /* FALL THROUGH */
1175         default:
1176             Perl_croak(aTHX_ "Unrecognized switch: -%s  (-h will show valid options)",s);
1177         }
1178     }
1179   switch_end:
1180
1181     if (
1182 #ifndef SECURE_INTERNAL_GETENV
1183         !PL_tainting &&
1184 #endif
1185         (s = PerlEnv_getenv("PERL5OPT")))
1186     {
1187         while (isSPACE(*s))
1188             s++;
1189         if (*s == '-' && *(s+1) == 'T')
1190             PL_tainting = TRUE;
1191         else {
1192             while (s && *s) {
1193                 char *d;
1194                 while (isSPACE(*s))
1195                     s++;
1196                 if (*s == '-') {
1197                     s++;
1198                     if (isSPACE(*s))
1199                         continue;
1200                 }
1201                 d = s;
1202                 if (!*s)
1203                     break;
1204                 if (!strchr("DIMUdmw", *s))
1205                     Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
1206                 while (++s && *s) {
1207                     if (isSPACE(*s)) {
1208                         *s++ = '\0';
1209                         break;
1210                     }
1211                 }
1212                 moreswitches(d);
1213             }
1214         }
1215     }
1216
1217     if (!scriptname)
1218         scriptname = argv[0];
1219     if (PL_e_script) {
1220         argc++,argv--;
1221         scriptname = BIT_BUCKET;        /* don't look for script or read stdin */
1222     }
1223     else if (scriptname == Nullch) {
1224 #ifdef MSDOS
1225         if ( PerlLIO_isatty(PerlIO_fileno(PerlIO_stdin())) )
1226             moreswitches("h");
1227 #endif
1228         scriptname = "-";
1229     }
1230
1231     init_perllib();
1232
1233     open_script(scriptname,dosearch,sv,&fdscript);
1234
1235     validate_suid(validarg, scriptname,fdscript);
1236
1237 #ifndef PERL_MICRO
1238 #if defined(SIGCHLD) || defined(SIGCLD)
1239     {
1240 #ifndef SIGCHLD
1241 #  define SIGCHLD SIGCLD
1242 #endif
1243         Sighandler_t sigstate = rsignal_state(SIGCHLD);
1244         if (sigstate == SIG_IGN) {
1245             if (ckWARN(WARN_SIGNAL))
1246                 Perl_warner(aTHX_ WARN_SIGNAL,
1247                             "Can't ignore signal CHLD, forcing to default");
1248             (void)rsignal(SIGCHLD, (Sighandler_t)SIG_DFL);
1249         }
1250     }
1251 #endif
1252 #endif
1253
1254 #ifdef MACOS_TRADITIONAL
1255     if (PL_doextract || gMacPerl_AlwaysExtract) {
1256 #else
1257     if (PL_doextract) {
1258 #endif
1259         find_beginning();
1260         if (cddir && PerlDir_chdir(cddir) < 0)
1261             Perl_croak(aTHX_ "Can't chdir to %s",cddir);
1262
1263     }
1264
1265     PL_main_cv = PL_compcv = (CV*)NEWSV(1104,0);
1266     sv_upgrade((SV *)PL_compcv, SVt_PVCV);
1267     CvUNIQUE_on(PL_compcv);
1268
1269     PL_comppad = newAV();
1270     av_push(PL_comppad, Nullsv);
1271     PL_curpad = AvARRAY(PL_comppad);
1272     PL_comppad_name = newAV();
1273     PL_comppad_name_fill = 0;
1274     PL_min_intro_pending = 0;
1275     PL_padix = 0;
1276 #ifdef USE_THREADS
1277     av_store(PL_comppad_name, 0, newSVpvn("@_", 2));
1278     PL_curpad[0] = (SV*)newAV();
1279     SvPADMY_on(PL_curpad[0]);   /* XXX Needed? */
1280     CvOWNER(PL_compcv) = 0;
1281     New(666, CvMUTEXP(PL_compcv), 1, perl_mutex);
1282     MUTEX_INIT(CvMUTEXP(PL_compcv));
1283 #endif /* USE_THREADS */
1284
1285     comppadlist = newAV();
1286     AvREAL_off(comppadlist);
1287     av_store(comppadlist, 0, (SV*)PL_comppad_name);
1288     av_store(comppadlist, 1, (SV*)PL_comppad);
1289     CvPADLIST(PL_compcv) = comppadlist;
1290
1291     boot_core_UNIVERSAL();
1292 #ifndef PERL_MICRO
1293     boot_core_xsutils();
1294 #endif
1295
1296     if (xsinit)
1297         (*xsinit)(aTHXo);       /* in case linked C routines want magical variables */
1298 #ifndef PERL_MICRO
1299 #if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
1300     init_os_extras();
1301 #endif
1302 #endif
1303
1304 #ifdef USE_SOCKS
1305 #   ifdef HAS_SOCKS5_INIT
1306     socks5_init(argv[0]);
1307 #   else
1308     SOCKSinit(argv[0]);
1309 #   endif
1310 #endif
1311
1312     init_predump_symbols();
1313     /* init_postdump_symbols not currently designed to be called */
1314     /* more than once (ENV isn't cleared first, for example)     */
1315     /* But running with -u leaves %ENV & @ARGV undefined!    XXX */
1316     if (!PL_do_undump)
1317         init_postdump_symbols(argc,argv,env);
1318
1319     init_lexer();
1320
1321     /* now parse the script */
1322
1323     SETERRNO(0,SS$_NORMAL);
1324     PL_error_count = 0;
1325 #ifdef MACOS_TRADITIONAL
1326     if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) {
1327         if (PL_minus_c)
1328             Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
1329         else {
1330             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1331                        MacPerl_MPWFileName(PL_origfilename));
1332         }
1333     }
1334 #else
1335     if (yyparse() || PL_error_count) {
1336         if (PL_minus_c)
1337             Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
1338         else {
1339             Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
1340                        PL_origfilename);
1341         }
1342     }
1343 #endif
1344     CopLINE_set(PL_curcop, 0);
1345     PL_curstash = PL_defstash;
1346     PL_preprocess = FALSE;
1347     if (PL_e_script) {
1348         SvREFCNT_dec(PL_e_script);
1349         PL_e_script = Nullsv;
1350     }
1351
1352     /* now that script is parsed, we can modify record separator */
1353     SvREFCNT_dec(PL_rs);
1354     PL_rs = SvREFCNT_inc(PL_nrs);
1355     sv_setsv(get_sv("/", TRUE), PL_rs);
1356     if (PL_do_undump)
1357         my_unexec();
1358
1359     if (isWARN_ONCE) {
1360         SAVECOPFILE(PL_curcop);
1361         SAVECOPLINE(PL_curcop);
1362         gv_check(PL_defstash);
1363     }
1364
1365     LEAVE;
1366     FREETMPS;
1367
1368 #ifdef MYMALLOC
1369     if ((s=PerlEnv_getenv("PERL_DEBUG_MSTATS")) && atoi(s) >= 2)
1370         dump_mstats("after compilation:");
1371 #endif
1372
1373     ENTER;
1374     PL_restartop = 0;
1375     return NULL;
1376 }
1377
1378 /*
1379 =for apidoc perl_run
1380
1381 Tells a Perl interpreter to run.  See L<perlembed>.
1382
1383 =cut
1384 */
1385
1386 int
1387 perl_run(pTHXx)
1388 {
1389     I32 oldscope;
1390     int ret = 0;
1391     dJMPENV;
1392 #ifdef USE_THREADS
1393     dTHX;
1394 #endif
1395
1396     oldscope = PL_scopestack_ix;
1397
1398 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1399  redo_body:
1400     CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vrun_body), oldscope);
1401 #else
1402     JMPENV_PUSH(ret);
1403 #endif
1404     switch (ret) {
1405     case 1:
1406         cxstack_ix = -1;                /* start context stack again */
1407         goto redo_body;
1408     case 0:                             /* normal completion */
1409 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1410  redo_body:
1411         run_body(oldscope);
1412 #endif
1413         /* FALL THROUGH */
1414     case 2:                             /* my_exit() */
1415         while (PL_scopestack_ix > oldscope)
1416             LEAVE;
1417         FREETMPS;
1418         PL_curstash = PL_defstash;
1419         if (PL_endav && !PL_minus_c)
1420             call_list(oldscope, PL_endav);
1421 #ifdef MYMALLOC
1422         if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
1423             dump_mstats("after execution:  ");
1424 #endif
1425         ret = STATUS_NATIVE_EXPORT;
1426         break;
1427     case 3:
1428         if (PL_restartop) {
1429             POPSTACK_TO(PL_mainstack);
1430             goto redo_body;
1431         }
1432         PerlIO_printf(Perl_error_log, "panic: restartop\n");
1433         FREETMPS;
1434         ret = 1;
1435         break;
1436     }
1437
1438     JMPENV_POP;
1439     return ret;
1440 }
1441
1442 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1443 STATIC void *
1444 S_vrun_body(pTHX_ va_list args)
1445 {
1446     I32 oldscope = va_arg(args, I32);
1447
1448     return run_body(oldscope);
1449 }
1450 #endif
1451
1452
1453 STATIC void *
1454 S_run_body(pTHX_ I32 oldscope)
1455 {
1456     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s $` $& $' support.\n",
1457                     PL_sawampersand ? "Enabling" : "Omitting"));
1458
1459     if (!PL_restartop) {
1460         DEBUG_x(dump_all());
1461         DEBUG(PerlIO_printf(Perl_debug_log, "\nEXECUTING...\n\n"));
1462         DEBUG_S(PerlIO_printf(Perl_debug_log, "main thread is 0x%"UVxf"\n",
1463                               PTR2UV(thr)));
1464
1465         if (PL_minus_c) {
1466 #ifdef MACOS_TRADITIONAL
1467             PerlIO_printf(Perl_error_log, "%s syntax OK\n", MacPerl_MPWFileName(PL_origfilename));
1468 #else
1469             PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
1470 #endif
1471             my_exit(0);
1472         }
1473         if (PERLDB_SINGLE && PL_DBsingle)
1474             sv_setiv(PL_DBsingle, 1);
1475         if (PL_initav)
1476             call_list(oldscope, PL_initav);
1477     }
1478
1479     /* do it */
1480
1481     if (PL_restartop) {
1482         PL_op = PL_restartop;
1483         PL_restartop = 0;
1484         CALLRUNOPS(aTHX);
1485     }
1486     else if (PL_main_start) {
1487         CvDEPTH(PL_main_cv) = 1;
1488         PL_op = PL_main_start;
1489         CALLRUNOPS(aTHX);
1490     }
1491
1492     my_exit(0);
1493     /* NOTREACHED */
1494     return NULL;
1495 }
1496
1497 /*
1498 =for apidoc p||get_sv
1499
1500 Returns the SV of the specified Perl scalar.  If C<create> is set and the
1501 Perl variable does not exist then it will be created.  If C<create> is not
1502 set and the variable does not exist then NULL is returned.
1503
1504 =cut
1505 */
1506
1507 SV*
1508 Perl_get_sv(pTHX_ const char *name, I32 create)
1509 {
1510     GV *gv;
1511 #ifdef USE_THREADS
1512     if (name[1] == '\0' && !isALPHA(name[0])) {
1513         PADOFFSET tmp = find_threadsv(name);
1514         if (tmp != NOT_IN_PAD)
1515             return THREADSV(tmp);
1516     }
1517 #endif /* USE_THREADS */
1518     gv = gv_fetchpv(name, create, SVt_PV);
1519     if (gv)
1520         return GvSV(gv);
1521     return Nullsv;
1522 }
1523
1524 /*
1525 =for apidoc p||get_av
1526
1527 Returns the AV of the specified Perl array.  If C<create> is set and the
1528 Perl variable does not exist then it will be created.  If C<create> is not
1529 set and the variable does not exist then NULL is returned.
1530
1531 =cut
1532 */
1533
1534 AV*
1535 Perl_get_av(pTHX_ const char *name, I32 create)
1536 {
1537     GV* gv = gv_fetchpv(name, create, SVt_PVAV);
1538     if (create)
1539         return GvAVn(gv);
1540     if (gv)
1541         return GvAV(gv);
1542     return Nullav;
1543 }
1544
1545 /*
1546 =for apidoc p||get_hv
1547
1548 Returns the HV of the specified Perl hash.  If C<create> is set and the
1549 Perl variable does not exist then it will be created.  If C<create> is not
1550 set and the variable does not exist then NULL is returned.
1551
1552 =cut
1553 */
1554
1555 HV*
1556 Perl_get_hv(pTHX_ const char *name, I32 create)
1557 {
1558     GV* gv = gv_fetchpv(name, create, SVt_PVHV);
1559     if (create)
1560         return GvHVn(gv);
1561     if (gv)
1562         return GvHV(gv);
1563     return Nullhv;
1564 }
1565
1566 /*
1567 =for apidoc p||get_cv
1568
1569 Returns the CV of the specified Perl subroutine.  If C<create> is set and
1570 the Perl subroutine does not exist then it will be declared (which has the
1571 same effect as saying C<sub name;>).  If C<create> is not set and the
1572 subroutine does not exist then NULL is returned.
1573
1574 =cut
1575 */
1576
1577 CV*
1578 Perl_get_cv(pTHX_ const char *name, I32 create)
1579 {
1580     GV* gv = gv_fetchpv(name, create, SVt_PVCV);
1581     /* XXX unsafe for threads if eval_owner isn't held */
1582     /* XXX this is probably not what they think they're getting.
1583      * It has the same effect as "sub name;", i.e. just a forward
1584      * declaration! */
1585     if (create && !GvCVu(gv))
1586         return newSUB(start_subparse(FALSE, 0),
1587                       newSVOP(OP_CONST, 0, newSVpv(name,0)),
1588                       Nullop,
1589                       Nullop);
1590     if (gv)
1591         return GvCVu(gv);
1592     return Nullcv;
1593 }
1594
1595 /* Be sure to refetch the stack pointer after calling these routines. */
1596
1597 /*
1598 =for apidoc p||call_argv
1599
1600 Performs a callback to the specified Perl sub.  See L<perlcall>.
1601
1602 =cut
1603 */
1604
1605 I32
1606 Perl_call_argv(pTHX_ const char *sub_name, I32 flags, register char **argv)
1607
1608                         /* See G_* flags in cop.h */
1609                         /* null terminated arg list */
1610 {
1611     dSP;
1612
1613     PUSHMARK(SP);
1614     if (argv) {
1615         while (*argv) {
1616             XPUSHs(sv_2mortal(newSVpv(*argv,0)));
1617             argv++;
1618         }
1619         PUTBACK;
1620     }
1621     return call_pv(sub_name, flags);
1622 }
1623
1624 /*
1625 =for apidoc p||call_pv
1626
1627 Performs a callback to the specified Perl sub.  See L<perlcall>.
1628
1629 =cut
1630 */
1631
1632 I32
1633 Perl_call_pv(pTHX_ const char *sub_name, I32 flags)
1634                         /* name of the subroutine */
1635                         /* See G_* flags in cop.h */
1636 {
1637     return call_sv((SV*)get_cv(sub_name, TRUE), flags);
1638 }
1639
1640 /*
1641 =for apidoc p||call_method
1642
1643 Performs a callback to the specified Perl method.  The blessed object must
1644 be on the stack.  See L<perlcall>.
1645
1646 =cut
1647 */
1648
1649 I32
1650 Perl_call_method(pTHX_ const char *methname, I32 flags)
1651                         /* name of the subroutine */
1652                         /* See G_* flags in cop.h */
1653 {
1654     return call_sv(sv_2mortal(newSVpv(methname,0)), flags | G_METHOD);
1655 }
1656
1657 /* May be called with any of a CV, a GV, or an SV containing the name. */
1658 /*
1659 =for apidoc p||call_sv
1660
1661 Performs a callback to the Perl sub whose name is in the SV.  See
1662 L<perlcall>.
1663
1664 =cut
1665 */
1666
1667 I32
1668 Perl_call_sv(pTHX_ SV *sv, I32 flags)
1669                         /* See G_* flags in cop.h */
1670 {
1671     dSP;
1672     LOGOP myop;         /* fake syntax tree node */
1673     UNOP method_op;
1674     I32 oldmark;
1675     I32 retval;
1676     I32 oldscope;
1677     bool oldcatch = CATCH_GET;
1678     int ret;
1679     OP* oldop = PL_op;
1680     dJMPENV;
1681
1682     if (flags & G_DISCARD) {
1683         ENTER;
1684         SAVETMPS;
1685     }
1686
1687     Zero(&myop, 1, LOGOP);
1688     myop.op_next = Nullop;
1689     if (!(flags & G_NOARGS))
1690         myop.op_flags |= OPf_STACKED;
1691     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1692                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1693                       OPf_WANT_SCALAR);
1694     SAVEOP();
1695     PL_op = (OP*)&myop;
1696
1697     EXTEND(PL_stack_sp, 1);
1698     *++PL_stack_sp = sv;
1699     oldmark = TOPMARK;
1700     oldscope = PL_scopestack_ix;
1701
1702     if (PERLDB_SUB && PL_curstash != PL_debstash
1703            /* Handle first BEGIN of -d. */
1704           && (PL_DBcv || (PL_DBcv = GvCV(PL_DBsub)))
1705            /* Try harder, since this may have been a sighandler, thus
1706             * curstash may be meaningless. */
1707           && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != PL_debstash)
1708           && !(flags & G_NODEBUG))
1709         PL_op->op_private |= OPpENTERSUB_DB;
1710
1711     if (flags & G_METHOD) {
1712         Zero(&method_op, 1, UNOP);
1713         method_op.op_next = PL_op;
1714         method_op.op_ppaddr = PL_ppaddr[OP_METHOD];
1715         myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB];
1716         PL_op = (OP*)&method_op;
1717     }
1718
1719     if (!(flags & G_EVAL)) {
1720         CATCH_SET(TRUE);
1721         call_body((OP*)&myop, FALSE);
1722         retval = PL_stack_sp - (PL_stack_base + oldmark);
1723         CATCH_SET(oldcatch);
1724     }
1725     else {
1726         myop.op_other = (OP*)&myop;
1727         PL_markstack_ptr--;
1728         /* we're trying to emulate pp_entertry() here */
1729         {
1730             register PERL_CONTEXT *cx;
1731             I32 gimme = GIMME_V;
1732         
1733             ENTER;
1734             SAVETMPS;
1735         
1736             push_return(Nullop);
1737             PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
1738             PUSHEVAL(cx, 0, 0);
1739             PL_eval_root = PL_op;             /* Only needed so that goto works right. */
1740         
1741             PL_in_eval = EVAL_INEVAL;
1742             if (flags & G_KEEPERR)
1743                 PL_in_eval |= EVAL_KEEPERR;
1744             else
1745                 sv_setpv(ERRSV,"");
1746         }
1747         PL_markstack_ptr++;
1748
1749 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1750  redo_body:
1751         CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1752                     (OP*)&myop, FALSE);
1753 #else
1754         JMPENV_PUSH(ret);
1755 #endif
1756         switch (ret) {
1757         case 0:
1758 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1759  redo_body:
1760             call_body((OP*)&myop, FALSE);
1761 #endif
1762             retval = PL_stack_sp - (PL_stack_base + oldmark);
1763             if (!(flags & G_KEEPERR))
1764                 sv_setpv(ERRSV,"");
1765             break;
1766         case 1:
1767             STATUS_ALL_FAILURE;
1768             /* FALL THROUGH */
1769         case 2:
1770             /* my_exit() was called */
1771             PL_curstash = PL_defstash;
1772             FREETMPS;
1773             JMPENV_POP;
1774             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1775                 Perl_croak(aTHX_ "Callback called exit");
1776             my_exit_jump();
1777             /* NOTREACHED */
1778         case 3:
1779             if (PL_restartop) {
1780                 PL_op = PL_restartop;
1781                 PL_restartop = 0;
1782                 goto redo_body;
1783             }
1784             PL_stack_sp = PL_stack_base + oldmark;
1785             if (flags & G_ARRAY)
1786                 retval = 0;
1787             else {
1788                 retval = 1;
1789                 *++PL_stack_sp = &PL_sv_undef;
1790             }
1791             break;
1792         }
1793
1794         if (PL_scopestack_ix > oldscope) {
1795             SV **newsp;
1796             PMOP *newpm;
1797             I32 gimme;
1798             register PERL_CONTEXT *cx;
1799             I32 optype;
1800
1801             POPBLOCK(cx,newpm);
1802             POPEVAL(cx);
1803             pop_return();
1804             PL_curpm = newpm;
1805             LEAVE;
1806         }
1807         JMPENV_POP;
1808     }
1809
1810     if (flags & G_DISCARD) {
1811         PL_stack_sp = PL_stack_base + oldmark;
1812         retval = 0;
1813         FREETMPS;
1814         LEAVE;
1815     }
1816     PL_op = oldop;
1817     return retval;
1818 }
1819
1820 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1821 STATIC void *
1822 S_vcall_body(pTHX_ va_list args)
1823 {
1824     OP *myop = va_arg(args, OP*);
1825     int is_eval = va_arg(args, int);
1826
1827     call_body(myop, is_eval);
1828     return NULL;
1829 }
1830 #endif
1831
1832 STATIC void
1833 S_call_body(pTHX_ OP *myop, int is_eval)
1834 {
1835     if (PL_op == myop) {
1836         if (is_eval)
1837             PL_op = Perl_pp_entereval(aTHX);    /* this doesn't do a POPMARK */
1838         else
1839             PL_op = Perl_pp_entersub(aTHX);     /* this does */
1840     }
1841     if (PL_op)
1842         CALLRUNOPS(aTHX);
1843 }
1844
1845 /* Eval a string. The G_EVAL flag is always assumed. */
1846
1847 /*
1848 =for apidoc p||eval_sv
1849
1850 Tells Perl to C<eval> the string in the SV.
1851
1852 =cut
1853 */
1854
1855 I32
1856 Perl_eval_sv(pTHX_ SV *sv, I32 flags)
1857
1858                         /* See G_* flags in cop.h */
1859 {
1860     dSP;
1861     UNOP myop;          /* fake syntax tree node */
1862     I32 oldmark = SP - PL_stack_base;
1863     I32 retval;
1864     I32 oldscope;
1865     int ret;
1866     OP* oldop = PL_op;
1867     dJMPENV;
1868
1869     if (flags & G_DISCARD) {
1870         ENTER;
1871         SAVETMPS;
1872     }
1873
1874     SAVEOP();
1875     PL_op = (OP*)&myop;
1876     Zero(PL_op, 1, UNOP);
1877     EXTEND(PL_stack_sp, 1);
1878     *++PL_stack_sp = sv;
1879     oldscope = PL_scopestack_ix;
1880
1881     if (!(flags & G_NOARGS))
1882         myop.op_flags = OPf_STACKED;
1883     myop.op_next = Nullop;
1884     myop.op_type = OP_ENTEREVAL;
1885     myop.op_flags |= ((flags & G_VOID) ? OPf_WANT_VOID :
1886                       (flags & G_ARRAY) ? OPf_WANT_LIST :
1887                       OPf_WANT_SCALAR);
1888     if (flags & G_KEEPERR)
1889         myop.op_flags |= OPf_SPECIAL;
1890
1891 #ifdef PERL_FLEXIBLE_EXCEPTIONS
1892  redo_body:
1893     CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_body),
1894                 (OP*)&myop, TRUE);
1895 #else
1896     JMPENV_PUSH(ret);
1897 #endif
1898     switch (ret) {
1899     case 0:
1900 #ifndef PERL_FLEXIBLE_EXCEPTIONS
1901  redo_body:
1902         call_body((OP*)&myop,TRUE);
1903 #endif
1904         retval = PL_stack_sp - (PL_stack_base + oldmark);
1905         if (!(flags & G_KEEPERR))
1906             sv_setpv(ERRSV,"");
1907         break;
1908     case 1:
1909         STATUS_ALL_FAILURE;
1910         /* FALL THROUGH */
1911     case 2:
1912         /* my_exit() was called */
1913         PL_curstash = PL_defstash;
1914         FREETMPS;
1915         JMPENV_POP;
1916         if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED))
1917             Perl_croak(aTHX_ "Callback called exit");
1918         my_exit_jump();
1919         /* NOTREACHED */
1920     case 3:
1921         if (PL_restartop) {
1922             PL_op = PL_restartop;
1923             PL_restartop = 0;
1924             goto redo_body;
1925         }
1926         PL_stack_sp = PL_stack_base + oldmark;
1927         if (flags & G_ARRAY)
1928             retval = 0;
1929         else {
1930             retval = 1;
1931             *++PL_stack_sp = &PL_sv_undef;
1932         }
1933         break;
1934     }
1935
1936     JMPENV_POP;
1937     if (flags & G_DISCARD) {
1938         PL_stack_sp = PL_stack_base + oldmark;
1939         retval = 0;
1940         FREETMPS;
1941         LEAVE;
1942     }
1943     PL_op = oldop;
1944     return retval;
1945 }
1946
1947 /*
1948 =for apidoc p||eval_pv
1949
1950 Tells Perl to C<eval> the given string and return an SV* result.
1951
1952 =cut
1953 */
1954
1955 SV*
1956 Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
1957 {
1958     dSP;
1959     SV* sv = newSVpv(p, 0);
1960
1961     eval_sv(sv, G_SCALAR);
1962     SvREFCNT_dec(sv);
1963
1964     SPAGAIN;
1965     sv = POPs;
1966     PUTBACK;
1967
1968     if (croak_on_error && SvTRUE(ERRSV)) {
1969         STRLEN n_a;
1970         Perl_croak(aTHX_ SvPVx(ERRSV, n_a));
1971     }
1972
1973     return sv;
1974 }
1975
1976 /* Require a module. */
1977
1978 /*
1979 =for apidoc p||require_pv
1980
1981 Tells Perl to C<require> a module.
1982
1983 =cut
1984 */
1985
1986 void
1987 Perl_require_pv(pTHX_ const char *pv)
1988 {
1989     SV* sv;
1990     dSP;
1991     PUSHSTACKi(PERLSI_REQUIRE);
1992     PUTBACK;
1993     sv = sv_newmortal();
1994     sv_setpv(sv, "require '");
1995     sv_catpv(sv, pv);
1996     sv_catpv(sv, "'");
1997     eval_sv(sv, G_DISCARD);
1998     SPAGAIN;
1999     POPSTACK;
2000 }
2001
2002 void
2003 Perl_magicname(pTHX_ char *sym, char *name, I32 namlen)
2004 {
2005     register GV *gv;
2006
2007     if ((gv = gv_fetchpv(sym,TRUE, SVt_PV)))
2008         sv_magic(GvSV(gv), (SV*)gv, 0, name, namlen);
2009 }
2010
2011 STATIC void
2012 S_usage(pTHX_ char *name)               /* XXX move this out into a module ? */
2013 {
2014     /* This message really ought to be max 23 lines.
2015      * Removed -h because the user already knows that opton. Others? */
2016
2017     static char *usage_msg[] = {
2018 "-0[octal]       specify record separator (\\0, if no argument)",
2019 "-a              autosplit mode with -n or -p (splits $_ into @F)",
2020 "-C              enable native wide character system interfaces",
2021 "-c              check syntax only (runs BEGIN and CHECK blocks)",
2022 "-d[:debugger]   run program under debugger",
2023 "-D[number/list] set debugging flags (argument is a bit mask or alphabets)",
2024 "-e 'command'    one line of program (several -e's allowed, omit programfile)",
2025 "-F/pattern/     split() pattern for -a switch (//'s are optional)",
2026 "-i[extension]   edit <> files in place (makes backup if extension supplied)",
2027 "-Idirectory     specify @INC/#include directory (several -I's allowed)",
2028 "-l[octal]       enable line ending processing, specifies line terminator",
2029 "-[mM][-]module  execute `use/no module...' before executing program",
2030 "-n              assume 'while (<>) { ... }' loop around program",
2031 "-p              assume loop like -n but print line also, like sed",
2032 "-P              run program through C preprocessor before compilation",
2033 "-s              enable rudimentary parsing for switches after programfile",
2034 "-S              look for programfile using PATH environment variable",
2035 "-T              enable tainting checks",
2036 "-u              dump core after parsing program",
2037 "-U              allow unsafe operations",
2038 "-v              print version, subversion (includes VERY IMPORTANT perl info)",
2039 "-V[:variable]   print configuration summary (or a single Config.pm variable)",
2040 "-w              enable many useful warnings (RECOMMENDED)",
2041 "-W              enable all warnings",
2042 "-X              disable all warnings",
2043 "-x[directory]   strip off text before #!perl line and perhaps cd to directory",
2044 "\n",
2045 NULL
2046 };
2047     char **p = usage_msg;
2048
2049     PerlIO_printf(PerlIO_stdout(),
2050                   "\nUsage: %s [switches] [--] [programfile] [arguments]",
2051                   name);
2052     while (*p)
2053         PerlIO_printf(PerlIO_stdout(), "\n  %s", *p++);
2054 }
2055
2056 /* This routine handles any switches that can be given during run */
2057
2058 char *
2059 Perl_moreswitches(pTHX_ char *s)
2060 {
2061     STRLEN numlen;
2062     U32 rschar;
2063
2064     switch (*s) {
2065     case '0':
2066     {
2067         numlen = 0;                     /* disallow underscores */
2068         rschar = (U32)scan_oct(s, 4, &numlen);
2069         SvREFCNT_dec(PL_nrs);
2070         if (rschar & ~((U8)~0))
2071             PL_nrs = &PL_sv_undef;
2072         else if (!rschar && numlen >= 2)
2073             PL_nrs = newSVpvn("", 0);
2074         else {
2075             char ch = rschar;
2076             PL_nrs = newSVpvn(&ch, 1);
2077         }
2078         return s + numlen;
2079     }
2080     case 'C':
2081         PL_widesyscalls = TRUE;
2082         s++;
2083         return s;
2084     case 'F':
2085         PL_minus_F = TRUE;
2086         PL_splitstr = savepv(s + 1);
2087         s += strlen(s);
2088         return s;
2089     case 'a':
2090         PL_minus_a = TRUE;
2091         s++;
2092         return s;
2093     case 'c':
2094         PL_minus_c = TRUE;
2095         s++;
2096         return s;
2097     case 'd':
2098         forbid_setid("-d");
2099         s++;
2100         /* The following permits -d:Mod to accepts arguments following an =
2101            in the fashion that -MSome::Mod does. */
2102         if (*s == ':' || *s == '=') {
2103             char *start;
2104             SV *sv;
2105             sv = newSVpv("use Devel::", 0);
2106             start = ++s;
2107             /* We now allow -d:Module=Foo,Bar */
2108             while(isALNUM(*s) || *s==':') ++s;
2109             if (*s != '=')
2110                 sv_catpv(sv, start);
2111             else {
2112                 sv_catpvn(sv, start, s-start);
2113                 sv_catpv(sv, " split(/,/,q{");
2114                 sv_catpv(sv, ++s);
2115                 sv_catpv(sv,    "})");
2116             }
2117             s += strlen(s);
2118             my_setenv("PERL5DB", SvPV(sv, PL_na));
2119         }
2120         if (!PL_perldb) {
2121             PL_perldb = PERLDB_ALL;
2122             init_debugger();
2123         }
2124         return s;
2125     case 'D':
2126     {   
2127 #ifdef DEBUGGING
2128         forbid_setid("-D");
2129         if (isALPHA(s[1])) {
2130             /* if adding extra options, remember to update DEBUG_MASK */
2131             static char debopts[] = "psltocPmfrxuLHXDSTR";
2132             char *d;
2133
2134             for (s++; *s && (d = strchr(debopts,*s)); s++)
2135                 PL_debug |= 1 << (d - debopts);
2136         }
2137         else {
2138             PL_debug = atoi(s+1);
2139             for (s++; isDIGIT(*s); s++) ;
2140         }
2141         PL_debug |= DEBUG_TOP_FLAG;
2142 #else
2143         if (ckWARN_d(WARN_DEBUGGING))
2144             Perl_warner(aTHX_ WARN_DEBUGGING,
2145                    "Recompile perl with -DDEBUGGING to use -D switch\n");
2146         for (s++; isALNUM(*s); s++) ;
2147 #endif
2148         /*SUPPRESS 530*/
2149         return s;
2150     }   
2151     case 'h':
2152         usage(PL_origargv[0]);
2153         PerlProc_exit(0);
2154     case 'i':
2155         if (PL_inplace)
2156             Safefree(PL_inplace);
2157         PL_inplace = savepv(s+1);
2158         /*SUPPRESS 530*/
2159         for (s = PL_inplace; *s && !isSPACE(*s); s++) ;
2160         if (*s) {
2161             *s++ = '\0';
2162             if (*s == '-')      /* Additional switches on #! line. */
2163                 s++;
2164         }
2165         return s;
2166     case 'I':   /* -I handled both here and in parse_perl() */
2167         forbid_setid("-I");
2168         ++s;
2169         while (*s && isSPACE(*s))
2170             ++s;
2171         if (*s) {
2172             char *e, *p;
2173             p = s;
2174             /* ignore trailing spaces (possibly followed by other switches) */
2175             do {
2176                 for (e = p; *e && !isSPACE(*e); e++) ;
2177                 p = e;
2178                 while (isSPACE(*p))
2179                     p++;
2180             } while (*p && *p != '-');
2181             e = savepvn(s, e-s);
2182             incpush(e, TRUE, TRUE);
2183             Safefree(e);
2184             s = p;
2185             if (*s == '-')
2186                 s++;
2187         }
2188         else
2189             Perl_croak(aTHX_ "No directory specified for -I");
2190         return s;
2191     case 'l':
2192         PL_minus_l = TRUE;
2193         s++;
2194         if (PL_ors_sv) {
2195             SvREFCNT_dec(PL_ors_sv);
2196             PL_ors_sv = Nullsv;
2197         }
2198         if (isDIGIT(*s)) {
2199             PL_ors_sv = newSVpvn("\n",1);
2200             numlen = 0;                 /* disallow underscores */
2201             *SvPVX(PL_ors_sv) = (char)scan_oct(s, 3 + (*s == '0'), &numlen);
2202             s += numlen;
2203         }
2204         else {
2205             if (RsPARA(PL_nrs)) {
2206                 PL_ors_sv = newSVpvn("\n\n",2);
2207             }
2208             else {
2209                 PL_ors_sv = newSVsv(PL_nrs);
2210             }
2211         }
2212         return s;
2213     case 'M':
2214         forbid_setid("-M");     /* XXX ? */
2215         /* FALL THROUGH */
2216     case 'm':
2217         forbid_setid("-m");     /* XXX ? */
2218         if (*++s) {
2219             char *start;
2220             SV *sv;
2221             char *use = "use ";
2222             /* -M-foo == 'no foo'       */
2223             if (*s == '-') { use = "no "; ++s; }
2224             sv = newSVpv(use,0);
2225             start = s;
2226             /* We allow -M'Module qw(Foo Bar)'  */
2227             while(isALNUM(*s) || *s==':') ++s;
2228             if (*s != '=') {
2229                 sv_catpv(sv, start);
2230                 if (*(start-1) == 'm') {
2231                     if (*s != '\0')
2232                         Perl_croak(aTHX_ "Can't use '%c' after -mname", *s);
2233                     sv_catpv( sv, " ()");
2234                 }
2235             } else {
2236                 if (s == start)
2237                     Perl_croak(aTHX_ "Module name required with -%c option",
2238                                s[-1]);
2239                 sv_catpvn(sv, start, s-start);
2240                 sv_catpv(sv, " split(/,/,q{");
2241                 sv_catpv(sv, ++s);
2242                 sv_catpv(sv,    "})");
2243             }
2244             s += strlen(s);
2245             if (!PL_preambleav)
2246                 PL_preambleav = newAV();
2247             av_push(PL_preambleav, sv);
2248         }
2249         else
2250             Perl_croak(aTHX_ "No space allowed after -%c", *(s-1));
2251         return s;
2252     case 'n':
2253         PL_minus_n = TRUE;
2254         s++;
2255         return s;
2256     case 'p':
2257         PL_minus_p = TRUE;
2258         s++;
2259         return s;
2260     case 's':
2261         forbid_setid("-s");
2262         PL_doswitches = TRUE;
2263         s++;
2264         return s;
2265     case 'T':
2266         if (!PL_tainting)
2267             Perl_croak(aTHX_ "Too late for \"-T\" option");
2268         s++;
2269         return s;
2270     case 'u':
2271 #ifdef MACOS_TRADITIONAL
2272         Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
2273 #endif
2274         PL_do_undump = TRUE;
2275         s++;
2276         return s;
2277     case 'U':
2278         PL_unsafe = TRUE;
2279         s++;
2280         return s;
2281     case 'v':
2282         PerlIO_printf(PerlIO_stdout(),
2283                       Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
2284                                 PL_patchlevel, ARCHNAME));
2285 #if defined(LOCAL_PATCH_COUNT)
2286         if (LOCAL_PATCH_COUNT > 0)
2287             PerlIO_printf(PerlIO_stdout(),
2288                           "\n(with %d registered patch%s, "
2289                           "see perl -V for more detail)",
2290                           (int)LOCAL_PATCH_COUNT,
2291                           (LOCAL_PATCH_COUNT!=1) ? "es" : "");
2292 #endif
2293
2294         PerlIO_printf(PerlIO_stdout(),
2295                       "\n\nCopyright 1987-2001, Larry Wall\n");
2296 #ifdef MACOS_TRADITIONAL
2297         PerlIO_printf(PerlIO_stdout(),
2298                       "\nMac OS port Copyright (c) 1991-2001, Matthias Neeracher\n");
2299 #endif
2300 #ifdef MSDOS
2301         PerlIO_printf(PerlIO_stdout(),
2302                       "\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
2303 #endif
2304 #ifdef DJGPP
2305         PerlIO_printf(PerlIO_stdout(),
2306                       "djgpp v2 port (jpl5003c) by Hirofumi Watanabe, 1996\n"
2307                       "djgpp v2 port (perl5004+) by Laszlo Molnar, 1997-1999\n");
2308 #endif
2309 #ifdef OS2
2310         PerlIO_printf(PerlIO_stdout(),
2311                       "\n\nOS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n"
2312                       "Version 5 port Copyright (c) 1994-1999, Andreas Kaiser, Ilya Zakharevich\n");
2313 #endif
2314 #ifdef atarist
2315         PerlIO_printf(PerlIO_stdout(),
2316                       "atariST series port, ++jrb  bammi@cadence.com\n");
2317 #endif
2318 #ifdef __BEOS__
2319         PerlIO_printf(PerlIO_stdout(),
2320                       "BeOS port Copyright Tom Spindler, 1997-1999\n");
2321 #endif
2322 #ifdef MPE
2323         PerlIO_printf(PerlIO_stdout(),
2324                       "MPE/iX port Copyright by Mark Klein and Mark Bixby, 1996-1999\n");
2325 #endif
2326 #ifdef OEMVS
2327         PerlIO_printf(PerlIO_stdout(),
2328                       "MVS (OS390) port by Mortice Kern Systems, 1997-1999\n");
2329 #endif
2330 #ifdef __VOS__
2331         PerlIO_printf(PerlIO_stdout(),
2332                       "Stratus VOS port by Paul_Green@stratus.com, 1997-1999\n");
2333 #endif
2334 #ifdef __OPEN_VM
2335         PerlIO_printf(PerlIO_stdout(),
2336                       "VM/ESA port by Neale Ferguson, 1998-1999\n");
2337 #endif
2338 #ifdef POSIX_BC
2339         PerlIO_printf(PerlIO_stdout(),
2340                       "BS2000 (POSIX) port by Start Amadeus GmbH, 1998-1999\n");
2341 #endif
2342 #ifdef __MINT__
2343         PerlIO_printf(PerlIO_stdout(),
2344                       "MiNT port by Guido Flohr, 1997-1999\n");
2345 #endif
2346 #ifdef EPOC
2347         PerlIO_printf(PerlIO_stdout(),
2348                       "EPOC port by Olaf Flebbe, 1999-2000\n");
2349 #endif
2350 #ifdef BINARY_BUILD_NOTICE
2351         BINARY_BUILD_NOTICE;
2352 #endif
2353         PerlIO_printf(PerlIO_stdout(),
2354                       "\n\
2355 Perl may be copied only under the terms of either the Artistic License or the\n\
2356 GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
2357 Complete documentation for Perl, including FAQ lists, should be found on\n\
2358 this system using `man perl' or `perldoc perl'.  If you have access to the\n\
2359 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
2360         PerlProc_exit(0);
2361     case 'w':
2362         if (! (PL_dowarn & G_WARN_ALL_MASK))
2363             PL_dowarn |= G_WARN_ON;
2364         s++;
2365         return s;
2366     case 'W':
2367         PL_dowarn = G_WARN_ALL_ON|G_WARN_ON;
2368         PL_compiling.cop_warnings = pWARN_ALL ;
2369         s++;
2370         return s;
2371     case 'X':
2372         PL_dowarn = G_WARN_ALL_OFF;
2373         PL_compiling.cop_warnings = pWARN_NONE ;
2374         s++;
2375         return s;
2376     case '*':
2377     case ' ':
2378         if (s[1] == '-')        /* Additional switches on #! line. */
2379             return s+2;
2380         break;
2381     case '-':
2382     case 0:
2383 #if defined(WIN32) || !defined(PERL_STRICT_CR)
2384     case '\r':
2385 #endif
2386     case '\n':
2387     case '\t':
2388         break;
2389 #ifdef ALTERNATE_SHEBANG
2390     case 'S':                   /* OS/2 needs -S on "extproc" line. */
2391         break;
2392 #endif
2393     case 'P':
2394         if (PL_preprocess)
2395             return s+1;
2396         /* FALL THROUGH */
2397     default:
2398         Perl_croak(aTHX_ "Can't emulate -%.1s on #! line",s);
2399     }
2400     return Nullch;
2401 }
2402
2403 /* compliments of Tom Christiansen */
2404
2405 /* unexec() can be found in the Gnu emacs distribution */
2406 /* Known to work with -DUNEXEC and using unexelf.c from GNU emacs-20.2 */
2407
2408 void
2409 Perl_my_unexec(pTHX)
2410 {
2411 #ifdef UNEXEC
2412     SV*    prog;
2413     SV*    file;
2414     int    status = 1;
2415     extern int etext;
2416
2417     prog = newSVpv(BIN_EXP, 0);
2418     sv_catpv(prog, "/perl");
2419     file = newSVpv(PL_origfilename, 0);
2420     sv_catpv(file, ".perldump");
2421
2422     unexec(SvPVX(file), SvPVX(prog), &etext, sbrk(0), 0);
2423     /* unexec prints msg to stderr in case of failure */
2424     PerlProc_exit(status);
2425 #else
2426 #  ifdef VMS
2427 #    include <lib$routines.h>
2428      lib$signal(SS$_DEBUG);  /* ssdef.h #included from vmsish.h */
2429 #  else
2430     ABORT();            /* for use with undump */
2431 #  endif
2432 #endif
2433 }
2434
2435 /* initialize curinterp */
2436 STATIC void
2437 S_init_interp(pTHX)
2438 {
2439
2440 #ifdef PERL_OBJECT              /* XXX kludge */
2441 #define I_REINIT \
2442   STMT_START {                          \
2443     PL_chopset          = " \n-";       \
2444     PL_copline          = NOLINE;       \
2445     PL_curcop           = &PL_compiling;\
2446     PL_curcopdb         = NULL;         \
2447     PL_dbargs           = 0;            \
2448     PL_dumpindent       = 4;            \
2449     PL_laststatval      = -1;           \
2450     PL_laststype        = OP_STAT;      \
2451     PL_maxscream        = -1;           \
2452     PL_maxsysfd         = MAXSYSFD;     \
2453     PL_statname         = Nullsv;       \
2454     PL_tmps_floor       = -1;           \
2455     PL_tmps_ix          = -1;           \
2456     PL_op_mask          = NULL;         \
2457     PL_laststatval      = -1;           \
2458     PL_laststype        = OP_STAT;      \
2459     PL_mess_sv          = Nullsv;       \
2460     PL_splitstr         = " ";          \
2461     PL_generation       = 100;          \
2462     PL_exitlist         = NULL;         \
2463     PL_exitlistlen      = 0;            \
2464     PL_regindent        = 0;            \
2465     PL_in_clean_objs    = FALSE;        \
2466     PL_in_clean_all     = FALSE;        \
2467     PL_profiledata      = NULL;         \
2468     PL_rsfp             = Nullfp;       \
2469     PL_rsfp_filters     = Nullav;       \
2470     PL_dirty            = FALSE;        \
2471   } STMT_END
2472     I_REINIT;
2473 #else
2474 #  ifdef MULTIPLICITY
2475 #    define PERLVAR(var,type)
2476 #    define PERLVARA(var,n,type)
2477 #    if defined(PERL_IMPLICIT_CONTEXT)
2478 #      if defined(USE_THREADS)
2479 #        define PERLVARI(var,type,init)         PERL_GET_INTERP->var = init;
2480 #        define PERLVARIC(var,type,init)        PERL_GET_INTERP->var = init;
2481 #      else /* !USE_THREADS */
2482 #        define PERLVARI(var,type,init)         aTHX->var = init;
2483 #        define PERLVARIC(var,type,init)        aTHX->var = init;
2484 #      endif /* USE_THREADS */
2485 #    else
2486 #      define PERLVARI(var,type,init)   PERL_GET_INTERP->var = init;
2487 #      define PERLVARIC(var,type,init)  PERL_GET_INTERP->var = init;
2488 #    endif
2489 #    include "intrpvar.h"
2490 #    ifndef USE_THREADS
2491 #      include "thrdvar.h"
2492 #    endif
2493 #    undef PERLVAR
2494 #    undef PERLVARA
2495 #    undef PERLVARI
2496 #    undef PERLVARIC
2497 #  else
2498 #    define PERLVAR(var,type)
2499 #    define PERLVARA(var,n,type)
2500 #    define PERLVARI(var,type,init)     PL_##var = init;
2501 #    define PERLVARIC(var,type,init)    PL_##var = init;
2502 #    include "intrpvar.h"
2503 #    ifndef USE_THREADS
2504 #      include "thrdvar.h"
2505 #    endif
2506 #    undef PERLVAR
2507 #    undef PERLVARA
2508 #    undef PERLVARI
2509 #    undef PERLVARIC
2510 #  endif
2511 #endif
2512
2513 }
2514
2515 STATIC void
2516 S_init_main_stash(pTHX)
2517 {
2518     GV *gv;
2519
2520     /* Note that strtab is a rather special HV.  Assumptions are made
2521        about not iterating on it, and not adding tie magic to it.
2522        It is properly deallocated in perl_destruct() */
2523     PL_strtab = newHV();
2524 #ifdef USE_THREADS
2525     MUTEX_INIT(&PL_strtab_mutex);
2526 #endif
2527     HvSHAREKEYS_off(PL_strtab);                 /* mandatory */
2528     hv_ksplit(PL_strtab, 512);
2529
2530     PL_curstash = PL_defstash = newHV();
2531     PL_curstname = newSVpvn("main",4);
2532     gv = gv_fetchpv("main::",TRUE, SVt_PVHV);
2533     SvREFCNT_dec(GvHV(gv));
2534     GvHV(gv) = (HV*)SvREFCNT_inc(PL_defstash);
2535     SvREADONLY_on(gv);
2536     HvNAME(PL_defstash) = savepv("main");
2537     PL_incgv = gv_HVadd(gv_AVadd(gv_fetchpv("INC",TRUE, SVt_PVAV)));
2538     GvMULTI_on(PL_incgv);
2539     PL_hintgv = gv_fetchpv("\010",TRUE, SVt_PV); /* ^H */
2540     GvMULTI_on(PL_hintgv);
2541     PL_defgv = gv_fetchpv("_",TRUE, SVt_PVAV);
2542     PL_errgv = gv_HVadd(gv_fetchpv("@", TRUE, SVt_PV));
2543     GvMULTI_on(PL_errgv);
2544     PL_replgv = gv_fetchpv("\022", TRUE, SVt_PV); /* ^R */
2545     GvMULTI_on(PL_replgv);
2546     (void)Perl_form(aTHX_ "%240s","");  /* Preallocate temp - for immediate signals. */
2547     sv_grow(ERRSV, 240);        /* Preallocate - for immediate signals. */
2548     sv_setpvn(ERRSV, "", 0);
2549     PL_curstash = PL_defstash;
2550     CopSTASH_set(&PL_compiling, PL_defstash);
2551     PL_debstash = GvHV(gv_fetchpv("DB::", GV_ADDMULTI, SVt_PVHV));
2552     PL_globalstash = GvHV(gv_fetchpv("CORE::GLOBAL::", GV_ADDMULTI, SVt_PVHV));
2553     PL_nullstash = GvHV(gv_fetchpv("<none>::", GV_ADDMULTI, SVt_PVHV));
2554     /* We must init $/ before switches are processed. */
2555     sv_setpvn(get_sv("/", TRUE), "\n", 1);
2556 }
2557
2558 STATIC void
2559 S_open_script(pTHX_ char *scriptname, bool dosearch, SV *sv, int *fdscript)
2560 {
2561     *fdscript = -1;
2562
2563     if (PL_e_script) {
2564         PL_origfilename = savepv("-e");
2565     }
2566     else {
2567         /* if find_script() returns, it returns a malloc()-ed value */
2568         PL_origfilename = scriptname = find_script(scriptname, dosearch, NULL, 1);
2569
2570         if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
2571             char *s = scriptname + 8;
2572             *fdscript = atoi(s);
2573             while (isDIGIT(*s))
2574                 s++;
2575             if (*s) {
2576                 scriptname = savepv(s + 1);
2577                 Safefree(PL_origfilename);
2578                 PL_origfilename = scriptname;
2579             }
2580         }
2581     }
2582
2583 #ifdef USE_ITHREADS
2584     Safefree(CopFILE(PL_curcop));
2585 #else
2586     SvREFCNT_dec(CopFILEGV(PL_curcop));
2587 #endif
2588     CopFILE_set(PL_curcop, PL_origfilename);
2589     if (strEQ(PL_origfilename,"-"))
2590         scriptname = "";
2591     if (*fdscript >= 0) {
2592         PL_rsfp = PerlIO_fdopen(*fdscript,PERL_SCRIPT_MODE);
2593 #if defined(HAS_FCNTL) && defined(F_SETFD)
2594         if (PL_rsfp)
2595             fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);  /* ensure close-on-exec */
2596 #endif
2597     }
2598     else if (PL_preprocess) {
2599         char *cpp_cfg = CPPSTDIN;
2600         SV *cpp = newSVpvn("",0);
2601         SV *cmd = NEWSV(0,0);
2602
2603         if (strEQ(cpp_cfg, "cppstdin"))
2604             Perl_sv_catpvf(aTHX_ cpp, "%s/", BIN_EXP);
2605         sv_catpv(cpp, cpp_cfg);
2606
2607         sv_catpvn(sv, "-I", 2);
2608         sv_catpv(sv,PRIVLIB_EXP);
2609
2610 #if defined(MSDOS) || defined(WIN32)
2611         Perl_sv_setpvf(aTHX_ cmd, "\
2612 sed %s -e \"/^[^#]/b\" \
2613  -e \"/^#[      ]*include[      ]/b\" \
2614  -e \"/^#[      ]*define[       ]/b\" \
2615  -e \"/^#[      ]*if[   ]/b\" \
2616  -e \"/^#[      ]*ifdef[        ]/b\" \
2617  -e \"/^#[      ]*ifndef[       ]/b\" \
2618  -e \"/^#[      ]*else/b\" \
2619  -e \"/^#[      ]*elif[         ]/b\" \
2620  -e \"/^#[      ]*undef[        ]/b\" \
2621  -e \"/^#[      ]*endif/b\" \
2622  -e \"s/^#.*//\" \
2623  %s | %"SVf" -C %"SVf" %s",
2624           (PL_doextract ? "-e \"1,/^#/d\n\"" : ""),
2625 #else
2626 #  ifdef __OPEN_VM
2627         Perl_sv_setpvf(aTHX_ cmd, "\
2628 %s %s -e '/^[^#]/b' \
2629  -e '/^#[       ]*include[      ]/b' \
2630  -e '/^#[       ]*define[       ]/b' \
2631  -e '/^#[       ]*if[   ]/b' \
2632  -e '/^#[       ]*ifdef[        ]/b' \
2633  -e '/^#[       ]*ifndef[       ]/b' \
2634  -e '/^#[       ]*else/b' \
2635  -e '/^#[       ]*elif[         ]/b' \
2636  -e '/^#[       ]*undef[        ]/b' \
2637  -e '/^#[       ]*endif/b' \
2638  -e 's/^[       ]*#.*//' \
2639  %s | %"SVf" %"SVf" %s",
2640 #  else
2641         Perl_sv_setpvf(aTHX_ cmd, "\
2642 %s %s -e '/^[^#]/b' \
2643  -e '/^#[       ]*include[      ]/b' \
2644  -e '/^#[       ]*define[       ]/b' \
2645  -e '/^#[       ]*if[   ]/b' \
2646  -e '/^#[       ]*ifdef[        ]/b' \
2647  -e '/^#[       ]*ifndef[       ]/b' \
2648  -e '/^#[       ]*else/b' \
2649  -e '/^#[       ]*elif[         ]/b' \
2650  -e '/^#[       ]*undef[        ]/b' \
2651  -e '/^#[       ]*endif/b' \
2652  -e 's/^[       ]*#.*//' \
2653  %s | %"SVf" -C %"SVf" %s",
2654 #  endif
2655 #ifdef LOC_SED
2656           LOC_SED,
2657 #else
2658           "sed",
2659 #endif
2660           (PL_doextract ? "-e '1,/^#/d\n'" : ""),
2661 #endif
2662           scriptname, cpp, sv, CPPMINUS);
2663         PL_doextract = FALSE;
2664 #ifdef IAMSUID                          /* actually, this is caught earlier */
2665         if (PL_euid != PL_uid && !PL_euid) {    /* if running suidperl */
2666 #ifdef HAS_SETEUID
2667             (void)seteuid(PL_uid);              /* musn't stay setuid root */
2668 #else
2669 #ifdef HAS_SETREUID
2670             (void)setreuid((Uid_t)-1, PL_uid);
2671 #else
2672 #ifdef HAS_SETRESUID
2673             (void)setresuid((Uid_t)-1, PL_uid, (Uid_t)-1);
2674 #else
2675             PerlProc_setuid(PL_uid);
2676 #endif
2677 #endif
2678 #endif
2679             if (PerlProc_geteuid() != PL_uid)
2680                 Perl_croak(aTHX_ "Can't do seteuid!\n");
2681         }
2682 #endif /* IAMSUID */
2683         PL_rsfp = PerlProc_popen(SvPVX(cmd), "r");
2684         SvREFCNT_dec(cmd);
2685         SvREFCNT_dec(cpp);
2686     }
2687     else if (!*scriptname) {
2688         forbid_setid("program input from stdin");
2689         PL_rsfp = PerlIO_stdin();
2690     }
2691     else {
2692         PL_rsfp = PerlIO_open(scriptname,PERL_SCRIPT_MODE);
2693 #if defined(HAS_FCNTL) && defined(F_SETFD)
2694         if (PL_rsfp)
2695             fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,1);  /* ensure close-on-exec */
2696 #endif
2697     }
2698     if (!PL_rsfp) {
2699 #ifdef DOSUID
2700 #ifndef IAMSUID         /* in case script is not readable before setuid */
2701         if (PL_euid &&
2702             PerlLIO_stat(CopFILE(PL_curcop),&PL_statbuf) >= 0 &&
2703             PL_statbuf.st_mode & (S_ISUID|S_ISGID))
2704         {
2705             /* try again */
2706             PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
2707                                      (int)PERL_REVISION, (int)PERL_VERSION,
2708                                      (int)PERL_SUBVERSION), PL_origargv);
2709             Perl_croak(aTHX_ "Can't do setuid\n");
2710         }
2711 #endif
2712 #endif
2713         Perl_croak(aTHX_ "Can't open perl script \"%s\": %s\n",
2714                    CopFILE(PL_curcop), Strerror(errno));
2715     }
2716 }
2717
2718 /* Mention
2719  * I_SYSSTATVFS HAS_FSTATVFS
2720  * I_SYSMOUNT
2721  * I_STATFS     HAS_FSTATFS     HAS_GETFSSTAT
2722  * I_MNTENT     HAS_GETMNTENT   HAS_HASMNTOPT
2723  * here so that metaconfig picks them up. */
2724
2725 #ifdef IAMSUID
2726 STATIC int
2727 S_fd_on_nosuid_fs(pTHX_ int fd)
2728 {
2729     int check_okay = 0; /* able to do all the required sys/libcalls */
2730     int on_nosuid  = 0; /* the fd is on a nosuid fs */
2731 /*
2732  * Preferred order: fstatvfs(), fstatfs(), ustat()+getmnt(), getmntent().
2733  * fstatvfs() is UNIX98.
2734  * fstatfs() is 4.3 BSD.
2735  * ustat()+getmnt() is pre-4.3 BSD.
2736  * getmntent() is O(number-of-mounted-filesystems) and can hang on
2737  * an irrelevant filesystem while trying to reach the right one.
2738  */
2739
2740 #undef FD_ON_NOSUID_CHECK_OKAY  /* found the syscalls to do the check? */
2741
2742 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2743         defined(HAS_FSTATVFS)
2744 #   define FD_ON_NOSUID_CHECK_OKAY
2745     struct statvfs stfs;
2746
2747     check_okay = fstatvfs(fd, &stfs) == 0;
2748     on_nosuid  = check_okay && (stfs.f_flag  & ST_NOSUID);
2749 #   endif /* fstatvfs */
2750
2751 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2752         defined(PERL_MOUNT_NOSUID)      && \
2753         defined(HAS_FSTATFS)            && \
2754         defined(HAS_STRUCT_STATFS)      && \
2755         defined(HAS_STRUCT_STATFS_F_FLAGS)
2756 #   define FD_ON_NOSUID_CHECK_OKAY
2757     struct statfs  stfs;
2758
2759     check_okay = fstatfs(fd, &stfs)  == 0;
2760     on_nosuid  = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
2761 #   endif /* fstatfs */
2762
2763 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2764         defined(PERL_MOUNT_NOSUID)      && \
2765         defined(HAS_FSTAT)              && \
2766         defined(HAS_USTAT)              && \
2767         defined(HAS_GETMNT)             && \
2768         defined(HAS_STRUCT_FS_DATA)     && \
2769         defined(NOSTAT_ONE)
2770 #   define FD_ON_NOSUID_CHECK_OKAY
2771     struct stat fdst;
2772
2773     if (fstat(fd, &fdst) == 0) {
2774         struct ustat us;
2775         if (ustat(fdst.st_dev, &us) == 0) {
2776             struct fs_data fsd;
2777             /* NOSTAT_ONE here because we're not examining fields which
2778              * vary between that case and STAT_ONE. */
2779             if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
2780                 size_t cmplen = sizeof(us.f_fname);
2781                 if (sizeof(fsd.fd_req.path) < cmplen)
2782                     cmplen = sizeof(fsd.fd_req.path);
2783                 if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
2784                     fdst.st_dev == fsd.fd_req.dev) {
2785                         check_okay = 1;
2786                         on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
2787                     }
2788                 }
2789             }
2790         }
2791     }
2792 #   endif /* fstat+ustat+getmnt */
2793
2794 #   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
2795         defined(HAS_GETMNTENT)          && \
2796         defined(HAS_HASMNTOPT)          && \
2797         defined(MNTOPT_NOSUID)
2798 #   define FD_ON_NOSUID_CHECK_OKAY
2799     FILE                *mtab = fopen("/etc/mtab", "r");
2800     struct mntent       *entry;
2801     struct stat         stb, fsb;
2802
2803     if (mtab && (fstat(fd, &stb) == 0)) {
2804         while (entry = getmntent(mtab)) {
2805             if (stat(entry->mnt_dir, &fsb) == 0
2806                 && fsb.st_dev == stb.st_dev)
2807             {
2808                 /* found the filesystem */
2809                 check_okay = 1;
2810                 if (hasmntopt(entry, MNTOPT_NOSUID))
2811                     on_nosuid = 1;
2812                 break;
2813             } /* A single fs may well fail its stat(). */
2814         }
2815     }
2816     if (mtab)
2817         fclose(mtab);
2818 #   endif /* getmntent+hasmntopt */
2819
2820     if (!check_okay)
2821         Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
2822     return on_nosuid;
2823 }
2824 #endif /* IAMSUID */
2825
2826 STATIC void
2827 S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
2828 {
2829 #ifdef IAMSUID
2830     int which;
2831 #endif
2832
2833     /* do we need to emulate setuid on scripts? */
2834
2835     /* This code is for those BSD systems that have setuid #! scripts disabled
2836      * in the kernel because of a security problem.  Merely defining DOSUID
2837      * in perl will not fix that problem, but if you have disabled setuid
2838      * scripts in the kernel, this will attempt to emulate setuid and setgid
2839      * on scripts that have those now-otherwise-useless bits set.  The setuid
2840      * root version must be called suidperl or sperlN.NNN.  If regular perl
2841      * discovers that it has opened a setuid script, it calls suidperl with
2842      * the same argv that it had.  If suidperl finds that the script it has
2843      * just opened is NOT setuid root, it sets the effective uid back to the
2844      * uid.  We don't just make perl setuid root because that loses the
2845      * effective uid we had before invoking perl, if it was different from the
2846      * uid.
2847      *
2848      * DOSUID must be defined in both perl and suidperl, and IAMSUID must
2849      * be defined in suidperl only.  suidperl must be setuid root.  The
2850      * Configure script will set this up for you if you want it.
2851      */
2852
2853 #ifdef DOSUID
2854     char *s, *s2;
2855
2856     if (PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf) < 0)  /* normal stat is insecure */
2857         Perl_croak(aTHX_ "Can't stat script \"%s\"",PL_origfilename);
2858     if (fdscript < 0 && PL_statbuf.st_mode & (S_ISUID|S_ISGID)) {
2859         I32 len;
2860         STRLEN n_a;
2861
2862 #ifdef IAMSUID
2863 #ifndef HAS_SETREUID
2864         /* On this access check to make sure the directories are readable,
2865          * there is actually a small window that the user could use to make
2866          * filename point to an accessible directory.  So there is a faint
2867          * chance that someone could execute a setuid script down in a
2868          * non-accessible directory.  I don't know what to do about that.
2869          * But I don't think it's too important.  The manual lies when
2870          * it says access() is useful in setuid programs.
2871          */
2872         if (PerlLIO_access(CopFILE(PL_curcop),1)) /*double check*/
2873             Perl_croak(aTHX_ "Permission denied");
2874 #else
2875         /* If we can swap euid and uid, then we can determine access rights
2876          * with a simple stat of the file, and then compare device and
2877          * inode to make sure we did stat() on the same file we opened.
2878          * Then we just have to make sure he or she can execute it.
2879          */
2880         {
2881             struct stat tmpstatbuf;
2882
2883             if (
2884 #ifdef HAS_SETREUID
2885                 setreuid(PL_euid,PL_uid) < 0
2886 #else
2887 # if HAS_SETRESUID
2888                 setresuid(PL_euid,PL_uid,(Uid_t)-1) < 0
2889 # endif
2890 #endif
2891                 || PerlProc_getuid() != PL_euid || PerlProc_geteuid() != PL_uid)
2892                 Perl_croak(aTHX_ "Can't swap uid and euid");    /* really paranoid */
2893             if (PerlLIO_stat(CopFILE(PL_curcop),&tmpstatbuf) < 0)
2894                 Perl_croak(aTHX_ "Permission denied");  /* testing full pathname here */
2895 #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK)
2896             if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp)))
2897                 Perl_croak(aTHX_ "Permission denied");
2898 #endif
2899             if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
2900                 tmpstatbuf.st_ino != PL_statbuf.st_ino) {
2901                 (void)PerlIO_close(PL_rsfp);
2902                 Perl_croak(aTHX_ "Permission denied\n");
2903             }
2904             if (
2905 #ifdef HAS_SETREUID
2906               setreuid(PL_uid,PL_euid) < 0
2907 #else
2908 # if defined(HAS_SETRESUID)
2909               setresuid(PL_uid,PL_euid,(Uid_t)-1) < 0
2910 # endif
2911 #endif
2912               || PerlProc_getuid() != PL_uid || PerlProc_geteuid() != PL_euid)
2913                 Perl_croak(aTHX_ "Can't reswap uid and euid");
2914             if (!cando(S_IXUSR,FALSE,&PL_statbuf))              /* can real uid exec? */
2915                 Perl_croak(aTHX_ "Permission denied\n");
2916         }
2917 #endif /* HAS_SETREUID */
2918 #endif /* IAMSUID */
2919
2920         if (!S_ISREG(PL_statbuf.st_mode))
2921             Perl_croak(aTHX_ "Permission denied");
2922         if (PL_statbuf.st_mode & S_IWOTH)
2923             Perl_croak(aTHX_ "Setuid/gid script is writable by world");
2924         PL_doswitches = FALSE;          /* -s is insecure in suid */
2925         CopLINE_inc(PL_curcop);
2926         if (sv_gets(PL_linestr, PL_rsfp, 0) == Nullch ||
2927           strnNE(SvPV(PL_linestr,n_a),"#!",2) ) /* required even on Sys V */
2928             Perl_croak(aTHX_ "No #! line");
2929         s = SvPV(PL_linestr,n_a)+2;
2930         if (*s == ' ') s++;
2931         while (!isSPACE(*s)) s++;
2932         for (s2 = s;  (s2 > SvPV(PL_linestr,n_a)+2 &&
2933                        (isDIGIT(s2[-1]) || strchr("._-", s2[-1])));  s2--) ;
2934         if (strnNE(s2-4,"perl",4) && strnNE(s-9,"perl",4))  /* sanity check */
2935             Perl_croak(aTHX_ "Not a perl script");
2936         while (*s == ' ' || *s == '\t') s++;
2937         /*
2938          * #! arg must be what we saw above.  They can invoke it by
2939          * mentioning suidperl explicitly, but they may not add any strange
2940          * arguments beyond what #! says if they do invoke suidperl that way.
2941          */
2942         len = strlen(validarg);
2943         if (strEQ(validarg," PHOOEY ") ||
2944             strnNE(s,validarg,len) || !isSPACE(s[len]))
2945             Perl_croak(aTHX_ "Args must match #! line");
2946
2947 #ifndef IAMSUID
2948         if (PL_euid != PL_uid && (PL_statbuf.st_mode & S_ISUID) &&
2949             PL_euid == PL_statbuf.st_uid)
2950             if (!PL_do_undump)
2951                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
2952 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
2953 #endif /* IAMSUID */
2954
2955         if (PL_euid) {  /* oops, we're not the setuid root perl */
2956             (void)PerlIO_close(PL_rsfp);
2957 #ifndef IAMSUID
2958             /* try again */
2959             PerlProc_execv(Perl_form(aTHX_ "%s/sperl"PERL_FS_VER_FMT, BIN_EXP,
2960                                      (int)PERL_REVISION, (int)PERL_VERSION,
2961                                      (int)PERL_SUBVERSION), PL_origargv);
2962 #endif
2963             Perl_croak(aTHX_ "Can't do setuid\n");
2964         }
2965
2966         if (PL_statbuf.st_mode & S_ISGID && PL_statbuf.st_gid != PL_egid) {
2967 #ifdef HAS_SETEGID
2968             (void)setegid(PL_statbuf.st_gid);
2969 #else
2970 #ifdef HAS_SETREGID
2971            (void)setregid((Gid_t)-1,PL_statbuf.st_gid);
2972 #else
2973 #ifdef HAS_SETRESGID
2974            (void)setresgid((Gid_t)-1,PL_statbuf.st_gid,(Gid_t)-1);
2975 #else
2976             PerlProc_setgid(PL_statbuf.st_gid);
2977 #endif
2978 #endif
2979 #endif
2980             if (PerlProc_getegid() != PL_statbuf.st_gid)
2981                 Perl_croak(aTHX_ "Can't do setegid!\n");
2982         }
2983         if (PL_statbuf.st_mode & S_ISUID) {
2984             if (PL_statbuf.st_uid != PL_euid)
2985 #ifdef HAS_SETEUID
2986                 (void)seteuid(PL_statbuf.st_uid);       /* all that for this */
2987 #else
2988 #ifdef HAS_SETREUID
2989                 (void)setreuid((Uid_t)-1,PL_statbuf.st_uid);
2990 #else
2991 #ifdef HAS_SETRESUID
2992                 (void)setresuid((Uid_t)-1,PL_statbuf.st_uid,(Uid_t)-1);
2993 #else
2994                 PerlProc_setuid(PL_statbuf.st_uid);
2995 #endif
2996 #endif
2997 #endif
2998             if (PerlProc_geteuid() != PL_statbuf.st_uid)
2999                 Perl_croak(aTHX_ "Can't do seteuid!\n");
3000         }
3001         else if (PL_uid) {                      /* oops, mustn't run as root */
3002 #ifdef HAS_SETEUID
3003           (void)seteuid((Uid_t)PL_uid);
3004 #else
3005 #ifdef HAS_SETREUID
3006           (void)setreuid((Uid_t)-1,(Uid_t)PL_uid);
3007 #else
3008 #ifdef HAS_SETRESUID
3009           (void)setresuid((Uid_t)-1,(Uid_t)PL_uid,(Uid_t)-1);
3010 #else
3011           PerlProc_setuid((Uid_t)PL_uid);
3012 #endif
3013 #endif
3014 #endif
3015             if (PerlProc_geteuid() != PL_uid)
3016                 Perl_croak(aTHX_ "Can't do seteuid!\n");
3017         }
3018         init_ids();
3019         if (!cando(S_IXUSR,TRUE,&PL_statbuf))
3020             Perl_croak(aTHX_ "Permission denied\n");    /* they can't do this */
3021     }
3022 #ifdef IAMSUID
3023     else if (PL_preprocess)
3024         Perl_croak(aTHX_ "-P not allowed for setuid/setgid script\n");
3025     else if (fdscript >= 0)
3026         Perl_croak(aTHX_ "fd script not allowed in suidperl\n");
3027     else
3028         Perl_croak(aTHX_ "Script is not setuid/setgid in suidperl\n");
3029
3030     /* We absolutely must clear out any saved ids here, so we */
3031     /* exec the real perl, substituting fd script for scriptname. */
3032     /* (We pass script name as "subdir" of fd, which perl will grok.) */
3033     PerlIO_rewind(PL_rsfp);
3034     PerlLIO_lseek(PerlIO_fileno(PL_rsfp),(Off_t)0,0);  /* just in case rewind didn't */
3035     for (which = 1; PL_origargv[which] && PL_origargv[which] != scriptname; which++) ;
3036     if (!PL_origargv[which])
3037         Perl_croak(aTHX_ "Permission denied");
3038     PL_origargv[which] = savepv(Perl_form(aTHX_ "/dev/fd/%d/%s",
3039                                   PerlIO_fileno(PL_rsfp), PL_origargv[which]));
3040 #if defined(HAS_FCNTL) && defined(F_SETFD)
3041     fcntl(PerlIO_fileno(PL_rsfp),F_SETFD,0);    /* ensure no close-on-exec */
3042 #endif
3043     PerlProc_execv(Perl_form(aTHX_ "%s/perl"PERL_FS_VER_FMT, BIN_EXP,
3044                              (int)PERL_REVISION, (int)PERL_VERSION,
3045                              (int)PERL_SUBVERSION), PL_origargv);/* try again */
3046     Perl_croak(aTHX_ "Can't do setuid\n");
3047 #endif /* IAMSUID */
3048 #else /* !DOSUID */
3049     if (PL_euid != PL_uid || PL_egid != PL_gid) {       /* (suidperl doesn't exist, in fact) */
3050 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
3051         PerlLIO_fstat(PerlIO_fileno(PL_rsfp),&PL_statbuf);      /* may be either wrapped or real suid */
3052         if ((PL_euid != PL_uid && PL_euid == PL_statbuf.st_uid && PL_statbuf.st_mode & S_ISUID)
3053             ||
3054             (PL_egid != PL_gid && PL_egid == PL_statbuf.st_gid && PL_statbuf.st_mode & S_ISGID)
3055            )
3056             if (!PL_do_undump)
3057                 Perl_croak(aTHX_ "YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET!\n\
3058 FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!\n");
3059 #endif /* SETUID_SCRIPTS_ARE_SECURE_NOW */
3060         /* not set-id, must be wrapped */
3061     }
3062 #endif /* DOSUID */
3063 }
3064
3065 STATIC void
3066 S_find_beginning(pTHX)
3067 {
3068     register char *s, *s2;
3069
3070     /* skip forward in input to the real script? */
3071
3072     forbid_setid("-x");
3073 #ifdef MACOS_TRADITIONAL
3074     /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
3075
3076     while (PL_doextract || gMacPerl_AlwaysExtract) {
3077         if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
3078             if (!gMacPerl_AlwaysExtract)
3079                 Perl_croak(aTHX_ "No Perl script found in input\n");
3080                 
3081             if (PL_doextract)                   /* require explicit override ? */
3082                 if (!OverrideExtract(PL_origfilename))
3083                     Perl_croak(aTHX_ "User aborted script\n");
3084                 else
3085                     PL_doextract = FALSE;
3086                 
3087             /* Pater peccavi, file does not have #! */
3088             PerlIO_rewind(PL_rsfp);
3089         
3090             break;
3091         }
3092 #else
3093     while (PL_doextract) {
3094         if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch)
3095             Perl_croak(aTHX_ "No Perl script found in input\n");
3096 #endif
3097         if (*s == '#' && s[1] == '!' && (s = instr(s,"perl"))) {
3098             PerlIO_ungetc(PL_rsfp, '\n');               /* to keep line count right */
3099             PL_doextract = FALSE;
3100             while (*s && !(isSPACE (*s) || *s == '#')) s++;
3101             s2 = s;
3102             while (*s == ' ' || *s == '\t') s++;
3103             if (*s++ == '-') {
3104                 while (isDIGIT(s2[-1]) || strchr("-._", s2[-1])) s2--;
3105                 if (strnEQ(s2-4,"perl",4))
3106                     /*SUPPRESS 530*/
3107                     while ((s = moreswitches(s)))
3108                         ;
3109             }
3110         }
3111     }
3112 }
3113
3114
3115 STATIC void
3116 S_init_ids(pTHX)
3117 {
3118     PL_uid = PerlProc_getuid();
3119     PL_euid = PerlProc_geteuid();
3120     PL_gid = PerlProc_getgid();
3121     PL_egid = PerlProc_getegid();
3122 #ifdef VMS
3123     PL_uid |= PL_gid << 16;
3124     PL_euid |= PL_egid << 16;
3125 #endif
3126     PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
3127 }
3128
3129 STATIC void
3130 S_forbid_setid(pTHX_ char *s)
3131 {
3132     if (PL_euid != PL_uid)
3133         Perl_croak(aTHX_ "No %s allowed while running setuid", s);
3134     if (PL_egid != PL_gid)
3135         Perl_croak(aTHX_ "No %s allowed while running setgid", s);
3136 }
3137
3138 void
3139 Perl_init_debugger(pTHX)
3140 {
3141     HV *ostash = PL_curstash;
3142
3143     PL_curstash = PL_debstash;
3144     PL_dbargs = GvAV(gv_AVadd((gv_fetchpv("args", GV_ADDMULTI, SVt_PVAV))));
3145     AvREAL_off(PL_dbargs);
3146     PL_DBgv = gv_fetchpv("DB", GV_ADDMULTI, SVt_PVGV);
3147     PL_DBline = gv_fetchpv("dbline", GV_ADDMULTI, SVt_PVAV);
3148     PL_DBsub = gv_HVadd(gv_fetchpv("sub", GV_ADDMULTI, SVt_PVHV));
3149     sv_upgrade(GvSV(PL_DBsub), SVt_IV); /* IVX accessed if PERLDB_SUB_NN */
3150     PL_DBsingle = GvSV((gv_fetchpv("single", GV_ADDMULTI, SVt_PV)));
3151     sv_setiv(PL_DBsingle, 0);
3152     PL_DBtrace = GvSV((gv_fetchpv("trace", GV_ADDMULTI, SVt_PV)));
3153     sv_setiv(PL_DBtrace, 0);
3154     PL_DBsignal = GvSV((gv_fetchpv("signal", GV_ADDMULTI, SVt_PV)));
3155     sv_setiv(PL_DBsignal, 0);
3156     PL_curstash = ostash;
3157 }
3158
3159 #ifndef STRESS_REALLOC
3160 #define REASONABLE(size) (size)
3161 #else
3162 #define REASONABLE(size) (1) /* unreasonable */
3163 #endif
3164
3165 void
3166 Perl_init_stacks(pTHX)
3167 {
3168     /* start with 128-item stack and 8K cxstack */
3169     PL_curstackinfo = new_stackinfo(REASONABLE(128),
3170                                  REASONABLE(8192/sizeof(PERL_CONTEXT) - 1));
3171     PL_curstackinfo->si_type = PERLSI_MAIN;
3172     PL_curstack = PL_curstackinfo->si_stack;
3173     PL_mainstack = PL_curstack;         /* remember in case we switch stacks */
3174
3175     PL_stack_base = AvARRAY(PL_curstack);
3176     PL_stack_sp = PL_stack_base;
3177     PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
3178
3179     New(50,PL_tmps_stack,REASONABLE(128),SV*);
3180     PL_tmps_floor = -1;
3181     PL_tmps_ix = -1;
3182     PL_tmps_max = REASONABLE(128);
3183
3184     New(54,PL_markstack,REASONABLE(32),I32);
3185     PL_markstack_ptr = PL_markstack;
3186     PL_markstack_max = PL_markstack + REASONABLE(32);
3187
3188     SET_MARK_OFFSET;
3189
3190     New(54,PL_scopestack,REASONABLE(32),I32);
3191     PL_scopestack_ix = 0;
3192     PL_scopestack_max = REASONABLE(32);
3193
3194     New(54,PL_savestack,REASONABLE(128),ANY);
3195     PL_savestack_ix = 0;
3196     PL_savestack_max = REASONABLE(128);
3197
3198     New(54,PL_retstack,REASONABLE(16),OP*);
3199     PL_retstack_ix = 0;
3200     PL_retstack_max = REASONABLE(16);
3201 }
3202
3203 #undef REASONABLE
3204
3205 STATIC void
3206 S_nuke_stacks(pTHX)
3207 {
3208     while (PL_curstackinfo->si_next)
3209         PL_curstackinfo = PL_curstackinfo->si_next;
3210     while (PL_curstackinfo) {
3211         PERL_SI *p = PL_curstackinfo->si_prev;
3212         /* curstackinfo->si_stack got nuked by sv_free_arenas() */
3213         Safefree(PL_curstackinfo->si_cxstack);
3214         Safefree(PL_curstackinfo);
3215         PL_curstackinfo = p;
3216     }
3217     Safefree(PL_tmps_stack);
3218     Safefree(PL_markstack);
3219     Safefree(PL_scopestack);
3220     Safefree(PL_savestack);
3221     Safefree(PL_retstack);
3222 }
3223
3224 #ifndef PERL_OBJECT
3225 static PerlIO *tmpfp;  /* moved outside init_lexer() because of UNICOS bug */
3226 #endif
3227
3228 STATIC void
3229 S_init_lexer(pTHX)
3230 {
3231 #ifdef PERL_OBJECT
3232         PerlIO *tmpfp;
3233 #endif
3234     tmpfp = PL_rsfp;
3235     PL_rsfp = Nullfp;
3236     lex_start(PL_linestr);
3237     PL_rsfp = tmpfp;
3238     PL_subname = newSVpvn("main",4);
3239 }
3240
3241 STATIC void
3242 S_init_predump_symbols(pTHX)
3243 {
3244     GV *tmpgv;
3245     IO *io;
3246
3247     sv_setpvn(get_sv("\"", TRUE), " ", 1);
3248     PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
3249     GvMULTI_on(PL_stdingv);
3250     io = GvIOp(PL_stdingv);
3251     IoIFP(io) = PerlIO_stdin();
3252     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
3253     GvMULTI_on(tmpgv);
3254     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3255
3256     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
3257     GvMULTI_on(tmpgv);
3258     io = GvIOp(tmpgv);
3259     IoOFP(io) = IoIFP(io) = PerlIO_stdout();
3260     setdefout(tmpgv);
3261     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
3262     GvMULTI_on(tmpgv);
3263     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3264
3265     PL_stderrgv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
3266     GvMULTI_on(PL_stderrgv);
3267     io = GvIOp(PL_stderrgv);
3268     IoOFP(io) = IoIFP(io) = PerlIO_stderr();
3269     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
3270     GvMULTI_on(tmpgv);
3271     GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
3272
3273     PL_statname = NEWSV(66,0);          /* last filename we did stat on */
3274
3275     if (PL_osname)
3276         Safefree(PL_osname);
3277     PL_osname = savepv(OSNAME);
3278 }
3279
3280 STATIC void
3281 S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
3282 {
3283     char *s;
3284     SV *sv;
3285     GV* tmpgv;
3286     char **dup_env_base = 0;
3287 #ifdef NEED_ENVIRON_DUP_FOR_MODIFY
3288     int dup_env_count = 0;
3289 #endif
3290
3291     argc--,argv++;      /* skip name of script */
3292     if (PL_doswitches) {
3293         for (; argc > 0 && **argv == '-'; argc--,argv++) {
3294             if (!argv[0][1])
3295                 break;
3296             if (argv[0][1] == '-' && !argv[0][2]) {
3297                 argc--,argv++;
3298                 break;
3299             }
3300             if ((s = strchr(argv[0], '='))) {
3301                 *s++ = '\0';
3302                 sv_setpv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),s);
3303             }
3304             else
3305                 sv_setiv(GvSV(gv_fetchpv(argv[0]+1,TRUE, SVt_PV)),1);
3306         }
3307     }
3308     PL_toptarget = NEWSV(0,0);
3309     sv_upgrade(PL_toptarget, SVt_PVFM);
3310     sv_setpvn(PL_toptarget, "", 0);
3311     PL_bodytarget = NEWSV(0,0);
3312     sv_upgrade(PL_bodytarget, SVt_PVFM);
3313     sv_setpvn(PL_bodytarget, "", 0);
3314     PL_formtarget = PL_bodytarget;
3315
3316     TAINT;
3317     if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {
3318 #ifdef MACOS_TRADITIONAL
3319         /* $0 is not majick on a Mac */
3320         sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
3321 #else
3322         sv_setpv(GvSV(tmpgv),PL_origfilename);
3323         magicname("0", "0", 1);
3324 #endif
3325     }
3326     if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV)))
3327 #ifdef OS2
3328         sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
3329 #else
3330         sv_setpv(GvSV(tmpgv),PL_origargv[0]);
3331 #endif
3332     if ((PL_argvgv = gv_fetchpv("ARGV",TRUE, SVt_PVAV))) {
3333         GvMULTI_on(PL_argvgv);
3334         (void)gv_AVadd(PL_argvgv);
3335         av_clear(GvAVn(PL_argvgv));
3336         for (; argc > 0; argc--,argv++) {
3337             SV *sv = newSVpv(argv[0],0);
3338             av_push(GvAVn(PL_argvgv),sv);
3339             if (PL_widesyscalls)
3340                 (void)sv_utf8_decode(sv);
3341         }
3342     }
3343     if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {
3344         HV *hv;
3345         GvMULTI_on(PL_envgv);
3346         hv = GvHVn(PL_envgv);
3347         hv_magic(hv, Nullgv, 'E');
3348 #ifdef USE_ENVIRON_ARRAY
3349         /* Note that if the supplied env parameter is actually a copy
3350            of the global environ then it may now point to free'd memory
3351            if the environment has been modified since. To avoid this
3352            problem we treat env==NULL as meaning 'use the default'
3353         */
3354         if (!env)
3355             env = environ;
3356         if (env != environ)
3357             environ[0] = Nullch;
3358 #ifdef NEED_ENVIRON_DUP_FOR_MODIFY
3359         {
3360             char **env_base;
3361             for (env_base = env; *env; env++)
3362                 dup_env_count++;
3363             if ((dup_env_base = (char **)
3364                  safesysmalloc( sizeof(char *) * (dup_env_count+1) ))) {
3365                 char **dup_env;
3366                 for (env = env_base, dup_env = dup_env_base;
3367                      *env;
3368                      env++, dup_env++) {
3369                     /* With environ one needs to use safesysmalloc(). */
3370                     *dup_env = safesysmalloc(strlen(*env) + 1);
3371                     (void)strcpy(*dup_env, *env);
3372                 }
3373                 *dup_env = Nullch;
3374                 env = dup_env_base;
3375             } /* else what? */
3376         }
3377 #endif /* NEED_ENVIRON_DUP_FOR_MODIFY */
3378         for (; *env; env++) {
3379             if (!(s = strchr(*env,'=')))
3380                 continue;
3381             *s++ = '\0';
3382 #if defined(MSDOS)
3383             (void)strupr(*env);
3384 #endif
3385             sv = newSVpv(s--,0);
3386             (void)hv_store(hv, *env, s - *env, sv, 0);
3387             *s = '=';
3388         }
3389 #ifdef NEED_ENVIRON_DUP_FOR_MODIFY
3390         if (dup_env_base) {
3391             char **dup_env;
3392             for (dup_env = dup_env_base; *dup_env; dup_env++)
3393                 safesysfree(*dup_env);
3394             safesysfree(dup_env_base);
3395         }
3396 #endif /* NEED_ENVIRON_DUP_FOR_MODIFY */
3397 #endif /* USE_ENVIRON_ARRAY */
3398 #ifdef DYNAMIC_ENV_FETCH
3399         HvNAME(hv) = savepv(ENV_HV_NAME);
3400 #endif
3401     }
3402     TAINT_NOT;
3403     if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV)))
3404         sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3405 }
3406
3407 STATIC void
3408 S_init_perllib(pTHX)
3409 {
3410     char *s;
3411     if (!PL_tainting) {
3412 #ifndef VMS
3413         s = PerlEnv_getenv("PERL5LIB");
3414         if (s)
3415             incpush(s, TRUE, TRUE);
3416         else
3417             incpush(PerlEnv_getenv("PERLLIB"), FALSE, FALSE);
3418 #else /* VMS */
3419         /* Treat PERL5?LIB as a possible search list logical name -- the
3420          * "natural" VMS idiom for a Unix path string.  We allow each
3421          * element to be a set of |-separated directories for compatibility.
3422          */
3423         char buf[256];
3424         int idx = 0;
3425         if (my_trnlnm("PERL5LIB",buf,0))
3426             do { incpush(buf,TRUE,TRUE); } while (my_trnlnm("PERL5LIB",buf,++idx));
3427         else
3428             while (my_trnlnm("PERLLIB",buf,idx++)) incpush(buf,FALSE,FALSE);
3429 #endif /* VMS */
3430     }
3431
3432 /* Use the ~-expanded versions of APPLLIB (undocumented),
3433     ARCHLIB PRIVLIB SITEARCH SITELIB VENDORARCH and VENDORLIB
3434 */
3435 #ifdef APPLLIB_EXP
3436     incpush(APPLLIB_EXP, TRUE, TRUE);
3437 #endif
3438
3439 #ifdef ARCHLIB_EXP
3440     incpush(ARCHLIB_EXP, FALSE, FALSE);
3441 #endif
3442 #ifdef MACOS_TRADITIONAL
3443     {
3444         struct stat tmpstatbuf;
3445         SV * privdir = NEWSV(55, 0);
3446         char * macperl = PerlEnv_getenv("MACPERL");
3447         
3448         if (!macperl)
3449             macperl = "";
3450         
3451         Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
3452         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3453             incpush(SvPVX(privdir), TRUE, FALSE);
3454         Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
3455         if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
3456             incpush(SvPVX(privdir), TRUE, FALSE);
3457         
3458         SvREFCNT_dec(privdir);
3459     }
3460     if (!PL_tainting)
3461         incpush(":", FALSE, FALSE);
3462 #else
3463 #ifndef PRIVLIB_EXP
3464 #  define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl"
3465 #endif
3466 #if defined(WIN32)
3467     incpush(PRIVLIB_EXP, TRUE, FALSE);
3468 #else
3469     incpush(PRIVLIB_EXP, FALSE, FALSE);
3470 #endif
3471
3472 #ifdef SITEARCH_EXP
3473     /* sitearch is always relative to sitelib on Windows for
3474      * DLL-based path intuition to work correctly */
3475 #  if !defined(WIN32)
3476     incpush(SITEARCH_EXP, FALSE, FALSE);
3477 #  endif
3478 #endif
3479
3480 #ifdef SITELIB_EXP
3481 #  if defined(WIN32)
3482     incpush(SITELIB_EXP, TRUE, FALSE);  /* this picks up sitearch as well */
3483 #  else
3484     incpush(SITELIB_EXP, FALSE, FALSE);
3485 #  endif
3486 #endif
3487
3488 #ifdef SITELIB_STEM /* Search for version-specific dirs below here */
3489     incpush(SITELIB_STEM, FALSE, TRUE);
3490 #endif
3491
3492 #ifdef PERL_VENDORARCH_EXP
3493     /* vendorarch is always relative to vendorlib on Windows for
3494      * DLL-based path intuition to work correctly */
3495 #  if !defined(WIN32)
3496     incpush(PERL_VENDORARCH_EXP, FALSE, FALSE);
3497 #  endif
3498 #endif
3499
3500 #ifdef PERL_VENDORLIB_EXP
3501 #  if defined(WIN32)
3502     incpush(PERL_VENDORLIB_EXP, TRUE, FALSE);   /* this picks up vendorarch as well */
3503 #  else
3504     incpush(PERL_VENDORLIB_EXP, FALSE, FALSE);
3505 #  endif
3506 #endif
3507
3508 #ifdef PERL_VENDORLIB_STEM /* Search for version-specific dirs below here */
3509     incpush(PERL_VENDORLIB_STEM, FALSE, TRUE);
3510 #endif
3511
3512 #ifdef PERL_OTHERLIBDIRS
3513     incpush(PERL_OTHERLIBDIRS, TRUE, TRUE);
3514 #endif
3515
3516     if (!PL_tainting)
3517         incpush(".", FALSE, FALSE);
3518 #endif /* MACOS_TRADITIONAL */
3519 }
3520
3521 #if defined(DOSISH) || defined(EPOC)
3522 #    define PERLLIB_SEP ';'
3523 #else
3524 #  if defined(VMS)
3525 #    define PERLLIB_SEP '|'
3526 #  else
3527 #    if defined(MACOS_TRADITIONAL)
3528 #      define PERLLIB_SEP ','
3529 #    else
3530 #      define PERLLIB_SEP ':'
3531 #    endif
3532 #  endif
3533 #endif
3534 #ifndef PERLLIB_MANGLE
3535 #  define PERLLIB_MANGLE(s,n) (s)
3536 #endif
3537
3538 STATIC void
3539 S_incpush(pTHX_ char *p, int addsubdirs, int addoldvers)
3540 {
3541     SV *subdir = Nullsv;
3542
3543     if (!p || !*p)
3544         return;
3545
3546     if (addsubdirs || addoldvers) {
3547         subdir = sv_newmortal();
3548     }
3549
3550     /* Break at all separators */
3551     while (p && *p) {
3552         SV *libdir = NEWSV(55,0);
3553         char *s;
3554
3555         /* skip any consecutive separators */
3556         while ( *p == PERLLIB_SEP ) {
3557             /* Uncomment the next line for PATH semantics */
3558             /* av_push(GvAVn(PL_incgv), newSVpvn(".", 1)); */
3559             p++;
3560         }
3561
3562         if ( (s = strchr(p, PERLLIB_SEP)) != Nullch ) {
3563             sv_setpvn(libdir, PERLLIB_MANGLE(p, (STRLEN)(s - p)),
3564                       (STRLEN)(s - p));
3565             p = s + 1;
3566         }
3567         else {
3568             sv_setpv(libdir, PERLLIB_MANGLE(p, 0));
3569             p = Nullch; /* break out */
3570         }
3571 #ifdef MACOS_TRADITIONAL
3572         if (!strchr(SvPVX(libdir), ':'))
3573             sv_insert(libdir, 0, 0, ":", 1);
3574         if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
3575             sv_catpv(libdir, ":");
3576 #endif
3577
3578         /*
3579          * BEFORE pushing libdir onto @INC we may first push version- and
3580          * archname-specific sub-directories.
3581          */
3582         if (addsubdirs || addoldvers) {
3583 #ifdef PERL_INC_VERSION_LIST
3584             /* Configure terminates PERL_INC_VERSION_LIST with a NULL */
3585             const char *incverlist[] = { PERL_INC_VERSION_LIST };
3586             const char **incver;
3587 #endif
3588             struct stat tmpstatbuf;
3589 #ifdef VMS
3590             char *unix;
3591             STRLEN len;
3592
3593             if ((unix = tounixspec_ts(SvPV(libdir,len),Nullch)) != Nullch) {
3594                 len = strlen(unix);
3595                 while (unix[len-1] == '/') len--;  /* Cosmetic */
3596                 sv_usepvn(libdir,unix,len);
3597             }
3598             else
3599                 PerlIO_printf(Perl_error_log,
3600                               "Failed to unixify @INC element \"%s\"\n",
3601                               SvPV(libdir,len));
3602 #endif
3603             if (addsubdirs) {
3604 #ifdef MACOS_TRADITIONAL
3605 #define PERL_AV_SUFFIX_FMT      ""
3606 #define PERL_ARCH_FMT           "%s:"
3607 #define PERL_ARCH_FMT_PATH      PERL_FS_VER_FMT PERL_AV_SUFFIX_FMT
3608 #else
3609 #define PERL_AV_SUFFIX_FMT      "/"
3610 #define PERL_ARCH_FMT           "/%s"
3611 #define PERL_ARCH_FMT_PATH      PERL_AV_SUFFIX_FMT PERL_FS_VER_FMT
3612 #endif
3613                 /* .../version/archname if -d .../version/archname */
3614                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH PERL_ARCH_FMT,
3615                                 libdir,
3616                                (int)PERL_REVISION, (int)PERL_VERSION,
3617                                (int)PERL_SUBVERSION, ARCHNAME);
3618                 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3619                       S_ISDIR(tmpstatbuf.st_mode))
3620                     av_push(GvAVn(PL_incgv), newSVsv(subdir));
3621
3622                 /* .../version if -d .../version */
3623                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT_PATH, libdir,
3624                                (int)PERL_REVISION, (int)PERL_VERSION,
3625                                (int)PERL_SUBVERSION);
3626                 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3627                       S_ISDIR(tmpstatbuf.st_mode))
3628                     av_push(GvAVn(PL_incgv), newSVsv(subdir));
3629
3630                 /* .../archname if -d .../archname */
3631                 Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, ARCHNAME);
3632                 if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3633                       S_ISDIR(tmpstatbuf.st_mode))
3634                     av_push(GvAVn(PL_incgv), newSVsv(subdir));
3635             }
3636
3637 #ifdef PERL_INC_VERSION_LIST
3638             if (addoldvers) {
3639                 for (incver = incverlist; *incver; incver++) {
3640                     /* .../xxx if -d .../xxx */
3641                     Perl_sv_setpvf(aTHX_ subdir, "%"SVf PERL_ARCH_FMT, libdir, *incver);
3642                     if (PerlLIO_stat(SvPVX(subdir), &tmpstatbuf) >= 0 &&
3643                           S_ISDIR(tmpstatbuf.st_mode))
3644                         av_push(GvAVn(PL_incgv), newSVsv(subdir));
3645                 }
3646             }
3647 #endif
3648         }
3649
3650         /* finally push this lib directory on the end of @INC */
3651         av_push(GvAVn(PL_incgv), libdir);
3652     }
3653 }
3654
3655 #ifdef USE_THREADS
3656 STATIC struct perl_thread *
3657 S_init_main_thread(pTHX)
3658 {
3659 #if !defined(PERL_IMPLICIT_CONTEXT)
3660     struct perl_thread *thr;
3661 #endif
3662     XPV *xpv;
3663
3664     Newz(53, thr, 1, struct perl_thread);
3665     PL_curcop = &PL_compiling;
3666     thr->interp = PERL_GET_INTERP;
3667     thr->cvcache = newHV();
3668     thr->threadsv = newAV();
3669     /* thr->threadsvp is set when find_threadsv is called */
3670     thr->specific = newAV();
3671     thr->flags = THRf_R_JOINABLE;
3672     MUTEX_INIT(&thr->mutex);
3673     /* Handcraft thrsv similarly to mess_sv */
3674     New(53, PL_thrsv, 1, SV);
3675     Newz(53, xpv, 1, XPV);
3676     SvFLAGS(PL_thrsv) = SVt_PV;
3677     SvANY(PL_thrsv) = (void*)xpv;
3678     SvREFCNT(PL_thrsv) = 1 << 30;       /* practically infinite */
3679     SvPVX(PL_thrsv) = (char*)thr;
3680     SvCUR_set(PL_thrsv, sizeof(thr));
3681     SvLEN_set(PL_thrsv, sizeof(thr));
3682     *SvEND(PL_thrsv) = '\0';    /* in the trailing_nul field */
3683     thr->oursv = PL_thrsv;
3684     PL_chopset = " \n-";
3685     PL_dumpindent = 4;
3686
3687     MUTEX_LOCK(&PL_threads_mutex);
3688     PL_nthreads++;
3689     thr->tid = 0;
3690     thr->next = thr;
3691     thr->prev = thr;
3692     thr->thr_done = 0;
3693     MUTEX_UNLOCK(&PL_threads_mutex);
3694
3695 #ifdef HAVE_THREAD_INTERN
3696     Perl_init_thread_intern(thr);
3697 #endif
3698
3699 #ifdef SET_THREAD_SELF
3700     SET_THREAD_SELF(thr);
3701 #else
3702     thr->self = pthread_self();
3703 #endif /* SET_THREAD_SELF */
3704     PERL_SET_THX(thr);
3705
3706     /*
3707      * These must come after the thread self setting
3708      * because sv_setpvn does SvTAINT and the taint
3709      * fields thread selfness being set.
3710      */
3711     PL_toptarget = NEWSV(0,0);
3712     sv_upgrade(PL_toptarget, SVt_PVFM);
3713     sv_setpvn(PL_toptarget, "", 0);
3714     PL_bodytarget = NEWSV(0,0);
3715     sv_upgrade(PL_bodytarget, SVt_PVFM);
3716     sv_setpvn(PL_bodytarget, "", 0);
3717     PL_formtarget = PL_bodytarget;
3718     thr->errsv = newSVpvn("", 0);
3719     (void) find_threadsv("@");  /* Ensure $@ is initialised early */
3720
3721     PL_maxscream = -1;
3722     PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp);
3723     PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags);
3724     PL_regint_start = MEMBER_TO_FPTR(Perl_re_intuit_start);
3725     PL_regint_string = MEMBER_TO_FPTR(Perl_re_intuit_string);
3726     PL_regfree = MEMBER_TO_FPTR(Perl_pregfree);
3727     PL_regindent = 0;
3728     PL_reginterp_cnt = 0;
3729
3730     return thr;
3731 }
3732 #endif /* USE_THREADS */
3733
3734 void
3735 Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
3736 {
3737     SV *atsv;
3738     line_t oldline = CopLINE(PL_curcop);
3739     CV *cv;
3740     STRLEN len;
3741     int ret;
3742     dJMPENV;
3743
3744     while (AvFILL(paramList) >= 0) {
3745         cv = (CV*)av_shift(paramList);
3746         if ((PL_minus_c & 0x10) && (paramList == PL_beginav)) {
3747                 /* save PL_beginav for compiler */
3748             if (! PL_beginav_save)
3749                 PL_beginav_save = newAV();
3750             av_push(PL_beginav_save, (SV*)cv);
3751         } else {
3752             SAVEFREESV(cv);
3753         }
3754 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3755         CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
3756 #else
3757         JMPENV_PUSH(ret);
3758 #endif
3759         switch (ret) {
3760         case 0:
3761 #ifndef PERL_FLEXIBLE_EXCEPTIONS
3762             call_list_body(cv);
3763 #endif
3764             atsv = ERRSV;
3765             (void)SvPV(atsv, len);
3766             if (len) {
3767                 STRLEN n_a;
3768                 PL_curcop = &PL_compiling;
3769                 CopLINE_set(PL_curcop, oldline);
3770                 if (paramList == PL_beginav)
3771                     sv_catpv(atsv, "BEGIN failed--compilation aborted");
3772                 else
3773                     Perl_sv_catpvf(aTHX_ atsv,
3774                                    "%s failed--call queue aborted",
3775                                    paramList == PL_checkav ? "CHECK"
3776                                    : paramList == PL_initav ? "INIT"
3777                                    : "END");
3778                 while (PL_scopestack_ix > oldscope)
3779                     LEAVE;
3780                 JMPENV_POP;
3781                 Perl_croak(aTHX_ "%s", SvPVx(atsv, n_a));
3782             }
3783             break;
3784         case 1:
3785             STATUS_ALL_FAILURE;
3786             /* FALL THROUGH */
3787         case 2:
3788             /* my_exit() was called */
3789             while (PL_scopestack_ix > oldscope)
3790                 LEAVE;
3791             FREETMPS;
3792             PL_curstash = PL_defstash;
3793             PL_curcop = &PL_compiling;
3794             CopLINE_set(PL_curcop, oldline);
3795             JMPENV_POP;
3796             if (PL_statusvalue && !(PL_exit_flags & PERL_EXIT_EXPECTED)) {
3797                 if (paramList == PL_beginav)
3798                     Perl_croak(aTHX_ "BEGIN failed--compilation aborted");
3799                 else
3800                     Perl_croak(aTHX_ "%s failed--call queue aborted",
3801                                paramList == PL_checkav ? "CHECK"
3802                                : paramList == PL_initav ? "INIT"
3803                                : "END");
3804             }
3805             my_exit_jump();
3806             /* NOTREACHED */
3807         case 3:
3808             if (PL_restartop) {
3809                 PL_curcop = &PL_compiling;
3810                 CopLINE_set(PL_curcop, oldline);
3811                 JMPENV_JUMP(3);
3812             }
3813             PerlIO_printf(Perl_error_log, "panic: restartop\n");
3814             FREETMPS;
3815             break;
3816         }
3817         JMPENV_POP;
3818     }
3819 }
3820
3821 #ifdef PERL_FLEXIBLE_EXCEPTIONS
3822 STATIC void *
3823 S_vcall_list_body(pTHX_ va_list args)
3824 {
3825     CV *cv = va_arg(args, CV*);
3826     return call_list_body(cv);
3827 }
3828 #endif
3829
3830 STATIC void *
3831 S_call_list_body(pTHX_ CV *cv)
3832 {
3833     PUSHMARK(PL_stack_sp);
3834     call_sv((SV*)cv, G_EVAL|G_DISCARD);
3835     return NULL;
3836 }
3837
3838 void
3839 Perl_my_exit(pTHX_ U32 status)
3840 {
3841     DEBUG_S(PerlIO_printf(Perl_debug_log, "my_exit: thread %p, status %lu\n",
3842                           thr, (unsigned long) status));
3843     switch (status) {
3844     case 0:
3845         STATUS_ALL_SUCCESS;
3846         break;
3847     case 1:
3848         STATUS_ALL_FAILURE;
3849         break;
3850     default:
3851         STATUS_NATIVE_SET(status);
3852         break;
3853     }
3854     my_exit_jump();
3855 }
3856
3857 void
3858 Perl_my_failure_exit(pTHX)
3859 {
3860 #ifdef VMS
3861     if (vaxc$errno & 1) {
3862         if (STATUS_NATIVE & 1)          /* fortuitiously includes "-1" */
3863             STATUS_NATIVE_SET(44);
3864     }
3865     else {
3866         if (!vaxc$errno && errno)       /* unlikely */
3867             STATUS_NATIVE_SET(44);
3868         else
3869             STATUS_NATIVE_SET(vaxc$errno);
3870     }
3871 #else
3872     int exitstatus;
3873     if (errno & 255)
3874         STATUS_POSIX_SET(errno);
3875     else {
3876         exitstatus = STATUS_POSIX >> 8;
3877         if (exitstatus & 255)
3878             STATUS_POSIX_SET(exitstatus);
3879         else
3880             STATUS_POSIX_SET(255);
3881     }
3882 #endif
3883     my_exit_jump();
3884 }
3885
3886 STATIC void
3887 S_my_exit_jump(pTHX)
3888 {
3889     register PERL_CONTEXT *cx;
3890     I32 gimme;
3891     SV **newsp;
3892
3893     if (PL_e_script) {
3894         SvREFCNT_dec(PL_e_script);
3895         PL_e_script = Nullsv;
3896     }
3897
3898     POPSTACK_TO(PL_mainstack);
3899     if (cxstack_ix >= 0) {
3900         if (cxstack_ix > 0)
3901             dounwind(0);
3902         POPBLOCK(cx,PL_curpm);
3903         LEAVE;
3904     }
3905
3906     JMPENV_JUMP(2);
3907 }
3908
3909 #ifdef PERL_OBJECT
3910 #include "XSUB.h"
3911 #endif
3912
3913 static I32
3914 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
3915 {
3916     char *p, *nl;
3917     p  = SvPVX(PL_e_script);
3918     nl = strchr(p, '\n');
3919     nl = (nl) ? nl+1 : SvEND(PL_e_script);
3920     if (nl-p == 0) {
3921         filter_del(read_e_script);
3922         return 0;
3923     }
3924     sv_catpvn(buf_sv, p, nl-p);
3925     sv_chop(PL_e_script, nl);
3926     return 1;
3927 }