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