Remove MAD.
authorJarkko Hietaniemi <jhi@iki.fi>
Fri, 13 Jun 2014 19:21:25 +0000 (15:21 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Fri, 13 Jun 2014 19:41:55 +0000 (15:41 -0400)
MAD = Misc Attribute Decoration; unmaintained attempt at preserving
the Perl parse tree more faithfully so that automatic conversion to
Perl 6 would have been easier.

46 files changed:
Configure
Cross/Makefile-cross-SH
Cross/cflags-cross-arm
MANIFEST
Makefile.SH
Porting/Glossary
Porting/config.sh
Porting/config_H
config_h.SH
dump.c
embed.fnc
embed.h
embedvar.h
ext/Devel-Peek/Peek.xs
intrpvar.h
locale.c
mad/Nomad.pm [deleted file]
mad/P5AST.pm [deleted file]
mad/P5re.pm [deleted file]
mad/PLXML.pm [deleted file]
mad/p55 [deleted file]
mad/t/p55.t [deleted file]
madly.c [deleted file]
makedef.pl
op.c
op.h
pad.c
pad.h
parser.h
perl.c
perl.h
perly.act
perly.c
perly.h
perly.tab
perly.y
pp_ctl.c
proto.h
regen_perly.pl
sv.c
t/run/mad.t [deleted file]
toke.c
uconfig.h
uconfig.sh
win32/config_H.gc
win32/config_H.vc

index c84249f..4e6315d 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1042,10 +1042,6 @@ sPRIgldbl=''
 sSCNfldbl=''
 lseeksize=''
 lseektype=''
-mad=''
-madlyh=''
-madlyobj=''
-madlysrc=''
 make_set_make=''
 d_mymalloc=''
 freetype=''
@@ -20338,40 +20334,6 @@ EOM
 *)  groupstype="$gidtype";;
 esac
 
-: MAD = Misc Attribute Definition
-
-if $test $patchlevel -lt 9; then
-: MAD is not available in 5.8.x or earlier.
-    ans=n;
-else
-    case "$mad" in
-    $define|true|[yY]*)        dflt='y' ;;
-    *)                 dflt='n' ;;
-    esac
-    cat <<EOM
-
-Would you like to build with Misc Attribute Decoration? This is development
-work leading to a Perl 5 to Perl 6 convertor, which imposes a space and speed
-overhead on the interpreter.
-
-If this doesn't make any sense to you, just accept the default '$dflt'.
-EOM
-    rp='Build Perl with MAD?'
-    . ./myread
-fi
-case "$ans" in
-y|Y)   val="$define"
-       madlyh='madly.h madly.act madly.tab'
-       madlysrc='madly.c'
-       madlyobj="madly$_o" ;;
-*)     val="$undef"
-       madlyh=''
-       madlysrc=''
-       madlyobj='' ;;
-esac
-set mad
-eval $setvar
-
 : check whether make sets MAKE
 echo " "
 echo "Checking if your $make program sets \$(MAKE)..." >&4
@@ -23746,10 +23708,6 @@ lpr='$lpr'
 ls='$ls'
 lseeksize='$lseeksize'
 lseektype='$lseektype'
-mad='$mad'
-madlyh='$madlyh'
-madlyobj='$madlyobj'
-madlysrc='$madlysrc'
 mail='$mail'
 mailx='$mailx'
 make='$make'
index 13945ce..eb673ce 100644 (file)
@@ -196,8 +196,6 @@ CLDFLAGS = $ldflags
 
 mallocsrc = $mallocsrc
 mallocobj = $mallocobj
-madlysrc = $madlysrc
-madlyobj = $madlyobj
 LNS = $lns
 # NOTE: some systems don't grok "cp -f". XXX Configure test needed?
 CPS = $cp
@@ -351,11 +349,11 @@ c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro.c perl.c
 c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
 c3 = taint.c toke.c util.c deb.c run.c universal.c pad.c globals.c keywords.c
 c4 = perlio.c perlapi.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c
-c5 = $(madlysrc) $(mallocsrc)
+c5 = $(mallocsrc)
 
 c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c perlmain.c opmini.c
 
-obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT)
+obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) perl$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
 obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
 
index acec8cc..8ee55a5 100644 (file)
@@ -78,7 +78,6 @@ for file do
     gv) ;;
     hv) ;;
     locale) ;;
-    madly) ;;
     main) ;;
     malloc) ;;
     mg) ;;
index 487e350..7ba8ccd 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -4235,13 +4235,6 @@ lib/warnings.pm                  For "use warnings"
 lib/warnings/register.pm       For "use warnings::register"
 lib/warnings.t                 See if warning controls work
 locale.c                       locale-specific utility functions
-madly.c                                parser code for MAD build
-mad/Nomad.pm                   Converts MAD XML dump to Perl 5
-mad/p55                                Perl 5 to Perl 5 translator - driver for nomad
-mad/P5AST.pm                   Used by nomad
-mad/P5re.pm                    Used by nomad
-mad/PLXML.pm                   Used by nomad
-mad/t/p55.t                    Test for the Perl 5 to Perl 5 translator
 makedef.pl                     Create symbol export lists for linking
 makedepend.SH                  Precursor to makedepend
 make_ext.pl                    Used by Makefile to execute extension Makefiles
@@ -5305,7 +5298,6 @@ t/run/flib/t2.pm          Test for .pmcs with -I/dir/
 t/run/flib/t2.pmc              Test for .pmcs with -I/dir/
 t/run/fresh_perl.t             Tests that require a fresh perl.
 t/run/locale.t         Tests related to locale handling
-t/run/mad.t                    Test vs MAD environment
 t/run/noswitch.t               Test aliasing ARGV for other switch tests
 t/run/runenv.t                 Test if perl honors its environment variables.
 t/run/script.t                 See if script invocation works
index 8c6221a..8438c4b 100755 (executable)
@@ -248,8 +248,6 @@ CLDFLAGS = $ldflags
 
 mallocsrc = $mallocsrc
 mallocobj = $mallocobj
-madlysrc = $madlysrc
-madlyobj = $madlyobj
 LNS = $lns
 # NOTE: some systems don't grok "cp -f". XXX Configure test needed?
 CPS = $cp
@@ -476,13 +474,13 @@ c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro.c perl.c
 c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
 c3 = taint.c toke.c util.c deb.c run.c universal.c pad.c globals.c keywords.c
 c4 = perlio.c perlapi.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c caretx.c
-c5 = $(madlysrc) $(mallocsrc)
+c5 = $(mallocsrc)
 
 c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c opmini.c perlmini.c
 
 obj0 = op$(OBJ_EXT) perl$(OBJ_EXT)
 obj0mini = perlmini$(OBJ_EXT) opmini$(OBJ_EXT) miniperlmain$(OBJ_EXT)
-obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT) keywords$(OBJ_EXT)
+obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT) keywords$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
 obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT)
 
index 9128f5f..c58fb52 100644 (file)
@@ -3830,22 +3830,6 @@ lseektype (lseektype.U):
        or whatever type is used to declare lseek offset's type in the
        kernel (which also appears to be lseek's return type).
 
-mad (mad.U):
-       This variable indicates that the Misc Attribute Definition code is to
-       be compiled.
-
-madlyh (mad.U):
-       If the Misc Attribute Decoration is to be compiled, this variable is
-       set to the name of the extra header files to be used, else it is ''
-
-madlyobj (mad.U):
-       If the Misc Attribute Decoration is to be compiled, this variable is
-       set to the name of the extra object files to be used, else it is ''
-
-madlysrc (mad.U):
-       If the Misc Attribute Decoration is to be compiled, this variable is
-       set to the name of the extra C source files to be used, else it is ''
-
 mail (Loc.U):
        This variable is defined but not used by Configure.
        The value is the empty string and is not useful.
index 372acb5..0a352e1 100644 (file)
@@ -822,9 +822,6 @@ ls='ls'
 lseeksize='8'
 lseektype='off_t'
 mad='undef'
-madlyh=''
-madlyobj=''
-madlysrc=''
 mail=''
 mailx=''
 make='make'
index 6c1f125..9e99b54 100644 (file)
 #define PERL_PRIeldbl  "Le"    /**/
 #define PERL_SCNfldbl  "Lf"    /**/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-/*#define      PERL_MAD                / **/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format
index c320df3..db150a6 100755 (executable)
@@ -4425,12 +4425,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$d_PRIeldbl PERL_PRIeldbl     $sPRIeldbl      /**/
 #$d_SCNfldbl PERL_SCNfldbl     $sSCNfldbl      /**/
 
-/* PERL_MAD:
- *     This symbol, if defined, indicates that the Misc Attribution
- *     Declaration code should be conditionally compiled.
- */
-#$mad  PERL_MAD                /**/
-
 /* NEED_VA_COPY:
  *     This symbol, if defined, indicates that the system stores
  *     the variable argument list datatype, va_list, in a format
diff --git a/dump.c b/dump.c
index 6bc0211..9bbbe2d 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -884,7 +884,7 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
     return FALSE;
 }
 
-#define DUMP_OP_FLAGS(o,xml,level,file)                                 \
+#define DUMP_OP_FLAGS(o,level,file)                                 \
     if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) { \
         SV * const tmpsv = newSVpvs("");                                \
         switch (o->op_flags & OPf_WANT) {                               \
@@ -906,22 +906,11 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
         if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");              \
         if (o->op_static)   sv_catpvs(tmpsv, ",STATIC");                \
         if (o->op_folded)   sv_catpvs(tmpsv, ",FOLDED");                \
-        if (!xml)                                                        \
-            Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",       \
-                            SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");\
-        else                                                            \
-            PerlIO_printf(file, " flags=\"%s\"",                        \
-                          SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");        \
+        Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",           \
+                         SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");   \
     }
 
-#if !defined(PERL_MAD)
-# define xmldump_attr1(level, file, pat, arg)
-#else
-# define xmldump_attr1(level, file, pat, arg) \
-       S_xmldump_attr(aTHX_ level, file, pat, arg)
-#endif
-
-#define DUMP_OP_PRIVATE(o,xml,level,file)                               \
+#define DUMP_OP_PRIVATE(o,level,file)                                   \
     if (o->op_private) {                                                \
         U32 optype = o->op_type;                                        \
         U32 oppriv = o->op_private;                                     \
@@ -1003,11 +992,8 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
            && oppriv & OPpSLICEWARNING  )                               \
             sv_catpvs(tmpsv, ",SLICEWARNING");                          \
        if (SvCUR(tmpsv)) {                                             \
-            if (xml)                                                    \
-                xmldump_attr1(level+1, file, "private=\"%s\"", SvPVX(tmpsv)+1); \
-            else                                                        \
-                Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1); \
-       } else if (!xml)                                                \
+            Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1); \
+       } else                                                          \
             Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n", \
                              (UV)oppriv);                               \
     }
@@ -1073,49 +1059,9 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
     Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
 #endif
 
-    DUMP_OP_FLAGS(o,0,level,file);
-    DUMP_OP_PRIVATE(o,0,level,file);
-
-#ifdef PERL_MAD
-    if (PL_madskills && o->op_madprop) {
-       SV * const tmpsv = newSVpvs("");
-       MADPROP* mp = o->op_madprop;
-       Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
-       level++;
-       while (mp) {
-           const char tmp = mp->mad_key;
-           sv_setpvs(tmpsv,"'");
-           if (tmp)
-               sv_catpvn(tmpsv, &tmp, 1);
-           sv_catpv(tmpsv, "'=");
-           switch (mp->mad_type) {
-           case MAD_NULL:
-               sv_catpv(tmpsv, "NULL");
-               Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-               break;
-           case MAD_PV:
-               sv_catpv(tmpsv, "<");
-               sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
-               sv_catpv(tmpsv, ">");
-               Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-               break;
-           case MAD_OP:
-               if ((OP*)mp->mad_val) {
-                   Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-                   do_op_dump(level, file, (OP*)mp->mad_val);
-               }
-               break;
-           default:
-               sv_catpv(tmpsv, "(UNK)");
-               Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
-               break;
-           }
-           mp = mp->mad_next;
-       }
-       level--;
-       Perl_dump_indent(aTHX_ level, file, "}\n");
-    }
-#endif
+    DUMP_OP_FLAGS(o,level,file);
+    DUMP_OP_PRIVATE(o,level,file);
+
 
     switch (optype) {
     case OP_AELEMFAST:
@@ -1130,11 +1076,6 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
       const char * name;
       SV * const tmpsv  = newSVpvs_flags("", SVs_TEMP);
       SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
-#ifdef PERL_MAD
-               /* FIXME - is this making unwarranted assumptions about the
-                  UTF-8 cleanliness of the dump file handle?  */
-               SvUTF8_on(tmpsv);
-#endif
                gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
       name = SvPV_const(tmpsv, len);
                Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
@@ -2461,11 +2402,6 @@ Perl_debop(pTHX_ const OP *o)
     case OP_GV:
        if (cGVOPo_gv) {
            SV * const sv = newSV(0);
-#ifdef PERL_MAD
-           /* FIXME - is this making unwarranted assumptions about the
-              UTF-8 cleanliness of the dump file handle?  */
-           SvUTF8_on(sv);
-#endif
            gv_fullname3(sv, cGVOPo_gv, NULL);
            PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
            SvREFCNT_dec_NN(sv);
@@ -2578,697 +2514,6 @@ Perl_debprofdump(pTHX)
     }
 }
 
