Integrate with Sarathy.
[p5sagit/p5-mst-13.2.git] / perl.c
diff --git a/perl.c b/perl.c
index 976b7b5..b654404 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -24,6 +24,8 @@
 char *getenv (char *); /* Usually in <stdlib.h> */
 #endif
 
+static I32 read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen);
+
 #ifdef I_FCNTL
 #include <fcntl.h>
 #endif
@@ -68,7 +70,7 @@ perl_alloc(void)
 #endif /* PERL_OBJECT */
 
 void
-perl_construct(register PerlInterpreter *my_perl)
+perl_construct(pTHXx)
 {
 #ifdef USE_THREADS
     int i;
@@ -83,7 +85,6 @@ perl_construct(register PerlInterpreter *my_perl)
 #endif
 
 #ifdef MULTIPLICITY
-    ++PL_ninterps;
     Zero(my_perl, 1, PerlInterpreter);
 #endif
 
@@ -178,6 +179,7 @@ perl_construct(register PerlInterpreter *my_perl)
     JMPENV_BOOTSTRAP;
     STATUS_ALL_SUCCESS;
 
+    init_i18nl10n(1);
     SET_NUMERIC_STANDARD();
 #if defined(PERL_SUBVERSION) && PERL_SUBVERSION > 0
     sprintf(PL_patchlevel, "%7.5f",   (double) PERL_REVISION
@@ -206,7 +208,7 @@ perl_construct(register PerlInterpreter *my_perl)
 }
 
 void
-perl_destruct(register PerlInterpreter *my_perl)
+perl_destruct(pTHXx)
 {
     dTHR;
     int destruct_level;  /* 0=none, 1=full, 2=full with checks */
@@ -307,10 +309,6 @@ perl_destruct(register PerlInterpreter *my_perl)
     LEAVE;
     FREETMPS;
 
-#ifdef MULTIPLICITY
-    --PL_ninterps;
-#endif
-
     /* We must account for everything.  */
 
     /* Destroy the main CV and syntax tree */
@@ -344,7 +342,7 @@ perl_destruct(register PerlInterpreter *my_perl)
 
     /* call exit list functions */
     while (PL_exitlistlen-- > 0)
-       PL_exitlist[PL_exitlistlen].fn(aTHX_ PL_exitlist[PL_exitlistlen].ptr);
+       PL_exitlist[PL_exitlistlen].fn(aTHXo_ PL_exitlist[PL_exitlistlen].ptr);
 
     Safefree(PL_exitlist);
 
@@ -450,18 +448,20 @@ perl_destruct(register PerlInterpreter *my_perl)
     SvREFCNT_dec(hv);
 
     FREETMPS;
-    if (destruct_level >= 2) {
+    if (destruct_level >= 2 && ckWARN_d(WARN_INTERNAL)) {
        if (PL_scopestack_ix != 0)
-           Perl_warn(aTHX_ "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
+           Perl_warner(aTHX_ WARN_INTERNAL,
+                "Unbalanced scopes: %ld more ENTERs than LEAVEs\n",
                 (long)PL_scopestack_ix);
        if (PL_savestack_ix != 0)
-           Perl_warn(aTHX_ "Unbalanced saves: %ld more saves than restores\n",
+           Perl_warner(aTHX_ WARN_INTERNAL,
+                "Unbalanced saves: %ld more saves than restores\n",
                 (long)PL_savestack_ix);
        if (PL_tmps_floor != -1)
-           Perl_warn(aTHX_ "Unbalanced tmps: %ld more allocs than frees\n",
+           Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced tmps: %ld more allocs than frees\n",
                 (long)PL_tmps_floor + 1);
        if (cxstack_ix != -1)
-           Perl_warn(aTHX_ "Unbalanced context: %ld more PUSHes than POPs\n",
+           Perl_warner(aTHX_ WARN_INTERNAL,"Unbalanced context: %ld more PUSHes than POPs\n",
                 (long)cxstack_ix + 1);
     }
 
@@ -490,8 +490,9 @@ perl_destruct(register PerlInterpreter *my_perl)
        array = HvARRAY(PL_strtab);
        hent = array[0];
        for (;;) {
-           if (hent) {
-               Perl_warn(aTHX_ "Unbalanced string table refcount: (%d) for \"%s\"",
+           if (hent && ckWARN_d(WARN_INTERNAL)) {
+               Perl_warner(aTHX_ WARN_INTERNAL,
+                    "Unbalanced string table refcount: (%d) for \"%s\"",
                     HeVAL(hent) - Nullsv, HeKEY(hent));
                HeVAL(hent) = Nullsv;
                hent = HeNEXT(hent);
@@ -505,8 +506,8 @@ perl_destruct(register PerlInterpreter *my_perl)
     }
     SvREFCNT_dec(PL_strtab);
 
-    if (PL_sv_count != 0)
-       Perl_warn(aTHX_ "Scalars leaked: %ld\n", (long)PL_sv_count);
+    if (PL_sv_count != 0 && ckWARN_d(WARN_INTERNAL))
+       Perl_warner(aTHX_ WARN_INTERNAL,"Scalars leaked: %ld\n", (long)PL_sv_count);
 
     sv_free_arenas();
 
@@ -565,7 +566,7 @@ perl_destruct(register PerlInterpreter *my_perl)
 }
 
 void
-perl_free(PerlInterpreter *my_perl)
+perl_free(pTHXx)
 {
 #ifdef PERL_OBJECT
        Safefree(this);
@@ -588,7 +589,7 @@ Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr)
 }
 
 int
-perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char **argv, char **env)
+perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
 {
     dTHR;
     I32 oldscope;
@@ -741,7 +742,7 @@ S_parse_body(pTHX_ va_list args)
                Perl_croak(aTHX_ "No -e allowed in setuid scripts");
            if (!PL_e_script) {
                PL_e_script = newSVpvn("",0);
-               filter_add(S_read_e_script, NULL);
+               filter_add(read_e_script, NULL);
            }
            if (*++s)
                sv_catpv(PL_e_script, s);
@@ -945,11 +946,15 @@ print \"  \\@INC:\\n    @INC\\n\";");
     boot_core_UNIVERSAL();
 
     if (xsinit)
-       (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
+       (*xsinit)(aTHXo);       /* in case linked C routines want magical variables */
 #if defined(VMS) || defined(WIN32) || defined(DJGPP)
     init_os_extras(aTHX);
 #endif
 
+#ifdef USE_SOCKS
+    SOCKSinit(argv[0]);
+#endif    
+
     init_predump_symbols();
     /* init_postdump_symbols not currently designed to be called */
     /* more than once (ENV isn't cleared first, for example)    */
@@ -968,7 +973,7 @@ print \"  \\@INC:\\n    @INC\\n\";");
            Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
        else {
            Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
-               PL_origfilename);
+                      PL_origfilename);
        }
     }
     PL_curcop->cop_line = 0;
@@ -986,7 +991,7 @@ print \"  \\@INC:\\n    @INC\\n\";");
     if (PL_do_undump)
        my_unexec();
 
-    if (ckWARN(WARN_ONCE))
+    if (isWARN_ONCE)
        gv_check(PL_defstash);
 
     LEAVE;
@@ -1003,7 +1008,7 @@ print \"  \\@INC:\\n    @INC\\n\";");
 }
 
 int
