phase 1 of somewhat major rearrangement of PERL_OBJECT stuff
[p5sagit/p5-mst-13.2.git] / dump.c
diff --git a/dump.c b/dump.c
index 273e6cc..8b73a9a 100644 (file)
--- a/dump.c
+++ b/dump.c
-/* $RCSfile: dump.c,v $$Revision: 4.0.1.1 $$Date: 91/06/07 10:58:44 $
+/*    dump.c
  *
- *    Copyright (c) 1991, Larry Wall
+ *    Copyright (c) 1991-1997, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *
- * $Log:       dump.c,v $
- * Revision 4.0.1.1  91/06/07  10:58:44  lwall
- * patch4: new copyright notice
- * 
- * Revision 4.0  91/03/20  01:08:25  lwall
- * 4.0 baseline.
- * 
+ */
+
+/*
+ * "'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and
+ * it has not been hard for me to read your mind and memory.'"
  */
 
 #include "EXTERN.h"
 #include "perl.h"
 
+#ifndef PERL_OBJECT
+static void dump(char *pat, ...);
+#endif /* PERL_OBJECT */
+
+void
+dump_all(void)
+{
 #ifdef DEBUGGING
-static int dumplvl = 0;
+    dTHR;
+    PerlIO_setlinebuf(Perl_debug_log);
+    if (PL_main_root)
+       dump_op(PL_main_root);
+    dump_packsubs(PL_defstash);
+#endif /* DEBUGGING */
+}
 
-dump_all()
+void
+dump_packsubs(HV *stash)
 {
-    register int i;
-    register STAB *stab;
-    register HENT *entry;
-    STR *str = str_mortal(&str_undef);
+#ifdef DEBUGGING
+    dTHR;
+    I32        i;
+    HE *entry;
 
-    dump_cmd(main_root,Nullcmd);
-    for (i = 0; i <= 127; i++) {
-       for (entry = defstash->tbl_array[i]; entry; entry = entry->hent_next) {
-           stab = (STAB*)entry->hent_val;
-           if (stab_sub(stab)) {
-               stab_fullname(str,stab);
-               dump("\nSUB %s = ", str->str_ptr);
-               dump_cmd(stab_sub(stab)->cmd,Nullcmd);
-           }
+    if (!HvARRAY(stash))
+       return;
+    for (i = 0; i <= (I32) HvMAX(stash); i++) {
+       for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
+           GV *gv = (GV*)HeVAL(entry);
+           HV *hv;
+           if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
+               continue;
+           if (GvCVu(gv))
+               dump_sub(gv);
+           if (GvFORM(gv))
+               dump_form(gv);
+           if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
+             (hv = GvHV(gv)) && HvNAME(hv) && hv != PL_defstash)
+               dump_packsubs(hv);              /* nested package */
        }
     }
+#endif /* DEBUGGING */
 }
 