-#ifdef PERL_MAD
-/*
- *    XML variants of most of the above routines
- */
-
-STATIC void
-S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-{
-    va_list args;
-
-    PERL_ARGS_ASSERT_XMLDUMP_ATTR;
-
-    PerlIO_printf(file, "\n    ");
-    va_start(args, pat);
-    xmldump_vindent(level, file, pat, &args);
-    va_end(args);
-}
-
-
-void
-Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
-{
-    va_list args;
-    PERL_ARGS_ASSERT_XMLDUMP_INDENT;
-    va_start(args, pat);
-    xmldump_vindent(level, file, pat, &args);
-    va_end(args);
-}
-
-void
-Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
-{
-    PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
-
-    PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
-    PerlIO_vprintf(file, pat, *args);
-}
-
-void
-Perl_xmldump_all(pTHX)
-{
-    xmldump_all_perl(FALSE);
-}
-
-void
-Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
-{
-    PerlIO_setlinebuf(PL_xmlfp);
-    if (PL_main_root)
-       op_xmldump(PL_main_root);
-    /* someday we might call this, when it outputs XML: */
-    /* xmldump_packsubs_perl(PL_defstash, justperl); */
-    if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
-       PerlIO_close(PL_xmlfp);
-    PL_xmlfp = 0;
-}
-
-void
-Perl_xmldump_packsubs(pTHX_ const HV *stash)
-{
-    PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
-    xmldump_packsubs_perl(stash, FALSE);
-}
-
-void
-Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
-{
-    I32        i;
-    HE *entry;
-
-    PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
-
-    if (!HvARRAY(stash))
-       return;
-    for (i = 0; i <= (I32) HvMAX(stash); i++) {
-       for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
-           GV *gv = MUTABLE_GV(HeVAL(entry));
-           HV *hv;
-           if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
-               continue;
-           if (GvCVu(gv))
-               xmldump_sub_perl(gv, justperl);
-           if (GvFORM(gv))
-               xmldump_form(gv);
-           if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
-               && (hv = GvHV(gv)) && hv != PL_defstash)
-               xmldump_packsubs_perl(hv, justperl);    /* nested package */
-       }
-    }
-}
-
-void
-Perl_xmldump_sub(pTHX_ const GV *gv)
-{
-    PERL_ARGS_ASSERT_XMLDUMP_SUB;
-    xmldump_sub_perl(gv, FALSE);
-}
-
-void
-Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
-{
-    SV * sv;
-
-    PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
-
-    if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
-       return;
-
-    sv = sv_newmortal();
-    gv_fullname3(sv, gv, NULL);
-    Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
-    if (CvXSUB(GvCV(gv)))
-       Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
-           PTR2UV(CvXSUB(GvCV(gv))),
-           (int)CvXSUBANY(GvCV(gv)).any_i32);
-    else if (CvROOT(GvCV(gv)))
-       op_xmldump(CvROOT(GvCV(gv)));
-    else
-       Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
-}
-
-void
-Perl_xmldump_form(pTHX_ const GV *gv)
-{
-    SV * const sv = sv_newmortal();
-
-    PERL_ARGS_ASSERT_XMLDUMP_FORM;
-
-    gv_fullname3(sv, gv, NULL);
-    Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
-    if (CvROOT(GvFORM(gv)))
-       op_xmldump(CvROOT(GvFORM(gv)));
-    else
-       Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
-}
-
-void
-Perl_xmldump_eval(pTHX)
-{
-    op_xmldump(PL_eval_root);
-}
-
-char *
-Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
-{
-    PERL_ARGS_ASSERT_SV_CATXMLSV;
-    return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
-}
-
-char *
-Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
-{
-    PERL_ARGS_ASSERT_SV_CATXMLPV;
-    return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
-}
-
-char *
-Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
-{
-    unsigned int c;
-    const char * const e = pv + len;
-    const char * const start = pv;
-    STRLEN dsvcur;
-    STRLEN cl;
-
-    PERL_ARGS_ASSERT_SV_CATXMLPVN;
-
-    sv_catpvs(dsv,"");
-    dsvcur = SvCUR(dsv);       /* in case we have to restart */
-
-  retry:
-    while (pv < e) {
-       if (utf8) {
-           c = utf8_to_uvchr_buf((U8*)pv, (U8*)e, &cl);
-           if (cl == 0) {
-               SvCUR(dsv) = dsvcur;
-               pv = start;
-               utf8 = 0;
-               goto retry;
-           }
-       }
-       else
-           c = (*pv & 255);
-
-        if (isCNTRL_L1(c)
-            && c != '\t'
-            && c != '\n'
-            && c != '\r'
-            && c != LATIN1_TO_NATIVE(0x85))
-        {
-           Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
-        }
-        else switch (c) {
-       case '<':
-           sv_catpvs(dsv, "&lt;");
-           break;
-       case '>':
-           sv_catpvs(dsv, "&gt;");
-           break;
-       case '&':
-           sv_catpvs(dsv, "&amp;");
-           break;
-       case '"':
-           sv_catpvs(dsv, "&#34;");
-           break;
-       default:
-           if (c < 0xD800) {
-               if (! isPRINT(c)) {
-                   Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
-               }
-               else {
-                   const char string = (char) c;
-                   sv_catpvn(dsv, &string, 1);
-               }
-               break;
-           }
-           if ((c >= 0xD800 && c <= 0xDB7F) ||
-               (c >= 0xDC00 && c <= 0xDFFF) ||
-               (c >= 0xFFF0 && c <= 0xFFFF) ||
-                c > 0x10ffff)
-               Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
-           else
-               Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
-       }
-
-       if (utf8)
-           pv += UTF8SKIP(pv);
-       else
-           pv++;
-    }
-
-    return SvPVX(dsv);
-}
-
-char *
-Perl_sv_xmlpeek(pTHX_ SV *sv)
-{
-    SV * const t = sv_newmortal();
-    STRLEN n_a;
-    int unref = 0;
-
-    PERL_ARGS_ASSERT_SV_XMLPEEK;
-
-    sv_utf8_upgrade(t);
-    sv_setpvs(t, "");
-    /* retry: */
-    if (!sv) {
-       sv_catpv(t, "VOID=\"\"");
-       goto finish;
-    }
-    else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
-       sv_catpv(t, "WILD=\"\"");
-       goto finish;
-    }
-    else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
-       if (sv == &PL_sv_undef) {
-           sv_catpv(t, "SV_UNDEF=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               SvREADONLY(sv))
-               goto finish;
-       }
-       else if (sv == &PL_sv_no) {
-           sv_catpv(t, "SV_NO=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
-                                 SVp_POK|SVp_NOK)) &&
-               SvCUR(sv) == 0 &&
-               SvNVX(sv) == 0.0)
-               goto finish;
-       }
-       else if (sv == &PL_sv_yes) {
-           sv_catpv(t, "SV_YES=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
-                                 SVp_POK|SVp_NOK)) &&
-               SvCUR(sv) == 1 &&
-               SvPVX(sv) && *SvPVX(sv) == '1' &&
-               SvNVX(sv) == 1.0)
-               goto finish;
-       }
-       else {
-           sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
-           if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
-                                SVs_GMG|SVs_SMG|SVs_RMG)) &&
-               SvREADONLY(sv))
-               goto finish;
-       }
-       sv_catpv(t, " XXX=\"\" ");
-    }
-    else if (SvREFCNT(sv) == 0) {
-       sv_catpv(t, " refcnt=\"0\"");
-       unref++;
-    }
-    else if (DEBUG_R_TEST_) {
-       int is_tmp = 0;
-       SSize_t ix;
-       /* is this SV on the tmps stack? */
-       for (ix=PL_tmps_ix; ix>=0; ix--) {
-           if (PL_tmps_stack[ix] == sv) {
-               is_tmp = 1;
-               break;
-           }
-       }
-       if (SvREFCNT(sv) > 1)
-           Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
-                   is_tmp ? "T" : "");
-       else if (is_tmp)
-           sv_catpv(t, " DRT=\"<T>\"");
-    }
-
-    if (SvROK(sv)) {
-       sv_catpv(t, " ROK=\"\"");
-    }
-    switch (SvTYPE(sv)) {
-    default:
-       sv_catpv(t, " FREED=\"1\"");
-       goto finish;
-
-    case SVt_NULL:
-       sv_catpv(t, " UNDEF=\"1\"");
-       goto finish;
-    case SVt_IV:
-       sv_catpv(t, " IV=\"");
-       break;
-    case SVt_NV:
-       sv_catpv(t, " NV=\"");
-       break;
-    case SVt_PV:
-       sv_catpv(t, " PV=\"");
-       break;
-    case SVt_PVIV:
-       sv_catpv(t, " PVIV=\"");
-       break;
-    case SVt_PVNV:
-       sv_catpv(t, " PVNV=\"");
-       break;
-    case SVt_PVMG:
-       sv_catpv(t, " PVMG=\"");
-       break;
-    case SVt_PVLV:
-       sv_catpv(t, " PVLV=\"");
-       break;
-    case SVt_PVAV:
-       sv_catpv(t, " AV=\"");
-       break;
-    case SVt_PVHV:
-       sv_catpv(t, " HV=\"");
-       break;
-    case SVt_PVCV:
-       if (CvGV(sv))
-           Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
-       else
-           sv_catpv(t, " CV=\"()\"");
-       goto finish;
-    case SVt_PVGV:
-       sv_catpv(t, " GV=\"");
-       break;
-    case SVt_INVLIST:
-       sv_catpv(t, " DUMMY=\"");
-       break;
-    case SVt_REGEXP:
-       sv_catpv(t, " REGEXP=\"");
-       break;
-    case SVt_PVFM:
-       sv_catpv(t, " FM=\"");
-       break;
-    case SVt_PVIO:
-       sv_catpv(t, " IO=\"");
-       break;
-    }
-
-    if (SvPOKp(sv)) {
-       if (SvPVX(sv)) {
-           sv_catxmlsv(t, sv);
-       }
-    }
-    else if (SvNOKp(sv)) {
-       STORE_NUMERIC_LOCAL_SET_STANDARD();
-       Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
-       RESTORE_NUMERIC_LOCAL();
-    }
-    else if (SvIOKp(sv)) {
-       if (SvIsUV(sv))
-           Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
-       else
-            Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
-    }
-    else
-       sv_catpv(t, "");
-    sv_catpv(t, "\"");
-
-  finish:
-    while (unref--)
-       sv_catpv(t, ")");
-    return SvPV(t, n_a);
-}
-
-void
-Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
-{
-    PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
-
-    if (!pm) {
-       Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
-       return;
-    }
-    Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
-    level++;
-    if (PM_GETRE(pm)) {
-       REGEXP *const r = PM_GETRE(pm);
-       SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
-       sv_catxmlsv(tmpsv, MUTABLE_SV(r));
-       Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
-            SvPVX(tmpsv));
-       SvREFCNT_dec_NN(tmpsv);
-       Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
-            (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
-    }
-    else
-       Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
-    if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
-       SV * const tmpsv = pm_description(pm);
-       Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
-       SvREFCNT_dec_NN(tmpsv);
-    }
-
-    level--;
-    if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
-       Perl_xmldump_indent(aTHX_ level, file, ">\n");
-       Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
-       do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
-       Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
-       Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
-    }
-    else
-       Perl_xmldump_indent(aTHX_ level, file, "/>\n");
-}
-
-void
-Perl_pmop_xmldump(pTHX_ const PMOP *pm)
-{
-    do_pmop_xmldump(0, PL_xmlfp, pm);
-}
-
-void
-Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
-{
-    UV      seq;
-    int     contents = 0;
-    const OPCODE optype = o->op_type;
-
-    PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
-
-    if (!o)
-       return;
-    seq = sequence_num(o);
-    Perl_xmldump_indent(aTHX_ level, file,
-       "<op_%s seq=\"%"UVuf" -> ",
-            OP_NAME(o),
-                     seq);
-    level++;
-    if (o->op_next)
-       PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
-                     sequence_num(o->op_next));
-    else
-       PerlIO_printf(file, "DONE\"");
-
-    if (o->op_targ) {
-       if (optype == OP_NULL)
-       {
-           PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
-           if (o->op_targ == OP_NEXTSTATE)
-           {
-               if (CopLINE(cCOPo))
-                   PerlIO_printf(file, " line=\"%"UVuf"\"",
-                                    (UV)CopLINE(cCOPo));
-               if (CopSTASHPV(cCOPo))
-                   PerlIO_printf(file, " package=\"%s\"",
-                                    CopSTASHPV(cCOPo));
-               if (CopLABEL(cCOPo))
-                   PerlIO_printf(file, " label=\"%s\"",
-                                    CopLABEL(cCOPo));
-           }
-       }
-       else
-           PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
-    }
-#ifdef DUMPADDR
-    PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
-#endif
-
-    DUMP_OP_FLAGS(o,1,0,file);
-    DUMP_OP_PRIVATE(o,1,0,file);
-
-    switch (optype) {
-    case OP_AELEMFAST:
-       if (o->op_flags & OPf_SPECIAL) {
-           break;
-       }
-    case OP_GVSV:
-    case OP_GV:
-#ifdef USE_ITHREADS
-       S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
-#else
-       if (cSVOPo->op_sv) {
-           SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
-           SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
-           char *s;
-           STRLEN len;
-           ENTER;
-           SAVEFREESV(tmpsv1);
-           SAVEFREESV(tmpsv2);
-           gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
-           s = SvPV(tmpsv1,len);
-           sv_catxmlpvn(tmpsv2, s, len, 1);
-           S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
-           LEAVE;
-       }
-       else
-           S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
-#endif
-       break;
-    case OP_CONST:
-    case OP_HINTSEVAL:
-    case OP_METHOD_NAMED:
-#ifndef USE_ITHREADS
-       /* with ITHREADS, consts are stored in the pad, and the right pad
-        * may not be active here, so skip */
-       S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
-#endif
-       break;
-    case OP_ANONCODE:
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
-       break;
-    case OP_NEXTSTATE:
-    case OP_DBSTATE:
-       if (CopLINE(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
-                            (UV)CopLINE(cCOPo));
-       if (CopSTASHPV(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
-                            CopSTASHPV(cCOPo));
-       if (CopLABEL(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
-                            CopLABEL(cCOPo));
-       break;
-    case OP_ENTERLOOP:
-       S_xmldump_attr(aTHX_ level, file, "redo=\"");
-       if (cLOOPo->op_redoop)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
-       else
-           PerlIO_printf(file, "DONE\"");
-       S_xmldump_attr(aTHX_ level, file, "next=\"");
-       if (cLOOPo->op_nextop)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
-       else
-           PerlIO_printf(file, "DONE\"");
-       S_xmldump_attr(aTHX_ level, file, "last=\"");
-       if (cLOOPo->op_lastop)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
-       else
-           PerlIO_printf(file, "DONE\"");
-       break;
-    case OP_COND_EXPR:
-    case OP_RANGE:
-    case OP_MAPWHILE:
-    case OP_GREPWHILE:
-    case OP_OR:
-    case OP_AND:
-       S_xmldump_attr(aTHX_ level, file, "other=\"");
-       if (cLOGOPo->op_other)
-           PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
-       else
-           PerlIO_printf(file, "DONE\"");
-       break;
-    case OP_LEAVE:
-    case OP_LEAVEEVAL:
-    case OP_LEAVESUB:
-    case OP_LEAVESUBLV:
-    case OP_LEAVEWRITE:
-    case OP_SCOPE:
-       if (o->op_private & OPpREFCOUNTED)
-           S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
-       break;
-    default:
-       break;
-    }
-
-    if (PL_madskills && o->op_madprop) {
-       char prevkey = '\0';
-       SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
-       const MADPROP* mp = o->op_madprop;
-
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
-       level++;
-       while (mp) {
-           char tmp = mp->mad_key;
-           sv_setpvs(tmpsv,"\"");
-           if (tmp)
-               sv_catxmlpvn(tmpsv, &tmp, 1, 0);
-           if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
-               sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
-           else
-               prevkey = tmp;
-           sv_catpv(tmpsv, "\"");
-           switch (mp->mad_type) {
-           case MAD_NULL:
-               sv_catpv(tmpsv, "NULL");
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
-               break;
-           case MAD_PV:
-               sv_catpv(tmpsv, " val=\"");
-               sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
-               sv_catpv(tmpsv, "\"");
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
-               break;
-           case MAD_SV:
-               sv_catpv(tmpsv, " val=\"");
-               sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
-               sv_catpv(tmpsv, "\"");
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
-               break;
-           case MAD_OP:
-               if ((OP*)mp->mad_val) {
-                   Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
-                   do_op_xmldump(level+1, file, (OP*)mp->mad_val);
-                   Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
-               }
-               break;
-           default:
-               Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
-               break;
-           }
-           mp = mp->mad_next;
-       }
-       level--;
-       Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
-
-       SvREFCNT_dec_NN(tmpsv);
-    }
-
-    switch (optype) {
-    case OP_PUSHRE:
-    case OP_MATCH:
-    case OP_QR:
-    case OP_SUBST:
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       do_pmop_xmldump(level, file, cPMOPo);
-       break;
-    default:
-       break;
-    }
-
-    if (o->op_flags & OPf_KIDS) {
-       OP *kid;
-       if (!contents) {
-           contents = 1;
-           PerlIO_printf(file, ">\n");
-       }
-       for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
-           do_op_xmldump(level, file, kid);
-    }
-
-    if (contents)
-       Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
-    else
-       PerlIO_printf(file, " />\n");
-}
-
-void
-Perl_op_xmldump(pTHX_ const OP *o)
-{
-    PERL_ARGS_ASSERT_OP_XMLDUMP;
-
-    do_op_xmldump(0, PL_xmlfp, o);
-}
-#endif
 
 /*
  * Local variables:
index b576d89..74b10ce 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -949,11 +949,7 @@ Apd        |CV*    |newCONSTSUB    |NULLOK HV* stash|NULLOK const char* name|NULLOK SV* sv
 Apd    |CV*    |newCONSTSUB_flags|NULLOK HV* stash \
                                  |NULLOK const char* name|STRLEN len \
                                  |U32 flags|NULLOK SV* sv
-#ifdef PERL_MAD
-Ap     |OP*    |newFORM        |I32 floor|NULLOK OP* o|NULLOK OP* block
-#else
 Ap     |void   |newFORM        |I32 floor|NULLOK OP* o|NULLOK OP* block
-#endif
 Apda   |OP*    |newFOROP       |I32 flags|NULLOK OP* sv|NN OP* expr|NULLOK OP* block|NULLOK OP* cont
 Apda   |OP*    |newGIVENOP     |NN OP* cond|NN OP* block|PADOFFSET defsv_off
 Apda   |OP*    |newLOGOP       |I32 optype|I32 flags|NN OP *first|NN OP *other
@@ -1055,11 +1051,7 @@ p        |void   |opslab_free_nopad|NN OPSLAB *slab
 p      |void   |opslab_force_free|NN OPSLAB *slab
 #endif
 : Used in perly.y
-#ifdef PERL_MAD
-p      |OP*    |package        |NN OP* o
-#else
 p      |void   |package        |NN OP* o
-#endif
 : Used in perly.y
 p      |void   |package_version|NN OP* v
 : Used in toke.c and perly.y
@@ -1593,12 +1585,7 @@ Ap       |void   |unsharepvn     |NULLOK const char* sv|I32 len|U32 hash
 : Used in gv.c, hv.c
 p      |void   |unshare_hek    |NULLOK HEK* hek
 : Used in perly.y
-#ifdef PERL_MAD
-p      |OP *   |utilize        |int aver|I32 floor|NULLOK OP* version \
-                               |NN OP* idop|NULLOK OP* arg
-#else
 p      |void   |utilize        |int aver|I32 floor|NULLOK OP* version|NN OP* idop|NULLOK OP* arg
-#endif
 Ap     |U8*    |utf16_to_utf8  |NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
 Ap     |U8*    |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
 AdpPR  |STRLEN |utf8_length    |NN const U8* s|NN const U8 *e
@@ -2494,9 +2481,6 @@ s |void   |deb_stack_n    |NN SV** stack_base|I32 stack_min \
 #endif
 
 : pad API
-#ifdef PERL_MAD
-Mnpd   |void   |pad_peg        |NN const char* s
-#endif
 Apda   |PADLIST*|pad_new       |int flags
 #if defined(PERL_IN_PAD_C)
 s      |PADOFFSET|pad_alloc_name|NN SV *namesv|U32 flags \
@@ -2663,58 +2647,6 @@ Apnod    |Size_t |my_strlcat     |NULLOK char *dst|NULLOK const char *src|Size_t size
 Apnod     |Size_t |my_strlcpy     |NULLOK char *dst|NULLOK const char *src|Size_t size
 #endif
 
-#ifdef PERL_MAD
-#if defined(PERL_IN_DUMP_C)
-sf     |void   |xmldump_attr   |I32 level|NN PerlIO *file|NN const char* pat \
-                               |...
-#endif
-Mfp    |void   |xmldump_indent |I32 level|NN PerlIO *file|NN const char* pat \
-                               |...
-Mp     |void   |xmldump_vindent|I32 level|NN PerlIO *file|NN const char* pat \
-                               |NULLOK va_list *args
-Mp     |void   |xmldump_all
-p      |void   |xmldump_all_perl       |bool justperl
-Mp     |void   |xmldump_packsubs       |NN const HV* stash
-p      |void   |xmldump_packsubs_perl  |NN const HV* stash|bool justperl
-Mp     |void   |xmldump_sub    |NN const GV* gv
-Mp     |void   |xmldump_sub_perl       |NN const GV* gv|bool justperl
-Mp     |void   |xmldump_form   |NN const GV* gv
-Mp     |void   |xmldump_eval
-Mp     |char*  |sv_catxmlsv    |NN SV *dsv|NN SV *ssv
-Mp     |char*  |sv_catxmlpvn   |NN SV *dsv|NN const char *pv|STRLEN len|int utf8
-Mp     |char*  |sv_catxmlpv    |NN SV *dsv|NN const char *pv|int utf8
-Mp     |char*  |sv_xmlpeek     |NN SV* sv
-Mp     |void   |do_pmop_xmldump|I32 level|NN PerlIO *file \
-                               |NULLOK const PMOP *pm
-Mp     |void   |pmop_xmldump   |NULLOK const PMOP* pm
-Mp     |void   |do_op_xmldump  |I32 level|NN PerlIO *file|NULLOK const OP *o
-Mp     |void   |op_xmldump     |NN const OP *o
-
-Mp     |TOKEN* |newTOKEN       |I32 optype|YYSTYPE lval \
-                               |NULLOK MADPROP* madprop
-Mp     |void   |token_free     |NN TOKEN *tk
-Mp     |void   |token_getmad   |NN TOKEN *tk|NULLOK OP *o|char slot
-Mp     |void   |op_getmad_weak |NULLOK OP* from|NULLOK OP* o|char slot
-Mp     |void   |op_getmad      |NULLOK OP* from|NULLOK OP* o|char slot
-Mp     |void   |prepend_madprops|NULLOK MADPROP* mp|NULLOK OP* o|char slot
-Mp     |void   |append_madprops|NULLOK MADPROP* tm|NULLOK OP* o|char slot
-Mp     |void   |addmad         |NULLOK MADPROP* tm|NULLOK MADPROP** root \
-                               |char slot
-Mp     |MADPROP*|newMADsv      |char key|NN SV* sv
-Mp     |MADPROP*|newMADPROP    |char key|char type|NULLOK void* val \
-                               |I32 vlen
-Mp     |void   |mad_free       |NULLOK MADPROP* mp
-
-#  if defined(PERL_IN_TOKE_C)
-s      |char*  |skipspace0     |NN char *s
-s      |char*  |skipspace1     |NN char *s
-s      |char*  |skipspace2     |NN char *s|NULLOK SV **sv
-s      |void   |start_force    |int where
-s      |void   |curmad         |char slot|NULLOK SV *sv
-#  endif
-Mp     |int    |madlex
-Mp     |int    |madparse       |int gramtype
-#endif
 #if !defined(HAS_SIGNBIT)
 AMdnoP |int    |Perl_signbit   |NV f
 #endif
diff --git a/embed.h b/embed.h
index c139c1e..b236ada 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define newCONSTSUB(a,b,c)     Perl_newCONSTSUB(aTHX_ a,b,c)
 #define newCONSTSUB_flags(a,b,c,d,e)   Perl_newCONSTSUB_flags(aTHX_ a,b,c,d,e)
 #define newCVREF(a,b)          Perl_newCVREF(aTHX_ a,b)
+#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
 #define newFOROP(a,b,c,d,e)    Perl_newFOROP(aTHX_ a,b,c,d,e)
 #define newGIVENOP(a,b,c)      Perl_newGIVENOP(aTHX_ a,b,c)
 #define newGVOP(a,b,c)         Perl_newGVOP(aTHX_ a,b,c)
 #if !(defined(NO_MATHOMS))
 #define sv_nounlocking(a)      Perl_sv_nounlocking(aTHX_ a)
 #endif
-#if !(defined(PERL_MAD))
-#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
-#endif
 #if !(defined(_MSC_VER))
 #ifndef PERL_IMPLICIT_CONTEXT
 #define die                    Perl_die
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
 #define _get_regclass_nonbitmap_data(a,b,c,d,e)        Perl__get_regclass_nonbitmap_data(aTHX_ a,b,c,d,e)
 #endif
-#if defined(PERL_MAD)
-#define newFORM(a,b,c)         Perl_newFORM(aTHX_ a,b,c)
-#endif
 #if defined(UNLINK_ALL_VERSIONS)
 #define unlnk(a)               Perl_unlnk(aTHX_ a)
 #endif
 #define oopsHV(a)              Perl_oopsHV(aTHX_ a)
 #define op_const_sv(a,b)       Perl_op_const_sv(aTHX_ a,b)
 #define op_unscope(a)          Perl_op_unscope(aTHX_ a)
+#define package(a)             Perl_package(aTHX_ a)
 #define package_version(a)     Perl_package_version(aTHX_ a)
 #define pad_block_start(a)     Perl_pad_block_start(aTHX_ a)
 #define pad_fixup_inner_anons(a,b,c)   Perl_pad_fixup_inner_anons(aTHX_ a,b,c)
 #define tied_method            Perl_tied_method
 #endif
 #define unshare_hek(a)         Perl_unshare_hek(aTHX_ a)
+#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
 #define vivify_ref(a,b)                Perl_vivify_ref(aTHX_ a,b)
 #define wait4pid(a,b,c)                Perl_wait4pid(aTHX_ a,b,c)
 #define watch(a)               Perl_watch(aTHX_ a)
 #  if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION))
 #define do_exec(a)             Perl_do_exec(aTHX_ a)
 #  endif
-#  if !(defined(PERL_MAD))
-#define package(a)             Perl_package(aTHX_ a)
-#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
-#  endif
 #  if !(defined(_MSC_VER))
 #define magic_regdatum_set(a,b)        Perl_magic_regdatum_set(aTHX_ a,b)
 #  endif
 #define tokeq(a)               S_tokeq(aTHX_ a)
 #define update_debugger_info(a,b,c)    S_update_debugger_info(aTHX_ a,b,c)
 #define yywarn(a,b)            S_yywarn(aTHX_ a,b)
-#    if defined(PERL_MAD)
-#define curmad(a,b)            S_curmad(aTHX_ a,b)
-#define skipspace0(a)          S_skipspace0(aTHX_ a)
-#define skipspace1(a)          S_skipspace1(aTHX_ a)
-#define skipspace2(a,b)                S_skipspace2(aTHX_ a,b)
-#define start_force(a)         S_start_force(aTHX_ a)
-#    endif
 #  endif
 #  if defined(PERL_IN_UNIVERSAL_C)
 #define isa_lookup(a,b,c,d)    S_isa_lookup(aTHX_ a,b,c,d)
 #define mem_log_common         S_mem_log_common
 #    endif
 #  endif
-#  if defined(PERL_MAD)
-#define addmad(a,b,c)          Perl_addmad(aTHX_ a,b,c)
-#define append_madprops(a,b,c) Perl_append_madprops(aTHX_ a,b,c)
-#define do_op_xmldump(a,b,c)   Perl_do_op_xmldump(aTHX_ a,b,c)
-#define do_pmop_xmldump(a,b,c) Perl_do_pmop_xmldump(aTHX_ a,b,c)
-#define mad_free(a)            Perl_mad_free(aTHX_ a)
-#define madlex()               Perl_madlex(aTHX)
-#define madparse(a)            Perl_madparse(aTHX_ a)
-#define newMADPROP(a,b,c,d)    Perl_newMADPROP(aTHX_ a,b,c,d)
-#define newMADsv(a,b)          Perl_newMADsv(aTHX_ a,b)
-#define newTOKEN(a,b,c)                Perl_newTOKEN(aTHX_ a,b,c)
-#define op_getmad(a,b,c)       Perl_op_getmad(aTHX_ a,b,c)
-#define op_getmad_weak(a,b,c)  Perl_op_getmad_weak(aTHX_ a,b,c)
-#define op_xmldump(a)          Perl_op_xmldump(aTHX_ a)
-#define package(a)             Perl_package(aTHX_ a)
-#define pad_peg                        Perl_pad_peg
-#define pmop_xmldump(a)                Perl_pmop_xmldump(aTHX_ a)
-#define prepend_madprops(a,b,c)        Perl_prepend_madprops(aTHX_ a,b,c)
-#define sv_catxmlpv(a,b,c)     Perl_sv_catxmlpv(aTHX_ a,b,c)
-#define sv_catxmlpvn(a,b,c,d)  Perl_sv_catxmlpvn(aTHX_ a,b,c,d)
-#define sv_catxmlsv(a,b)       Perl_sv_catxmlsv(aTHX_ a,b)
-#define sv_xmlpeek(a)          Perl_sv_xmlpeek(aTHX_ a)
-#define token_free(a)          Perl_token_free(aTHX_ a)
-#define token_getmad(a,b,c)    Perl_token_getmad(aTHX_ a,b,c)
-#define utilize(a,b,c,d,e)     Perl_utilize(aTHX_ a,b,c,d,e)
-#define xmldump_all()          Perl_xmldump_all(aTHX)
-#define xmldump_all_perl(a)    Perl_xmldump_all_perl(aTHX_ a)
-#define xmldump_eval()         Perl_xmldump_eval(aTHX)
-#define xmldump_form(a)                Perl_xmldump_form(aTHX_ a)
-#ifndef PERL_IMPLICIT_CONTEXT
-#define xmldump_indent         Perl_xmldump_indent
-#endif
-#define xmldump_packsubs(a)    Perl_xmldump_packsubs(aTHX_ a)
-#define xmldump_packsubs_perl(a,b)     Perl_xmldump_packsubs_perl(aTHX_ a,b)
-#define xmldump_sub(a)         Perl_xmldump_sub(aTHX_ a)
-#define xmldump_sub_perl(a,b)  Perl_xmldump_sub_perl(aTHX_ a,b)
-#define xmldump_vindent(a,b,c,d)       Perl_xmldump_vindent(aTHX_ a,b,c,d)
-#  endif
 #  if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
 #define pidgone(a,b)           S_pidgone(aTHX_ a,b)
 #  endif
index bf08780..454c1ee 100644 (file)
 #define PL_localizing          (vTHX->Ilocalizing)
 #define PL_localpatches                (vTHX->Ilocalpatches)
 #define PL_lockhook            (vTHX->Ilockhook)
-#define PL_madskills           (vTHX->Imadskills)
 #define PL_main_cv             (vTHX->Imain_cv)
 #define PL_main_root           (vTHX->Imain_root)
 #define PL_main_start          (vTHX->Imain_start)
 #define PL_warnhook            (vTHX->Iwarnhook)
 #define PL_watchaddr           (vTHX->Iwatchaddr)
 #define PL_watchok             (vTHX->Iwatchok)
-#define PL_xmlfp               (vTHX->Ixmlfp)
 
 #endif /* MULTIPLICITY */
 
index b20fa94..0d8b833 100644 (file)
@@ -364,19 +364,8 @@ S_ck_dump(pTHX_ OP *entersubop, GV *namegv, SV *cv)
        aop = cUNOPx(aop)->op_first;
     prev = aop;
     aop = aop->op_sibling;
-    while (PL_madskills && aop->op_type == OP_STUB) {
-       prev = aop;
-       aop = aop->op_sibling;
-    }
-    if (PL_madskills && aop->op_type == OP_NULL) {
-       first = ((UNOP*)aop)->op_first;
-       ((UNOP*)aop)->op_first = NULL;
-       prev = aop;
-    }
-    else {
-       first = aop;
-       prev->op_sibling = first->op_sibling;
-    }
+    first = aop;
+    prev->op_sibling = first->op_sibling;
     if (first->op_type == OP_RV2AV ||
        first->op_type == OP_PADAV ||
        first->op_type == OP_RV2HV ||
@@ -386,10 +375,6 @@ S_ck_dump(pTHX_ OP *entersubop, GV *namegv, SV *cv)
     else
        first->op_flags &= ~OPf_MOD;
     aop = aop->op_sibling;
-    while (PL_madskills && aop->op_type == OP_STUB) {
-       prev = aop;
-       aop = aop->op_sibling;
-    }
     if (!aop) {
        /* It doesn’t really matter what we return here, as this only
           occurs after yyerror.  */
index 3e7d4a3..c8982fd 100644 (file)
@@ -757,11 +757,6 @@ PERLVAR(I, memory_debug_header, struct perl_memory_debug_header)
 PERLVARI(I, dumper_fd, int,    -1)
 #endif
 
-#ifdef PERL_MAD
-PERLVARI(I, madskills, bool,   FALSE)  /* preserve all syntactic info */
-                                       /* (MAD = Misc Attribute Decoration) */
-PERLVARI(I, xmlfp,     PerlIO *, NULL)
-#endif
 
 #ifdef DEBUG_LEAKING_SCALARS
 PERLVARI(I, sv_serial, U32,    0)      /* SV serial number, used in sv.c */
index 64c0d8d..2b66c8c 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -1300,81 +1300,6 @@ Perl__is_cur_LC_category_utf8(pTHX_ int category)
 #   endif /* USE_LOCALE_MONETARY */
 #endif /* HAS_LOCALECONV */
 
-#if 0 && defined(HAS_STRERROR) && defined(USE_LOCALE_MESSAGES)
-
-/* This code is ifdefd out because it was found to not be necessary in testing
- * on our dromedary test machine, which has over 700 locales.  There, looking
- * at just the currency symbol gave essentially the same results as doing this
- * extra work.  Executing this also caused segfaults in miniperl.  I left it in
- * so as to avoid rewriting it if real-world experience indicates that
- * dromedary is an outlier.  Essentially, instead of returning abpve if we
- * haven't found illegal utf8, we continue on and examine all the strerror()
- * messages on the platform for utf8ness.  If all are ASCII, we still don't
- * know the answer; but otherwise we have a pretty good indication of the
- * utf8ness.  The reason this doesn't necessarily help much is that the
- * messages may not have been translated into the locale.  The currency symbol
- * is much more likely to have been translated.  The code below would need to
- * be altered somewhat to just be a continuation of testing the currency
- * symbol. */
-        int e;
-        unsigned int failures = 0, non_ascii = 0;
-        char *save_messages_locale = NULL;
-
-        /* Like above for LC_CTYPE, we set LC_MESSAGES to the locale of the
-         * desired category, if it isn't that locale already */
-
-        if (category != LC_MESSAGES) {
-
-            save_messages_locale = stdize_locale(savepv(setlocale(LC_MESSAGES,
-                                                                  NULL)));
-            if (! save_messages_locale) {
-                goto cant_use_messages;
-            }
-
-            if (strEQ(save_messages_locale, save_input_locale)) {
-                Safefree(save_input_locale);
-            }
-            else if (! setlocale(LC_MESSAGES, save_input_locale)) {
-                Safefree(save_messages_locale);
-                goto cant_use_messages;
-            }
-        }
-
-        /* Here the current LC_MESSAGES is set to the locale of the category
-         * whose information is desired.  Look through all the messages */
-
-        for (e = 0;
-#ifdef HAS_SYS_ERRLIST
-             e <= sys_nerr
-#endif
-             ; e++)
-        {
-            const U8* const errmsg = (U8 *) Strerror(e) ;
-            if (!errmsg)
-                break;
-            if (! is_utf8_string(errmsg, 0)) {
-                failures++;
-                break;
-            }
-            else if (! is_ascii_string(errmsg, 0)) {
-                non_ascii++;
-            }
-        }
-
-        /* And, if we changed it, restore LC_MESSAGES to its original locale */
-        if (save_messages_locale) {
-            setlocale(LC_MESSAGES, save_messages_locale);
-            Safefree(save_messages_locale);
-        }
-
-        /* Any non-UTF-8 message means not a UTF-8 locale; if all are valid,
-         * any non-ascii means it is one; otherwise we assume it isn't */
-        return (failures) ? FALSE : non_ascii;
-
-    }
-  cant_use_messages:
-
-#endif
 
     DEBUG_L(PerlIO_printf(Perl_debug_log,
                           "Assuming locale %s is not a UTF-8 locale\n",
diff --git a/mad/Nomad.pm b/mad/Nomad.pm
deleted file mode 100644 (file)
index eaac474..0000000
+++ /dev/null
@@ -1,3012 +0,0 @@
-package Nomad;
-
-# Suboptimal things:
-#      ast type info is generally still implicit
-#      the combined madness calls are actually losing type information
-#      brace madprops tend to be too low in the tree
-#      could use about 18 more refactorings...
-#      lots of unused cruft left around from previous refactorings
-
-use strict;
-use warnings;
-use Carp;
-
-use P5AST;
-use P5re;
-
-my $deinterpolate;
-
-sub xml_to_p5 {
-    my %options = @_;
-
-
-    my $filename = $options{'input'} or die;
-    $deinterpolate = $options{'deinterpolate'};
-    my $YAML = $options{'YAML'};
-
-    local $SIG{__DIE__} = sub {
-        my $e = shift;
-        $e =~ s/\n$/\n    [NODE $filename line $::prevstate->{line}]/ if $::prevstate;
-        confess $e;
-    };
-
-    # parse file
-    use XML::Parser;
-    my $p1 = XML::Parser->new(Style => 'Objects', Pkg => 'PLXML');
-    $p1->setHandlers('Char' => sub { warn "Chars $_[1]" if $_[1] =~ /\S/; });
-
-    # First slurp XML into tree of objects.
-
-    my $root = $p1->parsefile($filename);
-
-    # Now turn XML tree into something more like an AST.
-
-    PLXML::prepreproc($root->[0]);
-    my $ast = P5AST->new('Kids' => [$root->[0]->ast()]);
-    #::t($ast);
-
-    if ($YAML) {
-        require YAML::Syck;
-        return YAML::Syck::Dump($ast);
-    }
-
-    # Finally, walk AST to produce new program.
-
-    my $text = $ast->p5text(); # returns encoded, must output raw
-    return $text;
-}
-
-$::curstate = 0;
-$::prevstate = 0;
-$::curenc = 1;         # start in iso-8859-1, sigh...
-
-$::H = "HeredocHere000";
-%::H = ();
-
-my @enc = (
-    'utf-8',
-    'iso-8859-1',
-);
-
-my %enc = (
-    'utf-8' => 0,
-    'iso-8859-1' => 1,
-);
-
-my %madtype = (
-    '$' => 'p5::sigil',
-    '@' => 'p5::sigil',
-    '%' => 'p5::sigil',
-    '&' => 'p5::sigil',
-    '*' => 'p5::sigil',
-    'o' => 'p5::operator',
-    '~' => 'p5::operator',
-    '+' => 'p5::punct',
-    '?' => 'p5::punct',
-    ':' => 'p5::punct',
-    ',' => 'p5::punct',
-    ';' => 'p5::punct',
-    '#' => 'p5::punct',
-    '(' => 'p5::opener',
-    ')' => 'p5::closer',
-    '[' => 'p5::opener',
-    ']' => 'p5::closer',
-    '{' => 'p5::opener',
-    '}' => 'p5::closer',
-    '1'        => 'p5::punct',
-    '2'        => 'p5::punct',
-    'a'        => 'p5::operator',
-    'A'        => 'p5::operator',
-    'd' => 'p5::declarator',
-    'E'        => 'p5::text',
-    'L' => 'p5::label',
-    'm' => 'p5::remod',
-#    'n' => 'p5::name',
-    'q' => 'p5::openquote',
-    'Q' => 'p5::closequote',
-    '='        => 'p5::text',
-    'R'        => 'p5::text',
-    's'        => 'p5::text',
-    's'        => 'p5::declarator',
-#    'V' => 'p5::version',
-    'X' => 'p5::token',
-);
-
-use Data::Dumper;
-$Data::Dumper::Indent = 1;
-$Data::Dumper::Quotekeys = 0;
-
-sub d {
-    my $text = Dumper(@_);
-    # doesn't scale well, alas
-    1 while $text =~ s/(.*)^([^\n]*)bless\( \{\n(.*?)^(\s*\}), '([^']*)' \)([^\n]*)/$1$2$5 {\n$3$4$6 # $5/ms;
-    $text =~ s/PLXML:://g;
-    if ($text) {
-       my ($package, $filename, $line) = caller;
-       my $subroutine = (caller(1))[3];
-       $text =~ s/\n?\z/, called from $subroutine, line $line\n/;
-       warn $text;
-    }
-};
-
-{
-
-    my %xmlrepl = (
-       '&' => '&amp;',
-       "'" => '&apos;',
-       '"' => '&dquo;',
-       '<' => '&lt;',
-       '>' => '&gt;',
-       "\n" => '&#10;',
-       "\t" => '&#9;',
-    );
-
-    sub x {
-       my $indent = 0;
-       if (@_ > 1) {
-           warn xdolist($indent,"LIST",@_);
-       }
-       else {
-           my $type = ref $_[0];
-           if ($type) {
-               warn xdoitem($indent,$type,@_);
-           }
-           else {
-               warn xdoitem($indent,"ITEM",@_);
-           }
-       }
-    }
-
-    sub xdolist {
-       my $indent = shift;
-       my $tag = shift;
-       my $in = ' ' x ($indent * 2);
-       my $result;
-       $result .= "$in<$tag>\n" if defined $tag;
-       for my $it (@_) {
-           my $itt = ref $it || "ITEM";
-           $itt =~ s/::/:/g;
-           $result .= xdoitem($indent+1,$itt,$it);
-       }
-       $result .= "$in</$tag>\n" if defined $tag;
-       return $result;
-    }
-
-    sub xdohash {
-       my $indent = shift;
-       my $tag = shift;
-       my $hash = shift;
-       my $in = ' ' x ($indent * 2);
-       my $result = "$in<$tag>\n";
-       my @keys = sort keys %$hash;
-       my $longest = 0;
-       for my $k (@keys) {
-           $longest = length($k) if length($k) > $longest;
-       }
-       my $K;
-       for my $k (@keys) {
-           my $tmp;
-           $K = $$hash{$k}, next if $k eq 'Kids';
-           my $sp = ' ' x ($longest - length($k));
-           if (ref $$hash{$k}) {
-               $tmp = xdoitem($indent+1,"kv",$$hash{$k});
-               $tmp =~ s!^ *<kv>\n *</kv>!$in  <kv/>!;
-           }
-           else {
-               $tmp = xdoitem($indent+1,"kv",$$hash{$k});
-           }
-           $k =~ s/([\t\n'"<>&])/$xmlrepl{$1}/g;
-           $tmp =~ s/<kv/<kv k='$k'$sp/ or
-               $tmp =~ s/^(.*)$/$in  <kv k='$k'>\n$in  $1$in  <\/kv>\n/s;
-           $result .= $tmp;
-       }
-       if ($K and @$K) {
-           $result .= xdolist($indent, undef, @$K);
-       }
-       $result .= "$in</$tag>\n";
-    }
-
-    sub xdoitem {
-       my $indent = shift;
-       my $tag = shift;
-       my $item = shift;
-       my $in = ' ' x ($indent * 2);
-       my $r = ref $item;
-       if (not $r) {
-           $item =~ s/([\t\n'"<>&])/$xmlrepl{$1}/g;
-           return "$in<$tag>$item</$tag>\n";
-       }
-       (my $newtag = $r) =~ s/::/:/g;
-       my $t = "$item";
-       if ($t =~ /\bARRAY\b/) {
-           if (@{$item}) {
-               return xdolist($indent,$tag,@{$item});
-           }
-           else {
-               return "$in<$tag />\n";
-           }
-       }
-       if ($t =~ /\bHASH\b/) {
-           return xdohash($indent,$tag,$item);
-       }
-       if ($r =~ /^p5::/) {
-           return "$in<$newtag>$$item</$newtag>\n";
-       }
-       else {
-           return "$in<$newtag type='$r'/>\n";
-       }
-    }
-
-    my %trepl = (
-       "'" => '\\\'',
-       '"' => '\\"',
-       "\n" => '\\n',
-       "\t" => '\\t',
-    );
-
-    sub t {
-       my $indent = 0;
-       if (@_ > 1) {
-           tdolist($indent,"LIST",@_);
-       }
-       else {
-           my $type = ref $_[0];
-           if ($type) {
-               tdoitem($indent,$type,@_);
-           }
-           else {
-               tdoitem($indent,"ITEM",@_);
-           }
-       }
-       print STDERR "\n";
-    }
-
-    sub tdolist {
-       my $indent = shift;
-       my $tag = shift || "ARRAY";
-       my $in = ' ' x ($indent * 2);
-       if (@_) {
-           print STDERR "[\n";
-           for my $it (@_) {
-               my $itt = ref $it || "ITEM";
-               print STDERR $in,"  ";
-               tdoitem($indent+1,$itt,$it);
-               print STDERR "\n";
-           }
-           print STDERR "$in]";
-       }
-       else {
-           print STDERR "[]";
-       }
-    }
-
-    sub tdohash {
-       my $indent = shift;
-       my $tag = shift;
-       my $hash = shift;
-       my $in = ' ' x ($indent * 2);
-
-       print STDERR "$tag => {\n";
-
-       my @keys = sort keys %$hash;
-       my $longest = 0;
-       for my $k (@keys) {
-           $longest = length($k) if length($k) > $longest;
-       }
-       my $K;
-       for my $k (@keys) {
-           my $sp = ' ' x ($longest - length($k));
-           print STDERR "$in  $k$sp => ";
-           tdoitem($indent+1,"",$$hash{$k});
-           if ($k eq 'Kids') {
-               print STDERR " # Kids";
-           }
-           print STDERR "\n";
-       }
-       print STDERR "$in} # $tag";
-    }
-
-    sub tdoitem {
-       my $indent = shift;
-       my $tag = shift;
-       my $item = shift;
-       if (not defined $item) {
-           print STDERR "UNDEF";
-           return;
-       }
-#      my $in = ' ' x ($indent * 2);
-       my $r = ref $item;
-       if (not $r) {
-           $item =~ s/([\t\n"])/$trepl{$1}/g;
-           print STDERR "\"$item\"";
-           return;
-       }
-       my $t = "$item";
-       if ($r =~ /^p5::/) {
-           my $str = $$item{uni};
-           my $enc = $enc[$$item{enc}] . ' ';
-           $enc =~ s/iso-8859-1 //;
-           $str =~ s/([\t\n"])/$trepl{$1}/g;
-           print STDERR "$r $enc\"$str\"";
-       }
-       elsif ($t =~ /\bARRAY\b/) {
-           tdolist($indent,$tag,@{$item});
-       }
-       elsif ($t =~ /\bHASH\b/) {
-           tdohash($indent,$tag,$item);
-       }
-       else {
-           print STDERR "$r type='$r'";
-       }
-    }
-}
-
-sub encnum {
-    my $encname = shift;
-    if (not exists $enc{$encname}) {
-       push @enc, $encname;
-       return $enc{$encname} = $#enc;
-    }
-    return $enc{$encname};
-}
-
-use PLXML;
-
-package p5::text;
-
-use Encode;
-
-sub new {
-    my $class = shift;
-    my $text = shift;
-    die "Too many args to new" if @_;
-    die "Attempt to bless non-text $text" if ref $text;
-    return bless( { uni => $text,
-                   enc => $::curenc,
-                 }, $class);
-}
-
-sub uni { my $self = shift; $$self{uni}; }     # internal stuff all in utf8
-
-sub enc {
-    my $self = shift;
-    my $enc = $enc[$$self{enc} || 0];
-    return encode($enc, $$self{uni});
-}
-
-package p5::closequote;        BEGIN { @p5::closequote::ISA = 'p5::punct'; }
-package p5::closer;    BEGIN { @p5::closer::ISA = 'p5::punct'; }
-package p5::declarator;        BEGIN { @p5::declarator::ISA = 'p5::token'; }
-package p5::junk;      BEGIN { @p5::junk::ISA = 'p5::text'; }
-package p5::label;     BEGIN { @p5::label::ISA = 'p5::token'; }
-#package p5::name;     BEGIN { @p5::name::ISA = 'p5::token'; }
-package p5::opener;    BEGIN { @p5::opener::ISA = 'p5::punct'; }
-package p5::openquote; BEGIN { @p5::openquote::ISA = 'p5::punct'; }
-package p5::operator;  BEGIN { @p5::operator::ISA = 'p5::token'; }
-package p5::punct;     BEGIN { @p5::punct::ISA = 'p5::token'; }
-package p5::remod;     BEGIN { @p5::remod::ISA = 'p5::token'; }
-package p5::sigil;     BEGIN { @p5::sigil::ISA = 'p5::punct'; }
-package p5::token;     BEGIN { @p5::token::ISA = 'p5::text'; }
-#package p5::version;  BEGIN { @p5::version::ISA = 'p5::token'; }
-
-################################################################
-# Routines to turn XML tree into an AST.  Mostly this amounts to hoisting
-# misplaced nodes and flattening various things into lists.
-
-package PLXML;
-
-sub AUTOLOAD {
-    ::x("AUTOLOAD $PLXML::AUTOLOAD", @_);
-    return "[[[ $PLXML::AUTOLOAD ]]]";
-}
-
-sub prepreproc {
-    my $self = shift;
-    my $kids = $$self{Kids};
-    $self->{mp} = {};
-    if (defined $kids) {
-       my $i;
-       for ($i = 0; $i < @$kids; $i++) {
-           if (ref $kids->[$i] eq "PLXML::madprops") {
-               $self->{mp} = splice(@$kids, $i, 1)->hash($self,@_);
-               $i--;
-               next;
-           }
-           else {
-               prepreproc($kids->[$i], $self, @_);
-           }
-       }
-    }
-}
-
-sub preproc {
-    my $self = shift;
-    if (ref $self eq 'PLXML::op_null' and $$self{was}) {
-       return "PLXML::op_$$self{was}"->key();
-    }
-    else {
-       return $self->key();
-    }
-}
-
-sub newtype {
-    my $self = shift;
-    my $t = ref $self || $self;
-    $t = "PLXML::op_$$self{was}" if $t eq 'PLXML::op_null' and $$self{was};
-    $t =~ s/PLXML/P5AST/ or die "Bad type: $t";
-    return $t;
-}
-
-sub madness {
-    my $self = shift;
-    my @keys = split(' ', shift);
-    @keys = map { $_ eq 'd' ? ('k', 'd') : $_ } @keys;
-    my @vals = ();
-    for my $key (@keys) {
-       my $madprop = $self->{mp}{$key};
-       next unless defined $madprop;
-       if (ref $madprop eq 'PLXML::mad_op') {
-           if ($key eq 'b') {
-               push @vals, $madprop->blockast($self, @_);
-           }
-           else {
-               push @vals, $madprop->ast($self, @_);
-           }
-           next;
-       }
-       my $white;
-       if ($white = $self->{mp}{"_$key"}) {
-           push @vals, p5::junk->new($white);
-       }
-       my $type = $madtype{$key} || "p5::token";
-       push @vals, $type->new($madprop);
-       if ($white = $self->{mp}{"#$key"}) {
-           push @vals, p5::junk->new($white);
-       }
-    }
-    @vals;
-}
-
-sub blockast {
-    my $self = shift;
-    $self->ast(@_);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    return $self->newtype->new(Kids => [uc $self->key(), "(", @newkids, ")"]);
-}
-
-sub op {
-    my $self = shift;
-    my $desc = $self->desc();
-    if ($desc =~ /\((.*?)\)/) {
-       return $1;
-    }
-    else {
-       return " <<" . $self->key() . ">> ";
-    }
-}
-
-sub mp {
-    my $self = shift;
-    return $self->{mp};
-}
-
-package PLXML::Characters;
-
-sub ast { die "oops" }
-sub pair { die "oops" }
-
-package PLXML::madprops;
-
-sub ast {
-    die "oops madprops";
-}
-
-sub hash {
-    my $self = shift;
-    my @pairs;
-    my %hash = ();
-    my $firstthing = '';
-    my $lastthing = '';
-    
-    # We need to guarantee key uniqueness at this point.
-    for my $kid (@{$$self{Kids}}) {
-       my ($k,$v) = $kid->pair($self, @_);
-       $firstthing ||= $k;
-        $k .= 'x' while exists $hash{$k};
-        $lastthing = $k;
-       $hash{$k} = $v;
-    }
-    $hash{FIRST} = $firstthing;
-    $hash{LAST} = $lastthing;
-    return \%hash;
-}
-
-package PLXML::mad_op;
-
-sub pair {
-    my $self = shift;
-    my $key = $$self{key};
-    return $key,$self;
-}
-
-sub ast {
-    my $self = shift;
-    $self->prepreproc(@_);
-    my @vals;
-    for my $kid (@{$$self{Kids}}) {
-        push @vals, $kid->ast($self, @_);
-    }
-    if (@vals == 1) {
-       return @vals;
-    }
-    else {
-       return P5AST::op_list->new(Kids => [@vals]);
-    }
-}
-
-sub blockast {
-    my $self = shift;
-    $self->prepreproc(@_);
-    my @vals;
-    for my $kid (@{$$self{Kids}}) {
-        push @vals, $kid->blockast($self, @_);
-    }
-    if (@vals == 1) {
-       return @vals;
-    }
-    else {
-       return P5AST::op_lineseq->new(Kids => [@vals]);
-    }
-}
-
-package PLXML::mad_pv;
-
-sub pair {
-    my $self = shift;
-    my $key = $$self{key};
-    my $val = $$self{val};
-    $val =~ s/STUPIDXML\(#x(\w+)\)/chr(hex $1)/eg;
-    return $key,$val;
-}
-
-package PLXML::mad_sv;
-
-sub pair {
-    my $self = shift;
-    my $key = $$self{key};
-    my $val = $$self{val};
-    $val =~ s/STUPIDXML\(#x(\w+)\)/chr(hex $1)/eg;
-    return $key,$val;
-}
-
-package PLXML::baseop;
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    if (@newkids) {
-       push @retval, uc $self->key(), "(", @newkids , ")";
-    }
-    else {
-       push @retval, $self->madness('o ( )');
-    }
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::baseop_unop;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('d o (');
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype()->new(Kids => [@newkids]);
-}
-
-package PLXML::binop;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $right = $$self{Kids}[1];
-    if (defined $right) {
-       push @newkids, $right->ast($self, @_);
-    }
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::cop;
-
-package PLXML::filestatop;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids = $self->madness('o (');
-
-    if (@{$$self{Kids}}) {
-       for my $kid (@{$$self{Kids}}) {
-           push @newkids, $kid->ast($self, @_);
-       }
-    }
-    if ($$self{mp}{O}) {
-       push @newkids, $self->madness('O');
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::listop;
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @after;
-    if (@retval = $self->madness('X')) {
-       my @before, $self->madness('o x');
-       return P5AST::listop->new(Kids => [@before,@retval]);
-    }
-
-    push @retval, $self->madness('o d ( [ {');
-
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       next if ref $kid eq 'PLXML::op_pushmark';
-       next if ref $kid eq 'PLXML::op_null' and
-               defined $$kid{was} and $$kid{was} eq 'pushmark';
-       push @newkids, $kid->ast($self, @_);
-    }
-
-    my $x = "";
-
-    if ($$self{mp}{S}) {
-       push @retval, $self->madness('S');
-    }
-    push @retval, @newkids;
-
-    push @retval, $self->madness('} ] )');
-    return $self->newtype->new(Kids => [@retval,@after]);
-}
-
-package PLXML::logop;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('o (');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    push @newkids, $self->madness(')');
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::loop;
-
-package PLXML::loopexop;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o (');
-
-    if ($$self{mp}{L} or not $$self{flags} =~ /\bSPECIAL\b/) {
-       my @label = $self->madness('L');
-       if (@label) {
-           push @newkids, @label;
-       }
-       else {
-           my $arg = $$self{Kids}[0];
-           push @newkids, $arg->ast($self, @_) if defined $arg;
-       }
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-
-package PLXML::padop;
-
-package PLXML::padop_svop;
-
-package PLXML::pmop;
-
-sub ast {
-    my $self = shift;
-
-    return P5AST::pmop->new(Kids => []) unless exists $$self{flags};
-
-    my $bits = $self->fetchbits($$self{flags},@_);
-
-    my @newkids;
-    if ($bits->{binding}) {
-       push @newkids, $bits->{binding};
-       push @newkids, $self->madness('~');
-    }
-    if (exists $bits->{regcomp} and $bits->{regcomp}) {
-       my @front = $self->madness('q');
-       my @back = $self->madness('Q');
-       push @newkids, @front, $bits->{regcomp}, @back,
-               $self->madness('m');
-    }
-    elsif ($$self{mp}{q}) {
-       push @newkids, $self->madness('q = Q m');
-    }
-    elsif ($$self{mp}{X}) {
-       push @newkids, $self->madness('X m');
-    }
-    else {
-       push @newkids, $self->madness('e m');
-    }
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-sub innerpmop {
-    my $pmop = shift;
-    my $bits = shift;
-    for my $key (grep {!/^Kids/} keys %$pmop) {
-       $bits->{$key} = $pmop->{$key};
-    }
-
-    # Have to delete all the fake evals of the repl.  This is a pain...
-    if (@{$$pmop{Kids}}) {
-       my $really = $$pmop{Kids}[0]{Kids}[0];
-       if (ref $really eq 'PLXML::op_substcont') {
-           $really = $$really{Kids}[0];
-       }
-       while ((ref $really) =~ /^PLXML::op_.*(null|entereval)/) {
-           if (exists $$really{was}) {
-               $bits->{repl} = $really->ast(@_);
-               return;
-           }
-           $really = $$really{Kids}[0];
-       }
-       if (ref $really eq 'PLXML::op_scope' and
-           @{$$really{Kids}} == 1 and
-           ref $$really{Kids}[0] eq 'PLXML::op_null' and
-           not @{$$really{Kids}[0]{Kids}})
-       {
-           $bits->{repl} = '';
-           return;
-       }
-       if (ref $really eq 'PLXML::op_leave' and
-           @{$$really{Kids}} == 2 and
-           ref $$really{Kids}[1] eq 'PLXML::op_null' and
-           not @{$$really{Kids}[1]{Kids}})
-       {
-           $bits->{repl} = '';
-           return;
-       }
-       if ((ref $really) =~ /^PLXML::op_(scope|leave)/) {
-           # should be at inner do {...} here, so skip that fakery too
-           $bits->{repl} = $really->newtype->new(Kids => [$really->PLXML::op_lineseq::lineseq(@_)]);
-           # but retrieve the whitespace before fake '}'
-           if ($$really{mp}{'_}'}) {
-               push(@{$bits->{repl}->{Kids}}, p5::junk->new($$really{mp}{'_}'}));
-           }
-       }
-       else {  # something else, padsv probably
-           $bits->{repl} = $really->ast(@_);
-       }
-    }
-}
-
-sub fetchbits {
-    my $self = shift;
-    my $flags = shift || '';
-    my %bits = %$self;
-    my @kids = @{$$self{Kids}};
-    if (@kids) {
-       delete $bits{Kids};
-       my $arg = shift @kids;
-       innerpmop($arg,\%bits, $self, @_);
-       if ($flags =~ /STACKED/) {
-           $arg = shift @kids;
-           $bits{binding} = $arg->ast($self, @_);
-       }
-       if ($bits{when} ne "COMP" and @kids) {
-           $arg = pop @kids;
-           $bits{regcomp} = $arg->ast($self, @_);
-       }
-       if (not exists $bits{repl} and @kids) {
-           $arg = shift @kids;
-           $bits{repl} = $arg->ast($self, @_);
-       }
-    }
-    return \%bits;
-}
-
-package PLXML::pvop_svop;
-
-package PLXML::unop;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o (');
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    push @newkids, $self->madness(')');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML;
-package PLXML::Characters;
-package PLXML::madprops;
-package PLXML::mad_op;
-package PLXML::mad_pv;
-package PLXML::baseop;
-package PLXML::baseop_unop;
-package PLXML::binop;
-package PLXML::cop;
-package PLXML::filestatop;
-package PLXML::listop;
-package PLXML::logop;
-package PLXML::loop;
-package PLXML::loopexop;
-package PLXML::padop;
-package PLXML::padop_svop;
-package PLXML::pmop;
-package PLXML::pvop_svop;
-package PLXML::unop;
-package PLXML::op_null;
-
-# Null nodes typed by first madprop.
-
-my %astmad;
-
-BEGIN {
-    %astmad = (
-       'p' => sub {            # peg for #! line, etc.
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('p px');
-           $::curstate = 0;
-           return P5AST::peg->new(Kids => [@newkids])
-       },
-       '(' => sub {            # extra parens around the whole thing
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('dx d o (');
-           for my $kid (@{$$self{Kids}}) {
-               push @newkids, $kid->ast($self, @_);
-           }
-           push @newkids, $self->madness(')');
-           return P5AST::parens->new(Kids => [@newkids])
-       },
-       '~' => sub {                            # binding operator
-           my $self = shift;
-           my @newkids;
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           push @newkids, $self->madness('~');
-           push @newkids, $$self{Kids}[1]->ast($self,@_);
-           return P5AST::bindop->new(Kids => [@newkids])
-       },
-       ';' => sub {            # null statements/blocks
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('{ ; }');
-           $::curstate = 0;
-           return P5AST::nothing->new(Kids => [@newkids])
-       },
-       'I' => sub {            # if or unless statement keyword
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('L I (');
-           my @subkids;
-           for my $kid (@{$$self{Kids}}) {
-               push @subkids, $kid->ast($self, @_);
-           }
-           die "oops in op_null->new" unless @subkids == 1;
-           my $newself = $subkids[0];
-           @subkids = @{$$newself{Kids}};
-           
-           unshift @{$subkids[0]{Kids}}, @newkids;
-           push @{$subkids[0]{Kids}}, $self->madness(')');
-           return bless($newself, 'P5AST::condstate');
-       },
-       'U' => sub {                    # use
-           my $self = shift;
-           my @newkids;
-           my @module = $self->madness('U');
-           my @args = $self->madness('A');
-           my $module = $module[-1]{Kids}[-1];
-           if ($module->uni eq 'bytes') {
-               $::curenc = Nomad::encnum('iso-8859-1');
-           }
-           elsif ($module->uni eq 'utf8') {
-               if ($$self{mp}{o} eq 'no') {
-                   $::curenc = Nomad::encnum('iso-8859-1');
-               }
-               else {
-                   $::curenc = Nomad::encnum('utf-8');
-               }
-           }
-           elsif ($module->uni eq 'encoding') {
-               if ($$self{mp}{o} eq 'no') {
-                   $::curenc = Nomad::encnum('iso-8859-1');
-               }
-               else {
-                   $::curenc = Nomad::encnum(eval $args[0]->p5text); # XXX bletch
-               }
-           }
-           # (Surrounding {} ends up here if use is only thing in block.)
-           push @newkids, $self->madness('{ o');
-           push @newkids, @module;
-           push @newkids, $self->madness('V');
-           push @newkids, @args;
-           push @newkids, $self->madness('S ; }');
-           $::curstate = 0;
-           return P5AST::use->new(Kids => [@newkids])
-       },
-       '?' => sub {                    # ternary
-           my $self = shift;
-           my @newkids;
-           my @subkids;
-           my @condkids = @{$$self{Kids}[0]{Kids}};
-           
-           push @newkids, $condkids[0]->ast($self,@_), $self->madness('?');
-           push @newkids, $condkids[1]->ast($self,@_), $self->madness(':');
-           push @newkids, $condkids[2]->ast($self,@_);
-           return P5AST::ternary->new(Kids => [@newkids])
-       },
-       '&' => sub {                    # subroutine
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('d n s a : { & } ;');
-           $::curstate = 0;
-           return P5AST::sub->new(Kids => [@newkids])
-       },
-       'i' => sub {                    # modifier if
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('i');
-           my $cond = $$self{Kids}[0];
-           my @subkids;
-           for my $kid (@{$$cond{Kids}}) {
-               push @subkids, $kid->ast($self, @_);
-           }
-           push @newkids, shift @subkids;
-           unshift @newkids, @subkids;
-           return P5AST::condmod->new(Kids => [@newkids])
-       },
-       'P' => sub {                            # package declaration
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('o');
-           push @newkids, $self->madness('P');
-           push @newkids, $self->madness(';');
-           $::curstate = 0;
-           return P5AST::package->new(Kids => [@newkids])
-       },
-       'F' => sub {                            # format
-           my $self = shift;
-           my @newkids = $self->madness('F n b');
-           $::curstate = 0;
-           return P5AST::format->new(Kids => [@newkids])
-       },
-       'x' => sub {                            # qw literal
-           my $self = shift;
-           return P5AST::qwliteral->new(Kids => [$self->madness('x')])
-       },
-       'q' => sub {                            # random quote
-           my $self = shift;
-           return P5AST::quote->new(Kids => [$self->madness('q = Q')])
-       },
-       'X' => sub {                            # random literal
-           my $self = shift;
-           return P5AST::token->new(Kids => [$self->madness('X')])
-       },
-       ':' => sub {                            # attr list
-           my $self = shift;
-           return P5AST::attrlist->new(Kids => [$self->madness(':')])
-       },
-       ',' => sub {                            # "unary ," so to speak
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness(',');
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           return P5AST::listelem->new(Kids => [@newkids])
-       },
-       'C' => sub {                            # constant conditional
-           my $self = shift;
-           my @newkids;
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           my @folded = $self->madness('C');
-           if (@folded) {
-               my @t = $self->madness('t');
-               my @e = $self->madness('e');
-               if (@e) {
-                   return P5AST::op_cond_expr->new(
-                       Kids => [
-                           $self->madness('I ('),
-                           @folded,
-                           $self->madness(') ?'),
-                           P5AST::op_cond_expr->new(Kids => [@newkids]),
-                           $self->madness(':'),
-                           @e
-                       ] );
-               }
-               else {
-                   return P5AST::op_cond_expr->new(
-                       Kids => [
-                           $self->madness('I ('),
-                           @folded,
-                           $self->madness(') ?'),
-                           @t,
-                           $self->madness(':'),
-                           @newkids
-                       ] );
-               }
-           }
-           return P5AST::op_null->new(Kids => [@newkids])
-       },
-       '+' => sub {                            # unary +
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('+');
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           return P5AST::preplus->new(Kids => [@newkids])
-       },
-       'D' => sub {                            # do block
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('D');
-           push @newkids, $$self{Kids}[0]->ast($self,@_);
-           return P5AST::doblock->new(Kids => [@newkids])
-       },
-       '3' => sub {                            # C-style for loop
-           my $self = shift;
-           my @newkids;
-
-           # What a mess!
-           my (undef, $init, $lineseq) = @{$$self{Kids}[0]{Kids}};
-           my (undef, $leaveloop) = @{$$lineseq{Kids}};
-           my (undef, $null) = @{$$leaveloop{Kids}};
-           my $and;
-           my $cond;
-           my $lineseq2;
-           my $block;
-           my $cont;
-           if (exists $$null{was} and $$null{was} eq 'and') {
-               ($lineseq2) = @{$$null{Kids}};
-           }
-           else {
-               ($and) = @{$$null{Kids}};
-               ($cond, $lineseq2) = @{$$and{Kids}};
-           }
-           if ($$lineseq2{mp}{'{'}) {
-               $block = $lineseq2;
-           }
-           else {
-               ($block, $cont) = @{$$lineseq2{Kids}};
-           }
-
-           push @newkids, $self->madness('L 3 (');
-           push @newkids, $init->ast($self,@_);
-           push @newkids, $self->madness('1');
-           if (defined $cond) {
-               push @newkids, $cond->ast($self,@_);
-           }
-           elsif (defined $null) {
-               push @newkids, $null->madness('1');
-           }
-           push @newkids, $self->madness('2');
-           if (defined $cont) {
-               push @newkids, $cont->ast($self,@_);
-           }
-           push @newkids, $self->madness(')');
-           push @newkids, $block->blockast($self,@_);
-           $::curstate = 0;
-           return P5AST::cfor->new(Kids => [@newkids])
-       },
-       'o' => sub {                    # random useless operator
-           my $self = shift;
-           my @newkids;
-           push @newkids, $self->madness('o');
-           my $kind = $newkids[-1] || '';
-           $kind = $kind->uni if ref $kind;
-           my @subkids;
-           for my $kid (@{$$self{Kids}}) {
-               push @subkids, $kid->ast($self, @_);
-           }
-           if ($kind eq '=') { # stealth readline
-               unshift(@newkids, shift(@subkids));
-               push(@newkids, @subkids);
-               return P5AST::op_aassign->new(Kids => [@newkids])
-           }
-           else {
-               my $newself = $subkids[0];
-               splice(@{$newself->{Kids}}, 1, 0,
-                           $self->madness('ox ('),
-                           @newkids,
-                           $self->madness(')')
-               );
-               return $newself;
-           }
-       },
-    );
-}
-
-# Null nodes are an untyped mess inside Perl.  Instead of fixing it there,
-# we derive an effective type either from the "was" field or the first madprop.
-# (The individual routines select the actual new type.)
-
-sub ast {
-    my $self = shift;
-    my $was = $$self{was} || 'peg';
-    my $mad = $$self{mp}{FIRST} || "unknown";
-
-    # First try for a "was".
-    my $meth = "PLXML::op_${was}::astnull";
-    if (exists &{$meth}) {
-       return $self->$meth(@_);
-    }
-
-    # Look at first madprop.
-    if (exists $astmad{$mad}) {
-       return $astmad{$mad}->($self);
-    }
-    warn "No mad $mad" unless $mad eq 'unknown';
-
-    # Do something generic.
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-sub blockast {
-    my $self = shift;
-    local $::curstate;
-    local $::curenc = $::curenc;
-    return $self->madness('{ ; }');
-}
-
-package PLXML::op_stub;
-
-sub ast {
-    my $self = shift;
-    return $self->newtype->new(Kids => [$self->madness(', x ( ) q = Q')]);
-}
-
-package PLXML::op_scalar;
-
-sub ast {
-    my $self = shift;
-
-    my @pre = $self->madness('o q');
-    my $op = pop @pre;
-    if ($op->uni =~ /^<</) {
-       my @newkids;
-       my $opstub = bless { start => $op }, 'P5AST::heredoc';
-       push @newkids, $opstub;
-       push @newkids, $self->madness('(');
-
-       my @kids = @{$$self{Kids}};
-
-       my @divert;
-       for my $kid (@kids) {
-           next if ref $kid eq 'PLXML::op_pushmark';
-           next if ref $kid eq 'PLXML::op_null' and
-                   defined $$kid{was} and $$kid{was} eq 'pushmark';
-           push @divert, $kid->ast($self, @_);
-       }
-       $opstub->{doc} = P5AST::op_list->new(Kids => [@divert]);
-       $opstub->{end} = ($self->madness('Q'))[-1];
-
-       push @newkids, $self->madness(')');
-
-       return $self->newtype->new(Kids => [@pre,@newkids]);
-    }
-    return $self->PLXML::baseop_unop::ast();
-}
-
-package PLXML::op_pushmark;
-
-sub ast { () }
-
-package PLXML::op_wantarray;
-package PLXML::op_const;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    return unless $$self{mp};
-    push @newkids, $self->madness('q = Q X : f O ( )');
-    return P5AST::op_const->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-    return unless %{$$self{mp}};
-
-    my @before;
-
-    my $const;
-    my @args = $self->madness('f');
-    if (@args) {
-    }
-    elsif (exists $self->{mp}{q}) {
-       push @args, $self->madness('d q');
-       if ($args[-1]->uni =~ /^<</) {
-           my $opstub = bless { start => pop(@args) }, 'P5AST::heredoc';
-           $opstub->{doc} = P5AST::op_const->new(Kids => [$self->madness('=')]);
-           $opstub->{end} = ($self->madness('Q'))[-1];
-           push @args, $opstub;
-       }
-       else {
-           push @args, $self->madness('= Q');
-       }
-    }
-    elsif (exists $self->{mp}{X}) {
-       push @before, $self->madness('d');      # was local $[ probably
-       if (not $$self{mp}{O}) {
-           push @before, $self->madness('o');  # was unary
-       }
-       my @X = $self->madness(': X');
-       if (exists $$self{private} and $$self{private} =~ /BARE/) {
-           return $self->newtype->new(Kids => [@X]);
-       }
-       my $X = pop @X;
-       push @before, @X;
-       @args = (
-           $self->madness('x'),
-           $X);
-       if ($$self{mp}{O}) {
-           push @args, $self->madness('o O');
-       }
-    }
-    elsif (exists $self->{mp}{O}) {
-       push @args, $self->madness('O');
-    }
-    elsif ($$self{private} =~ /\bBARE\b/) {
-       @args = ($$self{PV});
-    }
-    elsif (exists $$self{mp}{o}) {
-       @args = $self->madness('o');
-    }
-    elsif (exists $$self{PV}) {
-       @args = ('"', $$self{PV}, '"');
-    }
-    elsif (exists $$self{NV}) {
-       @args = $$self{NV};
-    }
-    elsif (exists $$self{IV}) {
-       @args = $$self{IV};
-    }
-    else {
-       @args = $self->SUPER::text(@_);
-    }
-    return $self->newtype->new(Kids => [@before, @args]);
-}
-
-
-package PLXML::op_gvsv;
-
-sub ast {
-    my $self = shift;
-    my @args;
-    my @retval;
-    for my $attr (qw/gv GV flags/) {
-       if (exists $$self{$attr}) {
-           push @args, $attr, $$self{$attr};
-       }
-    }
-    push @retval, @args;
-    push @retval, $self->madness('X');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_gv;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('X K');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_gelem;
-
-sub ast {
-    my $self = shift;
-
-    local $::curstate; # in case there are statements in subscript
-    local $::curenc = $::curenc;
-    my @newkids;
-    push @newkids, $self->madness('dx d');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('o {');
-    push @newkids, $self->madness('}');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_padsv;
-
-sub ast {
-    my $self = shift;
-    my @args;
-    push @args, $self->madness('dx d ( $ )');
-
-    return $self->newtype->new(Kids => [@args]);
-}
-
-package PLXML::op_padav;
-
-sub astnull { ast(@_) }
-
-sub ast {
-    my $self = shift;
-    my @retval;
-    push @retval, $self->madness('dx d (');
-    push @retval, $self->madness('$ @');
-    push @retval, $self->madness(') o O');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_padhv;
-
-sub astnull { ast(@_) }
-
-sub ast {
-    my $self = shift;
-    my @retval;
-    push @retval, $self->madness('dx d (');
-    push @retval, $self->madness('$ @ %');
-    push @retval, $self->madness(') o O');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_padany;
-
-package PLXML::op_pushre;
-
-sub ast {
-    my $self = shift;
-    if ($$self{mp}{q}) {
-       return $self->madness('q = Q m');
-    }
-    if ($$self{mp}{X}) {
-       return $self->madness('X m');
-    }
-    if ($$self{mp}{e}) {
-       return $self->madness('e m');
-    }
-    return $$self{Kids}[1]->ast($self,@_), $self->madness('m');
-}
-
-package PLXML::op_rv2gv;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('dx d ( * $');
-    push @newkids, $$self{Kids}[0]->ast();
-    push @newkids, $self->madness(')');
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_rv2sv;
-
-sub astnull {
-    my $self = shift;
-    return P5AST::op_rv2sv->new(Kids => [$self->madness('O o dx d ( $ ) : a')]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('dx d ( $');
-    if (ref $$self{Kids}[0] ne "PLXML::op_gv") {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    push @newkids, $self->madness(') : a');
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_av2arylen;
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $$self{Kids}[0]->madness('l');
-    push @newkids, $$self{Kids}[0]->ast();
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_rv2cv;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('X');
-    return @newkids if @newkids;
-    if (exists $$self{mp}{'&'}) {
-       push @newkids, $self->madness('&');
-       if (@{$$self{Kids}}) {
-           push @newkids, $$self{Kids}[0]->ast(@_);
-       }
-    }
-    else {
-       push @newkids, $$self{Kids}[0]->ast(@_);
-    }
-    return P5AST::op_rv2cv->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('&');
-    if (@{$$self{Kids}}) {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_anoncode;
-
-sub ast {
-    my $self = shift;
-    my $arg = $$self{Kids}[0];
-    local $::curstate;         # hide nested statements in sub
-    local $::curenc = $::curenc;
-    if (defined $arg) {
-       return $arg->ast(@_);
-    }
-    return ';';  # XXX literal ; should come through somewhere
-}
-
-package PLXML::op_prototype;
-package PLXML::op_refgen;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o s a');
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_srefgen;
-
-sub ast {
-    my @newkids;
-    my $self = shift;
-    if ($$self{mp}{FIRST} eq '{') {
-       local $::curstate;      # this is officially a block, so hide it
-       local $::curenc = $::curenc;
-       push @newkids, $self->madness('{');
-       for my $kid (@{$$self{Kids}}) {
-           push @newkids, $kid->ast($self, @_);
-       }
-       push @newkids, $self->madness('; }');
-       return P5AST::op_stringify->new(Kids => [@newkids]);
-    }
-    else {
-       push @newkids, $self->madness('o [');
-       for my $kid (@{$$self{Kids}}) {
-           push @newkids, $kid->ast($self, @_);
-       }
-       push @newkids, $self->madness(']');
-       return P5AST::op_stringify->new(Kids => [@newkids]);
-    }
-}
-
-package PLXML::op_ref;
-package PLXML::op_bless;
-package PLXML::op_backtick;
-
-sub ast {
-    my $self = shift;
-    my @args;
-    if (exists $self->{mp}{q}) {
-       push @args, $self->madness('q');
-       if ($args[-1]->uni =~ /^<</) {
-           my $opstub = bless { start => $args[-1] }, 'P5AST::heredoc';
-           $args[-1] = $opstub;
-           $opstub->{doc} = P5AST::op_const->new(Kids => [$self->madness('=')]);
-           $opstub->{end} = ($self->madness('Q'))[-1];
-       }
-       else {
-           push @args, $self->madness('= Q');
-       }
-    }
-    return $self->newtype->new(Kids => [@args]);
-}
-
-package PLXML::op_glob;
-
-sub astnull {
-    my $self = shift;
-    my @retval = $self->madness('o q = Q');
-    if (not @retval or $retval[-1]->uni eq 'glob') {
-       push @retval, $self->madness('(');
-       push @retval, $$self{Kids}[0]->ast($self,@_);
-       push @retval, $self->madness(')');
-    }
-    return P5AST::op_glob->new(Kids => [@retval]);
-}
-
-package PLXML::op_readline;
-
-sub astnull {
-    my $self = shift;
-    my @retval;
-    if (exists $$self{mp}{q}) {
-       @retval = $self->madness('q = Q');
-    }
-    elsif (exists $$self{mp}{X}) {
-       @retval = $self->madness('X');
-    }
-    return P5AST::op_readline->new(Kids => [@retval]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-
-    my @args;
-    my $const;
-    if (exists $$self{mp}{q}) {
-       @args = $self->madness('q = Q');
-    }
-    elsif (exists $$self{mp}{X}) {
-       @args = $self->madness('X');
-    }
-    elsif (exists $$self{GV}) {
-       @args = $$self{IV};
-    }
-    elsif (@{$$self{Kids}}) {
-       @args = $self->PLXML::unop::ast(@_);
-    }
-    else {
-       @args = $self->SUPER::text(@_);
-    }
-    return $self->newtype->new(Kids => [@retval,@args]);
-}
-
-
-package PLXML::op_rcatline;
-package PLXML::op_regcmaybe;
-package PLXML::op_regcreset;
-package PLXML::op_regcomp;
-
-sub ast {
-    my $self = shift;
-    $self->PLXML::unop::ast(@_);
-}
-
-package PLXML::op_match;
-
-sub ast {
-    my $self = shift;
-    my $retval = $self->SUPER::ast(@_);
-    my $p5re;
-    if (not $p5re = $retval->p5text()) {
-       $retval = $self->newtype->new(Kids => [$self->madness('X q = Q m')]);
-       $p5re = $retval->p5text();
-    }
-    if ($deinterpolate) {
-       $retval->{P5re} = P5re::qrparse($p5re);
-    }
-    return $retval;
-}
-
-package PLXML::op_qr;
-
-sub ast {
-    my $self = shift;
-    my $retval;
-    if (exists $$self{flags}) {
-       $retval = $self->SUPER::ast(@_);
-    }
-    else {
-       $retval = $self->newtype->new(Kids => [$self->madness('X q = Q m')]);
-    }
-    if ($deinterpolate) {
-       my $p5re = $retval->p5text();
-       $retval->{P5re} = P5re::qrparse($p5re);
-    }
-    return $retval;
-}
-
-package PLXML::op_subst;
-
-sub ast {
-    my $self = shift;
-
-    my $bits = $self->fetchbits($$self{flags},@_);
-
-    my @newkids;
-    if ($bits->{binding}) {
-       push @newkids, $bits->{binding};
-       push @newkids, $self->madness('~');
-    }
-    my $X = p5::token->new($$self{mp}{X});
-    my @lfirst = $self->madness('q');
-    my @llast = $self->madness('Q');
-    push @newkids,
-       @lfirst,
-       $self->madness('E'),    # XXX s/b e probably
-       @llast;
-    my @rfirst = $self->madness('z');
-    my @rlast = $self->madness('Z');
-    my @mods = $self->madness('m');
-    if ($rfirst[-1]->uni ne $llast[-1]->uni) {
-       push @newkids, @rfirst;
-    }
-    # remove the fake '\n' if /e and '#' in replacement.
-    if (@mods and $mods[0] =~ m/e/ and ($self->madness('R'))[0]->uni =~ m/#/) {
-        unshift @rlast, bless {}, 'chomp'; # hack to remove '\n'
-    }
-    push @newkids, $bits->{repl}, @rlast, @mods;
-
-    my $retval = $self->newtype->new(Kids => [@newkids]);
-    if ($deinterpolate) {
-       my $p5re = $retval->p5text();
-       $retval->{P5re} = P5re::qrparse($p5re);
-    }
-    return $retval;
-}
-
-package PLXML::op_substcont;
-package PLXML::op_trans;
-
-sub ast {
-    my $self = shift;
-
-#    my $bits = $self->fetchbits($$self{flags},@_);
-#
-    my @newkids;
-    my @lfirst = $self->madness('q');
-    my @llast = $self->madness('Q');
-    push @newkids,
-       @lfirst,
-       $self->madness('E'),
-       @llast;
-    my @rfirst = $self->madness('z');
-    my @repl = $self->madness('R');
-    my @rlast = $self->madness('Z');
-    my @mods = $self->madness('m');
-    if ($rfirst[-1]->uni ne $llast[-1]->uni) {
-       push @newkids, @rfirst;
-    }
-
-    push @newkids, @repl, @rlast, @mods;
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_sassign;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    my $right = $$self{Kids}[1];
-    eval { push @newkids, $right->ast($self, @_); };
-
-    push @newkids, $self->madness('o');
-
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_aassign;
-
-sub astnull { ast(@_) }
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    my $right = $$self{Kids}[1];
-    push @newkids, $right->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_chop;
-package PLXML::op_schop;
-package PLXML::op_chomp;
-package PLXML::op_schomp;
-package PLXML::op_defined;
-package PLXML::op_undef;
-package PLXML::op_study;
-package PLXML::op_pos;
-package PLXML::op_preinc;
-
-sub ast {
-    my $self = shift;
-    if ($$self{targ}) {                # stealth post inc or dec
-       return $self->PLXML::op_postinc::ast(@_);
-    }
-    return $self->SUPER::ast(@_);
-}
-
-package PLXML::op_i_preinc;
-
-sub ast { my $self = shift; $self->PLXML::op_preinc::ast(@_); }
-
-package PLXML::op_predec;
-
-sub ast { my $self = shift; $self->PLXML::op_preinc::ast(@_); }
-
-package PLXML::op_i_predec;
-
-sub ast { my $self = shift; $self->PLXML::op_preinc::ast(@_); }
-
-package PLXML::op_postinc;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    push @newkids, $self->madness('o');
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_i_postinc;
-
-sub ast { my $self = shift; $self->PLXML::op_postinc::ast(@_); }
-
-package PLXML::op_postdec;
-
-sub ast { my $self = shift; $self->PLXML::op_postinc::ast(@_); }
-
-package PLXML::op_i_postdec;
-
-sub ast { my $self = shift; $self->PLXML::op_postinc::ast(@_); }
-
-package PLXML::op_pow;
-package PLXML::op_multiply;
-package PLXML::op_i_multiply;
-package PLXML::op_divide;
-package PLXML::op_i_divide;
-package PLXML::op_modulo;
-package PLXML::op_i_modulo;
-package PLXML::op_repeat;
-
-sub ast {
-    my $self = shift;
-    return $self->SUPER::ast(@_)
-       unless exists $$self{private} and $$self{private} =~ /DOLIST/;
-
-    my $newself = $$self{Kids}[0]->ast($self,@_);
-    splice @{$newself->{Kids}}, -1, 0, $self->madness('o');
-
-    return bless $newself, $self->newtype;     # rebless the op_null
-}
-
-package PLXML::op_add;
-package PLXML::op_i_add;
-package PLXML::op_subtract;
-package PLXML::op_i_subtract;
-package PLXML::op_concat;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-
-    my @after;
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $right = $$self{Kids}[1];
-    push @newkids, $right->ast($self, @_);
-    return P5AST::op_concat->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-    my $parent = $_[0];
-    my @newkids;
-
-    my @after;
-    my $left = $$self{Kids}[0];
-    push @newkids, $left->ast($self, @_);
-
-    push @newkids, $self->madness('o');
-
-    my $right = $$self{Kids}[1];
-    push @newkids, $right->ast($self, @_);
-
-    return $self->newtype->new(Kids => [@newkids, @after]);
-}
-
-package PLXML::op_stringify;
-
-sub astnull {
-    ast(@_);
-}
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-    my @front = $self->madness('q (');
-    my @back = $self->madness(') Q');
-    my @M = $self->madness('M');
-    if (@M) {
-       push @newkids, $M[0], $self->madness('o');
-    }
-    push @newkids, @front;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    push @newkids, @back;
-    return P5AST::op_stringify->new(Kids => [@newkids]);
-}
-
-package PLXML::op_left_shift;
-package PLXML::op_right_shift;
-package PLXML::op_lt;
-package PLXML::op_i_lt;
-package PLXML::op_gt;
-package PLXML::op_i_gt;
-package PLXML::op_le;
-package PLXML::op_i_le;
-package PLXML::op_ge;
-package PLXML::op_i_ge;
-package PLXML::op_eq;
-package PLXML::op_i_eq;
-package PLXML::op_ne;
-package PLXML::op_i_ne;
-package PLXML::op_ncmp;
-package PLXML::op_i_ncmp;
-package PLXML::op_slt;
-package PLXML::op_sgt;
-package PLXML::op_sle;
-package PLXML::op_sge;
-package PLXML::op_seq;
-package PLXML::op_sne;
-package PLXML::op_scmp;
-package PLXML::op_bit_and;
-package PLXML::op_bit_xor;
-package PLXML::op_bit_or;
-package PLXML::op_negate;
-package PLXML::op_i_negate;
-package PLXML::op_not;
-
-sub ast {
-    my $self = shift;
-    my @newkids = $self->madness('o (');
-    my @swap;
-    if (@newkids and $newkids[-1]->uni eq '!~') {
-       @swap = @newkids;
-       @newkids = ();
-    }
-
-    if (exists $$self{Kids}) {
-       my $arg = $$self{Kids}[0];
-       push @newkids, $arg->ast($self, @_) if defined $arg;
-    }
-    if (@swap) {
-       splice @{$newkids[-1][0]{Kids}}, -2, 0, @swap;  # XXX WAG
-    }
-    push @newkids, $self->madness(')');
-
-    my $res = $self->newtype->new(Kids => [@newkids]);
-    return $res;
-}
-
-package PLXML::op_complement;
-package PLXML::op_atan2;
-package PLXML::op_sin;
-package PLXML::op_cos;
-package PLXML::op_rand;
-package PLXML::op_srand;
-package PLXML::op_exp;
-package PLXML::op_log;
-package PLXML::op_sqrt;
-package PLXML::op_int;
-package PLXML::op_hex;
-package PLXML::op_oct;
-package PLXML::op_abs;
-package PLXML::op_length;
-package PLXML::op_substr;
-package PLXML::op_vec;
-package PLXML::op_index;
-package PLXML::op_rindex;
-package PLXML::op_sprintf;
-package PLXML::op_formline;
-package PLXML::op_ord;
-package PLXML::op_chr;
-package PLXML::op_crypt;
-package PLXML::op_ucfirst;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_lcfirst;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_uc;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_lc;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_quotemeta;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_rv2av;
-
-sub astnull {
-    my $self = shift;
-    return P5AST::op_rv2av->new(Kids => [$self->madness('$ @')]);
-}
-
-sub ast {
-    my $self = shift;
-
-    if (ref $$self{Kids}[0] eq 'PLXML::op_const' and $$self{mp}{'O'}) {
-       return $self->madness('O');
-    }
-
-    my @before;
-    push @before, $self->madness('dx d (');
-
-    my @newkids;
-    push @newkids, $self->madness('$ @ K');
-    if (ref $$self{Kids}[0] ne "PLXML::op_gv") {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    my @after;
-    push @after, $self->madness(') a');
-    return $self->newtype->new(Kids => [@before, @newkids, @after]);
-}
-
-package PLXML::op_aelemfast;
-
-sub ast {
-    my $self = shift;
-    return $self->madness('$');
-}
-
-package PLXML::op_aelem;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('dx d');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('a [');
-    push @newkids, $self->madness(']');
-    return P5AST::op_aelem->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @before = $self->madness('dx d');
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    splice @newkids, -1, 0, $self->madness('a [');
-    push @newkids, $self->madness(']');
-
-    return $self->newtype->new(Kids => [@before, @newkids]);
-}
-
-package PLXML::op_aslice;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('[');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d');
-    push @newkids, $self->madness(']');
-    return P5AST::op_aslice->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('[');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d');
-    push @newkids, $self->madness(']');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_each;
-package PLXML::op_values;
-package PLXML::op_keys;
-package PLXML::op_delete;
-package PLXML::op_exists;
-package PLXML::op_rv2hv;
-
-sub astnull {
-    my $self = shift;
-    return P5AST::op_rv2hv->new(Kids => [$self->madness('$')]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @before;
-    push @before, $self->madness('dx d (');
-
-    my @newkids;
-    push @newkids, $self->madness('$ @ % K');
-    if (ref $$self{Kids}[0] ne "PLXML::op_gv") {
-       push @newkids, $$self{Kids}[0]->ast();
-    }
-    my @after;
-    push @after, $self->madness(') a');
-    return $self->newtype->new(Kids => [@before, @newkids, @after]);
-}
-
-package PLXML::op_helem;
-
-sub astnull {
-    my $self = shift;
-    local $::curstate; # hash subscript potentially a lineseq
-    local $::curenc = $::curenc;
-
-    my @newkids;
-    push @newkids, $self->madness('dx d');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('a {');
-    push @newkids, $self->madness('}');
-    return P5AST::op_helem->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-    local $::curstate; # hash subscript potentially a lineseq
-    local $::curenc = $::curenc;
-
-    my @before = $self->madness('dx d');
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    splice @newkids, -1, 0, $self->madness('a {');
-    push @newkids, $self->madness('}');
-
-    return $self->newtype->new(Kids => [@before, @newkids]);
-}
-
-
-package PLXML::op_hslice;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('{');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d'); 
-    push @newkids, $self->madness('}');
-    return P5AST::op_hslice->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('{');
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast(@_);
-    }
-    unshift @newkids, pop @newkids;
-    unshift @newkids, $self->madness('dx d'); 
-    push @newkids, $self->madness('}');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_unpack;
-package PLXML::op_pack;
-package PLXML::op_split;
-package PLXML::op_join;
-package PLXML::op_list;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    my @retval;
-    my @before;
-    if (@retval = $self->madness('X')) {
-       push @before, $self->madness('x o');
-       return @before,@retval;
-    }
-    my @kids = @{$$self{Kids}};
-    for my $kid (@kids) {
-       next if ref $kid eq 'PLXML::op_pushmark';
-       next if ref $kid eq 'PLXML::op_null' and
-               defined $$kid{was} and $$kid{was} eq 'pushmark';
-       push @newkids, $kid->ast($self, @_);
-    }
-
-    my $x = "";
-    my @newnewkids = ();
-    push @newnewkids, $self->madness('dx d (');
-    push @newnewkids, @newkids;
-    push @newnewkids, $self->madness(') :');
-    return P5AST::op_list->new(Kids => [@newnewkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @before;
-    if (@retval = $self->madness('X')) {
-       push @before, $self->madness('o');
-       return $self->newtype->new(Kids => [@before,@retval]);
-    }
-    push @retval, $self->madness('dx d (');
-
-    my @newkids;
-    for my $kid (@{$$self{Kids}}) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    my $x = "";
-    my @newnewkids = ();
-    push @newnewkids, @newkids;
-    @newkids = @newnewkids;
-    push @retval, @newkids;
-    push @retval, $self->madness(') :');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_lslice;
-
-sub ast {
-    my $self = shift;
-    my @newkids;
-
-    if ($$self{mp}{q}) {
-       push @newkids, $self->madness('q = Q');
-    }
-    elsif ($$self{mp}{x}) {
-       push @newkids, $self->madness('x');
-    }
-    else {
-       push @newkids, $self->madness('(');
-       my $list = $$self{Kids}[1];
-       push @newkids, $list->ast($self, @_);
-       push @newkids, $self->madness(')');
-    }
-
-    push @newkids, $self->madness('[');
-
-    my $slice = $$self{Kids}[0];
-    push @newkids, $slice->ast($self, @_);
-    push @newkids, $self->madness(']');
-
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_anonlist;
-package PLXML::op_anonhash;
-package PLXML::op_splice;
-package PLXML::op_push;
-package PLXML::op_pop;
-package PLXML::op_shift;
-package PLXML::op_unshift;
-package PLXML::op_sort;
-package PLXML::op_reverse;
-
-sub astnull {
-    my $self = shift;
-    $self->PLXML::listop::ast(@_);
-}
-
-package PLXML::op_grepstart;
-package PLXML::op_grepwhile;
-package PLXML::op_mapstart;
-package PLXML::op_mapwhile;
-package PLXML::op_range;
-
-sub ast {
-    my $self = shift;
-    return $self->PLXML::binop::ast(@_);
-}
-
-package PLXML::op_flip;
-package PLXML::op_flop;
-package PLXML::op_and;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    my @first = $self->madness('1');
-    my @second = $self->madness('2');
-    my @stuff = $$self{Kids}[0]->ast();
-    if (my @I = $self->madness('I')) {
-       if (@second) {
-           push @newkids, @I;
-           push @newkids, $self->madness('(');
-           push @newkids, @stuff;
-           push @newkids, $self->madness(')');
-           push @newkids, @second;
-       }
-       else {
-           push @newkids, @I;
-           push @newkids, $self->madness('(');
-           push @newkids, @first;
-           push @newkids, $self->madness(')');
-           push @newkids, @stuff;
-       }
-    }
-    elsif (my @i = $self->madness('i')) {
-       if (@second) {
-           push @newkids, @second;
-           push @newkids, @i;
-           push @newkids, @stuff;
-       }
-       else {
-           push @newkids, @stuff;
-           push @newkids, @i;
-           push @newkids, @first;
-       }
-    }
-    elsif (my @o = $self->madness('o')) {
-       if (@second) {
-           push @newkids, @stuff;
-           push @newkids, @o;
-           push @newkids, @second;
-       }
-       else {
-           push @newkids, @first;
-           push @newkids, @o;
-           push @newkids, @stuff;
-       }
-    }
-    return P5AST::op_and->new(Kids => [@newkids]);
-}
-
-package PLXML::op_or;
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    my @first = $self->madness('1');
-    my @second = $self->madness('2');
-    my @i = $self->madness('i');
-    my @stuff = $$self{Kids}[0]->ast();
-    if (@second) {
-       if (@i) {
-           push @newkids, @second;
-           push @newkids, $self->madness('i');
-           push @newkids, @stuff;
-       }
-       else {
-           push @newkids, @stuff;
-           push @newkids, $self->madness('o');
-           push @newkids, @second;
-       }
-    }
-    else {
-       if (@i) {
-           push @newkids, @stuff;
-           push @newkids, $self->madness('i');
-           push @newkids, @first;
-       }
-       else {
-           push @newkids, @first;
-           push @newkids, $self->madness('o');
-           push @newkids, @stuff;
-       }
-    }
-    return "P5AST::op_$$self{was}"->new(Kids => [@newkids]);
-}
-
-
-package PLXML::op_xor;
-package PLXML::op_cond_expr;
-package PLXML::op_andassign;
-package PLXML::op_orassign;
-package PLXML::op_method;
-package PLXML::op_entersub;
-
-sub ast {
-    my $self = shift;
-
-    if ($$self{mp}{q}) {
-       return $self->madness('q = Q');
-    }
-    if ($$self{mp}{X}) {               # <FH> override?
-       return $self->madness('X');
-    }
-    if ($$self{mp}{A}) {
-       return $self->astmethod(@_);
-    }
-    if ($$self{mp}{a}) {
-       return $self->astarrow(@_);
-    }
-
-    my @retval;
-
-    my @newkids;
-    my @kids = @{$$self{Kids}};
-    if (@kids == 1 and ref $kids[0] eq 'PLXML::op_null' and $kids[0]{was} =~ /list/) {
-       @kids = @{$kids[0]{Kids}};
-    }
-    my $dest = pop @kids;
-    my @dest = $dest->ast($self, @_);
-    
-    if (ref($dest) =~ /method/) {
-       my $invocant = shift @kids;
-       $invocant = shift @kids if ref($invocant) eq 'PLXML::op_pushmark';
-       my @invocant = $invocant->ast($self, @_);
-       push @retval, @dest;
-       push @retval, @invocant;
-    }
-    elsif (exists $$self{mp}{o} and $$self{mp}{o} eq 'do') {
-       push @retval, $self->madness('o');
-       push @retval, @dest;
-    }
-    else {
-       push @retval, $self->madness('o');
-       push @retval, @dest;
-    }
-    while (@kids) {
-       my $kid = shift(@kids);
-       push @newkids, $kid->ast($self, @_);
-    }
-
-    push @retval, $self->madness('(');
-    push @retval, @newkids;
-    push @retval, $self->madness(')');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-sub astmethod {
-    my $self = shift;
-    my @newkids;
-    my @kids;
-    for my $kid (@{$$self{Kids}}) {
-       next if ref $kid eq 'PLXML::op_pushmark';
-       next if ref $kid eq 'PLXML::op_null' and
-               defined $$kid{was} and $$kid{was} eq 'pushmark';
-       push @kids, $kid;
-    }
-    my @invocant;
-    if ($$self{flags} =~ /\bSTACKED\b/) {
-       push @invocant, shift(@kids)->ast($self, @_);
-    }
-    for my $kid (@kids) {
-       push @newkids, $kid->ast($self, @_);
-    }
-    my $dest = pop(@newkids);
-    if (ref $dest eq 'PLXML::op_rv2cv' and $$self{flags} =~ /\bMOD\b/) {
-       $dest = pop(@newkids);
-    }
-    my $x = "";
-    my @retval;
-    push @retval, @invocant;
-    push @retval, $self->madness('A');
-    push @retval, $dest;
-    push @retval, $self->madness('(');
-    push @retval, @newkids;
-    push @retval, $self->madness(')');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-sub astarrow {
-    my $self = shift;
-    my @newkids;
-    my @retval;
-    my @kids = @{$$self{Kids}};
-    if (@kids == 1 and ref $kids[0] eq 'PLXML::op_null' and $kids[0]{was} =~ /list/) {
-       @kids = @{$kids[0]{Kids}};
-    }
-    while (@kids > 1) {
-       my $kid = shift(@kids);
-       push @newkids, $kid->ast($self, @_);
-    }
-    my @dest = $kids[0]->ast($self, @_);
-    my $x = "";
-    push @retval, @dest;
-    push @retval, $self->madness('a');
-    push @retval, $self->madness('(');
-    push @retval, @newkids;
-    push @retval, $self->madness(')');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_leavesub;
-
-sub ast {
-    my $self = shift;
-    if (ref $$self{Kids}[0] eq "PLXML::op_null") {
-       return $$self{Kids}[0]->ast(@_);
-    }
-    return $$self{Kids}[0]->blockast($self, @_);
-}
-
-package PLXML::op_leavesublv;
-
-sub ast {
-    my $self = shift;
-
-    return $$self{Kids}[0]->blockast($self, @_);
-}
-
-package PLXML::op_caller;
-package PLXML::op_warn;
-package PLXML::op_die;
-package PLXML::op_reset;
-package PLXML::op_lineseq;
-
-sub lineseq {
-    my $self = shift;
-    my @kids = @{$$self{Kids}};
-    local $::curstate = 0;     # (probably redundant, but that's okay)
-    local $::prevstate = 0;
-    local $::curenc = $::curenc;
-    my @retval;
-    my @newstuff;
-    my $newprev;
-    while (@kids) {
-       my $kid = shift @kids;
-       my $thing = $kid->ast($self, @_);
-       next unless defined $thing;
-       if ($::curstate ne $::prevstate) {
-           if ($::prevstate) {
-               push @newstuff, $::prevstate->madness(';');
-               push @{$newprev->{Kids}}, @newstuff if $newprev;
-               @newstuff = ();
-           }
-           $::prevstate = $::curstate;
-           $newprev = $thing;
-           push @retval, $thing;
-       }
-       elsif ($::prevstate) {
-           push @newstuff, $thing;
-       }
-       else {
-           push @retval, $thing;
-       }
-    }
-    if ($::prevstate) {
-       push @newstuff, $::prevstate->madness(';');
-       push @{$newprev->{Kids}}, @newstuff if $newprev;
-       @newstuff = ();
-       $::prevstate = 0;
-    }
-    return @retval;
-}
-
-sub blockast {
-    my $self = shift;
-    local $::curstate;
-
-    my @retval;
-    push @retval, $self->madness('{');
-    my @newkids = $self->PLXML::op_lineseq::lineseq(@_);
-    push @retval, @newkids;
-
-    push @retval, $self->madness('; }');
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_nextstate;
-
-sub newtype { return "P5AST::statement" }
-
-sub astnull {
-    my $self = shift;
-    my @newkids;
-    push @newkids, $self->madness('L');
-    $::curstate = $self;
-    return P5AST::statement->new(Kids => [@newkids]);
-}
-
-sub ast {
-    my $self = shift;
-
-    my @newkids;
-    push @newkids, $self->madness('L');
-    $::curstate = $self;
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-
-package PLXML::op_dbstate;
-package PLXML::op_unstack;
-package PLXML::op_enter;
-
-sub ast { () }
-
-package PLXML::op_leave;
-
-sub astnull {
-    ast(@_);
-}
-
-sub ast {
-    my $self = shift;
-
-    my $mad = $$self{mp}{FIRST} || "unknown";
-
-    my @retval;
-    if ($mad eq 'w') {
-       my @newkids;
-       my @tmpkids;
-       push @tmpkids, $self->{Kids};
-       my $anddo = $$self{Kids}[-1]{Kids}[0]{Kids};
-       eval { push @newkids, $anddo->[1]->ast($self,@_); };
-       push @newkids, "[[[NOANDDO]]]" if $@;
-       push @newkids, $self->madness('w');
-       push @newkids, $anddo->[0]->ast($self,@_);
-
-       return $self->newtype->new(Kids => [@newkids]);
-    }
-
-    local $::curstate;
-    push @retval, $self->madness('o {');
-
-    my @newkids = $self->PLXML::op_lineseq::lineseq(@_);
-    push @retval, @newkids;
-    push @retval, $self->madness(q/; }/);
-    my $retval = $self->newtype->new(Kids => [@retval]);
-
-    if ($$self{mp}{C}) {
-       my @before;
-       my @after;
-       push @before, $self->madness('I ( C )');
-       if ($$self{mp}{t}) {
-           push @before, $self->madness('t');
-       }
-       elsif ($$self{mp}{e}) {
-           push @after, $self->madness('e');
-       }
-       return P5AST::op_cond->new(Kids => [@before, $retval, @after]);
-    }
-    else {
-       return $retval;
-    }
-}
-
-package PLXML::op_scope;
-
-sub ast {
-    my $self = shift;
-    local $::curstate;
-
-    my @newkids;
-    push @newkids, $self->madness('o');
-
-    push @newkids, $self->madness('{');
-    push @newkids, $self->PLXML::op_lineseq::lineseq(@_);
-    push @newkids, $self->madness('; }');
-
-    my @folded = $self->madness('C');
-    if (@folded) {
-       my @t = $self->madness('t');
-       my @e = $self->madness('e');
-       if (@e) {
-           return $self->newtype->new(
-               Kids => [
-                   $self->madness('I ('),
-                   @folded,
-                   $self->madness(')'),
-                   $self->newtype->new(Kids => [@newkids]),
-                   @e
-               ] );
-       }
-       else {
-           return $self->newtype->new(
-               Kids => [
-                   $self->madness('I ('),
-                   @folded,
-                   $self->madness(')'),
-                   @t,
-                   $self->newtype->new(Kids => [@newkids])
-               ] );
-       }
-    }
-    return $self->newtype->new(Kids => [@newkids]);
-}
-
-package PLXML::op_enteriter;
-
-sub ast {
-    my $self = shift;
-    my (undef,$range,$var) = @{$self->{Kids}};
-    my @retval;
-    push @retval, $self->madness('v');
-    if (!@retval and defined $var) {
-       push @retval, $var->ast($self,@_);
-    }
-    else {
-       push @retval, '';
-    }
-    if (ref $range eq 'PLXML::op_null' and $$self{flags} =~ /STACKED/) {
-       my (undef,$min,$max) = @{$range->{Kids}};
-       push @retval, $min->ast($self,@_);
-       if (defined $max) {
-           if (exists $$range{mp}{O}) {        # deeply buried .. operator
-               PLXML::prepreproc($$range{mp}{O});
-               push @retval,
-                 $$range{mp}{'O'}{Kids}[0]{Kids}[0]{Kids}[0]{Kids}[0]->madness('o')
-           }
-           else {
-               push @retval, '..';             # XXX missing whitespace
-           }
-           push @retval, $max->ast($self,@_);
-       }
-    }
-    else {
-       push @retval, $range->ast($self,@_);
-    }
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_iter;
-package PLXML::op_enterloop;
-
-sub ast {
-}
-
-package PLXML::op_leaveloop;
-
-sub ast {
-    my $self = shift;
-
-    my @retval;
-    my @newkids;
-    my $enterloop = $$self{Kids}[0];
-    my $nextthing = $$self{Kids}[1];
-
-    if ($$self{mp}{W}) {
-       push @retval, $self->madness('L');
-       push @newkids, $self->madness('W d');
-
-       if (ref $enterloop eq 'PLXML::op_enteriter') {
-           my ($var,@rest) = @{$enterloop->ast($self,@_)->{Kids}};
-           push @newkids, $var if $var;
-           push @newkids, $self->madness('q ( x = Q');
-           push @newkids, @rest;
-       }
-       else {
-           push @newkids, $self->madness('(');
-           push @newkids, $enterloop->ast($self,@_);
-       }
-    }
-    my $andor;
-
-    if (ref $nextthing eq 'PLXML::op_null') {
-       if ($$nextthing{mp}{'1'}) {
-           push @newkids, $nextthing->madness('1');
-           push @newkids, $self->madness(')');
-           push @newkids, $$nextthing{Kids}[0]->blockast($self,@_);
-       }
-       elsif ($$nextthing{mp}{'2'}) {
-           push @newkids, $$nextthing{Kids}[0]->ast($self,@_);
-           push @newkids, $self->madness(')');
-           push @newkids, $$nextthing{mp}{'2'}->blockast($self,@_);
-       }
-       elsif ($$nextthing{mp}{'U'}) {
-           push @newkids, $nextthing->ast($self,@_);
-       }
-       else {
-           # bypass the op_null
-           $andor = $nextthing->{Kids}[0];
-           eval {
-               push @newkids, $$andor{Kids}[0]->ast($self, @_);
-           };
-           push @newkids, $self->madness(')');
-           eval {
-               push @newkids, $$andor{Kids}[1]->blockast($self, @_);
-           };
-       }
-    }
-    else {
-       $andor = $nextthing;
-       push @newkids, $nextthing->madness('O');
-       push @newkids, $self->madness(')');
-       push @newkids, $nextthing->blockast($self, @_);
-    }
-    if ($$self{mp}{w}) {
-       push @newkids, $self->madness('w');
-       push @newkids, $enterloop->ast($self,@_);
-    }
-
-    push @retval, @newkids;
-
-    return $self->newtype->new(Kids => [@retval]);
-}
-
-package PLXML::op_return;
-package PLXML::op_last;
-package PLXML::op_next;
-package PLXML::op_redo;
-package PLXML::op_dump;
-package PLXML::op_goto;
-package PLXML::op_exit;
-package PLXML::op_open;
-package PLXML::op_close;
-package PLXML::op_pipe_op;
-package PLXML::op_fileno;
-package PLXML::op_umask;
-package PLXML::op_binmode;
-package PLXML::op_tie;
-package PLXML::op_untie;
-package PLXML::op_tied;
-package PLXML::op_dbmopen;
-package PLXML::op_dbmclose;
-package PLXML::op_sselect;
-package PLXML::op_select;
-package PLXML::op_getc;
-package PLXML::op_read;
-package PLXML::op_enterwrite;
-package PLXML::op_leavewrite;
-package PLXML::op_prtf;
-package PLXML::op_print;
-package PLXML::op_say;
-package PLXML::op_sysopen;
-package PLXML::op_sysseek;
-package PLXML::op_sysread;
-package PLXML::op_syswrite;
-package PLXML::op_send;
-package PLXML::op_recv;
-package PLXML::op_eof;
-package PLXML::op_tell;
-package PLXML::op_seek;
-package PLXML::op_truncate;
-package PLXML::op_fcntl;
-package PLXML::op_ioctl;
-package PLXML::op_flock;
-package PLXML::op_socket;
-package PLXML::op_sockpair;
-package PLXML::op_bind;
-package PLXML::op_connect;
-package PLXML::op_listen;
-package PLXML::op_accept;
-package PLXML::op_shutdown;
-package PLXML::op_gsockopt;
-package PLXML::op_ssockopt;
-package PLXML::op_getsockname;
-package PLXML::op_getpeername;
-package PLXML::op_lstat;
-package PLXML::op_stat;
-package PLXML::op_ftrread;
-package PLXML::op_ftrwrite;
-package PLXML::op_ftrexec;
-package PLXML::op_fteread;
-package PLXML::op_ftewrite;
-package PLXML::op_fteexec;
-package PLXML::op_ftis;
-package PLXML::op_fteowned;
-package PLXML::op_ftrowned;
-package PLXML::op_ftzero;
-package PLXML::op_ftsize;
-package PLXML::op_ftmtime;
-package PLXML::op_ftatime;
-package PLXML::op_ftctime;
-package PLXML::op_ftsock;
-package PLXML::op_ftchr;
-package PLXML::op_ftblk;
-package PLXML::op_ftfile;
-package PLXML::op_ftdir;
-package PLXML::op_ftpipe;
-package PLXML::op_ftlink;
-package PLXML::op_ftsuid;
-package PLXML::op_ftsgid;
-package PLXML::op_ftsvtx;
-package PLXML::op_fttty;
-package PLXML::op_fttext;
-package PLXML::op_ftbinary;
-package PLXML::op_chdir;
-package PLXML::op_chown;
-package PLXML::op_chroot;
-package PLXML::op_unlink;
-package PLXML::op_chmod;
-package PLXML::op_utime;
-package PLXML::op_rename;
-package PLXML::op_link;
-package PLXML::op_symlink;
-package PLXML::op_readlink;
-package PLXML::op_mkdir;
-package PLXML::op_rmdir;
-package PLXML::op_open_dir;
-package PLXML::op_readdir;
-package PLXML::op_telldir;
-package PLXML::op_seekdir;
-package PLXML::op_rewinddir;
-package PLXML::op_closedir;
-package PLXML::op_fork;
-package PLXML::op_wait;
-package PLXML::op_waitpid;
-package PLXML::op_system;
-package PLXML::op_exec;
-package PLXML::op_kill;
-package PLXML::op_getppid;
-package PLXML::op_getpgrp;
-package PLXML::op_setpgrp;
-package PLXML::op_getpriority;
-package PLXML::op_setpriority;
-package PLXML::op_time;
-package PLXML::op_tms;
-package PLXML::op_localtime;
-package PLXML::op_gmtime;
-package PLXML::op_alarm;
-package PLXML::op_sleep;
-package PLXML::op_shmget;
-package PLXML::op_shmctl;
-package PLXML::op_shmread;
-package PLXML::op_shmwrite;
-package PLXML::op_msgget;
-package PLXML::op_msgctl;
-package PLXML::op_msgsnd;
-package PLXML::op_msgrcv;
-package PLXML::op_semget;
-package PLXML::op_semctl;
-package PLXML::op_semop;
-package PLXML::op_require;
-package PLXML::op_dofile;
-package PLXML::op_entereval;
-
-sub ast {
-    my $self = shift;
-    local $::curstate;         # eval {} has own statement sequence
-    return $self->SUPER::ast(@_);
-}
-
-package PLXML::op_leaveeval;
-package PLXML::op_entertry;
-package PLXML::op_leavetry;
-
-sub ast {
-    my $self = shift;
-
-    return $self->PLXML::op_leave::ast(@_);
-}
-
-package PLXML::op_ghbyname;
-package PLXML::op_ghbyaddr;
-package PLXML::op_ghostent;
-package PLXML::op_gnbyname;
-package PLXML::op_gnbyaddr;
-package PLXML::op_gnetent;
-package PLXML::op_gpbyname;
-package PLXML::op_gpbynumber;
-package PLXML::op_gprotoent;
-package PLXML::op_gsbyname;
-package PLXML::op_gsbyport;
-package PLXML::op_gservent;
-package PLXML::op_shostent;
-package PLXML::op_snetent;
-package PLXML::op_sprotoent;
-package PLXML::op_sservent;
-package PLXML::op_ehostent;
-package PLXML::op_enetent;
-package PLXML::op_eprotoent;
-package PLXML::op_eservent;
-package PLXML::op_gpwnam;
-package PLXML::op_gpwuid;
-package PLXML::op_gpwent;
-package PLXML::op_spwent;
-package PLXML::op_epwent;
-package PLXML::op_ggrnam;
-package PLXML::op_ggrgid;
-package PLXML::op_ggrent;
-package PLXML::op_sgrent;
-package PLXML::op_egrent;
-package PLXML::op_getlogin;
-package PLXML::op_syscall;
-package PLXML::op_lock;
-package PLXML::op_threadsv;
-package PLXML::op_setstate;
-package PLXML::op_method_named;
-
-sub ast {
-    my $self = shift;
-    return $self->madness('O');
-}
-
-package PLXML::op_dor;
-
-sub astnull {
-    my $self = shift;
-    $self->PLXML::op_or::astnull(@_);
-}
-
-package PLXML::op_dorassign;
-package PLXML::op_custom;
-
diff --git a/mad/P5AST.pm b/mad/P5AST.pm
deleted file mode 100644 (file)
index 13a35e1..0000000
+++ /dev/null
@@ -1,541 +0,0 @@
-package P5AST;
-
-$::herequeue = '';
-
-1;
-
-{
-    my %newkey = qw(
-    );
-
-    sub translate {
-       my $class = shift;
-       my $key = shift;
-       $key = $newkey{$key} || "op_$key";
-       return "P5AST::$key";
-    }
-}
-
-sub new {
-    my $class = shift;
-    bless {@_}, $class;
-}
-
-sub AUTOLOAD {
-    warn "AUTOLOAD $P5AST::AUTOLOAD(" . join(',', @_) . ")\n";
-}
-
-sub DESTROY { }
-
-sub p5arraytext {
-    my $kid = shift;
-    my $text = "";
-    for my $subkid (@$kid) {
-       my $type = ref $subkid;
-       if ($type eq 'ARRAY') {
-           if ($dowarn) {
-               warn "Extra array\n";
-               $text .= '〔 '. p5arraytext($subkid) . ' 〕';
-           }
-           else {
-               $text .= p5arraytext($subkid);
-           }
-       }
-       elsif ($type =~ /^p5::/) {
-           my $newtext = $subkid->enc();
-           if ($::herequeue && $newtext =~ s/\n/\n$::herequeue/) {
-               $::herequeue = '';
-           }
-           $text .= $newtext;
-       }
-       elsif ($type) {
-           $text .= $subkid->text(@_);
-       }
-       else {
-           $text .= $subkid;
-       }
-    }
-    return $text;
-}
-
-sub p5text {
-    my $self = shift;
-#    my $pre = $self->pretext();
-#    my $post = $self->posttext();
-    my $text = "";
-    foreach my $kid (@{$$self{Kids}}) {
-       my $type = ref $kid;
-       if ($type eq 'ARRAY') {
-           $text .= p5arraytext($kid);
-       }
-       elsif ($type =~ /^p5::/) {
-           my $newtext = $kid->enc();
-           if ($::herequeue && $newtext =~ s/\n/\n$::herequeue/) {
-               $::herequeue = '';
-           }
-           $text .= $newtext;
-       }
-        elsif ($type eq "chomp") {
-            $text =~ s/\n$//g;
-        }
-       elsif ($type) {
-           $text .= $kid->p5text(@_);
-       }
-       elsif (defined $kid) {
-           $text .= $kid;
-       }
-       else {
-           $text .= '[[[ UNDEF ]]]';
-       }
-    }
-    return $text;
-}
-
-sub p5subtext {
-    my $self = shift;
-    my @text;
-    foreach my $kid (@{$$self{Kids}}) {
-       my $text = $kid->p5text(@_);
-       push @text, $text if defined $text;
-    }
-    return @text;
-}
-
-sub p6text {
-    return $_[0]->p5text();    # assume it's the same
-}
-
-package P5AST::heredoc; @ISA = 'P5AST';
-
-sub p5text {
-    my $self = shift;
-    my $newdoc;
-    {
-       local $::herequeue;                     # don't interpolate outer heredoc yet
-       $newdoc = $self->{doc}->p5text(@_) .  $self->{end}->enc();
-       if ($::herequeue) {                     # heredoc within the heredoc?
-           $newdoc .= $::herequeue;
-           $::herequeue = '';
-       }
-    }
-    $::herequeue .= $newdoc;
-    my $start = $self->{start};
-    my $type = ref $start;
-    if ($type =~ /^p5::/) {            # XXX too much cut-n-paste here...
-       return $start->enc();
-    }
-    elsif ($type) {
-       return $start->p5text(@_);
-    }
-    else {
-       return $start;
-    }
-}
-
-package P5AST::BAD;
-
-sub p5text {
-    my $self = shift;
-    my $t = ref $t;
-    warn "Shouldn't have a node of type $t";
-}
-
-package P5AST::baseop;                 @ISA = 'P5AST';
-package P5AST::baseop_unop;    @ISA = 'P5AST::baseop';
-package P5AST::binop;          @ISA = 'P5AST::baseop';
-package P5AST::cop;            @ISA = 'P5AST::baseop';
-package P5AST::filestatop;     @ISA = 'P5AST::baseop';
-package P5AST::listop;                 @ISA = 'P5AST::baseop';
-package P5AST::logop;          @ISA = 'P5AST::baseop';
-package P5AST::loop;           @ISA = 'P5AST::baseop';
-package P5AST::loopexop;       @ISA = 'P5AST::baseop';
-package P5AST::padop;          @ISA = 'P5AST::baseop';
-package P5AST::padop_svop;     @ISA = 'P5AST::baseop';
-package P5AST::pmop;           @ISA = 'P5AST::baseop';
-package P5AST::pvop_svop;      @ISA = 'P5AST::baseop';
-package P5AST::unop;           @ISA = 'P5AST::baseop';
-
-# Nothing.
-
-package P5AST::op_null;        @ISA = 'P5AST::baseop';
-package P5AST::op_stub;        @ISA = 'P5AST::baseop';
-package P5AST::op_scalar;      @ISA = 'P5AST::baseop_unop';
-
-# Pushy stuff.
-
-package P5AST::op_pushmark;    @ISA = 'P5AST::baseop';
-package P5AST::op_wantarray;   @ISA = 'P5AST::baseop';
-package P5AST::op_const;       @ISA = 'P5AST::padop_svop';
-package P5AST::op_gvsv;        @ISA = 'P5AST::padop_svop';
-package P5AST::op_gv;          @ISA = 'P5AST::padop_svop';
-package P5AST::op_gelem;       @ISA = 'P5AST::binop';
-package P5AST::op_padsv;       @ISA = 'P5AST::baseop';
-package P5AST::op_padav;       @ISA = 'P5AST::baseop';
-package P5AST::op_padhv;       @ISA = 'P5AST::baseop';
-package P5AST::op_padany;      @ISA = 'P5AST::baseop';
-package P5AST::op_pushre;      @ISA = 'P5AST::pmop';
-package P5AST::op_rv2gv;       @ISA = 'P5AST::unop';
-package P5AST::op_rv2sv;       @ISA = 'P5AST::unop';
-package P5AST::op_av2arylen;   @ISA = 'P5AST::unop';
-package P5AST::op_rv2cv;       @ISA = 'P5AST::unop';
-package P5AST::op_anoncode;    @ISA = 'P5AST::padop_svop';
-package P5AST::op_prototype;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_refgen;      @ISA = 'P5AST::unop';
-package P5AST::op_srefgen;     @ISA = 'P5AST::unop';
-package P5AST::op_ref;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_bless;       @ISA = 'P5AST::listop';
-package P5AST::op_backtick;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_glob;        @ISA = 'P5AST::listop';
-package P5AST::op_readline;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rcatline;    @ISA = 'P5AST::padop_svop';
-package P5AST::op_regcmaybe;   @ISA = 'P5AST::unop';
-package P5AST::op_regcreset;   @ISA = 'P5AST::unop';
-package P5AST::op_regcomp;     @ISA = 'P5AST::logop';
-package P5AST::op_match;       @ISA = 'P5AST::pmop';
-package P5AST::op_qr;          @ISA = 'P5AST::pmop';
-package P5AST::op_subst;       @ISA = 'P5AST::pmop';
-package P5AST::op_substcont;   @ISA = 'P5AST::logop';
-package P5AST::op_trans;       @ISA = 'P5AST::pvop_svop';
-package P5AST::op_sassign;     @ISA = 'P5AST::baseop';
-package P5AST::op_aassign;     @ISA = 'P5AST::binop';
-package P5AST::op_chop;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_schop;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_chomp;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_schomp;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_defined;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_undef;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_study;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_pos;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_preinc;      @ISA = 'P5AST::unop';
-package P5AST::op_i_preinc;    @ISA = 'P5AST::unop';
-package P5AST::op_predec;      @ISA = 'P5AST::unop';
-package P5AST::op_i_predec;    @ISA = 'P5AST::unop';
-package P5AST::op_postinc;     @ISA = 'P5AST::unop';
-package P5AST::op_i_postinc;   @ISA = 'P5AST::unop';
-package P5AST::op_postdec;     @ISA = 'P5AST::unop';
-package P5AST::op_i_postdec;   @ISA = 'P5AST::unop';
-package P5AST::op_pow;                 @ISA = 'P5AST::binop';
-package P5AST::op_multiply;    @ISA = 'P5AST::binop';
-package P5AST::op_i_multiply;  @ISA = 'P5AST::binop';
-package P5AST::op_divide;      @ISA = 'P5AST::binop';
-package P5AST::op_i_divide;    @ISA = 'P5AST::binop';
-package P5AST::op_modulo;      @ISA = 'P5AST::binop';
-package P5AST::op_i_modulo;    @ISA = 'P5AST::binop';
-package P5AST::op_repeat;      @ISA = 'P5AST::binop';
-package P5AST::op_add;                 @ISA = 'P5AST::binop';
-package P5AST::op_i_add;       @ISA = 'P5AST::binop';
-package P5AST::op_subtract;    @ISA = 'P5AST::binop';
-package P5AST::op_i_subtract;  @ISA = 'P5AST::binop';
-package P5AST::op_concat;      @ISA = 'P5AST::binop';
-package P5AST::op_stringify;   @ISA = 'P5AST::listop';
-package P5AST::op_left_shift;  @ISA = 'P5AST::binop';
-package P5AST::op_right_shift;         @ISA = 'P5AST::binop';
-package P5AST::op_lt;          @ISA = 'P5AST::binop';
-package P5AST::op_i_lt;        @ISA = 'P5AST::binop';
-package P5AST::op_gt;          @ISA = 'P5AST::binop';
-package P5AST::op_i_gt;        @ISA = 'P5AST::binop';
-package P5AST::op_le;          @ISA = 'P5AST::binop';
-package P5AST::op_i_le;        @ISA = 'P5AST::binop';
-package P5AST::op_ge;          @ISA = 'P5AST::binop';
-package P5AST::op_i_ge;        @ISA = 'P5AST::binop';
-package P5AST::op_eq;          @ISA = 'P5AST::binop';
-package P5AST::op_i_eq;        @ISA = 'P5AST::binop';
-package P5AST::op_ne;          @ISA = 'P5AST::binop';
-package P5AST::op_i_ne;        @ISA = 'P5AST::binop';
-package P5AST::op_ncmp;        @ISA = 'P5AST::binop';
-package P5AST::op_i_ncmp;      @ISA = 'P5AST::binop';
-package P5AST::op_slt;                 @ISA = 'P5AST::binop';
-package P5AST::op_sgt;                 @ISA = 'P5AST::binop';
-package P5AST::op_sle;                 @ISA = 'P5AST::binop';
-package P5AST::op_sge;                 @ISA = 'P5AST::binop';
-package P5AST::op_seq;                 @ISA = 'P5AST::binop';
-package P5AST::op_sne;                 @ISA = 'P5AST::binop';
-package P5AST::op_scmp;        @ISA = 'P5AST::binop';
-package P5AST::op_bit_and;     @ISA = 'P5AST::binop';
-package P5AST::op_bit_xor;     @ISA = 'P5AST::binop';
-package P5AST::op_bit_or;      @ISA = 'P5AST::binop';
-package P5AST::op_negate;      @ISA = 'P5AST::unop';
-package P5AST::op_i_negate;    @ISA = 'P5AST::unop';
-package P5AST::op_not;                 @ISA = 'P5AST::unop';
-package P5AST::op_complement;  @ISA = 'P5AST::unop';
-package P5AST::op_atan2;       @ISA = 'P5AST::listop';
-package P5AST::op_sin;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_cos;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rand;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_srand;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_exp;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_log;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sqrt;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_int;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_hex;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_oct;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_abs;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_length;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_substr;      @ISA = 'P5AST::listop';
-package P5AST::op_vec;                 @ISA = 'P5AST::listop';
-package P5AST::op_index;       @ISA = 'P5AST::listop';
-package P5AST::op_rindex;      @ISA = 'P5AST::listop';
-package P5AST::op_sprintf;     @ISA = 'P5AST::listop';
-package P5AST::op_formline;    @ISA = 'P5AST::listop';
-package P5AST::op_ord;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_chr;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_crypt;       @ISA = 'P5AST::listop';
-package P5AST::op_ucfirst;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lcfirst;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_uc;          @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lc;          @ISA = 'P5AST::baseop_unop';
-package P5AST::op_quotemeta;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rv2av;       @ISA = 'P5AST::unop';
-package P5AST::op_aelemfast;   @ISA = 'P5AST::padop_svop';
-package P5AST::op_aelem;       @ISA = 'P5AST::binop';
-package P5AST::op_aslice;      @ISA = 'P5AST::listop';
-package P5AST::op_each;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_values;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_keys;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_delete;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_exists;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_rv2hv;       @ISA = 'P5AST::unop';
-package P5AST::op_helem;       @ISA = 'P5AST::listop';
-package P5AST::op_hslice;      @ISA = 'P5AST::listop';
-package P5AST::op_unpack;      @ISA = 'P5AST::listop';
-package P5AST::op_pack;        @ISA = 'P5AST::listop';
-package P5AST::op_split;       @ISA = 'P5AST::listop';
-package P5AST::op_join;        @ISA = 'P5AST::listop';
-package P5AST::op_list;        @ISA = 'P5AST::listop';
-package P5AST::op_lslice;      @ISA = 'P5AST::binop';
-package P5AST::op_anonlist;    @ISA = 'P5AST::listop';
-package P5AST::op_anonhash;    @ISA = 'P5AST::listop';
-package P5AST::op_splice;      @ISA = 'P5AST::listop';
-package P5AST::op_push;        @ISA = 'P5AST::listop';
-package P5AST::op_pop;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_shift;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_unshift;     @ISA = 'P5AST::listop';
-package P5AST::op_sort;        @ISA = 'P5AST::listop';
-package P5AST::op_reverse;     @ISA = 'P5AST::listop';
-package P5AST::op_grepstart;   @ISA = 'P5AST::listop';
-package P5AST::op_grepwhile;   @ISA = 'P5AST::logop';
-package P5AST::op_mapstart;    @ISA = 'P5AST::listop';
-package P5AST::op_mapwhile;    @ISA = 'P5AST::logop';
-package P5AST::op_range;       @ISA = 'P5AST::logop';
-package P5AST::op_flip;        @ISA = 'P5AST::unop';
-package P5AST::op_flop;        @ISA = 'P5AST::unop';
-package P5AST::op_and;                 @ISA = 'P5AST::logop';
-package P5AST::op_or;          @ISA = 'P5AST::logop';
-package P5AST::op_xor;                 @ISA = 'P5AST::binop';
-package P5AST::op_cond_expr;   @ISA = 'P5AST::logop';
-package P5AST::op_andassign;   @ISA = 'P5AST::logop';
-package P5AST::op_orassign;    @ISA = 'P5AST::logop';
-package P5AST::op_method;      @ISA = 'P5AST::unop';
-package P5AST::op_entersub;    @ISA = 'P5AST::unop';
-package P5AST::op_leavesub;    @ISA = 'P5AST::unop';
-package P5AST::op_leavesublv;  @ISA = 'P5AST::unop';
-package P5AST::op_caller;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_warn;        @ISA = 'P5AST::listop';
-package P5AST::op_die;                 @ISA = 'P5AST::listop';
-package P5AST::op_reset;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lineseq;     @ISA = 'P5AST::listop';
-package P5AST::op_nextstate;   @ISA = 'P5AST::BAD';
-package P5AST::op_dbstate;     @ISA = 'P5AST::cop';
-package P5AST::op_unstack;     @ISA = 'P5AST::baseop';
-package P5AST::op_enter;       @ISA = 'P5AST::baseop';
-package P5AST::op_leave;       @ISA = 'P5AST::listop';
-package P5AST::op_scope;       @ISA = 'P5AST::listop';
-package P5AST::op_enteriter;   @ISA = 'P5AST::loop';
-package P5AST::op_iter;        @ISA = 'P5AST::baseop';
-package P5AST::op_enterloop;   @ISA = 'P5AST::loop';
-package P5AST::op_leaveloop;   @ISA = 'P5AST::binop';
-package P5AST::op_return;      @ISA = 'P5AST::listop';
-package P5AST::op_last;        @ISA = 'P5AST::loopexop';
-package P5AST::op_next;        @ISA = 'P5AST::loopexop';
-package P5AST::op_redo;        @ISA = 'P5AST::loopexop';
-package P5AST::op_dump;        @ISA = 'P5AST::loopexop';
-package P5AST::op_goto;        @ISA = 'P5AST::loopexop';
-package P5AST::op_exit;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_open;        @ISA = 'P5AST::listop';
-package P5AST::op_close;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_pipe_op;     @ISA = 'P5AST::listop';
-package P5AST::op_fileno;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_umask;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_binmode;     @ISA = 'P5AST::listop';
-package P5AST::op_tie;                 @ISA = 'P5AST::listop';
-package P5AST::op_untie;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_tied;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_dbmopen;     @ISA = 'P5AST::listop';
-package P5AST::op_dbmclose;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sselect;     @ISA = 'P5AST::listop';
-package P5AST::op_select;      @ISA = 'P5AST::listop';
-package P5AST::op_getc;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_read;        @ISA = 'P5AST::listop';
-package P5AST::op_enterwrite;  @ISA = 'P5AST::baseop_unop';
-package P5AST::op_leavewrite;  @ISA = 'P5AST::unop';
-package P5AST::op_prtf;        @ISA = 'P5AST::listop';
-package P5AST::op_print;       @ISA = 'P5AST::listop';
-package P5AST::op_say;         @ISA = 'P5AST::listop';
-package P5AST::op_sysopen;     @ISA = 'P5AST::listop';
-package P5AST::op_sysseek;     @ISA = 'P5AST::listop';
-package P5AST::op_sysread;     @ISA = 'P5AST::listop';
-package P5AST::op_syswrite;    @ISA = 'P5AST::listop';
-package P5AST::op_send;        @ISA = 'P5AST::listop';
-package P5AST::op_recv;        @ISA = 'P5AST::listop';
-package P5AST::op_eof;                 @ISA = 'P5AST::baseop_unop';
-package P5AST::op_tell;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_seek;        @ISA = 'P5AST::listop';
-package P5AST::op_truncate;    @ISA = 'P5AST::listop';
-package P5AST::op_fcntl;       @ISA = 'P5AST::listop';
-package P5AST::op_ioctl;       @ISA = 'P5AST::listop';
-package P5AST::op_flock;       @ISA = 'P5AST::listop';
-package P5AST::op_socket;      @ISA = 'P5AST::listop';
-package P5AST::op_sockpair;    @ISA = 'P5AST::listop';
-package P5AST::op_bind;        @ISA = 'P5AST::listop';
-package P5AST::op_connect;     @ISA = 'P5AST::listop';
-package P5AST::op_listen;      @ISA = 'P5AST::listop';
-package P5AST::op_accept;      @ISA = 'P5AST::listop';
-package P5AST::op_shutdown;    @ISA = 'P5AST::listop';
-package P5AST::op_gsockopt;    @ISA = 'P5AST::listop';
-package P5AST::op_ssockopt;    @ISA = 'P5AST::listop';
-package P5AST::op_getsockname;         @ISA = 'P5AST::baseop_unop';
-package P5AST::op_getpeername;         @ISA = 'P5AST::baseop_unop';
-package P5AST::op_lstat;       @ISA = 'P5AST::filestatop';
-package P5AST::op_stat;        @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrread;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrwrite;    @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrexec;     @ISA = 'P5AST::filestatop';
-package P5AST::op_fteread;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftewrite;    @ISA = 'P5AST::filestatop';
-package P5AST::op_fteexec;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftis;        @ISA = 'P5AST::filestatop';
-package P5AST::op_fteowned;    @ISA = 'P5AST::filestatop';
-package P5AST::op_ftrowned;    @ISA = 'P5AST::filestatop';
-package P5AST::op_ftzero;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsize;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftmtime;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftatime;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftctime;     @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsock;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftchr;       @ISA = 'P5AST::filestatop';
-package P5AST::op_ftblk;       @ISA = 'P5AST::filestatop';
-package P5AST::op_ftfile;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftdir;       @ISA = 'P5AST::filestatop';
-package P5AST::op_ftpipe;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftlink;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsuid;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsgid;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftsvtx;      @ISA = 'P5AST::filestatop';
-package P5AST::op_fttty;       @ISA = 'P5AST::filestatop';
-package P5AST::op_fttext;      @ISA = 'P5AST::filestatop';
-package P5AST::op_ftbinary;    @ISA = 'P5AST::filestatop';
-package P5AST::op_chdir;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_chown;       @ISA = 'P5AST::listop';
-package P5AST::op_chroot;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_unlink;      @ISA = 'P5AST::listop';
-package P5AST::op_chmod;       @ISA = 'P5AST::listop';
-package P5AST::op_utime;       @ISA = 'P5AST::listop';
-package P5AST::op_rename;      @ISA = 'P5AST::listop';
-package P5AST::op_link;        @ISA = 'P5AST::listop';
-package P5AST::op_symlink;     @ISA = 'P5AST::listop';
-package P5AST::op_readlink;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_mkdir;       @ISA = 'P5AST::listop';
-package P5AST::op_rmdir;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_open_dir;    @ISA = 'P5AST::listop';
-package P5AST::op_readdir;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_telldir;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_seekdir;     @ISA = 'P5AST::listop';
-package P5AST::op_rewinddir;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_closedir;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_fork;        @ISA = 'P5AST::baseop';
-package P5AST::op_wait;        @ISA = 'P5AST::baseop';
-package P5AST::op_waitpid;     @ISA = 'P5AST::listop';
-package P5AST::op_system;      @ISA = 'P5AST::listop';
-package P5AST::op_exec;        @ISA = 'P5AST::listop';
-package P5AST::op_kill;        @ISA = 'P5AST::listop';
-package P5AST::op_getppid;     @ISA = 'P5AST::baseop';
-package P5AST::op_getpgrp;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_setpgrp;     @ISA = 'P5AST::listop';
-package P5AST::op_getpriority;         @ISA = 'P5AST::listop';
-package P5AST::op_setpriority;         @ISA = 'P5AST::listop';
-package P5AST::op_time;        @ISA = 'P5AST::baseop';
-package P5AST::op_tms;         @ISA = 'P5AST::baseop';
-package P5AST::op_localtime;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gmtime;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_alarm;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sleep;       @ISA = 'P5AST::baseop_unop';
-package P5AST::op_shmget;      @ISA = 'P5AST::listop';
-package P5AST::op_shmctl;      @ISA = 'P5AST::listop';
-package P5AST::op_shmread;     @ISA = 'P5AST::listop';
-package P5AST::op_shmwrite;    @ISA = 'P5AST::listop';
-package P5AST::op_msgget;      @ISA = 'P5AST::listop';
-package P5AST::op_msgctl;      @ISA = 'P5AST::listop';
-package P5AST::op_msgsnd;      @ISA = 'P5AST::listop';
-package P5AST::op_msgrcv;      @ISA = 'P5AST::listop';
-package P5AST::op_semget;      @ISA = 'P5AST::listop';
-package P5AST::op_semctl;      @ISA = 'P5AST::listop';
-package P5AST::op_semop;       @ISA = 'P5AST::listop';
-package P5AST::op_require;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_dofile;      @ISA = 'P5AST::unop';
-package P5AST::op_entereval;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_leaveeval;   @ISA = 'P5AST::unop';
-package P5AST::op_entertry;    @ISA = 'P5AST::logop';
-package P5AST::op_leavetry;    @ISA = 'P5AST::listop';
-package P5AST::op_ghbyname;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ghbyaddr;    @ISA = 'P5AST::listop';
-package P5AST::op_ghostent;    @ISA = 'P5AST::baseop';
-package P5AST::op_gnbyname;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gnbyaddr;    @ISA = 'P5AST::listop';
-package P5AST::op_gnetent;     @ISA = 'P5AST::baseop';
-package P5AST::op_gpbyname;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gpbynumber;  @ISA = 'P5AST::listop';
-package P5AST::op_gprotoent;   @ISA = 'P5AST::baseop';
-package P5AST::op_gsbyname;    @ISA = 'P5AST::listop';
-package P5AST::op_gsbyport;    @ISA = 'P5AST::listop';
-package P5AST::op_gservent;    @ISA = 'P5AST::baseop';
-package P5AST::op_shostent;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_snetent;     @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sprotoent;   @ISA = 'P5AST::baseop_unop';
-package P5AST::op_sservent;    @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ehostent;    @ISA = 'P5AST::baseop';
-package P5AST::op_enetent;     @ISA = 'P5AST::baseop';
-package P5AST::op_eprotoent;   @ISA = 'P5AST::baseop';
-package P5AST::op_eservent;    @ISA = 'P5AST::baseop';
-package P5AST::op_gpwnam;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gpwuid;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_gpwent;      @ISA = 'P5AST::baseop';
-package P5AST::op_spwent;      @ISA = 'P5AST::baseop';
-package P5AST::op_epwent;      @ISA = 'P5AST::baseop';
-package P5AST::op_ggrnam;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ggrgid;      @ISA = 'P5AST::baseop_unop';
-package P5AST::op_ggrent;      @ISA = 'P5AST::baseop';
-package P5AST::op_sgrent;      @ISA = 'P5AST::baseop';
-package P5AST::op_egrent;      @ISA = 'P5AST::baseop';
-package P5AST::op_getlogin;    @ISA = 'P5AST::baseop';
-package P5AST::op_syscall;     @ISA = 'P5AST::listop';
-package P5AST::op_lock;        @ISA = 'P5AST::baseop_unop';
-package P5AST::op_threadsv;    @ISA = 'P5AST::baseop';
-package P5AST::op_setstate;    @ISA = 'P5AST::cop';
-package P5AST::op_method_named; @ISA = 'P5AST::padop_svop';
-package P5AST::op_dor;                 @ISA = 'P5AST::logop';
-package P5AST::op_dorassign;   @ISA = 'P5AST::logop';
-package P5AST::op_custom;      @ISA = 'P5AST::baseop';
-
-# New node types (implicit types within perl)
-
-package P5AST::statement;      @ISA = 'P5AST::cop';
-package P5AST::peg;            @ISA = 'P5AST::baseop';
-package P5AST::parens;         @ISA = 'P5AST::baseop';
-package P5AST::bindop;         @ISA = 'P5AST::baseop';
-package P5AST::nothing;                @ISA = 'P5AST::baseop';
-package P5AST::condstate;      @ISA = 'P5AST::logop';
-package P5AST::use;            @ISA = 'P5AST::baseop';
-package P5AST::ternary;                @ISA = 'P5AST::baseop';
-package P5AST::sub;            @ISA = 'P5AST::baseop';
-package P5AST::condmod;                @ISA = 'P5AST::logop';
-package P5AST::package;                @ISA = 'P5AST::baseop';
-package P5AST::format;         @ISA = 'P5AST::baseop';
-package P5AST::qwliteral;      @ISA = 'P5AST::baseop';
-package P5AST::quote;          @ISA = 'P5AST::baseop';
-package P5AST::token;          @ISA = 'P5AST::baseop';
-package P5AST::attrlist;       @ISA = 'P5AST::baseop';
-package P5AST::listelem;       @ISA = 'P5AST::baseop';
-package P5AST::preplus;                @ISA = 'P5AST::baseop';
-package P5AST::doblock;                @ISA = 'P5AST::baseop';
-package P5AST::cfor;           @ISA = 'P5AST::baseop';
-package P5AST::pmop;           @ISA = 'P5AST::baseop';
diff --git a/mad/P5re.pm b/mad/P5re.pm
deleted file mode 100644 (file)
index 24037ec..0000000
+++ /dev/null
@@ -1,650 +0,0 @@
-#!/usr/bin/perl
-
-# Copyright (C) 2005, Larry Wall
-# This software may be copied under the same terms as Perl.
-
-package P5re;
-
-use strict;
-use warnings;
-
-our @EXPORT_OK = qw(re re2xml qr2xml);
-
-my $indent = 0;
-my $in = "";
-my $delim = 1;
-my $debug = 0;
-my $maxbrack;
-
-our $extended;
-our $insensitive;
-our $singleline;
-our $multiline;
-
-my %xmlish = (
-       chr(0x00) => "STUPIDXML(#x00)",
-       chr(0x01) => "STUPIDXML(#x01)",
-       chr(0x02) => "STUPIDXML(#x02)",
-       chr(0x03) => "STUPIDXML(#x03)",
-       chr(0x04) => "STUPIDXML(#x04)",
-       chr(0x05) => "STUPIDXML(#x05)",
-       chr(0x06) => "STUPIDXML(#x06)",
-       chr(0x07) => "STUPIDXML(#x07)",
-       chr(0x08) => "STUPIDXML(#x08)",
-       chr(0x09) => "&#9;",
-       chr(0x0a) => "&#10;",
-       chr(0x0b) => "STUPIDXML(#x0b)",
-       chr(0x0c) => "STUPIDXML(#x0c)",
-       chr(0x0d) => "&#13;",
-       chr(0x0e) => "STUPIDXML(#x0e)",
-       chr(0x0f) => "STUPIDXML(#x0f)",
-       chr(0x10) => "STUPIDXML(#x10)",
-       chr(0x11) => "STUPIDXML(#x11)",
-       chr(0x12) => "STUPIDXML(#x12)",
-       chr(0x13) => "STUPIDXML(#x13)",
-       chr(0x14) => "STUPIDXML(#x14)",
-       chr(0x15) => "STUPIDXML(#x15)",
-       chr(0x16) => "STUPIDXML(#x16)",
-       chr(0x17) => "STUPIDXML(#x17)",
-       chr(0x18) => "STUPIDXML(#x18)",
-       chr(0x19) => "STUPIDXML(#x19)",
-       chr(0x1a) => "STUPIDXML(#x1a)",
-       chr(0x1b) => "STUPIDXML(#x1b)",
-       chr(0x1c) => "STUPIDXML(#x1c)",
-       chr(0x1d) => "STUPIDXML(#x1d)",
-       chr(0x1e) => "STUPIDXML(#x1e)",
-       chr(0x1f) => "STUPIDXML(#x1f)",
-       chr(0x7f) => "STUPIDXML(#x7f)",
-       chr(0x80) => "STUPIDXML(#x80)",
-       chr(0x81) => "STUPIDXML(#x81)",
-       chr(0x82) => "STUPIDXML(#x82)",
-       chr(0x83) => "STUPIDXML(#x83)",
-       chr(0x84) => "STUPIDXML(#x84)",
-       chr(0x86) => "STUPIDXML(#x86)",
-       chr(0x87) => "STUPIDXML(#x87)",
-       chr(0x88) => "STUPIDXML(#x88)",
-       chr(0x89) => "STUPIDXML(#x89)",
-       chr(0x90) => "STUPIDXML(#x90)",
-       chr(0x91) => "STUPIDXML(#x91)",
-       chr(0x92) => "STUPIDXML(#x92)",
-       chr(0x93) => "STUPIDXML(#x93)",
-       chr(0x94) => "STUPIDXML(#x94)",
-       chr(0x95) => "STUPIDXML(#x95)",
-       chr(0x96) => "STUPIDXML(#x96)",
-       chr(0x97) => "STUPIDXML(#x97)",
-       chr(0x98) => "STUPIDXML(#x98)",
-       chr(0x99) => "STUPIDXML(#x99)",
-       chr(0x9a) => "STUPIDXML(#x9a)",
-       chr(0x9b) => "STUPIDXML(#x9b)",
-       chr(0x9c) => "STUPIDXML(#x9c)",
-       chr(0x9d) => "STUPIDXML(#x9d)",
-       chr(0x9e) => "STUPIDXML(#x9e)",
-       chr(0x9f) => "STUPIDXML(#x9f)",
-       '<'       => "&lt;",
-       '>'       => "&gt;",
-       '&'       => "&amp;",
-       '"'       => "&#34;",           # XML idiocy
-);
-
-sub xmlquote {
-    my $text = shift;
-    $text =~ s/(.)/$xmlish{$1} || $1/seg;
-    return $text;
-}
-
-sub text {
-    my $self = shift;
-    return xmlquote($self->{text});
-}
-
-sub rep {
-    my $self = shift;
-    return xmlquote($self->{rep});
-}
-
-sub xmlkids {
-    my $self = shift;
-    my $array = $self->{Kids};
-    my $ret = "";
-    $indent += 2;
-    $in = ' ' x $indent;
-    foreach my $chunk (@$array) {
-       if (ref $chunk eq "ARRAY") {
-           die;
-       }
-       elsif (ref $chunk) {
-           $ret .= $chunk->xml();
-       }
-       else {
-           warn $chunk;
-       }
-    }
-    $indent -= 2;
-    $in = ' ' x $indent;
-    return $ret;
-};
-
-package P5re::RE; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my %flags = @_;
-    if ($flags{indent}) {
-       $indent = delete $flags{indent} || 0;
-       $in = ' ' x $indent;
-    }
-
-    my $kind = $self->{kind};
-
-    my $first = $self->{Kids}[0];
-    if ($first and ref $first eq 'P5re::Mod') {
-       for my $c (qw(i m s x)) {
-           next unless defined $first->{$c};
-           $self->{$c} = $first->{$c};
-           delete $first->{$c};
-       }
-    }
-
-    my $modifiers = "";
-    foreach my $k (sort keys %$self) {
-       next if $k eq 'kind' or $k eq "Kids";
-       my $v = $self->{$k};
-       $k =~ s/^[A-Z]//;
-       $modifiers .= " $k=\"$v\"";
-    }
-    my $text = "$in<$kind$modifiers>\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</$kind>\n";
-    return $text;
-}
-
-package P5re::Alt; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $text = "$in<alt>\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</alt>\n";
-    return $text;
-}
-
-#package P5re::Atom; our @ISA = 'P5re';
-#
-#sub xml {
-#    my $self = shift;
-#    my $text = "$in<atom>\n";
-#    $text .= $self->xmlkids();
-#    $text .= "$in</atom>\n";
-#    return $text;
-#}
-
-package P5re::Quant; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $q = $self->{rep};
-    my $min = $self->{min};
-    my $max = $self->{max};
-    my $greedy = $self->{greedy};
-    my $text = "$in<quant rep=\"$q\" min=\"$min\" max=\"$max\" greedy=\"$greedy\">\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</quant>\n";
-    return $text;
-}
-
-package P5re::White; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<white text=\"" . $self->text() . "\" />\n";
-}
-
-package P5re::Char; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<char text=\"" . $self->text() . "\" />\n";
-}
-
-package P5re::Comment; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<comment rep=\"" . $self->rep() . "\" />\n";
-}
-
-package P5re::Mod; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $modifiers = "";
-    foreach my $k (sort keys %$self) {
-       next if $k eq 'kind' or $k eq "Kids";
-       my $v = $self->{$k};
-       $k =~ s/^[A-Z]//;
-       $modifiers .= " $k=\"$v\"";
-    }
-    return "$in<mod$modifiers />\n";
-}
-
-package P5re::Meta; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $sem = "";
-    if ($self->{sem}) {
-       $sem = 'sem="' . $self->{sem} . '" '
-    }
-    return "$in<meta rep=\"" . $self->rep() . "\" $sem/>\n";
-}
-
-package P5re::Back; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<backref to=\"" . P5re::xmlquote($self->{to}) . "\"/>\n";
-}
-
-package P5re::Var; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<var name=\"" . $self->{name} . "\" />\n";
-}
-
-package P5re::Closure; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    return "$in<closure rep=\"" . P5re::xmlquote($self->{rep}) . "\" />\n";
-}
-
-package P5re::CClass; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $neg = $self->{neg} ? "negated" : "normal";
-    my $text = "$in<cclass match=\"$neg\">\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</cclass>\n";
-    return $text;
-}
-
-package P5re::Range; our @ISA = 'P5re';
-
-sub xml {
-    my $self = shift;
-    my $text = "$in<range>\n";
-    $text .= $self->xmlkids();
-    $text .= "$in</range>\n";
-    return $text;
-}
-
-package P5re;
-
-unless (caller) {
-    while (<>) {
-       chomp;
-       print qr2xml($_);
-       print "#######################################\n";
-    }
-}
-
-sub qrparse {
-    my $qr = shift;
-    my $mod;
-    if ($qr =~ /^s/) {
-       $qr =~ s/^(?:\w*)(\W)((?:\\.|.)*?)\1(.*)\1(\w*)$/$2/;
-       $mod = $4;
-    }
-    else {
-       $qr =~ s/^(?:\w*)(\W)(.*)\1(\w*)$/$2/;
-       $mod = $3;
-    }
-    substr($qr,0,0) = "(?$mod)" if defined $mod and $mod ne "";
-    return parse($qr,@_);
-}
-
-sub qr2xml {
-    return qrparse(@_)->xml();
-}
-
-sub re2xml {
-    my $re = shift;
-    return parse($re,@_)->xml();
-}
-
-sub parse {
-    local($_) = shift;
-    my %flags = @_;
-    $maxbrack = 0;
-    $indent = delete $flags{indent} || 0;
-    $in = ' ' x $indent;
-    warn "$_\n" if $debug;
-    my $re = re('re');
-    @$re{keys %flags} = values %flags;
-    return $re;
-}
-
-sub re {
-    my $kind = shift;
-
-    my $oldextended = $extended;
-    my $oldinsensitive = $insensitive;
-    my $oldmultiline = $multiline;
-    my $oldsingleline = $singleline;
-
-    local $extended = $extended;
-    local $insensitive = $insensitive;
-    local $multiline = $multiline;
-    local $singleline = $singleline;
-
-    my $first = alt();
-
-    my $re;
-    if (not /^\|/) {
-       $first->{kind} = $kind;
-       $re = bless $first, "P5re::RE";  # rebless to remove single alt
-    }
-    else {
-       my @alts = ($first);
-
-       while (s/^\|//) {
-           push(@alts, alt());
-       }
-       $re = bless { Kids => [@alts], kind => $kind }, "P5re::RE";     
-    }
-
-    $re->{x} = $oldextended || 0;
-    $re->{i} = $oldinsensitive || 0;
-    $re->{m} = $oldmultiline || 0;
-    $re->{s} = $oldsingleline || 0;
-    return $re;
-}
-
-sub alt {
-    my @quants;
-
-    my $quant;
-    while ($quant = quant()) {
-       if (@quants and
-           ref $quant eq ref $quants[-1] and
-           exists $quants[-1]{text} and
-           exists $quant->{text} )
-       {
-           $quants[-1]{text} .= $quant->{text};
-       }
-       else {
-           push(@quants, $quant);
-       }
-    }
-    return bless { Kids => [@quants] }, "P5re::Alt";   
-}
-
-sub quant {
-    my $atom = atom();
-    return 0 unless $atom;
-#    $atom = bless { Kids => [$atom] }, "P5re::Atom";  
-    if (s/^(([*+?])(\??)|\{(\d+)(?:(,)(\d*))?\}(\??))//) {
-       my $min = 0;
-       my $max = "Inf";
-       my $greed = 1;
-       if ($2) {
-           if ($2 eq '+') {
-               $min = 1;
-           }
-           elsif ($2 eq '?') {
-               $max = 1;
-           }
-           $greed = 0 if $3;
-       }
-       elsif (defined $4) {
-           $min = $4;
-           if ($5) {
-               $max = $6 if $6;
-           }
-           else {
-               $max = $min;
-           }
-           $greed = 0 if $7;
-       }
-       $greed = "na" if $min == $max;
-       return bless { Kids => [$atom],
-                   rep => $1,
-                   min => $min,
-                   max => $max,
-                   greedy => $greed
-               }, "P5re::Quant";       
-    }
-    return $atom;
-}
-
-sub atom {
-    my $re;
-    if ($_ eq "") { return 0 }
-    if (/^[)|]/) { return 0 }
-
-    # whitespace is special because we don't know if /x is in effect
-    if ($extended) {
-       if (s/^(?=\s|#)(\s*(?:#.*)?)//) { return bless { text => $1 }, "P5re::White"; }
-    }
-
-    # all the parenthesized forms
-    if (s/^\(//) {
-       if (s/^\?://) {
-           $re = re('bracket');
-       }
-       elsif (s/^(\?#.*?)\)/)/) {
-           $re = bless { rep => "($1)" }, "P5re::Comment";     
-       }
-       elsif (s/^\?=//) {
-           $re = re('lookahead');
-       }
-       elsif (s/^\?!//) {
-           $re = re('neglookahead');
-       }
-       elsif (s/^\?<=//) {
-           $re = re('lookbehind');
-       }
-       elsif (s/^\?<!//) {
-           $re = re('neglookbehind');
-       }
-       elsif (s/^\?>//) {
-           $re = re('nobacktrack');
-       }
-       elsif (s/^(\?\??\{.*?\})\)/)/) {
-           $re = bless { rep => "($1)" }, "P5re::Closure";     
-       }
-       elsif (s/^(\?\(\d+\))//) {
-           my $mods = $1;
-           $re = re('conditional');
-           $re->{Arep} = "$mods";
-       }
-       elsif (s/^\?(?=\(\?)//) {
-           my $mods = $1;
-           my $cond = atom();
-           $re = re('conditional');
-           unshift(@{$re->{Kids}}, $cond);
-       }
-       elsif (s/^(\?[-\w]+)://) {
-           my $mods = $1;
-           local $extended = $extended;
-           local $insensitive = $insensitive;
-           local $multiline = $multiline;
-           local $singleline = $singleline;
-           setmods($mods);
-           $re = re('bracket');
-           $re->{Arep} = "($mods)";
-           $re->{x} = $extended || 0;
-           $re->{i} = $insensitive || 0;
-           $re->{m} = $multiline || 0;
-           $re->{s} = $singleline || 0;
-       }
-       elsif (s/^(\?[-\w]+)//) {
-           my $mods = $1;
-           $re = bless { Arep => "($mods)" }, "P5re::Mod";     
-           setmods($mods);
-           $re->{x} = $extended || 0;
-           $re->{i} = $insensitive || 0;
-           $re->{m} = $multiline || 0;
-           $re->{s} = $singleline || 0;
-       }
-       elsif (s/^\?//) {
-           $re = re('UNRECOGNIZED');
-       }
-       else {
-           my $brack = ++$maxbrack;
-           $re = re('capture');
-           $re->{Ato} = $brack;
-       }
-
-       if (not s/^\)//) { warn "Expected right paren at: '$_'" }
-       return $re;
-    }
-
-    # special meta
-    if (s/^\.//) {
-       my $s = $singleline ? '.' : '\N';
-       return bless { rep => '.', sem => $s }, "P5re::Meta";
-    }
-    if (s/^\^//) {
-       my $s = $multiline ? '^^' : '^';
-       return bless { rep => '^', sem => $s }, "P5re::Meta";
-    }
-    if (s/^\$(?:$|(?=[|)]))//) {
-       my $s = $multiline ? '$$' : '$';
-       return bless { rep => '$', sem => $s }, "P5re::Meta";
-    }
-    if (s/^([\$\@](\w+|.))//) {                # XXX need to handle subscripts here
-       return bless { name => $1 }, "P5re::Var";
-    }
-
-    # character classes
-    if (s/^\[//) {
-       my $re = cclass();
-       if (not s/^\]//) { warn "Expected right bracket at: '$_'" }
-       return $re;
-    }
-
-    # backwhacks
-    if (/^\\([1-9]\d*)/ and $1 <= $maxbrack) {
-       my $to = $1;
-       onechar();
-       return bless { to => $to }, "P5re::Back";
-    }
-
-    # backwhacks
-    if (/^\\(?=\w)/) {
-       return bless { rep => onechar() }, "P5re::Meta";
-    }
-
-    # backwhacks
-    if (s/^\\(.)//) {
-       return bless { text => $1 }, "P5re::Char";
-    }
-
-    # optimization, would happen anyway
-    if (s/^(\w+)//) { return bless { text => $1 }, "P5re::Char"; }
-
-    # random character
-    if (s/^(.)//) { return bless { text => $1 }, "P5re::Char"; }
-}
-
-sub cclass {
-    my @cclass;
-    my $cclass = "";
-    my $neg = 0;
-    if (s/^\^//) { $neg = 1 }
-    if (s/^([\]\-])//) { $cclass .= $1 }
-
-    while ($_ ne "" and not /^\]/) {
-       # backwhacks
-       if (/^\\(?=.)|.-/) {
-           my $o1 = onecharobj();
-           if ($cclass ne "") {
-               push @cclass, bless { text => $cclass }, "P5re::Char";
-               $cclass = "";
-           }
-
-           if (s/^-(?=[^]])//) {
-               my $o2 = onecharobj();
-               push @cclass, bless { Kids => [$o1, $o2] }, "P5re::Range";
-           }
-           else {
-               push @cclass, $o1;
-           }
-       }
-       elsif (s/^(\[([:=.])\^?\w*\2\])//) {
-           if ($cclass ne "") {
-               push @cclass, bless { text => $cclass }, "P5re::Char";
-               $cclass = "";
-           }
-           push @cclass, bless { rep => $1 }, "P5re::Meta";
-       }
-       else {
-           $cclass .= onechar();
-       }
-    }
-
-    if ($cclass ne "") {
-       push @cclass, bless { text => $cclass }, "P5re::Char";
-    }
-    return bless { Kids => [@cclass], neg => $neg }, "P5re::CClass";
-}
-
-sub onecharobj {
-    my $ch = onechar();
-    if ($ch =~ /^\\/) {
-       $ch = bless { rep => $ch }, "P5re::Meta";
-    }
-    else {
-       $ch = bless { text => $ch }, "P5re::Char";
-    }
-}
-
-sub onechar {
-    die "Oops, short cclass" unless s/^(.)//;
-    my $ch = $1;
-    if ($ch eq '\\') {
-       if (s/^([rntf]|[0-7]{1,4})//) { $ch .= $1 }
-       elsif (s/^(x[0-9a-fA-f]{1,2})//) { $ch .= $1 }
-       elsif (s/^(x\{[0-9a-fA-f]+\})//) { $ch .= $1 }
-       elsif (s/^([NpP]\{.*?\})//) { $ch .= $1 }
-       elsif (s/^([cpP].)//) { $ch .= $1 }
-       elsif (s/^(.)//) { $ch .= $1 }
-       else {
-           die "Oops, short backwhack";
-       }
-    }
-    return $ch;
-}
-
-sub setmods {
-    my $mods = shift;
-    if ($mods =~ /\-.*x/) {
-       $extended = 0;
-    }
-    elsif ($mods =~ /x/) {
-       $extended = 1;
-    }
-    if ($mods =~ /\-.*i/) {
-       $insensitive = 0;
-    }
-    elsif ($mods =~ /i/) {
-       $insensitive = 1;
-    }
-    if ($mods =~ /\-.*m/) {
-       $multiline = 0;
-    }
-    elsif ($mods =~ /m/) {
-       $multiline = 1;
-    }
-    if ($mods =~ /\-.*s/) {
-       $singleline = 0;
-    }
-    elsif ($mods =~ /s/) {
-       $singleline = 1;
-    }
-}
-
-1;
diff --git a/mad/PLXML.pm b/mad/PLXML.pm
deleted file mode 100644 (file)
index ad77860..0000000
+++ /dev/null
@@ -1,4162 +0,0 @@
-use strict;
-use warnings;
-
-package PLXML;
-
-sub DESTROY { }
-
-sub walk {
-    print "walk(" . join(',', @_) . ")\n";
-    my $self = shift;
-    for my $key (sort keys %$self) {
-       print "\t$key = <$$self{$key}>\n";
-    }
-    foreach my $kid (@{$$self{Kids}}) {
-       $kid->walk(@_);
-    }
-}
-
-package PLXML::Characters;
-
-our @ISA = ('PLXML');
-sub walk {}
-
-package PLXML::madprops;
-
-our @ISA = ('PLXML');
-
-package PLXML::mad_op;
-
-our @ISA = ('PLXML');
-
-package PLXML::mad_pv;
-
-our @ISA = ('PLXML');
-
-package PLXML::baseop;
-
-our @ISA = ('PLXML');
-
-package PLXML::baseop_unop;
-
-our @ISA = ('PLXML');
-
-package PLXML::binop;
-
-our @ISA = ('PLXML');
-
-package PLXML::cop;
-
-our @ISA = ('PLXML');
-
-package PLXML::filestatop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-package PLXML::listop;
-
-our @ISA = ('PLXML');
-
-package PLXML::logop;
-
-our @ISA = ('PLXML');
-
-package PLXML::loop;
-
-our @ISA = ('PLXML');
-
-package PLXML::loopexop;
-
-our @ISA = ('PLXML');
-
-package PLXML::padop;
-
-our @ISA = ('PLXML');
-
-package PLXML::padop_svop;
-
-our @ISA = ('PLXML');
-
-package PLXML::pmop;
-
-our @ISA = ('PLXML');
-
-package PLXML::pvop_svop;
-
-our @ISA = ('PLXML');
-
-package PLXML::unop;
-
-our @ISA = ('PLXML');
-
-
-# New ops always go at the end, just before 'custom'
-
-# A recapitulation of the format of this file:
-# The file consists of five columns: the name of the op, an English
-# description, the name of the "check" routine used to optimize this
-# operation, some flags, and a description of the operands.
-
-# The flags consist of options followed by a mandatory op class signifier
-
-# The classes are:
-# baseop      - 0            unop     - 1            binop      - 2
-# logop       - |            listop   - @            pmop       - /
-# padop/svop  - $            padop    - # (unused)   loop       - {
-# baseop/unop - %            loopexop - }            filestatop - -
-# pvop/svop   - "            cop      - ;
-
-# Other options are:
-#   needs stack mark                    - m
-#   needs constant folding              - f
-#   produces a scalar                   - s
-#   produces an integer                 - i
-#   needs a target                      - t
-#   target can be in a pad              - T
-#   has a corresponding integer version - I
-#   has side effects                    - d
-#   uses $_ if no argument given        - u
-
-# Values for the operands are:
-# scalar      - S            list     - L            array     - A
-# hash        - H            sub (CV) - C            file      - F
-# socket      - Fs           filetest - F-           reference - R
-# "?" denotes an optional operand.
-
-# Nothing.
-
-package PLXML::op_null;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'null' }
-sub desc { 'null operation' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_stub;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'stub' }
-sub desc { 'stub' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_scalar;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'scalar' }
-sub desc { 'scalar' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'S' }
-
-
-
-# Pushy stuff.
-
-package PLXML::op_pushmark;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'pushmark' }
-sub desc { 'pushmark' }
-sub check { 'ck_null' }
-sub flags { 's0' }
-sub args { '' }
-
-
-package PLXML::op_wantarray;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'wantarray' }
-sub desc { 'wantarray' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-
-package PLXML::op_const;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'const' }
-sub desc { 'constant item' }
-sub check { 'ck_svconst' }
-sub flags { 's$' }
-sub args { '' }
-
-
-
-package PLXML::op_gvsv;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'gvsv' }
-sub desc { 'scalar variable' }
-sub check { 'ck_null' }
-sub flags { 'ds$' }
-sub args { '' }
-
-
-package PLXML::op_gv;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'gv' }
-sub desc { 'glob value' }
-sub check { 'ck_null' }
-sub flags { 'ds$' }
-sub args { '' }
-
-
-package PLXML::op_gelem;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'gelem' }
-sub desc { 'glob elem' }
-sub check { 'ck_null' }
-sub flags { 'd2' }
-sub args { 'S S' }
-
-
-package PLXML::op_padsv;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padsv' }
-sub desc { 'private variable' }
-sub check { 'ck_null' }
-sub flags { 'ds0' }
-sub args { '' }
-
-
-package PLXML::op_padav;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padav' }
-sub desc { 'private array' }
-sub check { 'ck_null' }
-sub flags { 'd0' }
-sub args { '' }
-
-
-package PLXML::op_padhv;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padhv' }
-sub desc { 'private hash' }
-sub check { 'ck_null' }
-sub flags { 'd0' }
-sub args { '' }
-
-
-package PLXML::op_padany;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'padany' }
-sub desc { 'private value' }
-sub check { 'ck_null' }
-sub flags { 'd0' }
-sub args { '' }
-
-
-
-package PLXML::op_pushre;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'pushre' }
-sub desc { 'push regexp' }
-sub check { 'ck_null' }
-sub flags { 'd/' }
-sub args { '' }
-
-
-
-# References and stuff.
-
-package PLXML::op_rv2gv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2gv' }
-sub desc { 'ref-to-glob cast' }
-sub check { 'ck_rvconst' }
-sub flags { 'ds1' }
-sub args { '' }
-
-
-package PLXML::op_rv2sv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2sv' }
-sub desc { 'scalar dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'ds1' }
-sub args { '' }
-
-
-package PLXML::op_av2arylen;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'av2arylen' }
-sub desc { 'array length' }
-sub check { 'ck_null' }
-sub flags { 'is1' }
-sub args { '' }
-
-
-package PLXML::op_rv2cv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2cv' }
-sub desc { 'subroutine dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'd1' }
-sub args { '' }
-
-
-package PLXML::op_anoncode;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'anoncode' }
-sub desc { 'anonymous subroutine' }
-sub check { 'ck_anoncode' }
-sub flags { '$' }
-sub args { '' }
-
-
-package PLXML::op_prototype;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'prototype' }
-sub desc { 'subroutine prototype' }
-sub check { 'ck_null' }
-sub flags { 's%' }
-sub args { 'S' }
-
-
-package PLXML::op_refgen;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'refgen' }
-sub desc { 'reference constructor' }
-sub check { 'ck_spair' }
-sub flags { 'm1' }
-sub args { 'L' }
-
-
-package PLXML::op_srefgen;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'srefgen' }
-sub desc { 'single ref constructor' }
-sub check { 'ck_null' }
-sub flags { 'fs1' }
-sub args { 'S' }
-
-
-package PLXML::op_ref;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ref' }
-sub desc { 'reference-type operator' }
-sub check { 'ck_fun' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_bless;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'bless' }
-sub desc { 'bless' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'S S?' }
-
-
-
-# Pushy I/O.
-
-package PLXML::op_backtick;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'backtick' }
-sub desc { 'quoted execution (``, qx)' }
-sub check { 'ck_open' }
-sub flags { 't%' }
-sub args { '' }
-
-
-# glob defaults its first arg to $_
-package PLXML::op_glob;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'glob' }
-sub desc { 'glob' }
-sub check { 'ck_glob' }
-sub flags { 't@' }
-sub args { 'S?' }
-
-
-package PLXML::op_readline;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'readline' }
-sub desc { '<HANDLE>' }
-sub check { 'ck_null' }
-sub flags { 't%' }
-sub args { 'F?' }
-
-
-package PLXML::op_rcatline;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'rcatline' }
-sub desc { 'append I/O operator' }
-sub check { 'ck_null' }
-sub flags { 't$' }
-sub args { '' }
-
-
-
-# Bindable operators.
-
-package PLXML::op_regcmaybe;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'regcmaybe' }
-sub desc { 'regexp internal guard' }
-sub check { 'ck_fun' }
-sub flags { 's1' }
-sub args { 'S' }
-
-
-package PLXML::op_regcreset;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'regcreset' }
-sub desc { 'regexp internal reset' }
-sub check { 'ck_fun' }
-sub flags { 's1' }
-sub args { 'S' }
-
-
-package PLXML::op_regcomp;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'regcomp' }
-sub desc { 'regexp compilation' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { 'S' }
-
-
-package PLXML::op_match;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'match' }
-sub desc { 'pattern match (m//)' }
-sub check { 'ck_match' }
-sub flags { 'd/' }
-sub args { '' }
-
-
-package PLXML::op_qr;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'qr' }
-sub desc { 'pattern quote (qr//)' }
-sub check { 'ck_match' }
-sub flags { 's/' }
-sub args { '' }
-
-
-package PLXML::op_subst;
-
-our @ISA = ('PLXML::pmop');
-
-sub key { 'subst' }
-sub desc { 'substitution (s///)' }
-sub check { 'ck_match' }
-sub flags { 'dis/' }
-sub args { 'S' }
-
-
-package PLXML::op_substcont;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'substcont' }
-sub desc { 'substitution iterator' }
-sub check { 'ck_null' }
-sub flags { 'dis|' }
-sub args { '' }
-
-
-package PLXML::op_trans;
-
-our @ISA = ('PLXML::pvop_svop');
-
-sub key { 'trans' }
-sub desc { 'transliteration (tr///)' }
-sub check { 'ck_match' }
-sub flags { 'is"' }
-sub args { 'S' }
-
-
-
-# Lvalue operators.
-# sassign is special-cased for op class
-
-package PLXML::op_sassign;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'sassign' }
-sub desc { 'scalar assignment' }
-sub check { 'ck_sassign' }
-sub flags { 's0' }
-sub args { '' }
-
-
-package PLXML::op_aassign;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'aassign' }
-sub desc { 'list assignment' }
-sub check { 'ck_null' }
-sub flags { 't2' }
-sub args { 'L L' }
-
-
-
-package PLXML::op_chop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chop' }
-sub desc { 'chop' }
-sub check { 'ck_spair' }
-sub flags { 'mts%' }
-sub args { 'L' }
-
-
-package PLXML::op_schop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'schop' }
-sub desc { 'scalar chop' }
-sub check { 'ck_null' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_chomp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chomp' }
-sub desc { 'chomp' }
-sub check { 'ck_spair' }
-sub flags { 'mTs%' }
-sub args { 'L' }
-
-
-package PLXML::op_schomp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'schomp' }
-sub desc { 'scalar chomp' }
-sub check { 'ck_null' }
-sub flags { 'sTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_defined;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'defined' }
-sub desc { 'defined operator' }
-sub check { 'ck_defined' }
-sub flags { 'isu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_undef;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'undef' }
-sub desc { 'undef operator' }
-sub check { 'ck_lfun' }
-sub flags { 's%' }
-sub args { 'S?' }
-
-
-package PLXML::op_study;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'study' }
-sub desc { 'study' }
-sub check { 'ck_fun' }
-sub flags { 'su%' }
-sub args { 'S?' }
-
-
-package PLXML::op_pos;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'pos' }
-sub desc { 'match position' }
-sub check { 'ck_lfun' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-
-package PLXML::op_preinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'preinc' }
-sub desc { 'preincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIs1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_preinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_preinc' }
-sub desc { 'integer preincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'dis1' }
-sub args { 'S' }
-
-
-package PLXML::op_predec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'predec' }
-sub desc { 'predecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIs1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_predec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_predec' }
-sub desc { 'integer predecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'dis1' }
-sub args { 'S' }
-
-
-package PLXML::op_postinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'postinc' }
-sub desc { 'postincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIst1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_postinc;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_postinc' }
-sub desc { 'integer postincrement (++)' }
-sub check { 'ck_lfun' }
-sub flags { 'disT1' }
-sub args { 'S' }
-
-
-package PLXML::op_postdec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'postdec' }
-sub desc { 'postdecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'dIst1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_postdec;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_postdec' }
-sub desc { 'integer postdecrement (--)' }
-sub check { 'ck_lfun' }
-sub flags { 'disT1' }
-sub args { 'S' }
-
-
-
-# Ordinary operators.
-
-package PLXML::op_pow;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'pow' }
-sub desc { 'exponentiation (**)' }
-sub check { 'ck_null' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_multiply;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'multiply' }
-sub desc { 'multiplication (*)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_multiply;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_multiply' }
-sub desc { 'integer multiplication (*)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_divide;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'divide' }
-sub desc { 'division (/)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_divide;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_divide' }
-sub desc { 'integer division (/)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_modulo;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'modulo' }
-sub desc { 'modulus (%)' }
-sub check { 'ck_null' }
-sub flags { 'IifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_modulo;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_modulo' }
-sub desc { 'integer modulus (%)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_repeat;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'repeat' }
-sub desc { 'repeat (x)' }
-sub check { 'ck_repeat' }
-sub flags { 'mt2' }
-sub args { 'L S' }
-
-
-
-package PLXML::op_add;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'add' }
-sub desc { 'addition (+)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_add;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_add' }
-sub desc { 'integer addition (+)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_subtract;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'subtract' }
-sub desc { 'subtraction (-)' }
-sub check { 'ck_null' }
-sub flags { 'IfsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_subtract;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_subtract' }
-sub desc { 'integer subtraction (-)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_concat;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'concat' }
-sub desc { 'concatenation (.) or string' }
-sub check { 'ck_concat' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_stringify;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'stringify' }
-sub desc { 'string' }
-sub check { 'ck_fun' }
-sub flags { 'fsT@' }
-sub args { 'S' }
-
-
-
-package PLXML::op_left_shift;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'left_shift' }
-sub desc { 'left bitshift (<<)' }
-sub check { 'ck_bitop' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-package PLXML::op_right_shift;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'right_shift' }
-sub desc { 'right bitshift (>>)' }
-sub check { 'ck_bitop' }
-sub flags { 'fsT2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_lt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'lt' }
-sub desc { 'numeric lt (<)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_lt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_lt' }
-sub desc { 'integer lt (<)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_gt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'gt' }
-sub desc { 'numeric gt (>)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_gt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_gt' }
-sub desc { 'integer gt (>)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_le;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'le' }
-sub desc { 'numeric le (<=)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_le;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_le' }
-sub desc { 'integer le (<=)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_ge;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'ge' }
-sub desc { 'numeric ge (>=)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_ge;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_ge' }
-sub desc { 'integer ge (>=)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_eq;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'eq' }
-sub desc { 'numeric eq (==)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_eq;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_eq' }
-sub desc { 'integer eq (==)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_ne;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'ne' }
-sub desc { 'numeric ne (!=)' }
-sub check { 'ck_null' }
-sub flags { 'Iifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_ne;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_ne' }
-sub desc { 'integer ne (!=)' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_ncmp;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'ncmp' }
-sub desc { 'numeric comparison (<=>)' }
-sub check { 'ck_null' }
-sub flags { 'Iifst2' }
-sub args { 'S S' }
-
-
-package PLXML::op_i_ncmp;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'i_ncmp' }
-sub desc { 'integer comparison (<=>)' }
-sub check { 'ck_null' }
-sub flags { 'ifst2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_slt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'slt' }
-sub desc { 'string lt' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sgt;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sgt' }
-sub desc { 'string gt' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sle;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sle' }
-sub desc { 'string le' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sge;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sge' }
-sub desc { 'string ge' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_seq;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'seq' }
-sub desc { 'string eq' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_sne;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'sne' }
-sub desc { 'string ne' }
-sub check { 'ck_null' }
-sub flags { 'ifs2' }
-sub args { 'S S' }
-
-
-package PLXML::op_scmp;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'scmp' }
-sub desc { 'string comparison (cmp)' }
-sub check { 'ck_null' }
-sub flags { 'ifst2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_bit_and;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'bit_and' }
-sub desc { 'bitwise and (&)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst2' }
-sub args { 'S S' }
-
-
-package PLXML::op_bit_xor;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'bit_xor' }
-sub desc { 'bitwise xor (^)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst2' }
-sub args { 'S S' }
-
-
-package PLXML::op_bit_or;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'bit_or' }
-sub desc { 'bitwise or (|)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst2' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_negate;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'negate' }
-sub desc { 'negation (-)' }
-sub check { 'ck_null' }
-sub flags { 'Ifst1' }
-sub args { 'S' }
-
-
-package PLXML::op_i_negate;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'i_negate' }
-sub desc { 'integer negation (-)' }
-sub check { 'ck_null' }
-sub flags { 'ifsT1' }
-sub args { 'S' }
-
-
-package PLXML::op_not;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'not' }
-sub desc { 'not' }
-sub check { 'ck_null' }
-sub flags { 'ifs1' }
-sub args { 'S' }
-
-
-package PLXML::op_complement;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'complement' }
-sub desc { '1\'s complement (~)' }
-sub check { 'ck_bitop' }
-sub flags { 'fst1' }
-sub args { 'S' }
-
-
-
-# High falutin' math.
-
-package PLXML::op_atan2;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'atan2' }
-sub desc { 'atan2' }
-sub check { 'ck_fun' }
-sub flags { 'fsT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_sin;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sin' }
-sub desc { 'sin' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_cos;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'cos' }
-sub desc { 'cos' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_rand;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'rand' }
-sub desc { 'rand' }
-sub check { 'ck_fun' }
-sub flags { 'sT%' }
-sub args { 'S?' }
-
-
-package PLXML::op_srand;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'srand' }
-sub desc { 'srand' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'S?' }
-
-
-package PLXML::op_exp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'exp' }
-sub desc { 'exp' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_log;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'log' }
-sub desc { 'log' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_sqrt;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sqrt' }
-sub desc { 'sqrt' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-
-# Lowbrow math.
-
-package PLXML::op_int;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'int' }
-sub desc { 'int' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_hex;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'hex' }
-sub desc { 'hex' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_oct;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'oct' }
-sub desc { 'oct' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_abs;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'abs' }
-sub desc { 'abs' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-
-# String stuff.
-
-package PLXML::op_length;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'length' }
-sub desc { 'length' }
-sub check { 'ck_lengthconst' }
-sub flags { 'isTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_substr;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'substr' }
-sub desc { 'substr' }
-sub check { 'ck_substr' }
-sub flags { 'st@' }
-sub args { 'S S S? S?' }
-
-
-package PLXML::op_vec;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'vec' }
-sub desc { 'vec' }
-sub check { 'ck_fun' }
-sub flags { 'ist@' }
-sub args { 'S S S' }
-
-
-
-package PLXML::op_index;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'index' }
-sub desc { 'index' }
-sub check { 'ck_index' }
-sub flags { 'isT@' }
-sub args { 'S S S?' }
-
-
-package PLXML::op_rindex;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'rindex' }
-sub desc { 'rindex' }
-sub check { 'ck_index' }
-sub flags { 'isT@' }
-sub args { 'S S S?' }
-
-
-
-package PLXML::op_sprintf;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sprintf' }
-sub desc { 'sprintf' }
-sub check { 'ck_fun' }
-sub flags { 'mfst@' }
-sub args { 'S L' }
-
-
-package PLXML::op_formline;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'formline' }
-sub desc { 'formline' }
-sub check { 'ck_fun' }
-sub flags { 'ms@' }
-sub args { 'S L' }
-
-
-package PLXML::op_ord;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ord' }
-sub desc { 'ord' }
-sub check { 'ck_fun' }
-sub flags { 'ifsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_chr;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chr' }
-sub desc { 'chr' }
-sub check { 'ck_fun' }
-sub flags { 'fsTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_crypt;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'crypt' }
-sub desc { 'crypt' }
-sub check { 'ck_fun' }
-sub flags { 'fsT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_ucfirst;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ucfirst' }
-sub desc { 'ucfirst' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_lcfirst;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'lcfirst' }
-sub desc { 'lcfirst' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_uc;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'uc' }
-sub desc { 'uc' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_lc;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'lc' }
-sub desc { 'lc' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_quotemeta;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'quotemeta' }
-sub desc { 'quotemeta' }
-sub check { 'ck_fun' }
-sub flags { 'fstu%' }
-sub args { 'S?' }
-
-
-
-# Arrays.
-
-package PLXML::op_rv2av;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2av' }
-sub desc { 'array dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'dt1' }
-sub args { '' }
-
-
-package PLXML::op_aelemfast;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'aelemfast' }
-sub desc { 'constant array element' }
-sub check { 'ck_null' }
-sub flags { 's$' }
-sub args { 'A S' }
-
-
-package PLXML::op_aelem;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'aelem' }
-sub desc { 'array element' }
-sub check { 'ck_null' }
-sub flags { 's2' }
-sub args { 'A S' }
-
-
-package PLXML::op_aslice;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'aslice' }
-sub desc { 'array slice' }
-sub check { 'ck_null' }
-sub flags { 'm@' }
-sub args { 'A L' }
-
-
-
-# Hashes.
-
-package PLXML::op_each;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'each' }
-sub desc { 'each' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'H' }
-
-
-package PLXML::op_values;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'values' }
-sub desc { 'values' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'H' }
-
-
-package PLXML::op_keys;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'keys' }
-sub desc { 'keys' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'H' }
-
-
-package PLXML::op_delete;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'delete' }
-sub desc { 'delete' }
-sub check { 'ck_delete' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_exists;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'exists' }
-sub desc { 'exists' }
-sub check { 'ck_exists' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_rv2hv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'rv2hv' }
-sub desc { 'hash dereference' }
-sub check { 'ck_rvconst' }
-sub flags { 'dt1' }
-sub args { '' }
-
-
-package PLXML::op_helem;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'helem' }
-sub desc { 'hash element' }
-sub check { 'ck_null' }
-sub flags { 's2@' }
-sub args { 'H S' }
-
-
-package PLXML::op_hslice;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'hslice' }
-sub desc { 'hash slice' }
-sub check { 'ck_null' }
-sub flags { 'm@' }
-sub args { 'H L' }
-
-
-
-# Explosives and implosives.
-
-package PLXML::op_unpack;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'unpack' }
-sub desc { 'unpack' }
-sub check { 'ck_unpack' }
-sub flags { '@' }
-sub args { 'S S?' }
-
-
-package PLXML::op_pack;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'pack' }
-sub desc { 'pack' }
-sub check { 'ck_fun' }
-sub flags { 'mst@' }
-sub args { 'S L' }
-
-
-package PLXML::op_split;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'split' }
-sub desc { 'split' }
-sub check { 'ck_split' }
-sub flags { 't@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_join;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'join' }
-sub desc { 'join or string' }
-sub check { 'ck_join' }
-sub flags { 'mst@' }
-sub args { 'S L' }
-
-
-
-# List operators.
-
-package PLXML::op_list;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'list' }
-sub desc { 'list' }
-sub check { 'ck_null' }
-sub flags { 'm@' }
-sub args { 'L' }
-
-
-package PLXML::op_lslice;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'lslice' }
-sub desc { 'list slice' }
-sub check { 'ck_null' }
-sub flags { '2' }
-sub args { 'H L L' }
-
-
-package PLXML::op_anonlist;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'anonlist' }
-sub desc { 'anonymous list ([])' }
-sub check { 'ck_fun' }
-sub flags { 'ms@' }
-sub args { 'L' }
-
-
-package PLXML::op_anonhash;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'anonhash' }
-sub desc { 'anonymous hash ({})' }
-sub check { 'ck_fun' }
-sub flags { 'ms@' }
-sub args { 'L' }
-
-
-
-package PLXML::op_splice;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'splice' }
-sub desc { 'splice' }
-sub check { 'ck_fun' }
-sub flags { 'm@' }
-sub args { 'A S? S? L' }
-
-
-package PLXML::op_push;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'push' }
-sub desc { 'push' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'A L' }
-
-
-package PLXML::op_pop;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'pop' }
-sub desc { 'pop' }
-sub check { 'ck_shift' }
-sub flags { 's%' }
-sub args { 'A?' }
-
-
-package PLXML::op_shift;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'shift' }
-sub desc { 'shift' }
-sub check { 'ck_shift' }
-sub flags { 's%' }
-sub args { 'A?' }
-
-
-package PLXML::op_unshift;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'unshift' }
-sub desc { 'unshift' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'A L' }
-
-
-package PLXML::op_sort;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sort' }
-sub desc { 'sort' }
-sub check { 'ck_sort' }
-sub flags { 'm@' }
-sub args { 'C? L' }
-
-
-package PLXML::op_reverse;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'reverse' }
-sub desc { 'reverse' }
-sub check { 'ck_fun' }
-sub flags { 'mt@' }
-sub args { 'L' }
-
-
-
-package PLXML::op_grepstart;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'grepstart' }
-sub desc { 'grep' }
-sub check { 'ck_grep' }
-sub flags { 'dm@' }
-sub args { 'C L' }
-
-
-package PLXML::op_grepwhile;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'grepwhile' }
-sub desc { 'grep iterator' }
-sub check { 'ck_null' }
-sub flags { 'dt|' }
-sub args { '' }
-
-
-
-package PLXML::op_mapstart;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'mapstart' }
-sub desc { 'map' }
-sub check { 'ck_grep' }
-sub flags { 'dm@' }
-sub args { 'C L' }
-
-
-package PLXML::op_mapwhile;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'mapwhile' }
-sub desc { 'map iterator' }
-sub check { 'ck_null' }
-sub flags { 'dt|' }
-sub args { '' }
-
-
-
-# Range stuff.
-
-package PLXML::op_range;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'range' }
-sub desc { 'flipflop' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { 'S S' }
-
-
-package PLXML::op_flip;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'flip' }
-sub desc { 'range (or flip)' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { 'S S' }
-
-
-package PLXML::op_flop;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'flop' }
-sub desc { 'range (or flop)' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-
-# Control.
-
-package PLXML::op_and;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'and' }
-sub desc { 'logical and (&&)' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_or;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'or' }
-sub desc { 'logical or (||)' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_xor;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'xor' }
-sub desc { 'logical xor' }
-sub check { 'ck_null' }
-sub flags { 'fs2' }
-sub args { 'S S        ' }
-
-
-package PLXML::op_cond_expr;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'cond_expr' }
-sub desc { 'conditional expression' }
-sub check { 'ck_null' }
-sub flags { 'd|' }
-sub args { '' }
-
-
-package PLXML::op_andassign;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'andassign' }
-sub desc { 'logical and assignment (&&=)' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { '' }
-
-
-package PLXML::op_orassign;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'orassign' }
-sub desc { 'logical or assignment (||=)' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { '' }
-
-
-
-package PLXML::op_method;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'method' }
-sub desc { 'method lookup' }
-sub check { 'ck_method' }
-sub flags { 'd1' }
-sub args { '' }
-
-
-package PLXML::op_entersub;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'entersub' }
-sub desc { 'subroutine entry' }
-sub check { 'ck_subr' }
-sub flags { 'dmt1' }
-sub args { 'L' }
-
-
-package PLXML::op_leavesub;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leavesub' }
-sub desc { 'subroutine exit' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-package PLXML::op_leavesublv;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leavesublv' }
-sub desc { 'lvalue subroutine return' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-package PLXML::op_caller;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'caller' }
-sub desc { 'caller' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'S?' }
-
-
-package PLXML::op_warn;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'warn' }
-sub desc { 'warn' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'L' }
-
-
-package PLXML::op_die;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'die' }
-sub desc { 'die' }
-sub check { 'ck_die' }
-sub flags { 'dimst@' }
-sub args { 'L' }
-
-
-package PLXML::op_reset;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'reset' }
-sub desc { 'symbol reset' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S?' }
-
-
-
-package PLXML::op_lineseq;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'lineseq' }
-sub desc { 'line sequence' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-package PLXML::op_nextstate;
-
-our @ISA = ('PLXML::cop');
-
-sub key { 'nextstate' }
-sub desc { 'next statement' }
-sub check { 'ck_null' }
-sub flags { 's;' }
-sub args { '' }
-
-
-package PLXML::op_dbstate;
-
-our @ISA = ('PLXML::cop');
-
-sub key { 'dbstate' }
-sub desc { 'debug next statement' }
-sub check { 'ck_null' }
-sub flags { 's;' }
-sub args { '' }
-
-
-package PLXML::op_unstack;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'unstack' }
-sub desc { 'iteration finalizer' }
-sub check { 'ck_null' }
-sub flags { 's0' }
-sub args { '' }
-
-
-package PLXML::op_enter;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'enter' }
-sub desc { 'block entry' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_leave;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'leave' }
-sub desc { 'block exit' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-package PLXML::op_scope;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'scope' }
-sub desc { 'block' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-package PLXML::op_enteriter;
-
-our @ISA = ('PLXML::loop');
-
-sub key { 'enteriter' }
-sub desc { 'foreach loop entry' }
-sub check { 'ck_null' }
-sub flags { 'd{' }
-sub args { '' }
-
-
-package PLXML::op_iter;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'iter' }
-sub desc { 'foreach loop iterator' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_enterloop;
-
-our @ISA = ('PLXML::loop');
-
-sub key { 'enterloop' }
-sub desc { 'loop entry' }
-sub check { 'ck_null' }
-sub flags { 'd{' }
-sub args { '' }
-
-
-package PLXML::op_leaveloop;
-
-our @ISA = ('PLXML::binop');
-
-sub key { 'leaveloop' }
-sub desc { 'loop exit' }
-sub check { 'ck_null' }
-sub flags { '2' }
-sub args { '' }
-
-
-package PLXML::op_return;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'return' }
-sub desc { 'return' }
-sub check { 'ck_return' }
-sub flags { 'dm@' }
-sub args { 'L' }
-
-
-package PLXML::op_last;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'last' }
-sub desc { 'last' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_next;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'next' }
-sub desc { 'next' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_redo;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'redo' }
-sub desc { 'redo' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_dump;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'dump' }
-sub desc { 'dump' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_goto;
-
-our @ISA = ('PLXML::loopexop');
-
-sub key { 'goto' }
-sub desc { 'goto' }
-sub check { 'ck_null' }
-sub flags { 'ds}' }
-sub args { '' }
-
-
-package PLXML::op_exit;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'exit' }
-sub desc { 'exit' }
-sub check { 'ck_exit' }
-sub flags { 'ds%' }
-sub args { 'S?' }
-
-
-# continued below
-
-#nswitch       numeric switch          ck_null         d       
-#cswitch       character switch        ck_null         d       
-
-# I/O.
-
-package PLXML::op_open;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'open' }
-sub desc { 'open' }
-sub check { 'ck_open' }
-sub flags { 'ismt@' }
-sub args { 'F S? L' }
-
-
-package PLXML::op_close;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'close' }
-sub desc { 'close' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'F?' }
-
-
-package PLXML::op_pipe_op;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'pipe_op' }
-sub desc { 'pipe' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'F F' }
-
-
-
-package PLXML::op_fileno;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'fileno' }
-sub desc { 'fileno' }
-sub check { 'ck_fun' }
-sub flags { 'ist%' }
-sub args { 'F' }
-
-
-package PLXML::op_umask;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'umask' }
-sub desc { 'umask' }
-sub check { 'ck_fun' }
-sub flags { 'ist%' }
-sub args { 'S?' }
-
-
-package PLXML::op_binmode;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'binmode' }
-sub desc { 'binmode' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S?' }
-
-
-
-package PLXML::op_tie;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'tie' }
-sub desc { 'tie' }
-sub check { 'ck_fun' }
-sub flags { 'idms@' }
-sub args { 'R S L' }
-
-
-package PLXML::op_untie;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'untie' }
-sub desc { 'untie' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'R' }
-
-
-package PLXML::op_tied;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'tied' }
-sub desc { 'tied' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'R' }
-
-
-package PLXML::op_dbmopen;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'dbmopen' }
-sub desc { 'dbmopen' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'H S S' }
-
-
-package PLXML::op_dbmclose;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'dbmclose' }
-sub desc { 'dbmclose' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'H' }
-
-
-
-package PLXML::op_sselect;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sselect' }
-sub desc { 'select system call' }
-sub check { 'ck_select' }
-sub flags { 't@' }
-sub args { 'S S S S' }
-
-
-package PLXML::op_select;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'select' }
-sub desc { 'select' }
-sub check { 'ck_select' }
-sub flags { 'st@' }
-sub args { 'F?' }
-
-
-
-package PLXML::op_getc;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getc' }
-sub desc { 'getc' }
-sub check { 'ck_eof' }
-sub flags { 'st%' }
-sub args { 'F?' }
-
-
-package PLXML::op_read;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'read' }
-sub desc { 'read' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'F R S S?' }
-
-
-package PLXML::op_enterwrite;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'enterwrite' }
-sub desc { 'write' }
-sub check { 'ck_fun' }
-sub flags { 'dis%' }
-sub args { 'F?' }
-
-
-package PLXML::op_leavewrite;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leavewrite' }
-sub desc { 'write exit' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { '' }
-
-
-
-package PLXML::op_prtf;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'prtf' }
-sub desc { 'printf' }
-sub check { 'ck_listiob' }
-sub flags { 'ims@' }
-sub args { 'F? L' }
-
-
-package PLXML::op_print;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'print' }
-sub desc { 'print' }
-sub check { 'ck_listiob' }
-sub flags { 'ims@' }
-sub args { 'F? L' }
-
-
-package PLXML::op_say;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'say' }
-sub desc { 'say' }
-sub check { 'ck_listiob' }
-sub flags { 'ims@' }
-sub args { 'F? L' }
-
-
-package PLXML::op_sysopen;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sysopen' }
-sub desc { 'sysopen' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S S S?' }
-
-
-package PLXML::op_sysseek;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sysseek' }
-sub desc { 'sysseek' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S S' }
-
-
-package PLXML::op_sysread;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sysread' }
-sub desc { 'sysread' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'F R S S?' }
-
-
-package PLXML::op_syswrite;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'syswrite' }
-sub desc { 'syswrite' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'F S S? S?' }
-
-
-
-package PLXML::op_send;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'send' }
-sub desc { 'send' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'Fs S S S?' }
-
-
-package PLXML::op_recv;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'recv' }
-sub desc { 'recv' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'Fs R S S' }
-
-
-
-package PLXML::op_eof;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'eof' }
-sub desc { 'eof' }
-sub check { 'ck_eof' }
-sub flags { 'is%' }
-sub args { 'F?' }
-
-
-package PLXML::op_tell;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'tell' }
-sub desc { 'tell' }
-sub check { 'ck_fun' }
-sub flags { 'st%' }
-sub args { 'F?' }
-
-
-package PLXML::op_seek;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'seek' }
-sub desc { 'seek' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S S' }
-
-
-# truncate really behaves as if it had both "S S" and "F S"
-package PLXML::op_truncate;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'truncate' }
-sub desc { 'truncate' }
-sub check { 'ck_trunc' }
-sub flags { 'is@' }
-sub args { 'S S' }
-
-
-
-package PLXML::op_fcntl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'fcntl' }
-sub desc { 'fcntl' }
-sub check { 'ck_fun' }
-sub flags { 'st@' }
-sub args { 'F S S' }
-
-
-package PLXML::op_ioctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'ioctl' }
-sub desc { 'ioctl' }
-sub check { 'ck_fun' }
-sub flags { 'st@' }
-sub args { 'F S S' }
-
-
-package PLXML::op_flock;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'flock' }
-sub desc { 'flock' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'F S' }
-
-
-
-# Sockets.
-
-package PLXML::op_socket;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'socket' }
-sub desc { 'socket' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S S S' }
-
-
-package PLXML::op_sockpair;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'sockpair' }
-sub desc { 'socketpair' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs Fs S S S' }
-
-
-
-package PLXML::op_bind;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'bind' }
-sub desc { 'bind' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S' }
-
-
-package PLXML::op_connect;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'connect' }
-sub desc { 'connect' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S' }
-
-
-package PLXML::op_listen;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'listen' }
-sub desc { 'listen' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S' }
-
-
-package PLXML::op_accept;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'accept' }
-sub desc { 'accept' }
-sub check { 'ck_fun' }
-sub flags { 'ist@' }
-sub args { 'Fs Fs' }
-
-
-package PLXML::op_shutdown;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shutdown' }
-sub desc { 'shutdown' }
-sub check { 'ck_fun' }
-sub flags { 'ist@' }
-sub args { 'Fs S' }
-
-
-
-package PLXML::op_gsockopt;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gsockopt' }
-sub desc { 'getsockopt' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S S' }
-
-
-package PLXML::op_ssockopt;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'ssockopt' }
-sub desc { 'setsockopt' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'Fs S S S' }
-
-
-
-package PLXML::op_getsockname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getsockname' }
-sub desc { 'getsockname' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'Fs' }
-
-
-package PLXML::op_getpeername;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getpeername' }
-sub desc { 'getpeername' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'Fs' }
-
-
-
-# Stat calls.
-
-package PLXML::op_lstat;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'lstat' }
-sub desc { 'lstat' }
-sub check { 'ck_ftst' }
-sub flags { 'u-' }
-sub args { 'F' }
-
-
-package PLXML::op_stat;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'stat' }
-sub desc { 'stat' }
-sub check { 'ck_ftst' }
-sub flags { 'u-' }
-sub args { 'F' }
-
-
-package PLXML::op_ftrread;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrread' }
-sub desc { '-R' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftrwrite;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrwrite' }
-sub desc { '-W' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftrexec;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrexec' }
-sub desc { '-X' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fteread;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fteread' }
-sub desc { '-r' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftewrite;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftewrite' }
-sub desc { '-w' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fteexec;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fteexec' }
-sub desc { '-x' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftis;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftis' }
-sub desc { '-e' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fteowned;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fteowned' }
-sub desc { '-O' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftrowned;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftrowned' }
-sub desc { '-o' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftzero;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftzero' }
-sub desc { '-z' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsize;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsize' }
-sub desc { '-s' }
-sub check { 'ck_ftst' }
-sub flags { 'istu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftmtime;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftmtime' }
-sub desc { '-M' }
-sub check { 'ck_ftst' }
-sub flags { 'stu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftatime;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftatime' }
-sub desc { '-A' }
-sub check { 'ck_ftst' }
-sub flags { 'stu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftctime;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftctime' }
-sub desc { '-C' }
-sub check { 'ck_ftst' }
-sub flags { 'stu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsock;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsock' }
-sub desc { '-S' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftchr;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftchr' }
-sub desc { '-c' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftblk;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftblk' }
-sub desc { '-b' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftfile;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftfile' }
-sub desc { '-f' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftdir;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftdir' }
-sub desc { '-d' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftpipe;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftpipe' }
-sub desc { '-p' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftlink;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftlink' }
-sub desc { '-l' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsuid;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsuid' }
-sub desc { '-u' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsgid;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsgid' }
-sub desc { '-g' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftsvtx;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftsvtx' }
-sub desc { '-k' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fttty;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fttty' }
-sub desc { '-t' }
-sub check { 'ck_ftst' }
-sub flags { 'is-' }
-sub args { 'F-' }
-
-
-package PLXML::op_fttext;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'fttext' }
-sub desc { '-T' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-package PLXML::op_ftbinary;
-
-our @ISA = ('PLXML::filestatop');
-
-sub key { 'ftbinary' }
-sub desc { '-B' }
-sub check { 'ck_ftst' }
-sub flags { 'isu-' }
-sub args { 'F-' }
-
-
-
-# File calls.
-
-package PLXML::op_chdir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chdir' }
-sub desc { 'chdir' }
-sub check { 'ck_fun' }
-sub flags { 'isT%' }
-sub args { 'S?' }
-
-
-package PLXML::op_chown;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'chown' }
-sub desc { 'chown' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_chroot;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'chroot' }
-sub desc { 'chroot' }
-sub check { 'ck_fun' }
-sub flags { 'isTu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_unlink;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'unlink' }
-sub desc { 'unlink' }
-sub check { 'ck_fun' }
-sub flags { 'imsTu@' }
-sub args { 'L' }
-
-
-package PLXML::op_chmod;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'chmod' }
-sub desc { 'chmod' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_utime;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'utime' }
-sub desc { 'utime' }
-sub check { 'ck_fun' }
-sub flags { 'imsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_rename;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'rename' }
-sub desc { 'rename' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_link;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'link' }
-sub desc { 'link' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_symlink;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'symlink' }
-sub desc { 'symlink' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_readlink;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'readlink' }
-sub desc { 'readlink' }
-sub check { 'ck_fun' }
-sub flags { 'stu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_mkdir;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'mkdir' }
-sub desc { 'mkdir' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S?' }
-
-
-package PLXML::op_rmdir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'rmdir' }
-sub desc { 'rmdir' }
-sub check { 'ck_fun' }
-sub flags { 'isTu%' }
-sub args { 'S?' }
-
-
-
-# Directory calls.
-
-package PLXML::op_open_dir;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'open_dir' }
-sub desc { 'opendir' }
-sub check { 'ck_fun' }
-sub flags { 'is@' }
-sub args { 'F S' }
-
-
-package PLXML::op_readdir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'readdir' }
-sub desc { 'readdir' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'F' }
-
-
-package PLXML::op_telldir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'telldir' }
-sub desc { 'telldir' }
-sub check { 'ck_fun' }
-sub flags { 'st%' }
-sub args { 'F' }
-
-
-package PLXML::op_seekdir;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'seekdir' }
-sub desc { 'seekdir' }
-sub check { 'ck_fun' }
-sub flags { 's@' }
-sub args { 'F S' }
-
-
-package PLXML::op_rewinddir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'rewinddir' }
-sub desc { 'rewinddir' }
-sub check { 'ck_fun' }
-sub flags { 's%' }
-sub args { 'F' }
-
-
-package PLXML::op_closedir;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'closedir' }
-sub desc { 'closedir' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'F' }
-
-
-
-# Process control.
-
-package PLXML::op_fork;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'fork' }
-sub desc { 'fork' }
-sub check { 'ck_null' }
-sub flags { 'ist0' }
-sub args { '' }
-
-
-package PLXML::op_wait;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'wait' }
-sub desc { 'wait' }
-sub check { 'ck_null' }
-sub flags { 'isT0' }
-sub args { '' }
-
-
-package PLXML::op_waitpid;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'waitpid' }
-sub desc { 'waitpid' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_system;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'system' }
-sub desc { 'system' }
-sub check { 'ck_exec' }
-sub flags { 'imsT@' }
-sub args { 'S? L' }
-
-
-package PLXML::op_exec;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'exec' }
-sub desc { 'exec' }
-sub check { 'ck_exec' }
-sub flags { 'dimsT@' }
-sub args { 'S? L' }
-
-
-package PLXML::op_kill;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'kill' }
-sub desc { 'kill' }
-sub check { 'ck_fun' }
-sub flags { 'dimsT@' }
-sub args { 'L' }
-
-
-package PLXML::op_getppid;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'getppid' }
-sub desc { 'getppid' }
-sub check { 'ck_null' }
-sub flags { 'isT0' }
-sub args { '' }
-
-
-package PLXML::op_getpgrp;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'getpgrp' }
-sub desc { 'getpgrp' }
-sub check { 'ck_fun' }
-sub flags { 'isT%' }
-sub args { 'S?' }
-
-
-package PLXML::op_setpgrp;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'setpgrp' }
-sub desc { 'setpgrp' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S? S?' }
-
-
-package PLXML::op_getpriority;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'getpriority' }
-sub desc { 'getpriority' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S' }
-
-
-package PLXML::op_setpriority;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'setpriority' }
-sub desc { 'setpriority' }
-sub check { 'ck_fun' }
-sub flags { 'isT@' }
-sub args { 'S S S' }
-
-
-
-# Time calls.
-
-package PLXML::op_time;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'time' }
-sub desc { 'time' }
-sub check { 'ck_null' }
-sub flags { 'isT0' }
-sub args { '' }
-
-
-package PLXML::op_tms;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'tms' }
-sub desc { 'times' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_localtime;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'localtime' }
-sub desc { 'localtime' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'S?' }
-
-
-package PLXML::op_gmtime;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gmtime' }
-sub desc { 'gmtime' }
-sub check { 'ck_fun' }
-sub flags { 't%' }
-sub args { 'S?' }
-
-
-package PLXML::op_alarm;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'alarm' }
-sub desc { 'alarm' }
-sub check { 'ck_fun' }
-sub flags { 'istu%' }
-sub args { 'S?' }
-
-
-package PLXML::op_sleep;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sleep' }
-sub desc { 'sleep' }
-sub check { 'ck_fun' }
-sub flags { 'isT%' }
-sub args { 'S?' }
-
-
-
-# Shared memory.
-
-package PLXML::op_shmget;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmget' }
-sub desc { 'shmget' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_shmctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmctl' }
-sub desc { 'shmctl' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_shmread;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmread' }
-sub desc { 'shmread' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S' }
-
-
-package PLXML::op_shmwrite;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'shmwrite' }
-sub desc { 'shmwrite' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S' }
-
-
-
-# Message passing.
-
-package PLXML::op_msgget;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgget' }
-sub desc { 'msgget' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S' }
-
-
-package PLXML::op_msgctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgctl' }
-sub desc { 'msgctl' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_msgsnd;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgsnd' }
-sub desc { 'msgsnd' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_msgrcv;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'msgrcv' }
-sub desc { 'msgrcv' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S S' }
-
-
-
-# Semaphores.
-
-package PLXML::op_semget;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'semget' }
-sub desc { 'semget' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S' }
-
-
-package PLXML::op_semctl;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'semctl' }
-sub desc { 'semctl' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S S S' }
-
-
-package PLXML::op_semop;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'semop' }
-sub desc { 'semop' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S S' }
-
-
-
-# Eval.
-
-package PLXML::op_require;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'require' }
-sub desc { 'require' }
-sub check { 'ck_require' }
-sub flags { 'du%' }
-sub args { 'S?' }
-
-
-package PLXML::op_dofile;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'dofile' }
-sub desc { 'do "file"' }
-sub check { 'ck_fun' }
-sub flags { 'd1' }
-sub args { 'S' }
-
-
-package PLXML::op_entereval;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'entereval' }
-sub desc { 'eval "string"' }
-sub check { 'ck_eval' }
-sub flags { 'd%' }
-sub args { 'S' }
-
-
-package PLXML::op_leaveeval;
-
-our @ISA = ('PLXML::unop');
-
-sub key { 'leaveeval' }
-sub desc { 'eval "string" exit' }
-sub check { 'ck_null' }
-sub flags { '1' }
-sub args { 'S' }
-
-
-#evalonce      eval constant string    ck_null         d1      S
-package PLXML::op_entertry;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'entertry' }
-sub desc { 'eval {block}' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_leavetry;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'leavetry' }
-sub desc { 'eval {block} exit' }
-sub check { 'ck_null' }
-sub flags { '@' }
-sub args { '' }
-
-
-
-# Get system info.
-
-package PLXML::op_ghbyname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ghbyname' }
-sub desc { 'gethostbyname' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_ghbyaddr;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'ghbyaddr' }
-sub desc { 'gethostbyaddr' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_ghostent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'ghostent' }
-sub desc { 'gethostent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_gnbyname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gnbyname' }
-sub desc { 'getnetbyname' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gnbyaddr;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gnbyaddr' }
-sub desc { 'getnetbyaddr' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_gnetent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gnetent' }
-sub desc { 'getnetent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_gpbyname;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gpbyname' }
-sub desc { 'getprotobyname' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gpbynumber;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gpbynumber' }
-sub desc { 'getprotobynumber' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S' }
-
-
-package PLXML::op_gprotoent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gprotoent' }
-sub desc { 'getprotoent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_gsbyname;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gsbyname' }
-sub desc { 'getservbyname' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_gsbyport;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'gsbyport' }
-sub desc { 'getservbyport' }
-sub check { 'ck_fun' }
-sub flags { '@' }
-sub args { 'S S' }
-
-
-package PLXML::op_gservent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gservent' }
-sub desc { 'getservent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_shostent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'shostent' }
-sub desc { 'sethostent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_snetent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'snetent' }
-sub desc { 'setnetent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_sprotoent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sprotoent' }
-sub desc { 'setprotoent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_sservent;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'sservent' }
-sub desc { 'setservent' }
-sub check { 'ck_fun' }
-sub flags { 'is%' }
-sub args { 'S' }
-
-
-package PLXML::op_ehostent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'ehostent' }
-sub desc { 'endhostent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_enetent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'enetent' }
-sub desc { 'endnetent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_eprotoent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'eprotoent' }
-sub desc { 'endprotoent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_eservent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'eservent' }
-sub desc { 'endservent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_gpwnam;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gpwnam' }
-sub desc { 'getpwnam' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gpwuid;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'gpwuid' }
-sub desc { 'getpwuid' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_gpwent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'gpwent' }
-sub desc { 'getpwent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_spwent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'spwent' }
-sub desc { 'setpwent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_epwent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'epwent' }
-sub desc { 'endpwent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_ggrnam;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ggrnam' }
-sub desc { 'getgrnam' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_ggrgid;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'ggrgid' }
-sub desc { 'getgrgid' }
-sub check { 'ck_fun' }
-sub flags { '%' }
-sub args { 'S' }
-
-
-package PLXML::op_ggrent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'ggrent' }
-sub desc { 'getgrent' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
-package PLXML::op_sgrent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'sgrent' }
-sub desc { 'setgrent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_egrent;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'egrent' }
-sub desc { 'endgrent' }
-sub check { 'ck_null' }
-sub flags { 'is0' }
-sub args { '' }
-
-
-package PLXML::op_getlogin;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'getlogin' }
-sub desc { 'getlogin' }
-sub check { 'ck_null' }
-sub flags { 'st0' }
-sub args { '' }
-
-
-
-# Miscellaneous.
-
-package PLXML::op_syscall;
-
-our @ISA = ('PLXML::listop');
-
-sub key { 'syscall' }
-sub desc { 'syscall' }
-sub check { 'ck_fun' }
-sub flags { 'imst@' }
-sub args { 'S L' }
-
-
-
-# For multi-threading
-package PLXML::op_lock;
-
-our @ISA = ('PLXML::baseop_unop');
-
-sub key { 'lock' }
-sub desc { 'lock' }
-sub check { 'ck_rfun' }
-sub flags { 's%' }
-sub args { 'R' }
-
-
-package PLXML::op_threadsv;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'threadsv' }
-sub desc { 'per-thread value' }
-sub check { 'ck_null' }
-sub flags { 'ds0' }
-sub args { '' }
-
-
-
-# Control (contd.)
-package PLXML::op_setstate;
-
-our @ISA = ('PLXML::cop');
-
-sub key { 'setstate' }
-sub desc { 'set statement info' }
-sub check { 'ck_null' }
-sub flags { 's;' }
-sub args { '' }
-
-
-package PLXML::op_method_named;
-
-our @ISA = ('PLXML::padop_svop');
-
-sub key { 'method_named' }
-sub desc { 'method with known name' }
-sub check { 'ck_null' }
-sub flags { 'd$' }
-sub args { '' }
-
-
-
-package PLXML::op_dor;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'dor' }
-sub desc { 'defined or (//)' }
-sub check { 'ck_null' }
-sub flags { '|' }
-sub args { '' }
-
-
-package PLXML::op_dorassign;
-
-our @ISA = ('PLXML::logop');
-
-sub key { 'dorassign' }
-sub desc { 'defined or assignment (//=)' }
-sub check { 'ck_null' }
-sub flags { 's|' }
-sub args { '' }
-
-
-
-# Add new ops before this, the custom operator.
-
-package PLXML::op_custom;
-
-our @ISA = ('PLXML::baseop');
-
-sub key { 'custom' }
-sub desc { 'unknown custom operator' }
-sub check { 'ck_null' }
-sub flags { '0' }
-sub args { '' }
-
-
diff --git a/mad/p55 b/mad/p55
deleted file mode 100644 (file)
index 20b879b..0000000
--- a/mad/p55
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/perl
-
-while (@ARGV and $ARGV[0] =~ /^-/) {
-    my $switch = shift;
-    if ($switch eq '-Y') {
-        $YAML = '-Y ';
-    }
-    else {
-        die "Unrecognized switch: -$switch";
-    }
-}
-
-my $file = shift;
-my $infile = $file;
-
-unlink "$file.msg";
-my $top = "/home/larry/src/p55";
-
-my $text;
-open(FILE, $file) or die "Can't open $file: $!\n";
-{
-    local $/;
-    $text = <FILE>;
-}
-close FILE;
-my $T;
-$switches = $1 if $text =~ /^#!.*?\s(-.*)/;
-$switches =~ s/\s+-[-*].*//;
-$switches =~ s/\s+#.*//;
-
-#if ($text =~ s/\bexit\b/DUMMYEXIT/g) {
-#    $infile = "$file.tmp";
-#    open FILE, ">$infile";
-#    print FILE $text;
-#    close FILE;
-#}
-
-unlink "$file.xml", "$file.msg", "$file.err", "$file.diff", "$file.p5";
-print "PERL_XMLDUMP='$file.xml' $top/perl $switches -I lib $infile 2>$file.err\n";
-system "PERL_XMLDUMP='$file.xml' $top/perl $switches -I lib $infile 2>$file.err";
-
-if ($?) {
-    print "Exit status $?\n";
-    system "cat $file.err";
-    exit 1;
-}
-
-if (not -s "$file.xml") {
-    die "Didn't produce an xml file!?!\n"
-}
-
-if ($YAML) {
-    system "$top/nomad -Y $file.xml";
-    exit;
-}
-
-system "$top/nomad $file.xml >$file.p5 2>$file.msg";
-
-if ($?) {
-    print "Oops!\n" unless -s "$file.msg";
-    system "cat $file.msg";
-    exit 1;
-}
-
-system "diff -u $file $file.p5 >$file.diff";
-if (-s "$file.diff") {
-    system "cat $file.diff";
-    exit 1;
-}
diff --git a/mad/t/p55.t b/mad/t/p55.t
deleted file mode 100644 (file)
index fbfa451..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-
-# Test p55, the "Perl 5 to Perl 5" translator.
-
-# The perl core should have MAD enabled ('sh Configure -Dmad=y ...')
-
-# The part to convert xml to Perl 5 requires XML::Parser, but it does
-# not depend on Perl internals, so you can use a stable system wide
-# perl
-
-# For the p55 on the perl test suite, it should be started from the
-# $perlsource/t subdir
-
-# Instructions:
-#     sh Configure -Dmad=y
-#     make && make test
-#     cd t && /usr/bin/prove ../mad/t/p55.t
-
-use strict;
-use warnings;
-
-BEGIN {
-    push @INC, "../mad";
-}
-
-use Test::More qw|no_plan|;
-use IO::Handle;
-
-use Nomad;
-
-sub p55 {
-    my ($input, $msg) = @_;
-
-    # perl5 to xml
-    open my $infile, "> tmp.in";
-    $infile->print($input);
-    close $infile;
-
-    unlink "tmp.xml";
-    `PERL_XMLDUMP='tmp.xml' ../perl -I ../lib tmp.in 2> tmp.err`;
-
-    if (-z "tmp.xml") {
-        return ok 0, "MAD dump failed $msg";
-    }
-    my $output = eval { Nomad::xml_to_p5( input => "tmp.xml" ) };
-    diag($@) if $@;
-    is($output, $input, $msg);
-}
-
-undef $/;
-my @prgs = split m/^########\n/m, <DATA>;
-
-use bytes;
-
-for my $prog (@prgs) {
-    my $msg = ($prog =~ s/^#(.*)\n//) && $1;
-    local $TODO = ($msg =~ /TODO/) ? 1 : 0;
-    p55($prog, $msg);
-}
-
-# Files
-use File::Find;
-use Test::Differences;
-
-our %failing = map { $_, 1 } qw|
-../t/comp/require.t
-
-../t/op/switch.t
-
-../t/op/attrhand.t
-
-../t/op/symbolcache.t
-
-../t/op/exec.t
-
-../t/op/state.t
-../t/op/each_array.t
-../t/lib/cygwin.t
-|;
-
-my @files;
-find( sub { push @files, $File::Find::name if m/[.]t$/ }, '../t/');
-
-for my $file (@files) {
-    my $input;
-    local $/ = undef;
-    local $TODO = (exists $failing{$file} ? "Known failure" : undef);
-    #warn $file;
-    open(my $fh, "<", "$file") or die "Failed open '../t/$file' $!";
-    $input = $fh->getline;
-    close $fh or die;
-
-    my $switches = "";
-    if( $input =~ m/^[#][!].*perl(.*)/) {
-        $switches = $1;
-    }
-
-    unlink "tmp.xml";
-    `PERL_XMLDUMP='tmp.xml' ../perl $switches -I ../lib $file 2> tmp.err`;
-
-    if (-z "tmp.xml") {
-        fail "MAD dump failure of '$file'";
-        next;
-    }
-    my $output = eval { Nomad::xml_to_p5( input => "tmp.xml" ) };
-    if ($@) {
-        fail "convert xml to p5 failed file: '$file'";
-        diag "error: $@";
-        next;
-    }
-    eq_or_diff $output, $input, "p55 '$file'";
-}
-
-__DATA__
-use strict;
-#ABC
-new Foo;
-Foo->new;
-########
-sub pi() { 3.14 }
-my $x = pi;
-########
--OS_Code => $a
-########
-use encoding 'euc-jp';
-tr/¤¡-¤ó¥¡-¥ó/¥¡-¥ó¤¡-¤ó/;
-########
-sub ok($$) { }
-BEGIN { ok(1, 2, ); }
-########
-for (my $i=0; $i<3; $i++) { }
-########
-for (; $a<3; $a++) { }
-########
-#
-s//$#foo/ge;
-########
-#
-s//m#.#/ge;
-########
-#
-eval { require 5.005 }
-########
-# Reduced test case from t/io/layers.t
-sub PerlIO::F_UTF8 () { 0x00008000 } # from perliol.h
-BEGIN { PerlIO::Layer->find("encoding",1);}
-########
-# from ../t/op/array.t
-$[ = 1
-########
-# from t/comp/parser.t
-$x = 1 for ($[) = 0;
-########
-# from t/op/getppid.t
-pipe my ($r, $w)
-########
-# TODO switch
-use feature 'switch';
-given(my $x = "bar") { }
-########
-# TODO attribute t/op/attrhand.t
-sub something : TypeCheck(
-    QNET::Util::Object,
-    QNET::Util::Object,
-    QNET::Util::Object
-) { #           WrongAttr (perl tokenizer bug)
-    # keep this ^ lined up !
-    return 42;
-}
-########
-# TODO symbol table t/op/symbolcache.t
-sub replaced2 { 'func' }
-BEGIN { undef $main::{replaced2} }
-########
-# TODO exit in begin block. from t/op/threads.t without threads
-BEGIN {
-    exit 0;
-}
-use foobar;
diff --git a/madly.c b/madly.c
deleted file mode 100644 (file)
index d703732..0000000
--- a/madly.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/*    madly.c
- *
- *    Copyright (c) 2004, 2005, 2006 Larry Wall and others
- *
- *    You may distribute under the terms of either the GNU General Public
- *    License or the Artistic License, as specified in the README file.
- * 
- * Note that this file is essentially empty, and just #includes perly.c,
- * to allow compilation of a second parser, Perl_madparse, that is
- * identical to Perl_yyparse, but which includes extra code for dumping
- * the parse tree.  This is controlled by the PERL_IN_MADLY_C define.
- */
-
-#define PERL_IN_MADLY_C
-
-#include "perly.c"
-
-/*
- * Local variables:
- * c-indentation-style: bsd
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- *
- * ex: set ts=8 sts=4 sw=4 et:
- */
index c88bee8..83f0c91 100644 (file)
@@ -453,13 +453,6 @@ unless ($define{'PERL_TRACK_MEMPOOL'}) {
     ++$skip{PL_memory_debug_header};
 }
 
-unless ($define{PERL_MAD}) {
-    ++$skip{$_} foreach qw(
-                   PL_madskills
-                   PL_xmlfp
-                        );
-}
-
 unless ($define{'MULTIPLICITY'}) {
     ++$skip{$_} foreach qw(
                    PL_interp_size
diff --git a/op.c b/op.c
index be20c21..eb64b52 100644 (file)
--- a/op.c
+++ b/op.c
@@ -571,8 +571,6 @@ S_no_bareword_allowed(pTHX_ OP *o)
 {
     PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED;
 
-    if (PL_madskills)
-       return;         /* various ok barewords are hidden in extra OP_NULL */
     qerror(Perl_mess(aTHX_
                     "Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
                     SVfARG(cSVOPo_sv)));
@@ -786,19 +784,8 @@ Perl_op_clear(pTHX_ OP *o)
 
     PERL_ARGS_ASSERT_OP_CLEAR;
 
-#ifdef PERL_MAD
-    mad_free(o->op_madprop);
-    o->op_madprop = 0;
-#endif    
-
- retry:
     switch (o->op_type) {
     case OP_NULL:      /* Was holding old type, if any. */
-       if (PL_madskills && o->op_targ != OP_NULL) {
-           o->op_type = (Optype)o->op_targ;
-           o->op_targ = 0;
-           goto retry;
-       }
         /* FALLTHROUGH */
     case OP_ENTERTRY:
     case OP_ENTEREVAL: /* Was holding hints. */
@@ -1038,8 +1025,7 @@ Perl_op_null(pTHX_ OP *o)
 
     if (o->op_type == OP_NULL)
        return;
-    if (!PL_madskills)
-       op_clear(o);
+    op_clear(o);
     o->op_targ = o->op_type;
     o->op_type = OP_NULL;
     o->op_ppaddr = PL_ppaddr[OP_NULL];
@@ -1398,21 +1384,6 @@ Perl_scalarvoid(pTHX_ OP *o)
 
     PERL_ARGS_ASSERT_SCALARVOID;
 
-    /* trailing mad null ops don't count as "there" for void processing */
-    if (PL_madskills &&
-       o->op_type != OP_NULL &&
-       o->op_sibling &&
-       o->op_sibling->op_type == OP_NULL)
-    {
-       OP *sib;
-       for (sib = o->op_sibling;
-               sib && sib->op_type == OP_NULL;
-               sib = sib->op_sibling) ;
-       
-       if (!sib)
-           return o;
-    }
-
     if (o->op_type == OP_NEXTSTATE
        || o->op_type == OP_DBSTATE
        || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
@@ -1673,8 +1644,7 @@ Perl_scalarvoid(pTHX_ OP *o)
     case OP_AND:
        kid = cLOGOPo->op_first;
        if (kid->op_type == OP_NOT
-           && (kid->op_flags & OPf_KIDS)
-           && !PL_madskills) {
+           && (kid->op_flags & OPf_KIDS)) {
            if (o->op_type == OP_AND) {
                o->op_type = OP_OR;
                o->op_ppaddr = PL_ppaddr[OP_OR];
@@ -1885,23 +1855,6 @@ S_finalize_op(pTHX_ OP* o)
 {
     PERL_ARGS_ASSERT_FINALIZE_OP;
 
-#if defined(PERL_MAD) && defined(USE_ITHREADS)
-    {
-       /* Make sure mad ops are also thread-safe */
-       MADPROP *mp = o->op_madprop;
-       while (mp) {
-           if (mp->mad_type == MAD_OP && mp->mad_vlen) {
-               OP *prop_op = (OP *) mp->mad_val;
-               /* We only need "Relocate sv to the pad for thread safety.", but this
-                  easiest way to make sure it traverses everything */
-               if (prop_op->op_type == OP_CONST)
-                   cSVOPx(prop_op)->op_private &= ~OPpCONST_STRICT;
-               finalize_op(prop_op);
-           }
-           mp = mp->mad_next;
-       }
-    }
-#endif
 
     switch (o->op_type) {
     case OP_NEXTSTATE:
@@ -2132,7 +2085,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        PL_modcount++;
        return o;
     case OP_STUB:
-       if ((o->op_flags & OPf_PARENS) || PL_madskills)
+       if ((o->op_flags & OPf_PARENS))
            break;
        goto nomod;
     case OP_ENTERSUB:
@@ -2635,10 +2588,6 @@ S_dup_attrlist(pTHX_ OP *o)
      */
     if (o->op_type == OP_CONST)
        rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv));
-#ifdef PERL_MAD
-    else if (o->op_type == OP_NULL)
-       rop = NULL;
-#endif
     else {
        assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
        rop = NULL;
@@ -2898,10 +2847,6 @@ S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
        return o;
 
     type = o->op_type;
-    if (PL_madskills && type == OP_NULL && o->op_flags & OPf_KIDS) {
-       (void)my_kid(cUNOPo->op_first, attrs, imopsp);
-       return o;
-    }
 
     if (type == OP_LIST) {
         OP *kid;
@@ -3614,14 +3559,7 @@ S_fold_constants(pTHX_ OP *o)
        CALLRUNOPS(aTHX);
        sv = *(PL_stack_sp--);
        if (o->op_targ && sv == PAD_SV(o->op_targ)) {   /* grab pad temp? */
-#ifdef PERL_MAD
-           /* Can't simply swipe the SV from the pad, because that relies on
-              the op being freed "real soon now". Under MAD, this doesn't
-              happen (see the #ifdef below).  */
-           sv = newSVsv(sv);
-#else
            pad_swipe(o->op_targ,  FALSE);
-#endif
        }
        else if (SvTEMP(sv)) {                  /* grab mortal temp? */
            SvREFCNT_inc_simple_void(sv);
@@ -3655,9 +3593,7 @@ S_fold_constants(pTHX_ OP *o)
     if (ret)
        goto nope;
 
-#ifndef PERL_MAD
     op_free(o);
-#endif
     assert(sv);
     if (type == OP_STRINGIFY) SvPADTMP_off(sv);
     else if (!SvIMMORTAL(sv)) {
@@ -3671,7 +3607,6 @@ S_fold_constants(pTHX_ OP *o)
        newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv));
        if (type != OP_STRINGIFY) newop->op_folded = 1;
     }
-    op_getmad(o,newop,'f');
     return newop;
 
  nope:
@@ -3718,11 +3653,7 @@ S_gen_constant_list(pTHX_ OP *o)
            SvPADTMP_on(*svp);
            SvREADONLY_on(*svp);
        }
-#ifdef PERL_MAD
-    op_getmad(curop,o,'O');
-#else
     op_free(curop);
-#endif
     LINKLIST(o);
     return list(o);
 }
@@ -3834,21 +3765,6 @@ Perl_op_append_list(pTHX_ I32 type, OP *first, OP *last)
     ((LISTOP*)first)->op_last = ((LISTOP*)last)->op_last;
     first->op_flags |= (last->op_flags & OPf_KIDS);
 
-#ifdef PERL_MAD
-    if (((LISTOP*)last)->op_first && first->op_madprop) {
-       MADPROP *mp = ((LISTOP*)last)->op_first->op_madprop;
-       if (mp) {
-           while (mp->mad_next)
-               mp = mp->mad_next;
-           mp->mad_next = first->op_madprop;
-       }
-       else {
-           ((LISTOP*)last)->op_first->op_madprop = first->op_madprop;
-       }
-    }
-    first->op_madprop = last->op_madprop;
-    last->op_madprop = 0;
-#endif
 
     S_op_destroy(aTHX_ last);
 
@@ -3901,251 +3817,6 @@ Perl_op_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
 
 /* Constructors */
 
-#ifdef PERL_MAD
-TOKEN *
-Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop)
-{
-    TOKEN *tk;
-    Newxz(tk, 1, TOKEN);
-    tk->tk_type = (OPCODE)optype;
-    tk->tk_type = 12345;
-    tk->tk_lval = lval;
-    tk->tk_mad = madprop;
-    return tk;
-}
-
-void
-Perl_token_free(pTHX_ TOKEN* tk)
-{
-    PERL_ARGS_ASSERT_TOKEN_FREE;
-
-    if (tk->tk_type != 12345)
-       return;
-    mad_free(tk->tk_mad);
-    Safefree(tk);
-}
-
-void
-Perl_token_getmad(pTHX_ TOKEN* tk, OP* o, char slot)
-{
-    MADPROP* mp;
-    MADPROP* tm;
-
-    PERL_ARGS_ASSERT_TOKEN_GETMAD;
-
-    if (tk->tk_type != 12345) {
-       Perl_warner(aTHX_ packWARN(WARN_MISC),
-            "Invalid TOKEN object ignored");
-       return;
-    }
-    tm = tk->tk_mad;
-    if (!tm)
-       return;
-
-    /* faked up qw list? */
-    if (slot == '(' &&
-       tm->mad_type == MAD_SV &&
-       SvPVX((SV *)tm->mad_val)[0] == 'q')
-           slot = 'x';
-
-    if (o) {
-       mp = o->op_madprop;
-       if (mp) {
-           for (;;) {
-               /* pretend constant fold didn't happen? */
-               if (mp->mad_key == 'f' &&
-                   (o->op_type == OP_CONST ||
-                    o->op_type == OP_GV) )
-               {
-                   token_getmad(tk,(OP*)mp->mad_val,slot);
-                   return;
-               }
-               if (!mp->mad_next)
-                   break;
-               mp = mp->mad_next;
-           }
-           mp->mad_next = tm;
-           mp = mp->mad_next;
-       }
-       else {
-           o->op_madprop = tm;
-           mp = o->op_madprop;
-       }
-       if (mp->mad_key == 'X')
-           mp->mad_key = slot; /* just change the first one */
-
-       tk->tk_mad = 0;
-    }
-    else
-       mad_free(tm);
-    Safefree(tk);
-}
-
-void
-Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot)
-{
-    MADPROP* mp;
-    if (!from)
-       return;
-    if (o) {
-       mp = o->op_madprop;
-       if (mp) {
-           for (;;) {
-               /* pretend constant fold didn't happen? */
-               if (mp->mad_key == 'f' &&
-                   (o->op_type == OP_CONST ||
-                    o->op_type == OP_GV) )
-               {
-                   op_getmad(from,(OP*)mp->mad_val,slot);
-                   return;
-               }
-               if (!mp->mad_next)
-                   break;
-               mp = mp->mad_next;
-           }
-           mp->mad_next = newMADPROP(slot,MAD_OP,from,0);
-       }
-       else {
-           o->op_madprop = newMADPROP(slot,MAD_OP,from,0);
-       }
-    }
-}
-
-void
-Perl_op_getmad(pTHX_ OP* from, OP* o, char slot)
-{
-    MADPROP* mp;
-    if (!from)
-       return;
-    if (o) {
-       mp = o->op_madprop;
-       if (mp) {
-           for (;;) {
-               /* pretend constant fold didn't happen? */
-               if (mp->mad_key == 'f' &&
-                   (o->op_type == OP_CONST ||
-                    o->op_type == OP_GV) )
-               {
-                   op_getmad(from,(OP*)mp->mad_val,slot);
-                   return;
-               }
-               if (!mp->mad_next)
-                   break;
-               mp = mp->mad_next;
-           }
-           mp->mad_next = newMADPROP(slot,MAD_OP,from,1);
-       }
-       else {
-           o->op_madprop = newMADPROP(slot,MAD_OP,from,1);
-       }
-    }
-    else {
-       PerlIO_printf(PerlIO_stderr(),
-                     "DESTROYING op = %0"UVxf"\n", PTR2UV(from));
-       op_free(from);
-    }
-}
-
-void
-Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot)
-{
-    MADPROP* tm;
-    if (!mp || !o)
-       return;
-    if (slot)
-       mp->mad_key = slot;
-    tm = o->op_madprop;
-    o->op_madprop = mp;
-    for (;;) {
-       if (!mp->mad_next)
-           break;
-       mp = mp->mad_next;
-    }
-    mp->mad_next = tm;
-}
-
-void
-Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot)
-{
-    if (!o)
-       return;
-    addmad(tm, &(o->op_madprop), slot);
-}
-
-void
-Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot)
-{
-    MADPROP* mp;
-    if (!tm || !root)
-       return;
-    if (slot)
-       tm->mad_key = slot;
-    mp = *root;
-    if (!mp) {
-       *root = tm;
-       return;
-    }
-    for (;;) {
-       if (!mp->mad_next)
-           break;
-       mp = mp->mad_next;
-    }
-    mp->mad_next = tm;
-}
-
-MADPROP *
-Perl_newMADsv(pTHX_ char key, SV* sv)
-{
-    PERL_ARGS_ASSERT_NEWMADSV;
-
-    return newMADPROP(key, MAD_SV, sv, 0);
-}
-
-MADPROP *
-Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen)
-{
-    MADPROP *const mp = (MADPROP *) PerlMemShared_malloc(sizeof(MADPROP));
-    mp->mad_next = 0;
-    mp->mad_key = key;
-    mp->mad_vlen = vlen;
-    mp->mad_type = type;
-    mp->mad_val = val;
-/*    PerlIO_printf(PerlIO_stderr(), "NEW  mp = %0x\n", mp);  */
-    return mp;
-}
-
-void
-Perl_mad_free(pTHX_ MADPROP* mp)
-{
-/*    PerlIO_printf(PerlIO_stderr(), "FREE mp = %0x\n", mp); */
-    if (!mp)
-       return;
-    if (mp->mad_next)
-       mad_free(mp->mad_next);
-/*    if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING && mp->mad_vlen)
-       PerlIO_printf(PerlIO_stderr(), "DESTROYING '%c'=<%s>\n", mp->mad_key & 255, mp->mad_val); */
-    switch (mp->mad_type) {
-    case MAD_NULL:
-       break;
-    case MAD_PV:
-       Safefree(mp->mad_val);
-       break;
-    case MAD_OP:
-       if (mp->mad_vlen)       /* vlen holds "strong/weak" boolean */
-           op_free((OP*)mp->mad_val);
-       break;
-    case MAD_SV:
-       sv_free(MUTABLE_SV(mp->mad_val));
-       break;
-    default:
-       PerlIO_printf(PerlIO_stderr(), "Unrecognized mad\n");
-       break;
-    }
-    PerlMemShared_free(mp);
-}
-
-#endif
 
 /*
 =head1 Optree construction
@@ -4386,10 +4057,6 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
     dVAR;
     SV * const tstr = ((SVOP*)expr)->op_sv;
     SV * const rstr =
-#ifdef PERL_MAD
-                       (repl->op_type == OP_NULL)
-                           ? ((SVOP*)((LISTOP*)repl)->op_first)->op_sv :
-#endif
                              ((SVOP*)repl)->op_sv;
     STRLEN tlen;
     STRLEN rlen;
@@ -4620,13 +4287,8 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
        Safefree(tsave);
        Safefree(rsave);
 
-#ifdef PERL_MAD
-       op_getmad(expr,o,'e');
-       op_getmad(repl,o,'r');
-#else
        op_free(expr);
        op_free(repl);
-#endif
        return o;
     }
 
@@ -4711,13 +4373,8 @@ S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
 
     if (grows)
        o->op_private |= OPpTRANS_GROWS;
-#ifdef PERL_MAD
-    op_getmad(expr,o,'e');
-    op_getmad(repl,o,'r');
-#else
     op_free(expr);
     op_free(repl);
-#endif
 
     return o;
 }
@@ -4969,11 +4626,7 @@ Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg, I32 floor)
                    : Perl_re_op_compile(aTHX_ NULL, 0, expr, eng, NULL, NULL,
                                        rx_flags, pm->op_pmflags)
            );
-#ifdef PERL_MAD
-           op_getmad(expr,(OP*)pm,'e');
-#else
            op_free(expr);
-#endif
        }
        else {
            /* compile-time pattern that includes literal code blocks */
@@ -5316,18 +4969,11 @@ Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
     return CHECKOP(type, pvop);
 }
 
-#ifdef PERL_MAD
-OP*
-#else
 void
-#endif
 Perl_package(pTHX_ OP *o)
 {
     dVAR;
     SV *const sv = cSVOPo->op_sv;
-#ifdef PERL_MAD
-    OP *pegop;
-#endif
 
     PERL_ARGS_ASSERT_PACKAGE;
 
@@ -5342,18 +4988,7 @@ Perl_package(pTHX_ OP *o)
     PL_parser->copline = NOLINE;
     PL_parser->expect = XSTATE;
 
-#ifndef PERL_MAD
     op_free(o);
-#else
-    if (!PL_madskills) {
-       op_free(o);
-       return NULL;
-    }
-
-    pegop = newOP(OP_NULL,0);
-    op_getmad(o,pegop,'P');
-    return pegop;
-#endif
 }
 
 void
@@ -5368,20 +5003,13 @@ Perl_package_version( pTHX_ OP *v )
     op_free(v);
 }
 
-#ifdef PERL_MAD
-OP*
-#else
 void
-#endif
 Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
 {
     dVAR;
     OP *pack;
     OP *imop;
     OP *veop;
-#ifdef PERL_MAD
-    OP *pegop = PL_madskills ? newOP(OP_NULL,0) : NULL;
-#endif
     SV *use_version = NULL;
 
     PERL_ARGS_ASSERT_UTILIZE;
@@ -5389,16 +5017,11 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
     if (idop->op_type != OP_CONST)
        Perl_croak(aTHX_ "Module name must be constant");
 
-    if (PL_madskills)
-       op_getmad(idop,pegop,'U');
-
     veop = NULL;
 
     if (version) {
        SV * const vesv = ((SVOP*)version)->op_sv;
 
-       if (PL_madskills)
-           op_getmad(version,pegop,'V');
        if (!arg && !SvNIOKp(vesv)) {
            arg = version;
        }
@@ -5423,8 +5046,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
 
     /* Fake up an import/unimport */
     if (arg && arg->op_type == OP_STUB) {
-       if (PL_madskills)
-           op_getmad(arg,pegop,'S');
        imop = arg;             /* no import on explicit () */
     }
     else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
@@ -5437,9 +5058,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
     else {
        SV *meth;
 
-       if (PL_madskills)
-           op_getmad(arg,pegop,'A');
-
        /* Make copy of idop so we don't free it twice */
        pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
 
@@ -5514,9 +5132,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
     if (PL_cop_seqmax == PERL_PADSEQ_INTRO) /* not a legal value */
        PL_cop_seqmax++;
 
-#ifdef PERL_MAD
-    return pegop;
-#endif
 }
 
 /*
@@ -5910,7 +5525,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
            LINKLIST(o);
        }
 
-       if (right && right->op_type == OP_SPLIT && !PL_madskills) {
+       if (right && right->op_type == OP_SPLIT) {
            OP* tmpop = ((LISTOP*)right)->op_first;
            if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
                PMOP * const pm = (PMOP*)tmpop;
@@ -6211,7 +5826,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
        && (first->op_flags & OPf_KIDS)
        && ((first->op_flags & OPf_SPECIAL) /* unless ($x) { } */
            || (other->op_type == OP_NOT))  /* if (!$x && !$y) { } */
-       && !PL_madskills) {
+       ) {
        if (type == OP_AND || type == OP_OR) {
            if (type == OP_AND)
                type = OP_OR;
@@ -6236,12 +5851,6 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
            *firstp = NULL;
            if (other->op_type == OP_CONST)
                other->op_private |= OPpCONST_SHORTCIRCUIT;
-           if (PL_madskills) {
-               OP *newop = newUNOP(OP_NULL, 0, other);
-               op_getmad(first, newop, '1');
-               newop->op_targ = type;  /* set "was" field */
-               return newop;
-           }
            op_free(first);
            if (other->op_type == OP_LEAVE)
                other = newUNOP(OP_NULL, OPf_SPECIAL, other);
@@ -6276,13 +5885,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
            *otherp = NULL;
            if (cstop->op_type == OP_CONST)
                cstop->op_private |= OPpCONST_SHORTCIRCUIT;
-           if (PL_madskills) {
-               first = newUNOP(OP_NULL, 0, first);
-               op_getmad(other, first, '2');
-               first->op_targ = type;  /* set "was" field */
-           }
-           else
-               op_free(other);
+               op_free(other);
            return first;
        }
     }
@@ -6397,15 +6000,8 @@ Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
            cstop->op_private & OPpCONST_STRICT) {
            no_bareword_allowed(cstop);
        }
-       if (PL_madskills) {
-           /* This is all dead code when PERL_MAD is not defined.  */
-           live = newUNOP(OP_NULL, 0, live);
-           op_getmad(first, live, 'C');
-           op_getmad(dead, live, left ? 'e' : 't');
-       } else {
-           op_free(first);
-           op_free(dead);
-       }
+        op_free(first);
+        op_free(dead);
        if (live->op_type == OP_LEAVE)
            live = newUNOP(OP_NULL, OPf_SPECIAL, live);
        else if (live->op_type == OP_MATCH || live->op_type == OP_SUBST
@@ -6767,7 +6363,6 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
     PADOFFSET padoff = 0;
     I32 iterflags = 0;
     I32 iterpflags = 0;
-    OP *madsv = NULL;
 
     PERL_ARGS_ASSERT_NEWFOROP;
 
@@ -6790,12 +6385,8 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
        else if (sv->op_type == OP_PADSV) { /* private variable */
            iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
            padoff = sv->op_targ;
-           if (PL_madskills)
-               madsv = sv;
-           else {
-               sv->op_targ = 0;
-               op_free(sv);
-           }
+            sv->op_targ = 0;
+            op_free(sv);
            sv = NULL;
        }
        else
@@ -6846,11 +6437,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
        right->op_next = (OP*)listop;
        listop->op_next = listop->op_first;
 
-#ifdef PERL_MAD
-       op_getmad(expr,(OP*)listop,'O');
-#else
        op_free(expr);
-#endif
        expr = (OP*)(listop);
         op_null(expr);
        iterflags |= OPf_STACKED;
@@ -6879,8 +6466,6 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont)
        loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
     loop->op_targ = padoff;
     wop = newWHILEOP(flags, 1, loop, newOP(OP_ITER, 0), block, cont, 0);
-    if (madsv)
-       op_getmad(madsv, (OP*)loop, 'v');
     return wop;
 }
 
@@ -6933,11 +6518,7 @@ Perl_newLOOPEX(pTHX_ I32 type, OP *label)
     
     /* If we have already created an op, we do not need the label. */
     if (o)
-#ifdef PERL_MAD
-               op_getmad(label,o,'L');
-#else
                op_free(label);
-#endif
     else o = newUNOP(type, OPf_STACKED, label);
 
     PL_hints |= HINT_BLOCK_SCOPE;
@@ -7298,9 +6879,6 @@ Perl_op_const_sv(pTHX_ const OP *o, CV *cv)
     dVAR;
     SV *sv = NULL;
 
-    if (PL_madskills)
-       return NULL;
-
     if (!o)
        return NULL;
 
@@ -7362,9 +6940,6 @@ S_already_defined(pTHX_ CV *const cv, OP * const block, OP * const o,
     assert (o || name);
     assert (const_svp);
     if ((!block
-#ifdef PERL_MAD
-        || block->op_type == OP_NULL
-#endif
         )) {
        if (CvFLAGS(PL_compcv)) {
            /* might have had built-in attrs applied */
@@ -7402,13 +6977,7 @@ S_already_defined(pTHX_ CV *const cv, OP * const block, OP * const o,
        SvREFCNT_inc_simple_void_NN(PL_compcv);
        CopLINE_set(PL_curcop, oldline);
     }
-#ifdef PERL_MAD
-    if (!PL_minus_c)   /* keep old one around for madskills */
-#endif
-    {
-       /* (PL_madskills unset in used file.) */
-       SAVEFREESV(cv);
-    }
+    SAVEFREESV(cv);
     return TRUE;
 }
 
@@ -7464,12 +7033,10 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     else
        ps = NULL;
 
-    if (!PL_madskills) {
-       if (proto)
-           SAVEFREEOP(proto);
-       if (attrs)
-           SAVEFREEOP(attrs);
-    }
+    if (proto)
+        SAVEFREEOP(proto);
+    if (attrs)
+        SAVEFREEOP(attrs);
 
     if (PL_parser && PL_parser->error_count) {
        op_free(block);
@@ -7512,9 +7079,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
 
     if (!block || !ps || *ps || attrs
        || (CvFLAGS(compcv) & CVf_BUILTIN_ATTRS)
-#ifdef PERL_MAD
-       || block->op_type == OP_NULL
-#endif
        )
        const_sv = NULL;
     else
@@ -7563,8 +7127,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
        CvXSUB(cv) = const_sv_xsub;
        CvCONST_on(cv);
        CvISXSUB_on(cv);
-       if (PL_madskills)
-           goto install_block;
        op_free(block);
        SvREFCNT_dec(compcv);
        PL_compcv = NULL;
@@ -7585,9 +7147,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     if (cv) {  /* must reuse cv in case stub is referenced elsewhere */
        /* transfer PL_compcv to cv */
        if (block
-#ifdef PERL_MAD
-                  && block->op_type != OP_NULL
-#endif
        ) {
            cv_flags_t preserved_flags =
                CvFLAGS(cv) & (CVf_BUILTIN_ATTRS|CVf_NAMED);
@@ -7651,7 +7210,6 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
         if ( ps_utf8 ) SvUTF8_on(MUTABLE_SV(cv));
     }
 
- install_block:
     if (!block)
        goto attrs;
 
@@ -7664,11 +7222,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     /* This makes sub {}; work as expected.  */
     if (block->op_type == OP_STUB) {
            OP* const newblock = newSTATEOP(0, NULL, 0);
-#ifdef PERL_MAD
-           op_getmad(block,newblock,'B');
-#else
            op_free(block);
-#endif
            block = newblock;
     }
     CvROOT(cv) = CvLVALUE(cv)
@@ -7786,8 +7340,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
        store it.  */
     const I32 gv_fetch_flags
        = ec ? GV_NOADD_NOINIT :
-        (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
-          || PL_madskills)
+        (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS))
        ? GV_ADDMULTI : GV_ADDMULTI | GV_NOINIT;
     STRLEN namlen = 0;
     const char * const name =
@@ -7831,14 +7384,12 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     else
        ps = NULL;
 
-    if (!PL_madskills) {
-       if (o)
-           SAVEFREEOP(o);
-       if (proto)
-           SAVEFREEOP(proto);
-       if (attrs)
-           SAVEFREEOP(attrs);
-    }
+    if (o)
+        SAVEFREEOP(o);
+    if (proto)
+        SAVEFREEOP(proto);
+    if (attrs)
+        SAVEFREEOP(attrs);
 
     if (ec) {
        op_free(block);
@@ -7885,9 +7436,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
 
     if (!block || !ps || *ps || attrs
        || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
-#ifdef PERL_MAD
-       || block->op_type == OP_NULL
-#endif
        )
        const_sv = NULL;
     else
@@ -7933,8 +7481,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
                const_sv
            );
        }
-       if (PL_madskills)
-           goto install_block;
        op_free(block);
        SvREFCNT_dec(PL_compcv);
        PL_compcv = NULL;
@@ -7943,9 +7489,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     if (cv) {                          /* must reuse cv if autoloaded */
        /* transfer PL_compcv to cv */
        if (block
-#ifdef PERL_MAD
-                  && block->op_type != OP_NULL
-#endif
        ) {
            cv_flags_t existing_builtin_attrs = CvFLAGS(cv) & CVf_BUILTIN_ATTRS;
            PADLIST *const temp_av = CvPADLIST(cv);
@@ -8010,7 +7553,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
         if ( ps_utf8 ) SvUTF8_on(MUTABLE_SV(cv));
     }
 
- install_block:
     if (!block)
        goto attrs;
 
@@ -8023,11 +7565,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     /* This makes sub {}; work as expected.  */
     if (block->op_type == OP_STUB) {
            OP* const newblock = newSTATEOP(0, NULL, 0);
-#ifdef PERL_MAD
-           op_getmad(block,newblock,'B');
-#else
            op_free(block);
-#endif
            block = newblock;
     }
     CvROOT(cv) = CvLVALUE(cv)
@@ -8395,18 +7933,11 @@ Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename)
     );
 }
 
-#ifdef PERL_MAD
-OP *
-#else
 void
-#endif
 Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
 {
     dVAR;
     CV *cv;
-#ifdef PERL_MAD
-    OP* pegop = newOP(OP_NULL, 0);
-#endif
 
     GV *gv;
 
@@ -8455,18 +7986,10 @@ Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
     cv_forget_slab(cv);
 
   finish:
-#ifdef PERL_MAD
-    op_getmad(o,pegop,'n');
-    op_getmad_weak(block, pegop, 'b');
-#else
     op_free(o);
-#endif
     if (PL_parser)
        PL_parser->copline = NOLINE;
     LEAVE_SCOPE(floor);
-#ifdef PERL_MAD
-    return pegop;
-#endif
 }
 
 OP *
@@ -8632,8 +8155,7 @@ Perl_ck_anoncode(pTHX_ OP *o)
     PERL_ARGS_ASSERT_CK_ANONCODE;
 
     cSVOPo->op_targ = pad_add_anon((CV*)cSVOPo->op_sv, o->op_type);
-    if (!PL_madskills)
-       cSVOPo->op_sv = NULL;
+    cSVOPo->op_sv = NULL;
     return o;
 }
 
@@ -8697,11 +8219,7 @@ Perl_ck_backtick(pTHX_ OP *o)
     else if (!(o->op_flags & OPf_KIDS))
        newop = newUNOP(OP_BACKTICK, 0, newDEFSVOP());
     if (newop) {
-#ifdef PERL_MAD
-       op_getmad(o,newop,'O');
-#else
        op_free(o);
-#endif
        return newop;
     }
     S_io_hints(aTHX_ o);
@@ -8801,11 +8319,7 @@ Perl_ck_spair(pTHX_ OP *o)
                    type == OP_RV2AV || type == OP_RV2HV)
                return o;
        }
-#ifdef PERL_MAD
-       op_getmad(kUNOP->op_first,newop,'K');
-#else
        op_free(kUNOP->op_first);
-#endif
        kUNOP->op_first = newop;
     }
     /* transforms OP_REFGEN into OP_SREFGEN, OP_CHOP into OP_SCHOP,
@@ -8864,11 +8378,7 @@ Perl_ck_eof(pTHX_ OP *o)
        if (cLISTOPo->op_first->op_type == OP_STUB) {
            OP * const newop
                = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv));
-#ifdef PERL_MAD
-           op_getmad(o,newop,'O');
-#else
            op_free(o);
-#endif
            o = newop;
        }
        o = ck_fun(o);
@@ -8893,14 +8403,9 @@ Perl_ck_eval(pTHX_ OP *o)
 
        if (kid->op_type == OP_LINESEQ || kid->op_type == OP_STUB) {
            LOGOP *enter;
-#ifdef PERL_MAD
-           OP* const oldo = o;
-#endif
 
            cUNOPo->op_first = 0;
-#ifndef PERL_MAD
            op_free(o);
-#endif
 
            NewOp(1101, enter, 1, LOGOP);
            enter->op_type = OP_ENTERTRY;
@@ -8914,7 +8419,6 @@ Perl_ck_eval(pTHX_ OP *o)
            o->op_type = OP_LEAVETRY;
            o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
            enter->op_other = o;
-           op_getmad(oldo,o,'O');
            return o;
        }
        else {
@@ -8924,13 +8428,8 @@ Perl_ck_eval(pTHX_ OP *o)
     }
     else {
        const U8 priv = o->op_private;
-#ifdef PERL_MAD
-       OP* const oldo = o;
-#else
        op_free(o);
-#endif
        o = newUNOP(OP_ENTEREVAL, priv <<8, newDEFSVOP());
-       op_getmad(oldo,o,'O');
     }
     o->op_targ = (PADOFFSET)PL_hints;
     if (o->op_private & OPpEVAL_BYTES) o->op_targ &= ~HINT_UTF8;
@@ -9123,11 +8622,7 @@ Perl_ck_ftst(pTHX_ OP *o)
         && !kid->op_folded) {
            OP * const newop = newGVOP(type, OPf_REF,
                gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO));
-#ifdef PERL_MAD
-           op_getmad(o,newop,'O');
-#else
            op_free(o);
-#endif
            return newop;
        }
        if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type))
@@ -9144,16 +8639,11 @@ Perl_ck_ftst(pTHX_ OP *o)
        }
     }
     else {
-#ifdef PERL_MAD
-       OP* const oldo = o;
-#else
        op_free(o);
-#endif
        if (type == OP_FTTTY)
            o = newGVOP(type, OPf_REF, PL_stdingv);
        else
            o = newUNOP(type, 0, newDEFSVOP());
-       op_getmad(oldo,o,'O');
     }
     return o;
 }
@@ -9208,12 +8698,6 @@ Perl_ck_fun(pTHX_ OP *o)
 
            numargs++;
            sibl = kid->op_sibling;
-#ifdef PERL_MAD
-           if (!sibl && kid->op_type == OP_STUB) {
-               numargs--;
-               break;
-           }
-#endif
            switch (oa & 7) {
            case OA_SCALAR:
                /* list seen where single (scalar) arg expected? */
@@ -9281,11 +8765,7 @@ Perl_ck_fun(pTHX_ OP *o)
                        if (!(o->op_private & 1) && /* if not unop */
                            kid == cLISTOPo->op_last)
                            cLISTOPo->op_last = newop;
-#ifdef PERL_MAD
-                       op_getmad(kid,newop,'K');
-#else
                        op_free(kid);
-#endif
                        kid = newop;
                    }
                    else if (kid->op_type == OP_READLINE) {
@@ -9407,28 +8887,17 @@ Perl_ck_fun(pTHX_ OP *o)
            tokid = &kid->op_sibling;
            kid = kid->op_sibling;
        }
-#ifdef PERL_MAD
-       if (kid && kid->op_type != OP_STUB)
-           return too_many_arguments_pv(o,OP_DESC(o), 0);
-       o->op_private |= numargs;
-#else
-       /* FIXME - should the numargs move as for the PERL_MAD case?  */
+       /* FIXME - should the numargs or-ing move after the too many
+         * arguments check? */
        o->op_private |= numargs;
        if (kid)
            return too_many_arguments_pv(o,OP_DESC(o), 0);
-#endif
        listkids(o);
     }
     else if (PL_opargs[type] & OA_DEFGV) {
-#ifdef PERL_MAD
-       OP *newop = newUNOP(type, 0, newDEFSVOP());
-       op_getmad(o,newop,'O');
-       return newop;
-#else
        /* Ordering of these two is important to keep f_map.t passing.  */
        op_free(o);
        return newUNOP(type, 0, newDEFSVOP());
-#endif
     }
 
     if (oa) {
@@ -9628,11 +9097,7 @@ Perl_ck_readline(pTHX_ OP *o)
     else {
        OP * const newop
            = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
-#ifdef PERL_MAD
-       op_getmad(o,newop,'O');
-#else
        op_free(o);
-#endif
        return newop;
     }
     return o;
@@ -9724,8 +9189,6 @@ Perl_ck_sassign(pTHX_ OP *o)
        && !(kid->op_flags & OPf_STACKED)
        /* Cannot steal the second time! */
        && !(kid->op_private & OPpTARGET_MY)
-       /* Keep the full thing for madskills */
-       && !PL_madskills
        )
     {
        OP * const kkid = kid->op_sibling;
@@ -9820,11 +9283,7 @@ Perl_ck_method(pTHX_ OP *o)
                kSVOP->op_sv = NULL;
            }
            cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
-#ifdef PERL_MAD
-           op_getmad(o,cmop,'O');
-#else
            op_free(o);
-#endif
            return cmop;
        }
     }
@@ -9934,11 +9393,8 @@ Perl_ck_require(pTHX_ OP *o)
        else {
            kid = newDEFSVOP();
        }
-#ifndef PERL_MAD
        op_free(o);
-#endif
        newop = S_new_entersubop(aTHX_ gv, kid);
-       op_getmad(o,newop,'O');
        return newop;
     }
 
@@ -10003,17 +9459,8 @@ Perl_ck_shift(pTHX_ OP *o)
        }
 
        argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv)));
-#ifdef PERL_MAD
-       {
-           OP * const oldo = o;
-           o = newUNOP(type, 0, scalar(argop));
-           op_getmad(oldo,o,'O');
-           return o;
-       }
-#else
        op_free(o);
        return newUNOP(type, 0, scalar(argop));
-#endif
     }
     return scalar(ck_fun(o));
 }