-perl_run(PerlInterpreter *my_perl)
+perl_run(pTHXx)
 {
     dTHR;
     I32 oldscope;
@@ -1090,6 +1095,8 @@ S_run_body(pTHX_ va_list args)
        CALLRUNOPS(aTHX);
     }
 
+    my_exit(0);
+    /* NOTREACHED */
     return NULL;
 }
 
@@ -1578,6 +1585,7 @@ Perl_moreswitches(pTHX_ char *s)
        }
        return s;
     case 'D':
+    {  
 #ifdef DEBUGGING
        forbid_setid("-D");
        if (isALPHA(s[1])) {
@@ -1593,11 +1601,15 @@ Perl_moreswitches(pTHX_ char *s)
        }
        PL_debug |= 0x80000000;
 #else
-       Perl_warn(aTHX_ "Recompile perl with -DDEBUGGING to use -D switch\n");
+       dTHR;
+       if (ckWARN_d(WARN_DEBUGGING))
+           Perl_warner(aTHX_ WARN_DEBUGGING,
+                  "Recompile perl with -DDEBUGGING to use -D switch\n");
        for (s++; isALNUM(*s); s++) ;
 #endif
        /*SUPPRESS 530*/
        return s;
+    }  
     case 'h':
        usage(PL_origargv[0]);    
        PerlProc_exit(0);
@@ -1890,6 +1902,7 @@ S_init_interp(pTHX)
 #else
 #  ifdef MULTIPLICITY
 #    define PERLVAR(var,type)
+#    define PERLVARA(var,n,type)
 #    if defined(PERL_IMPLICIT_CONTEXT)
 #      define PERLVARI(var,type,init)  my_perl->var = init;
 #      define PERLVARIC(var,type,init) my_perl->var = init;
@@ -1902,10 +1915,12 @@ S_init_interp(pTHX)
 #      include "thrdvar.h"
 #    endif
 #    undef PERLVAR
+#    undef PERLVARA
 #    undef PERLVARI
 #    undef PERLVARIC
 #  else
 #    define PERLVAR(var,type)
