perl 5.002gamma: hints/sco.sh
[p5sagit/p5-mst-13.2.git] / pp_ctl.c
index 68628f1..7416f0e 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -102,7 +102,7 @@ PP(pp_substcont)
     register char *s = cx->sb_s;
     register char *m = cx->sb_m;
     char *orig = cx->sb_orig;
-    register REGEXP *rx = pm->op_pmregexp;
+    register REGEXP *rx = cx->sb_rx;
 
     if (cx->sb_iters++) {
        if (cx->sb_iters > cx->sb_maxiters)
@@ -969,7 +969,7 @@ char *message;
            }
        }
        else
-           sv_catpv(GvSV(errgv), message);
+           sv_setpv(GvSV(errgv), message);
        
        cxix = dopoptoeval(cxstack_ix);
        if (cxix >= 0) {
@@ -998,8 +998,12 @@ char *message;
     }
     fputs(message, stderr);
     (void)fflush(stderr);
-    if (e_fp)
+    if (e_fp) {
+#ifdef DOSISH
+       fclose(e_fp);
+#endif 
        (void)UNLINK(e_tmpname);
+    }
     statusvalue = SHIFTSTATUS(statusvalue);
 #ifdef VMS
     my_exit((U32)vaxc$errno?vaxc$errno:errno?errno:statusvalue?statusvalue:SS$_ABORT);
@@ -1077,6 +1081,14 @@ PP(pp_caller)
        cxix = dopoptosub(cxix - 1);
     }
     cx = &cxstack[cxix];
+    if (cxstack[cxix].cx_type == CXt_SUB) {
+        dbcxix = dopoptosub(cxix - 1);
+       /* We expect that cxstack[dbcxix] is CXt_SUB, anyway, the
+          field below is defined for any cx. */
+       if (DBsub && dbcxix >= 0 && cxstack[dbcxix].blk_sub.cv == GvCV(DBsub))
+           cx = &cxstack[dbcxix];
+    }
+
     if (GIMME != G_ARRAY) {
        dTARGET;
 
@@ -1084,16 +1096,13 @@ PP(pp_caller)
        PUSHs(TARG);
        RETURN;
     }
-    dbcxix = dopoptosub(cxix - 1);
-    if (DBsub && dbcxix >= 0 && cxstack[dbcxix].blk_sub.cv == GvCV(DBsub))
-       cx = &cxstack[dbcxix];
 
     PUSHs(sv_2mortal(newSVpv(HvNAME(cx->blk_oldcop->cop_stash), 0)));
     PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
     PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
     if (!MAXARG)
        RETURN;
-    if (cx->cx_type == CXt_SUB) {
+    if (cx->cx_type == CXt_SUB) { /* So is cxstack[dbcxix]. */
        sv = NEWSV(49, 0);
        gv_efullname(sv, CvGV(cxstack[cxix].blk_sub.cv));
        PUSHs(sv_2mortal(sv));
@@ -1105,8 +1114,15 @@ PP(pp_caller)
     }
     PUSHs(sv_2mortal(newSViv((I32)cx->blk_gimme)));
     if (cx->cx_type == CXt_EVAL) {
-       if (cx->blk_eval.old_op_type == OP_ENTEREVAL)
+       if (cx->blk_eval.old_op_type == OP_ENTEREVAL) {
            PUSHs(cx->blk_eval.cur_text);
+           PUSHs(&sv_no);
+       } 
+       else if (cx->blk_eval.old_name) { /* Try blocks have old_name == 0. */
+           /* Require, put the name. */
+           PUSHs(sv_2mortal(newSVpv(cx->blk_eval.old_name, 0)));
+           PUSHs(&sv_yes);
+       }
     }
     else if (cx->cx_type == CXt_SUB &&
            cx->blk_sub.hasargs &&
@@ -1232,7 +1248,7 @@ PP(pp_dbstate)
        if (!cv)
            DIE("No DB::DB routine defined");
 
-       if (CvDEPTH(cv) >= 1)           /* don't do recursive DB::DB call */
+       if (CvDEPTH(cv) >= 1 && !(debug & (1<<30))) /* don't do recursive DB::DB call */
            return NORMAL;
 
        ENTER;
@@ -1968,10 +1984,8 @@ int gimme;
     error_count = 0;
     curcop = &compiling;
     curcop->cop_arybase = 0;
-    rs = "\n";
-    rslen = 1;
-    rschar = '\n';
-    rspara = 0;
+    SvREFCNT_dec(rs);
+    rs = newSVpv("\n", 1);
     sv_setpv(GvSV(errgv),"");
     if (yyparse() || error_count || !eval_root) {
        SV **newsp;
@@ -1991,16 +2005,12 @@ int gimme;
        LEAVE;
        if (optype == OP_REQUIRE)
            DIE("%s", SvPVx(GvSV(errgv), na));
-       rs = nrs;
-       rslen = nrslen;
-       rschar = nrschar;
-       rspara = (nrslen == 2);
+       SvREFCNT_dec(rs);
+       rs = SvREFCNT_inc(nrs);
        RETPUSHUNDEF;
     }
-    rs = nrs;
-    rslen = nrslen;
-    rschar = nrschar;
-    rspara = (nrslen == 2);
+    SvREFCNT_dec(rs);
+    rs = SvREFCNT_inc(nrs);
     compiling.cop_line = 0;
     SAVEFREEOP(eval_root);
     if (gimme & G_ARRAY)