@@ -10182,11 +9629,7 @@ S_simplify_sort(pTHX_ OP *o)
        o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
     kid = cLISTOPo->op_first->op_sibling;
     cLISTOPo->op_first->op_sibling = kid->op_sibling; /* bypass old block */
-#ifdef PERL_MAD
-    op_getmad(kid,o,'S');                            /* then delete it */
-#else
     op_free(kid);                                    /* then delete it */
-#endif
 }
 
 OP *
@@ -10410,10 +9853,8 @@ Perl_ck_entersub_args_list(pTHX_ OP *entersubop)
     if (!aop->op_sibling)
        aop = cUNOPx(aop)->op_first;
     for (aop = aop->op_sibling; aop->op_sibling; aop = aop->op_sibling) {
-       if (!(PL_madskills && aop->op_type == OP_STUB)) {
-           list(aop);
-           op_lvalue(aop, OP_ENTERSUB);
-       }
+        list(aop);
+        op_lvalue(aop, OP_ENTERSUB);
     }
     return entersubop;
 }
@@ -10472,15 +9913,7 @@ Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
     aop = aop->op_sibling;
     for (cvop = aop; cvop->op_sibling; cvop = cvop->op_sibling) ;
     while (aop != cvop) {
-       OP* o3;
-       if (PL_madskills && aop->op_type == OP_STUB) {
-           aop = aop->op_sibling;
-           continue;
-       }
-       if (PL_madskills && aop->op_type == OP_NULL)
-           o3 = ((UNOP*)aop)->op_first;
-       else
-           o3 = aop;
+       OP* o3 = aop;
 
        if (proto >= proto_end)
            return too_many_arguments_sv(entersubop, gv_ename(namegv), 0);
@@ -10537,14 +9970,9 @@ Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
                                GV * const gv = cGVOPx_gv(gvop);
                                OP * const sibling = aop->op_sibling;
                                SV * const n = newSVpvs("");
-#ifdef PERL_MAD
-                               OP * const oldaop = aop;
-#else
                                op_free(aop);
-#endif
                                gv_fullname4(n, gv, "", FALSE);
                                aop = newSVOP(OP_CONST, 0, n);
-                               op_getmad(oldaop,aop,'O');
                                prev->op_sibling = aop;
                                aop->op_sibling = sibling;
                            }