+#    define PERLVARA(var,n,type)
 #    define PERLVARI(var,type,init)    PL_##var = init;
 #    define PERLVARIC(var,type,init)   PL_##var = init;
 #    include "intrpvar.h"
@@ -1913,6 +1928,7 @@ S_init_interp(pTHX)
 #      include "thrdvar.h"
 #    endif
 #    undef PERLVAR
+#    undef PERLVARA
 #    undef PERLVARI
 #    undef PERLVARIC
 #  endif
@@ -2600,29 +2616,33 @@ S_init_predump_symbols(pTHX)
     dTHR;
     GV *tmpgv;
     GV *othergv;
+    IO *io;
 
     sv_setpvn(get_sv("\"", TRUE), " ", 1);
     PL_stdingv = gv_fetchpv("STDIN",TRUE, SVt_PVIO);
     GvMULTI_on(PL_stdingv);
-    IoIFP(GvIOp(PL_stdingv)) = PerlIO_stdin();
+    io = GvIOp(PL_stdingv);
+    IoIFP(io) = PerlIO_stdin();
     tmpgv = gv_fetchpv("stdin",TRUE, SVt_PV);
     GvMULTI_on(tmpgv);
-    GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_stdingv));
+    GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
 
     tmpgv = gv_fetchpv("STDOUT",TRUE, SVt_PVIO);
     GvMULTI_on(tmpgv);
-    IoOFP(GvIOp(tmpgv)) = IoIFP(GvIOp(tmpgv)) = PerlIO_stdout();
+    io = GvIOp(tmpgv);
+    IoOFP(io) = IoIFP(io) = PerlIO_stdout();
     setdefout(tmpgv);
     tmpgv = gv_fetchpv("stdout",TRUE, SVt_PV);
     GvMULTI_on(tmpgv);
-    GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(PL_defoutgv));
+    GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
 
     othergv = gv_fetchpv("STDERR",TRUE, SVt_PVIO);
     GvMULTI_on(othergv);
-    IoOFP(GvIOp(othergv)) = IoIFP(GvIOp(othergv)) = PerlIO_stderr();
+    io = GvIOp(othergv);
+    IoOFP(io) = IoIFP(io) = PerlIO_stderr();
     tmpgv = gv_fetchpv("stderr",TRUE, SVt_PV);
     GvMULTI_on(tmpgv);
-    GvIOp(tmpgv) = (IO*)SvREFCNT_inc(GvIOp(othergv));
+    GvIOp(tmpgv) = (IO*)SvREFCNT_inc(io);
 
     PL_statname = NEWSV(66,0);         /* last filename we did stat on */
 
@@ -2683,7 +2703,7 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register
        GvMULTI_on(PL_envgv);
        hv = GvHVn(PL_envgv);
        hv_magic(hv, PL_envgv, 'E');
-#ifndef VMS  /* VMS doesn't have environ array */
+#if !defined( VMS) && !defined(EPOC)  /* VMS doesn't have environ array */
        /* Note that if the supplied env parameter is actually a copy
           of the global environ then it may now point to free'd memory
           if the environment has been modified since. To avoid this
@@ -2943,6 +2963,9 @@ S_init_main_thread(pTHX)
     PL_maxscream = -1;
     PL_regcompp = FUNC_NAME_TO_PTR(Perl_pregcomp);
     PL_regexecp = FUNC_NAME_TO_PTR(Perl_regexec_flags);
+    PL_regint_start = FUNC_NAME_TO_PTR(Perl_re_intuit_start);
+    PL_regint_string = FUNC_NAME_TO_PTR(Perl_re_intuit_string);
+    PL_regfree = FUNC_NAME_TO_PTR(Perl_pregfree);
     PL_regindent = 0;
     PL_reginterp_cnt = 0;
 
@@ -3100,19 +3123,18 @@ S_my_exit_jump(pTHX)
 
 #ifdef PERL_OBJECT
 #define NO_XSLOCKS
-#endif  /* PERL_OBJECT */
-
 #include "XSUB.h"
+#endif
 
-STATIC I32
-S_read_e_script(pTHX_ int idx, SV *buf_sv, int maxlen)
+static I32
+read_e_script(pTHXo_ int idx, SV *buf_sv, int maxlen)
 {
     char *p, *nl;
     p  = SvPVX(PL_e_script);
     nl = strchr(p, '\n');
     nl = (nl) ? nl+1 : SvEND(PL_e_script);
     if (nl-p == 0) {
-       filter_del(S_read_e_script);
+       filter_del(read_e_script);
        return 0;
     }
     sv_catpvn(buf_sv, p, nl-p);