-dump_cmd(cmd,alt)
-register CMD *cmd;
-register CMD *alt;
+void
+dump_sub(GV *gv)
 {
-    fprintf(stderr,"{\n");
-    while (cmd) {
-       dumplvl++;
-       dump("C_TYPE = %s\n",cmdname[cmd->c_type]);
-       dump("C_ADDR = 0x%lx\n",cmd);
-       dump("C_NEXT = 0x%lx\n",cmd->c_next);
-       if (cmd->c_line)
-           dump("C_LINE = %d (0x%lx)\n",cmd->c_line,cmd);
-       if (cmd->c_label)
-           dump("C_LABEL = \"%s\"\n",cmd->c_label);
-       dump("C_OPT = CFT_%s\n",cmdopt[cmd->c_flags & CF_OPTIMIZE]);
-       *buf = '\0';
-       if (cmd->c_flags & CF_FIRSTNEG)
-           (void)strcat(buf,"FIRSTNEG,");
-       if (cmd->c_flags & CF_NESURE)
-           (void)strcat(buf,"NESURE,");
-       if (cmd->c_flags & CF_EQSURE)
-           (void)strcat(buf,"EQSURE,");
-       if (cmd->c_flags & CF_COND)
-           (void)strcat(buf,"COND,");
-       if (cmd->c_flags & CF_LOOP)
-           (void)strcat(buf,"LOOP,");
-       if (cmd->c_flags & CF_INVERT)
-           (void)strcat(buf,"INVERT,");
-       if (cmd->c_flags & CF_ONCE)
-           (void)strcat(buf,"ONCE,");
-       if (cmd->c_flags & CF_FLIP)
-           (void)strcat(buf,"FLIP,");
-       if (cmd->c_flags & CF_TERM)
-           (void)strcat(buf,"TERM,");
-       if (*buf)
-           buf[strlen(buf)-1] = '\0';
-       dump("C_FLAGS = (%s)\n",buf);
-       if (cmd->c_short) {
-           dump("C_SHORT = \"%s\"\n",str_peek(cmd->c_short));
-           dump("C_SLEN = \"%d\"\n",cmd->c_slen);
+#ifdef DEBUGGING
+    SV *sv = sv_newmortal();
+
+    gv_fullname3(sv, gv, Nullch);
+    dump("\nSUB %s = ", SvPVX(sv));
+    if (CvXSUB(GvCV(gv)))
+       dump("(xsub 0x%x %d)\n",
+           (long)CvXSUB(GvCV(gv)),
+           CvXSUBANY(GvCV(gv)).any_i32);
+    else if (CvROOT(GvCV(gv)))
+       dump_op(CvROOT(GvCV(gv)));
+    else
+       dump("<undef>\n");
+#endif /* DEBUGGING */
+}
+
+void
+dump_form(GV *gv)
+{
+#ifdef DEBUGGING
+    SV *sv = sv_newmortal();
+
+    gv_fullname3(sv, gv, Nullch);
+    dump("\nFORMAT %s = ", SvPVX(sv));
+    if (CvROOT(GvFORM(gv)))
+       dump_op(CvROOT(GvFORM(gv)));
+    else
+       dump("<undef>\n");
+#endif /* DEBUGGING */
+}
+
+void
+dump_eval(void)
+{
+#ifdef DEBUGGING
+    dump_op(PL_eval_root);
+#endif /* DEBUGGING */
+}
+
+void
+dump_op(OP *o)
+{
+#ifdef DEBUGGING
+    dump("{\n");
+    if (o->op_seq)
+       PerlIO_printf(Perl_debug_log, "%-4d", o->op_seq);
+    else
+       PerlIO_printf(Perl_debug_log, "    ");
+    dump("TYPE = %s  ===> ", PL_op_name[o->op_type]);
+    if (o->op_next) {
+       if (o->op_seq)
+           PerlIO_printf(Perl_debug_log, "%d\n", o->op_next->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "(%d)\n", o->op_next->op_seq);
+    }
+    else
+       PerlIO_printf(Perl_debug_log, "DONE\n");
+    PL_dumplvl++;
+    if (o->op_targ) {
+       if (o->op_type == OP_NULL)
+           dump("  (was %s)\n", PL_op_name[o->op_targ]);
+       else
+           dump("TARG = %d\n", o->op_targ);
+    }
+#ifdef DUMPADDR
+    dump("ADDR = 0x%lx => 0x%lx\n",o, o->op_next);
+#endif
+    if (o->op_flags) {
+       SV *tmpsv = newSVpv("", 0);
+       switch (o->op_flags & OPf_WANT) {
+       case OPf_WANT_VOID:
+           sv_catpv(tmpsv, ",VOID");
+           break;
+       case OPf_WANT_SCALAR:
+           sv_catpv(tmpsv, ",SCALAR");
+           break;
+       case OPf_WANT_LIST:
+           sv_catpv(tmpsv, ",LIST");
+           break;
+       default:
+           sv_catpv(tmpsv, ",UNKNOWN");
+           break;
+       }
+       if (o->op_flags & OPf_KIDS)
+           sv_catpv(tmpsv, ",KIDS");
+       if (o->op_flags & OPf_PARENS)
+           sv_catpv(tmpsv, ",PARENS");
+       if (o->op_flags & OPf_STACKED)
+           sv_catpv(tmpsv, ",STACKED");
+       if (o->op_flags & OPf_REF)
+           sv_catpv(tmpsv, ",REF");
+       if (o->op_flags & OPf_MOD)
+           sv_catpv(tmpsv, ",MOD");
+       if (o->op_flags & OPf_SPECIAL)
+           sv_catpv(tmpsv, ",SPECIAL");
+       dump("FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
+       SvREFCNT_dec(tmpsv);
+    }
+    if (o->op_private) {
+       SV *tmpsv = newSVpv("", 0);
+       if (o->op_type == OP_AASSIGN) {
+           if (o->op_private & OPpASSIGN_COMMON)
+               sv_catpv(tmpsv, ",COMMON");
        }
-       if (cmd->c_stab) {
-           dump("C_STAB = ");
-           dump_stab(cmd->c_stab);
+       else if (o->op_type == OP_SASSIGN) {
+           if (o->op_private & OPpASSIGN_BACKWARDS)
+               sv_catpv(tmpsv, ",BACKWARDS");
        }
-       if (cmd->c_spat) {
-           dump("C_SPAT = ");
-           dump_spat(cmd->c_spat);
+       else if (o->op_type == OP_TRANS) {
+           if (o->op_private & OPpTRANS_SQUASH)
+               sv_catpv(tmpsv, ",SQUASH");
+           if (o->op_private & OPpTRANS_DELETE)
+               sv_catpv(tmpsv, ",DELETE");
+           if (o->op_private & OPpTRANS_COMPLEMENT)
+               sv_catpv(tmpsv, ",COMPLEMENT");
        }
-       if (cmd->c_expr) {
-           dump("C_EXPR = ");
-           dump_arg(cmd->c_expr);
-       } else
-           dump("C_EXPR = NULL\n");
-       switch (cmd->c_type) {
-       case C_NEXT:
-       case C_WHILE:
-       case C_BLOCK:
-       case C_ELSE:
-       case C_IF:
-           if (cmd->ucmd.ccmd.cc_true) {
-               dump("CC_TRUE = ");
-               dump_cmd(cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt);
+       else if (o->op_type == OP_REPEAT) {
+           if (o->op_private & OPpREPEAT_DOLIST)
+               sv_catpv(tmpsv, ",DOLIST");
+       }
+       else if (o->op_type == OP_ENTERSUB ||
+                o->op_type == OP_RV2SV ||
+                o->op_type == OP_RV2AV ||
+                o->op_type == OP_RV2HV ||
+                o->op_type == OP_RV2GV ||
+                o->op_type == OP_AELEM ||
+                o->op_type == OP_HELEM )
+       {
+           if (o->op_type == OP_ENTERSUB) {
+               if (o->op_private & OPpENTERSUB_AMPER)
+                   sv_catpv(tmpsv, ",AMPER");
+               if (o->op_private & OPpENTERSUB_DB)
+                   sv_catpv(tmpsv, ",DB");
            }
-           else
-               dump("CC_TRUE = NULL\n");
-           if (cmd->c_type == C_IF && cmd->ucmd.ccmd.cc_alt) {
-               dump("CC_ENDELSE = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
+           switch (o->op_private & OPpDEREF) {
+           case OPpDEREF_SV:
+               sv_catpv(tmpsv, ",SV");
+               break;
+           case OPpDEREF_AV:
+               sv_catpv(tmpsv, ",AV");
+               break;
+           case OPpDEREF_HV:
+               sv_catpv(tmpsv, ",HV");
+               break;
            }
-           else if (cmd->c_type == C_NEXT && cmd->ucmd.ccmd.cc_alt) {
-               dump("CC_NEXT = 0x%lx\n",cmd->ucmd.ccmd.cc_alt);
+           if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
+               if (o->op_private & OPpLVAL_DEFER)
+                   sv_catpv(tmpsv, ",LVAL_DEFER");
            }
-           else
-               dump("CC_ALT = NULL\n");
-           break;
-       case C_EXPR:
-           if (cmd->ucmd.acmd.ac_stab) {
-               dump("AC_STAB = ");
-               dump_stab(cmd->ucmd.acmd.ac_stab);
-           } else
-               dump("AC_STAB = NULL\n");
-           if (cmd->ucmd.acmd.ac_expr) {
-               dump("AC_EXPR = ");
-               dump_arg(cmd->ucmd.acmd.ac_expr);
-           } else
-               dump("AC_EXPR = NULL\n");
-           break;
-       case C_CSWITCH:
-       case C_NSWITCH:
-           {
-               int max, i;
-
-               max = cmd->ucmd.scmd.sc_max;
-               dump("SC_MIN = (%d)\n",cmd->ucmd.scmd.sc_offset + 1);
-               dump("SC_MAX = (%d)\n", max + cmd->ucmd.scmd.sc_offset - 1);
-               dump("SC_NEXT[LT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[0]);
-               for (i = 1; i < max; i++)
-                   dump("SC_NEXT[%d] = 0x%lx\n", i + cmd->ucmd.scmd.sc_offset,
-                     cmd->ucmd.scmd.sc_next[i]);
-               dump("SC_NEXT[GT] = 0x%lx\n", cmd->ucmd.scmd.sc_next[max]);
+           else {
+               if (o->op_private & HINT_STRICT_REFS)
+                   sv_catpv(tmpsv, ",STRICT_REFS");
            }
-           break;
        }
-       cmd = cmd->c_next;
-       if (cmd && cmd->c_head == cmd) {        /* reached end of while loop */
-           dump("C_NEXT = HEAD\n");
-           dumplvl--;
-           dump("}\n");
-           break;
+       else if (o->op_type == OP_CONST) {
+           if (o->op_private & OPpCONST_BARE)
+               sv_catpv(tmpsv, ",BARE");
        }
-       dumplvl--;
-       dump("}\n");
-       if (cmd)
-           if (cmd == alt)
-               dump("CONT 0x%lx {\n",cmd);
-           else
-               dump("{\n");
-    }
-}
-
-dump_arg(arg)
-register ARG *arg;
-{
-    register int i;
-
-    fprintf(stderr,"{\n");
-    dumplvl++;
-    dump("OP_TYPE = %s\n",opname[arg->arg_type]);
-    dump("OP_LEN = %d\n",arg->arg_len);
-    if (arg->arg_flags) {
-       dump_flags(buf,arg->arg_flags);
-       dump("OP_FLAGS = (%s)\n",buf);
-    }
-    for (i = 1; i <= arg->arg_len; i++) {
-       dump("[%d]ARG_TYPE = %s%s\n",i,argname[arg[i].arg_type & A_MASK],
-           arg[i].arg_type & A_DONT ? " (unevaluated)" : "");
-       if (arg[i].arg_len)
-           dump("[%d]ARG_LEN = %d\n",i,arg[i].arg_len);
-       if (arg[i].arg_flags) {
-           dump_flags(buf,arg[i].arg_flags);
-           dump("[%d]ARG_FLAGS = (%s)\n",i,buf);
+       else if (o->op_type == OP_FLIP) {
+           if (o->op_private & OPpFLIP_LINENUM)
+               sv_catpv(tmpsv, ",LINENUM");
        }
-       switch (arg[i].arg_type & A_MASK) {
-       case A_NULL:
-           if (arg->arg_type == O_TRANS) {
-               short *tbl = (short*)arg[2].arg_ptr.arg_cval;
-               int i;
+       else if (o->op_type == OP_FLOP) {
+           if (o->op_private & OPpFLIP_LINENUM)
+               sv_catpv(tmpsv, ",LINENUM");
+       }
+       if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
+           sv_catpv(tmpsv, ",INTRO");
+       if (SvCUR(tmpsv))
+           dump("PRIVATE = (%s)\n", SvPVX(tmpsv) + 1);
+       SvREFCNT_dec(tmpsv);
+    }
 
-               for (i = 0; i < 256; i++) {
-                   if (tbl[i] >= 0)
-                       dump("   %d -> %d\n", i, tbl[i]);
-                   else if (tbl[i] == -2)
-                       dump("   %d -> DELETE\n", i);
-               }
-           }
-           break;
-       case A_LEXPR:
-       case A_EXPR:
-           dump("[%d]ARG_ARG = ",i);
-           dump_arg(arg[i].arg_ptr.arg_arg);
-           break;
-       case A_CMD:
-           dump("[%d]ARG_CMD = ",i);
-           dump_cmd(arg[i].arg_ptr.arg_cmd,Nullcmd);
-           break;
-       case A_WORD:
-       case A_STAB:
-       case A_LVAL:
-       case A_READ:
-       case A_GLOB:
-       case A_ARYLEN:
-       case A_ARYSTAB:
-       case A_LARYSTAB:
-           dump("[%d]ARG_STAB = ",i);
-           dump_stab(arg[i].arg_ptr.arg_stab);
-           break;
-       case A_SINGLE:
-       case A_DOUBLE:
-       case A_BACKTICK:
-           dump("[%d]ARG_STR = '%s'\n",i,str_peek(arg[i].arg_ptr.arg_str));
-           break;
-       case A_SPAT:
-           dump("[%d]ARG_SPAT = ",i);
-           dump_spat(arg[i].arg_ptr.arg_spat);
-           break;
+    switch (o->op_type) {
+    case OP_GVSV:
+    case OP_GV:
+       if (cGVOPo->op_gv) {
+           SV *tmpsv = NEWSV(0,0);
+           ENTER;
+           SAVEFREESV(tmpsv);
+           gv_fullname3(tmpsv, cGVOPo->op_gv, Nullch);
+           dump("GV = %s\n", SvPV(tmpsv, PL_na));
+           LEAVE;
        }
+       else
+           dump("GV = NULL\n");
+       break;
+    case OP_CONST:
+       dump("SV = %s\n", SvPEEK(cSVOPo->op_sv));
+       break;
+    case OP_NEXTSTATE:
+    case OP_DBSTATE:
+       if (cCOPo->cop_line)
+           dump("LINE = %d\n",cCOPo->cop_line);
+       if (cCOPo->cop_label)
+           dump("LABEL = \"%s\"\n",cCOPo->cop_label);
+       break;
+    case OP_ENTERLOOP:
+       dump("REDO ===> ");
+       if (cLOOPo->op_redoop)
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOOPo->op_redoop->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "DONE\n");
+       dump("NEXT ===> ");
+       if (cLOOPo->op_nextop)
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOOPo->op_nextop->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "DONE\n");
+       dump("LAST ===> ");
+       if (cLOOPo->op_lastop)
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOOPo->op_lastop->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "DONE\n");
+       break;
+    case OP_COND_EXPR:
+       dump("TRUE ===> ");
+       if (cCONDOPo->op_true)
+           PerlIO_printf(Perl_debug_log, "%d\n", cCONDOPo->op_true->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "DONE\n");
+       dump("FALSE ===> ");
+       if (cCONDOPo->op_false)
+           PerlIO_printf(Perl_debug_log, "%d\n", cCONDOPo->op_false->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "DONE\n");
+       break;
+    case OP_MAPWHILE:
+    case OP_GREPWHILE:
+    case OP_OR:
+    case OP_AND:
+       dump("OTHER ===> ");
+       if (cLOGOPo->op_other)
+           PerlIO_printf(Perl_debug_log, "%d\n", cLOGOPo->op_other->op_seq);
+       else
+           PerlIO_printf(Perl_debug_log, "DONE\n");
+       break;
+    case OP_PUSHRE:
+    case OP_MATCH:
+    case OP_QR:
+    case OP_SUBST:
+       dump_pm(cPMOPo);
+       break;
+    default:
+       break;
+    }
+    if (o->op_flags & OPf_KIDS) {
+       OP *kid;
+       for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
+           dump_op(kid);
     }
-    dumplvl--;
+    PL_dumplvl--;
     dump("}\n");
+#endif /* DEBUGGING */
 }
 
-dump_flags(b,flags)
-char *b;
-unsigned int flags;
-{
-    *b = '\0';
-    if (flags & AF_ARYOK)
-       (void)strcat(b,"ARYOK,");
-    if (flags & AF_POST)
-       (void)strcat(b,"POST,");
-    if (flags & AF_PRE)
-       (void)strcat(b,"PRE,");
-    if (flags & AF_UP)
-       (void)strcat(b,"UP,");
-    if (flags & AF_COMMON)
-       (void)strcat(b,"COMMON,");
-    if (flags & AF_DEPR)
-       (void)strcat(b,"DEPR,");
-    if (flags & AF_LISTISH)
-       (void)strcat(b,"LISTISH,");
-    if (flags & AF_LOCAL)
-       (void)strcat(b,"LOCAL,");
-    if (*b)
-       b[strlen(b)-1] = '\0';
-}
-
-dump_stab(stab)
-register STAB *stab;
+void
+dump_gv(GV *gv)
 {
-    STR *str;
+#ifdef DEBUGGING
+    SV *sv;
 
-    if (!stab) {
-       fprintf(stderr,"{}\n");
+    if (!gv) {
+       PerlIO_printf(Perl_debug_log, "{}\n");
        return;
     }
-    str = str_mortal(&str_undef);
-    dumplvl++;
-    fprintf(stderr,"{\n");
-    stab_fullname(str,stab);
-    dump("STAB_NAME = %s\n", str->str_ptr);
-    dumplvl--;
+    sv = sv_newmortal();
+    PL_dumplvl++;
+    PerlIO_printf(Perl_debug_log, "{\n");
+    gv_fullname3(sv, gv, Nullch);
+    dump("GV_NAME = %s", SvPVX(sv));
+    if (gv != GvEGV(gv)) {
+       gv_efullname3(sv, GvEGV(gv), Nullch);
+       dump("-> %s", SvPVX(sv));
+    }
+    dump("\n");
+    PL_dumplvl--;
     dump("}\n");
+#endif /* DEBUGGING */
 }
 
-dump_spat(spat)
-register SPAT *spat;
+void
+dump_pm(PMOP *pm)
 {
+#ifdef DEBUGGING
     char ch;
 
-    if (!spat) {
-       fprintf(stderr,"{}\n");
+    if (!pm) {
+       dump("{}\n");
        return;
     }
-    fprintf(stderr,"{\n");
-    dumplvl++;
-    if (spat->spat_runtime) {
-       dump("SPAT_RUNTIME = ");
-       dump_arg(spat->spat_runtime);
-    } else {
-       if (spat->spat_flags & SPAT_ONCE)
-           ch = '?';
-       else
-           ch = '/';
-       dump("SPAT_PRE %c%s%c\n",ch,spat->spat_regexp->precomp,ch);
-    }
-    if (spat->spat_repl) {
-       dump("SPAT_REPL = ");
-       dump_arg(spat->spat_repl);
+    dump("{\n");
+    PL_dumplvl++;
+    if (pm->op_pmflags & PMf_ONCE)
+       ch = '?';
+    else
+       ch = '/';
+    if (pm->op_pmregexp)
+       dump("PMf_PRE %c%s%c%s\n",
+            ch, pm->op_pmregexp->precomp, ch,
+            (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
+    else
+       dump("PMf_PRE (RUNTIME)\n");
+    if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
+       dump("PMf_REPL = ");
+       dump_op(pm->op_pmreplroot);
     }
-    if (spat->spat_short) {
-       dump("SPAT_SHORT = \"%s\"\n",str_peek(spat->spat_short));
+    if (pm->op_pmflags || (pm->op_pmregexp && pm->op_pmregexp->check_substr)) {
+       SV *tmpsv = newSVpv("", 0);
+       if (pm->op_pmdynflags & PMdf_USED)
+           sv_catpv(tmpsv, ",USED");
+       if (pm->op_pmdynflags & PMdf_TAINTED)
+           sv_catpv(tmpsv, ",TAINTED");
+       if (pm->op_pmflags & PMf_ONCE)
+           sv_catpv(tmpsv, ",ONCE");
+       if (pm->op_pmregexp && pm->op_pmregexp->check_substr
+           && !(pm->op_pmregexp->reganch & ROPT_NOSCAN))
+           sv_catpv(tmpsv, ",SCANFIRST");
+       if (pm->op_pmregexp && pm->op_pmregexp->check_substr
+           && pm->op_pmregexp->reganch & ROPT_CHECK_ALL)
+           sv_catpv(tmpsv, ",ALL");
+       if (pm->op_pmflags & PMf_SKIPWHITE)
+           sv_catpv(tmpsv, ",SKIPWHITE");
+       if (pm->op_pmflags & PMf_CONST)
+           sv_catpv(tmpsv, ",CONST");
+       if (pm->op_pmflags & PMf_KEEP)
+           sv_catpv(tmpsv, ",KEEP");
+       if (pm->op_pmflags & PMf_GLOBAL)
+           sv_catpv(tmpsv, ",GLOBAL");
+       if (pm->op_pmflags & PMf_CONTINUE)
+           sv_catpv(tmpsv, ",CONTINUE");
+       if (pm->op_pmflags & PMf_RETAINT)
+           sv_catpv(tmpsv, ",RETAINT");
+       if (pm->op_pmflags & PMf_EVAL)
+           sv_catpv(tmpsv, ",EVAL");
+       dump("PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
+       SvREFCNT_dec(tmpsv);
     }
-    dumplvl--;
+
+    PL_dumplvl--;
     dump("}\n");
+#endif /* DEBUGGING */
 }
 
-/* VARARGS1 */
-dump(arg1,arg2,arg3,arg4,arg5)
-char *arg1;
-long arg2, arg3, arg4, arg5;
-{
-    int i;
-
-    for (i = dumplvl*4; i; i--)
-       (void)putc(' ',stderr);
-    fprintf(stderr,arg1, arg2, arg3, arg4, arg5);
-}
-#endif
 
-#ifdef DEBUG
-char *
-showinput()
+STATIC void
+dump(char *pat,...)
 {
-    register char *s = str_get(linestr);
-    int fd;
-    static char cmd[] =
-      {05,030,05,03,040,03,022,031,020,024,040,04,017,016,024,01,023,013,040,
-       074,057,024,015,020,057,056,006,017,017,0};
+#ifdef DEBUGGING
+    I32 i;
+    va_list args;
 
-    if (rsfp != stdin || strnEQ(s,"#!",2))
-       return s;
-    for (; *s; s++) {
-       if (*s & 0200) {
-           fd = creat("/tmp/.foo",0600);
-           write(fd,str_get(linestr),linestr->str_cur);
-           while(s = str_gets(linestr,rsfp,0)) {
-               write(fd,s,linestr->str_cur);
-           }
-           (void)close(fd);
-           for (s=cmd; *s; s++)
-               if (*s < ' ')
-                   *s += 96;
-           rsfp = mypopen(cmd,"r");
-           s = str_gets(linestr,rsfp,0);
-           return s;
-       }
-    }
-    return str_get(linestr);
+    va_start(args, pat);
+    for (i = PL_dumplvl*4; i; i--)
+       (void)PerlIO_putc(Perl_debug_log,' ');
+    PerlIO_vprintf(Perl_debug_log,pat,args);
+    va_end(args);
+#endif /* DEBUGGING */
 }
-#endif