@@ -10744,9 +10172,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
            aop = cUNOPx(aop)->op_first;
        aop = aop->op_sibling;
        for (cvop = aop; cvop->op_sibling; cvop = cvop->op_sibling) ;
-       if (PL_madskills) while (aop != cvop && aop->op_type == OP_STUB) {
-           aop = aop->op_sibling;
-       }
        if (aop != cvop)
            (void)too_many_arguments_pv(entersubop, GvNAME(namegv), 0);
        
@@ -10772,9 +10197,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
     else {
        OP *prev, *cvop;
        U32 flags;
-#ifdef PERL_MAD
-       bool seenarg = FALSE;
-#endif
        if (!aop->op_sibling)
            aop = cUNOPx(aop)->op_first;
        
@@ -10784,10 +10206,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
        for (cvop = aop;
             cvop->op_sibling;
             prev=cvop, cvop = cvop->op_sibling)
-#ifdef PERL_MAD
-           if (PL_madskills && cvop->op_sibling
-            && cvop->op_type != OP_STUB) seenarg = TRUE
-#endif
            ;
        prev->op_sibling = NULL;
        flags = OPf_SPECIAL * !(cvop->op_private & OPpENTERSUB_NOPAREN);
@@ -10806,9 +10224,6 @@ Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
            return aop ? newUNOP(opnum,flags,aop) : newOP(opnum,flags);
        case OA_BASEOP:
            if (aop) {
-#ifdef PERL_MAD
-               if (!PL_madskills || seenarg)
-#endif
                    (void)too_many_arguments_pv(aop, GvNAME(namegv), 0);
                op_free(aop);
            }
diff --git a/op.h b/op.h
index 9d9dd58..100514c 100644 (file)
--- a/op.h
+++ b/op.h
 
 #define OPCODE U16
 
-#ifdef PERL_MAD
-#  define MADPROP_IN_BASEOP    MADPROP*        op_madprop;
-#else
-#  define MADPROP_IN_BASEOP
-#endif
-
 typedef PERL_BITFIELD16 Optype;
 
 #ifdef BASEOP_DEFINITION
@@ -50,7 +44,6 @@ typedef PERL_BITFIELD16 Optype;
     OP*                op_next;                \
     OP*                op_sibling;             \
     OP*                (*op_ppaddr)(pTHX);     \
-    MADPROP_IN_BASEOP                  \
     PADOFFSET  op_targ;                \
     PERL_BITFIELD16 op_type:9;         \
     PERL_BITFIELD16 op_opt:1;          \
@@ -1062,103 +1055,6 @@ the NULL pointer check.
 #define newATTRSUB(f, o, p, a, b) Perl_newATTRSUB_x(aTHX_  f, o, p, a, b, FALSE)
 #define newSUB(f, o, p, b)     newATTRSUB((f), (o), (p), NULL, (b))
 
-#ifdef PERL_MAD
-#  define MAD_NULL 1
-#  define MAD_PV 2
-#  define MAD_OP 3
-#  define MAD_SV 4
-
-struct madprop {
-    MADPROP* mad_next;
-    void *mad_val;
-    U32 mad_vlen;
-/*    short mad_count; */
-    char mad_key;
-    char mad_type;
-};
-
-struct token {
-    I32 tk_type;
-    YYSTYPE tk_lval;
-    MADPROP* tk_mad;
-};
-#endif
-
-/*
- * Values that can be held by mad_key :
- * ^       unfilled head spot
- * ,       literal ,
- * ;       literal ; (blank if implicit ; at end of block)
- * :       literal : from ?: or attr list
- * +       unary +
- * ?       literal ? from ?:
- * (       literal (
- * )       literal )
- * [       literal [
- * ]       literal ]
- * {       literal {
- * }       literal }
- * @       literal @ sigil
- * $       literal $ sigil
- * *       literal * sigil
- * !       use is source filtered
- * &       & or sub
- * #       whitespace/comment following ; or }
- * #       $# sigil
- * 1       1st ; from for(;;)
- * 1       retired protasis
- * 2       2nd ; from for(;;)
- * 2       retired apodosis
- * 3       C-style for list
- * a       sub or var attributes
- * a       non-method arrow operator
- * A       method arrow operator
- * A       use import args
- * b       format block
- * B       retired stub block
- * C       constant conditional op
- * d       declarator
- * D       do block
- * e       unreached "else" (see C)
- * e       expression producing E
- * E       tr/E/R/, /E/
- * f       folded constant op
- * F       peg op for format
- * g       op was forced to be a word
- * i       if/unless modifier
- * I       if/elsif/unless statement
- * k       local declarator
- * K       retired kid op
- * l       last index of array ($#foo)
- * L       label
- * m       modifier on regex
- * n       sub or format name
- * o       current operator/declarator name
- * o       else/continue
- * O       generic optimized op
- * p       peg to hold extra whitespace at statement level
- * P       peg op for package declaration
- * q       opening quote
- * =       quoted material
- * Q       closing quote
- * Q       optimized qw//
- * r       expression producing R
- * R       tr/E/R/ s/E/R/
- * s       sub signature
- * S       use import stub (no import)
- * S       retired sort block
- * t       unreached "then" (see C)
- * U       use import op
- * v       private sv of for loop
- * V       use version
- * w       while/until modifier
- * W       while/for statement
- * x       optimized qw
- * X       random thing
- * _       whitespace/comments preceding anything else
- * ~       =~ operator
- */
-
 /*
 =head1 Hook manipulation
 */
diff --git a/pad.c b/pad.c
index e2523e3..da067bf 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -152,28 +152,6 @@ Points directly to the body of the L</PL_comppad> array.
 #define PARENT_FAKELEX_FLAGS_set(sv,val)       \
   STMT_START { ((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xhigh = (val); } STMT_END
 
-/*
-=for apidoc mx|void|pad_peg|const char *s
-
-When PERL_MAD is enabled, this is a small no-op function that gets called
-at the start of each pad-related function.  It can be breakpointed to
-track all pad operations.  The parameter is a string indicating the type
-of pad operation being performed.
-
-=cut
-*/
-
-#ifdef PERL_MAD
-void pad_peg(const char* s) {
-    static int pegcnt; /* XXX not threadsafe */
-    PERL_UNUSED_ARG(s);
-
-    PERL_ARGS_ASSERT_PAD_PEG;
-
-    pegcnt++;
-}
-#endif
-
 /*
 This is basically sv_eq_flags() in sv.c, but we avoid the magic
 and bytes checking.
diff --git a/pad.h b/pad.h
index 6269bdc..b36eafb 100644 (file)
--- a/pad.h
+++ b/pad.h
@@ -135,9 +135,7 @@ typedef enum {
  * whether PL_comppad and PL_curpad are consistent and whether they have
  * active values */
 
-#ifndef PERL_MAD
 #  define pad_peg(label)
-#endif
 
 #ifdef DEBUGGING
 #  define ASSERT_CURPAD_LEGAL(label) \
index ff5867e..75f676c 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -98,28 +98,9 @@ typedef struct yy_parser {
     AV         *rsfp_filters;  /* holds chain of active source filters */
     U8         form_lex_state; /* remember lex_state when parsing fmt */
 
-#ifdef PERL_MAD
-    SV         *endwhite;
-    I32                faketokens;
-    I32                lasttoke;
-    SV         *nextwhite;
-    I32                realtokenstart;
-    SV         *skipwhite;
-    SV         *thisclose;
-    MADPROP *  thismad;
-    SV         *thisopen;
-    SV         *thisstuff;
-    SV         *thistoken;
-    SV         *thiswhite;
-
-/* What we know when we're in LEX_KNOWNEXT state. */
-    NEXTTOKE   nexttoke[5];    /* value of next token, if any */
-    I32                curforce;
-#else
     YYSTYPE    nextval[5];     /* value of next token, if any */
     I32                nexttype[5];    /* type of next token */
     I32                nexttoke;
-#endif
 
     COP                *saved_curcop;  /* the previous PL_curcop */
     char       tokenbuf[256];
diff --git a/perl.c b/perl.c
index 544a0bc..9e0d2b5 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -2244,32 +2244,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
     }
     }
 
-#ifdef PERL_MAD
-    {
-       const char *s;
-    if (!TAINTING_get &&
-        (s = PerlEnv_getenv("PERL_XMLDUMP"))) {
-       PL_madskills = 1;
-       PL_minus_c = 1;
-       if (!s || !s[0])
-           PL_xmlfp = PerlIO_stdout();
-       else {
-           PL_xmlfp = PerlIO_open(s, "w");
-           if (!PL_xmlfp)
-               Perl_croak(aTHX_ "Can't open %s", s);
-       }
-       my_setenv("PERL_XMLDUMP", NULL);        /* hide from subprocs */
-    }
-    }
-
-    {
-       const char *s;
-    if ((s = PerlEnv_getenv("PERL_MADSKILLS"))) {
-       PL_madskills = atoi(s);
-       my_setenv("PERL_MADSKILLS", NULL);      /* hide from subprocs */
-    }
-    }
-#endif
 
     lex_start(linestr_sv, rsfp, lex_start_flags);
     SvREFCNT_dec(linestr_sv);
@@ -2398,12 +2372,6 @@ S_run_body(pTHX_ I32 oldscope)
                     (unsigned int)(PL_sawampersand)));
 
     if (!PL_restartop) {
-#ifdef PERL_MAD
-       if (PL_xmlfp) {
-           xmldump_all();
-           exit(0);    /* less likely to core dump than my_exit(0) */
-       }
-#endif
 #ifdef DEBUGGING
        if (DEBUG_x_TEST || DEBUG_B_TEST)
            dump_all_perl(!DEBUG_B_TEST);
@@ -4858,21 +4826,12 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
                Perl_av_create_and_push(aTHX_ &PL_unitcheckav_save, MUTABLE_SV(cv));
            }
        } else {
-           if (!PL_madskills)
-               SAVEFREESV(cv);
+            SAVEFREESV(cv);
        }
        JMPENV_PUSH(ret);
        switch (ret) {
        case 0:
-#ifdef PERL_MAD
-           if (PL_madskills)
-               PL_madskills |= 16384;
-#endif
            CALL_LIST_BODY(cv);
-#ifdef PERL_MAD
-           if (PL_madskills)
-               PL_madskills &= ~16384;
-#endif
            atsv = ERRSV;
            (void)SvPV_const(atsv, len);
            if (len) {
diff --git a/perl.h b/perl.h
index 3fa7db5..237c2d1 100644 (file)
--- a/perl.h
+++ b/perl.h