diff options
-rwxr-xr-x | Configure | 42 | ||||
-rw-r--r-- | Cross/Makefile-cross-SH | 6 | ||||
-rw-r--r-- | Cross/cflags-cross-arm | 1 | ||||
-rw-r--r-- | MANIFEST | 8 | ||||
-rwxr-xr-x | Makefile.SH | 6 | ||||
-rw-r--r-- | Porting/Glossary | 16 | ||||
-rw-r--r-- | Porting/config.sh | 3 | ||||
-rw-r--r-- | Porting/config_H | 6 | ||||
-rwxr-xr-x | config_h.SH | 6 | ||||
-rw-r--r-- | dump.c | 773 | ||||
-rw-r--r-- | embed.fnc | 68 | ||||
-rw-r--r-- | embed.h | 58 | ||||
-rw-r--r-- | embedvar.h | 2 | ||||
-rw-r--r-- | ext/Devel-Peek/Peek.xs | 19 | ||||
-rw-r--r-- | intrpvar.h | 5 | ||||
-rw-r--r-- | locale.c | 75 | ||||
-rw-r--r-- | mad/Nomad.pm | 3012 | ||||
-rw-r--r-- | mad/P5AST.pm | 541 | ||||
-rw-r--r-- | mad/P5re.pm | 650 | ||||
-rw-r--r-- | mad/PLXML.pm | 4162 | ||||
-rw-r--r-- | mad/p55 | 69 | ||||
-rw-r--r-- | mad/t/p55.t | 178 | ||||
-rw-r--r-- | madly.c | 26 | ||||
-rw-r--r-- | makedef.pl | 7 | ||||
-rw-r--r-- | op.c | 641 | ||||
-rw-r--r-- | op.h | 104 | ||||
-rw-r--r-- | pad.c | 22 | ||||
-rw-r--r-- | pad.h | 2 | ||||
-rw-r--r-- | parser.h | 19 | ||||
-rw-r--r-- | perl.c | 43 | ||||
-rw-r--r-- | perl.h | 25 | ||||
-rw-r--r-- | perly.act | 1380 | ||||
-rw-r--r-- | perly.c | 42 | ||||
-rw-r--r-- | perly.h | 50 | ||||
-rw-r--r-- | perly.tab | 1596 | ||||
-rw-r--r-- | perly.y | 761 | ||||
-rw-r--r-- | pp_ctl.c | 13 | ||||
-rw-r--r-- | proto.h | 175 | ||||
-rw-r--r-- | regen_perly.pl | 2 | ||||
-rw-r--r-- | sv.c | 18 | ||||
-rw-r--r-- | t/run/mad.t | 46 | ||||
-rw-r--r-- | toke.c | 1213 | ||||
-rw-r--r-- | uconfig.h | 10 | ||||
-rw-r--r-- | uconfig.sh | 1 | ||||
-rw-r--r-- | win32/config_H.gc | 6 | ||||
-rw-r--r-- | win32/config_H.vc | 6 |
46 files changed, 1576 insertions, 14338 deletions
@@ -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' diff --git a/Cross/Makefile-cross-SH b/Cross/Makefile-cross-SH index 13945ceb19..eb673ce6fe 100644 --- a/Cross/Makefile-cross-SH +++ b/Cross/Makefile-cross-SH @@ -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) diff --git a/Cross/cflags-cross-arm b/Cross/cflags-cross-arm index acec8cc80f..8ee55a5d31 100644 --- a/Cross/cflags-cross-arm +++ b/Cross/cflags-cross-arm @@ -78,7 +78,6 @@ for file do gv) ;; hv) ;; locale) ;; - madly) ;; main) ;; malloc) ;; mg) ;; @@ -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 diff --git a/Makefile.SH b/Makefile.SH index 8c6221ae29..8438c4b2bd 100755 --- a/Makefile.SH +++ b/Makefile.SH @@ -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) diff --git a/Porting/Glossary b/Porting/Glossary index 9128f5f41a..c58fb5202f 100644 --- a/Porting/Glossary +++ b/Porting/Glossary @@ -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. diff --git a/Porting/config.sh b/Porting/config.sh index 372acb5256..0a352e1e5b 100644 --- a/Porting/config.sh +++ b/Porting/config.sh @@ -822,9 +822,6 @@ ls='ls' lseeksize='8' lseektype='off_t' mad='undef' -madlyh='' -madlyobj='' -madlysrc='' mail='' mailx='' make='make' diff --git a/Porting/config_H b/Porting/config_H index 6c1f125af3..9e99b54c5c 100644 --- a/Porting/config_H +++ b/Porting/config_H @@ -4132,12 +4132,6 @@ #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 diff --git a/config_h.SH b/config_h.SH index c320df38fe..db150a6deb 100755 --- a/config_h.SH +++ b/config_h.SH @@ -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 @@ -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, "<"); - break; - case '>': - sv_catpvs(dsv, ">"); - break; - case '&': - sv_catpvs(dsv, "&"); - break; - case '"': - sv_catpvs(dsv, """); - 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: @@ -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 @@ -352,6 +352,7 @@ #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) @@ -733,9 +734,6 @@ #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 @@ -813,9 +811,6 @@ #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 @@ -1238,6 +1233,7 @@ #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) @@ -1287,6 +1283,7 @@ #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) @@ -1309,10 +1306,6 @@ # 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 @@ -1706,13 +1699,6 @@ #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) @@ -1736,44 +1722,6 @@ #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 diff --git a/embedvar.h b/embedvar.h index bf087801aa..454c1ee49b 100644 --- a/embedvar.h +++ b/embedvar.h @@ -180,7 +180,6 @@ #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) @@ -348,7 +347,6 @@ #define PL_warnhook (vTHX->Iwarnhook) #define PL_watchaddr (vTHX->Iwatchaddr) #define PL_watchok (vTHX->Iwatchok) -#define PL_xmlfp (vTHX->Ixmlfp) #endif /* MULTIPLICITY */ diff --git a/ext/Devel-Peek/Peek.xs b/ext/Devel-Peek/Peek.xs index b20fa94687..0d8b833267 100644 --- a/ext/Devel-Peek/Peek.xs +++ b/ext/Devel-Peek/Peek.xs @@ -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. */ diff --git a/intrpvar.h b/intrpvar.h index 3e7d4a36f7..c8982fd92f 100644 --- a/intrpvar.h +++ b/intrpvar.h @@ -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 */ @@ -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 index eaac474b78..0000000000 --- a/mad/Nomad.pm +++ /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 = ( - '&' => '&', - "'" => ''', - '"' => '&dquo;', - '<' => '<', - '>' => '>', - "\n" => ' ', - "\t" => '	', - ); - - 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 index 13a35e18d0..0000000000 --- a/mad/P5AST.pm +++ /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 index 24037ecc0d..0000000000 --- a/mad/P5re.pm +++ /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) => "	", - chr(0x0a) => " ", - chr(0x0b) => "STUPIDXML(#x0b)", - chr(0x0c) => "STUPIDXML(#x0c)", - chr(0x0d) => " ", - 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)", - '<' => "<", - '>' => ">", - '&' => "&", - '"' => """, # 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 index ad778601c7..0000000000 --- a/mad/PLXML.pm +++ /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 index 20b879bbd2..0000000000 --- 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 index fbfa451220..0000000000 --- a/mad/t/p55.t +++ /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 index d703732816..0000000000 --- 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: - */ diff --git a/makedef.pl b/makedef.pl index c88bee8b0b..83f0c91e06 100644 --- a/makedef.pl +++ b/makedef.pl @@ -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 @@ -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); } @@ -35,12 +35,6 @@ #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 */ @@ -153,28 +153,6 @@ Points directly to the body of the L</PL_comppad> array. 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. */ @@ -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) \ @@ -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]; @@ -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) { @@ -2256,11 +2256,6 @@ int isnan(double d); typedef MEM_SIZE STRLEN; -#ifdef PERL_MAD -typedef struct token TOKEN; -typedef struct madprop MADPROP; -typedef struct nexttoken NEXTTOKE; -#endif typedef struct op OP; typedef struct cop COP; typedef struct unop UNOP; @@ -3294,13 +3289,6 @@ typedef struct crypt_data { /* straight from /usr/include/crypt.h */ #endif #include "perly.h" -#ifdef PERL_MAD -struct nexttoken { - YYSTYPE next_val; /* value of next token, if any */ - I32 next_type; /* type of next token */ - MADPROP *next_mad; /* everything else about that token */ -}; -#endif /* macros to define bit-fields in structs. */ #ifndef PERL_BITFIELD8 @@ -4611,9 +4599,6 @@ EXTCONST char PL_bincompat_options[] = # ifdef PERL_IMPLICIT_SYS " PERL_IMPLICIT_SYS" # endif -# ifdef PERL_MAD - " PERL_MAD" -# endif # ifdef PERL_MICRO " PERL_MICRO" # endif @@ -5032,12 +5017,6 @@ struct tempsym; /* defined in pp_pack.c */ #if !defined(PERL_FOR_X2P) # include "embedvar.h" #endif -#ifndef PERL_MAD -# undef PL_madskills -# undef PL_xmlfp -# define PL_madskills 0 -# define PL_xmlfp 0 -#endif /* Now include all the 'global' variables * If we don't have threads or multiple interpreters @@ -5064,10 +5043,6 @@ END_EXTERN_C In particular, need the relevant *ish file included already, as it may define HAVE_INTERP_INTERN */ #include "embed.h" -#ifndef PERL_MAD -# undef op_getmad -# define op_getmad(arg,pegop,slot) NOOP -#endif #ifndef PERL_GLOBAL_STRUCT START_EXTERN_C @@ -5,14 +5,14 @@ */ case 2: -#line 142 "perly.y" +#line 114 "perly.y" { PL_parser->expect = XSTATE; } break; case 3: -#line 146 "perly.y" +#line 118 "perly.y" { newPROG(block_end((ps[(3) - (4)].val.ival),(ps[(4) - (4)].val.opval))); (yyval.ival) = 0; @@ -20,14 +20,14 @@ case 2: break; case 4: -#line 151 "perly.y" +#line 123 "perly.y" { parser->expect = XTERM; } break; case 5: -#line 155 "perly.y" +#line 127 "perly.y" { PL_eval_root = (ps[(3) - (3)].val.opval); (yyval.ival) = 0; @@ -35,14 +35,14 @@ case 2: break; case 6: -#line 160 "perly.y" +#line 132 "perly.y" { parser->expect = XBLOCK; } break; case 7: -#line 164 "perly.y" +#line 136 "perly.y" { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[(3) - (3)].val.opval); @@ -53,14 +53,14 @@ case 2: break; case 8: -#line 172 "perly.y" +#line 144 "perly.y" { parser->expect = XSTATE; } break; case 9: -#line 176 "perly.y" +#line 148 "perly.y" { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[(3) - (3)].val.opval); @@ -71,14 +71,14 @@ case 2: break; case 10: -#line 184 "perly.y" +#line 156 "perly.y" { parser->expect = XSTATE; } break; case 11: -#line 188 "perly.y" +#line 160 "perly.y" { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[(3) - (3)].val.opval); @@ -89,14 +89,14 @@ case 2: break; case 12: -#line 196 "perly.y" +#line 168 "perly.y" { parser->expect = XSTATE; } break; case 13: -#line 200 "perly.y" +#line 172 "perly.y" { PL_eval_root = (ps[(3) - (3)].val.opval); (yyval.ival) = 0; @@ -104,52 +104,46 @@ case 2: break; case 14: -#line 208 "perly.y" - { if (PL_parser->copline > (line_t)IVAL((ps[(1) - (4)].val.i_tkval))) - PL_parser->copline = (line_t)IVAL((ps[(1) - (4)].val.i_tkval)); +#line 180 "perly.y" + { if (PL_parser->copline > (line_t)(ps[(1) - (4)].val.ival)) + PL_parser->copline = (line_t)(ps[(1) - (4)].val.ival); (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval)); - TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}'); } break; case 15: -#line 218 "perly.y" - { if (PL_parser->copline > (line_t)IVAL((ps[(1) - (7)].val.i_tkval))) - PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval)); +#line 188 "perly.y" + { if (PL_parser->copline > (line_t)(ps[(1) - (7)].val.ival)) + PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival); (yyval.opval) = block_end((ps[(2) - (7)].val.ival), (ps[(5) - (7)].val.opval)); - TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(7) - (7)].val.i_tkval),(yyval.opval),'}'); } break; case 16: -#line 227 "perly.y" +#line 195 "perly.y" { (yyval.ival) = block_start(TRUE); } break; case 17: -#line 231 "perly.y" - { if (PL_parser->copline > (line_t)IVAL((ps[(1) - (4)].val.i_tkval))) - PL_parser->copline = (line_t)IVAL((ps[(1) - (4)].val.i_tkval)); +#line 199 "perly.y" + { if (PL_parser->copline > (line_t)(ps[(1) - (4)].val.ival)) + PL_parser->copline = (line_t)(ps[(1) - (4)].val.ival); (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval)); - TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}'); } break; case 18: -#line 240 "perly.y" +#line 206 "perly.y" { (yyval.ival) = block_start(FALSE); } break; case 19: -#line 245 "perly.y" +#line 211 "perly.y" { (yyval.opval) = (OP*)NULL; } break; case 20: -#line 247 "perly.y" +#line 213 "perly.y" { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval)); PL_pad_reset_pending = TRUE; if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval)) @@ -158,12 +152,12 @@ case 2: break; case 21: -#line 256 "perly.y" +#line 222 "perly.y" { (yyval.opval) = (OP*)NULL; } break; case 22: -#line 258 "perly.y" +#line 224 "perly.y" { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval)); PL_pad_reset_pending = TRUE; if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval)) @@ -172,68 +166,42 @@ case 2: break; case 23: -#line 267 "perly.y" +#line 233 "perly.y" { - if((ps[(1) - (1)].val.opval)) { - (yyval.opval) = newSTATEOP(0, NULL, (ps[(1) - (1)].val.opval)); - } else { - (yyval.opval) = IF_MAD(newOP(OP_NULL, 0), NULL); - } + (yyval.opval) = (ps[(1) - (1)].val.opval) ? newSTATEOP(0, NULL, (ps[(1) - (1)].val.opval)) : NULL; } break; case 24: -#line 275 "perly.y" +#line 237 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 25: -#line 279 "perly.y" +#line 241 "perly.y" { - (yyval.opval) = newSTATEOP(SVf_UTF8 - * PVAL((ps[(1) - (2)].val.p_tkval))[strlen(PVAL((ps[(1) - (2)].val.p_tkval)))+1], - PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval), - (ps[(2) - (2)].val.opval) ? cLISTOPx((yyval.opval))->op_first : (yyval.opval), 'L'); + (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval)); } break; case 26: -#line 287 "perly.y" +#line 245 "perly.y" { - (yyval.opval) = newSTATEOP(SVf_UTF8 - * PVAL((ps[(1) - (2)].val.p_tkval))[strlen(PVAL((ps[(1) - (2)].val.p_tkval)))+1], - PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval), cLISTOPx((yyval.opval))->op_first, 'L'); + (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval)); } break; case 27: -#line 297 "perly.y" +#line 252 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 28: -#line 299 "perly.y" - { - (yyval.opval) = newOP(OP_NULL,0); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'p'); - } - break; - - case 29: -#line 304 "perly.y" +#line 254 "perly.y" { CV *fmtcv = PL_compcv; -#ifdef MAD - (yyval.opval) = newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval)); - prepend_madprops((ps[(1) - (4)].val.i_tkval)->tk_mad, (yyval.opval), 'F'); - (ps[(1) - (4)].val.i_tkval)->tk_mad = 0; - token_free((ps[(1) - (4)].val.i_tkval)); -#else newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval)); (yyval.opval) = (OP*)NULL; -#endif if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) { SvREFCNT_inc_simple_void(fmtcv); pad_add_anon(fmtcv, OP_NULL); @@ -241,8 +209,8 @@ case 2: } break; - case 30: -#line 321 "perly.y" + case 29: +#line 264 "perly.y" { if ((ps[(2) - (3)].val.opval)->op_type == OP_CONST) { const char *const name = @@ -266,104 +234,63 @@ case 2: } break; - case 31: -#line 343 "perly.y" + case 30: +#line 286 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); -#ifdef MAD - { - OP* o = newSVOP(OP_ANONCODE, 0, - (SV*)( -#endif (ps[(2) - (7)].val.opval)->op_type == OP_CONST ? newATTRSUB((ps[(3) - (7)].val.ival), (ps[(2) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval)) : newMYSUB((ps[(3) - (7)].val.ival), (ps[(2) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval)) -#ifdef MAD - )); - (yyval.opval) = newOP(OP_NULL,0); - op_getmad(o,(yyval.opval),'&'); - op_getmad((ps[(2) - (7)].val.opval),(yyval.opval),'n'); - op_getmad((ps[(5) - (7)].val.opval),(yyval.opval),'s'); - op_getmad((ps[(6) - (7)].val.opval),(yyval.opval),'a'); - token_getmad((ps[(1) - (7)].val.i_tkval),(yyval.opval),'d'); - append_madprops((ps[(7) - (7)].val.opval)->op_madprop, (yyval.opval), 0); - (ps[(7) - (7)].val.opval)->op_madprop = 0; - } -#else ; (yyval.opval) = (OP*)NULL; -#endif intro_my(); } break; - case 32: -#line 371 "perly.y" + case 31: +#line 296 "perly.y" { -#ifdef MAD - (yyval.opval) = package((ps[(3) - (4)].val.opval)); - token_getmad((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o'); - if ((ps[(2) - (4)].val.opval)) - package_version((ps[(2) - (4)].val.opval)); - token_getmad((ps[(4) - (4)].val.i_tkval),(yyval.opval),';'); -#else package((ps[(3) - (4)].val.opval)); if ((ps[(2) - (4)].val.opval)) package_version((ps[(2) - (4)].val.opval)); (yyval.opval) = (OP*)NULL; -#endif } break; - case 33: -#line 386 "perly.y" + case 32: +#line 303 "perly.y" { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } break; - case 34: -#line 388 "perly.y" + case 33: +#line 305 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); -#ifdef MAD - (yyval.opval) = utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval)); - token_getmad((ps[(1) - (7)].val.i_tkval),(yyval.opval),'o'); - token_getmad((ps[(7) - (7)].val.i_tkval),(yyval.opval),';'); - if (PL_parser->rsfp_filters && - AvFILLp(PL_parser->rsfp_filters) >= 0) - append_madprops(newMADPROP('!', MAD_NULL, NULL, 0), (yyval.opval), 0); -#else - utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval)); + utilize((ps[(1) - (7)].val.ival), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval)); (yyval.opval) = (OP*)NULL; -#endif } break; - case 35: -#line 403 "perly.y" + case 34: +#line 311 "perly.y" { (yyval.opval) = block_end((ps[(3) - (7)].val.ival), newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval))); - TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'I'); - TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival); } break; - case 36: -#line 412 "perly.y" + case 35: +#line 317 "perly.y" { (yyval.opval) = block_end((ps[(3) - (7)].val.ival), newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval))); - TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'I'); - TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival); } break; - case 37: -#line 421 "perly.y" + case 36: +#line 323 "perly.y" { const PADOFFSET offset = pad_findmy_pvs("$_", 0); (yyval.opval) = block_end((ps[(3) - (6)].val.ival), @@ -372,50 +299,44 @@ case 2: || PAD_COMPNAME_FLAGS_isOUR(offset) ? 0 : offset)); - PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (6)].val.ival); } break; - case 38: -#line 432 "perly.y" + case 37: +#line 334 "perly.y" { (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newWHENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)))); } break; - case 39: -#line 434 "perly.y" + case 38: +#line 336 "perly.y" { (yyval.opval) = newWHENOP(0, op_scope((ps[(2) - (2)].val.opval))); } break; - case 40: -#line 436 "perly.y" + case 39: +#line 338 "perly.y" { (yyval.opval) = block_end((ps[(3) - (8)].val.ival), newWHILEOP(0, 1, (LOOP*)(OP*)NULL, (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval), (ps[(6) - (8)].val.ival))); - TOKEN_GETMAD((ps[(1) - (8)].val.i_tkval),(yyval.opval),'W'); - TOKEN_GETMAD((ps[(2) - (8)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (8)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (8)].val.ival); } break; - case 41: -#line 446 "perly.y" + case 40: +#line 345 "perly.y" { (yyval.opval) = block_end((ps[(3) - (8)].val.ival), newWHILEOP(0, 1, (LOOP*)(OP*)NULL, (ps[(4) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval), (ps[(6) - (8)].val.ival))); - TOKEN_GETMAD((ps[(1) - (8)].val.i_tkval),(yyval.opval),'W'); - TOKEN_GETMAD((ps[(2) - (8)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (8)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (8)].val.ival); } break; - case 42: -#line 457 "perly.y" + case 41: +#line 353 "perly.y" { - OP *initop = IF_MAD((ps[(4) - (11)].val.opval) ? (ps[(4) - (11)].val.opval) : newOP(OP_NULL, 0), (ps[(4) - (11)].val.opval)); + OP *initop = (ps[(4) - (11)].val.opval); OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, scalar((ps[(6) - (11)].val.opval)), (ps[(11) - (11)].val.opval), (ps[(9) - (11)].val.opval), (ps[(8) - (11)].val.ival)); if (initop) { @@ -424,55 +345,39 @@ case 2: newOP(OP_UNSTACK, OPf_SPECIAL), forop)); } - DO_MAD({ forop = newUNOP(OP_NULL, 0, forop); }) (yyval.opval) = block_end((ps[(3) - (11)].val.ival), forop); - TOKEN_GETMAD((ps[(1) - (11)].val.i_tkval),(yyval.opval),'3'); - TOKEN_GETMAD((ps[(2) - (11)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (11)].val.i_tkval),(yyval.opval),'1'); - TOKEN_GETMAD((ps[(7) - (11)].val.i_tkval),(yyval.opval),'2'); - TOKEN_GETMAD((ps[(10) - (11)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (11)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (11)].val.ival); } break; - case 43: -#line 477 "perly.y" + case 42: +#line 367 "perly.y" { (yyval.opval) = block_end((ps[(3) - (9)].val.ival), newFOROP(0, (ps[(4) - (9)].val.opval), (ps[(6) - (9)].val.opval), (ps[(8) - (9)].val.opval), (ps[(9) - (9)].val.opval))); - TOKEN_GETMAD((ps[(1) - (9)].val.i_tkval),(yyval.opval),'W'); - TOKEN_GETMAD((ps[(2) - (9)].val.i_tkval),(yyval.opval),'d'); - TOKEN_GETMAD((ps[(5) - (9)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(7) - (9)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (9)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (9)].val.ival); } break; - case 44: -#line 486 "perly.y" + case 43: +#line 372 "perly.y" { (yyval.opval) = block_end((ps[(4) - (8)].val.ival), newFOROP(0, op_lvalue((ps[(2) - (8)].val.opval), OP_ENTERLOOP), (ps[(5) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval))); - TOKEN_GETMAD((ps[(1) - (8)].val.i_tkval),(yyval.opval),'W'); - TOKEN_GETMAD((ps[(3) - (8)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(6) - (8)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (8)].val.ival); } break; - case 45: -#line 495 "perly.y" + case 44: +#line 378 "perly.y" { (yyval.opval) = block_end((ps[(3) - (7)].val.ival), newFOROP(0, (OP*)NULL, (ps[(4) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval))); - TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'W'); - TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')'); - PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval)); + PL_parser->copline = (line_t)(ps[(1) - (7)].val.ival); } break; - case 46: -#line 504 "perly.y" + case 45: +#line 384 "perly.y" { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, @@ -480,8 +385,8 @@ case 2: } break; - case 47: -#line 510 "perly.y" + case 46: +#line 390 "perly.y" { package((ps[(3) - (5)].val.opval)); if ((ps[(2) - (5)].val.opval)) { @@ -490,53 +395,43 @@ case 2: } break; - case 48: -#line 517 "perly.y" + case 47: +#line 397 "perly.y" { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, (OP*)NULL, block_end((ps[(5) - (8)].val.ival), (ps[(7) - (8)].val.opval)), (OP*)NULL, 0); - TOKEN_GETMAD((ps[(4) - (8)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(8) - (8)].val.i_tkval),(yyval.opval),'}'); - if (PL_parser->copline > (line_t)IVAL((ps[(4) - (8)].val.i_tkval))) - PL_parser->copline = (line_t)IVAL((ps[(4) - (8)].val.i_tkval)); + if (PL_parser->copline > (line_t)(ps[(4) - (8)].val.ival)) + PL_parser->copline = (line_t)(ps[(4) - (8)].val.ival); } break; - case 49: -#line 527 "perly.y" + case 48: +#line 405 "perly.y" { PL_parser->expect = XSTATE; (yyval.opval) = (ps[(1) - (2)].val.opval); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),';'); } break; - case 50: -#line 533 "perly.y" + case 49: +#line 410 "perly.y" { PL_parser->expect = XSTATE; - (yyval.opval) = IF_MAD(newOP(OP_NULL, 0), (OP*)NULL); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),';'); + (yyval.opval) = (OP*)NULL; PL_parser->copline = NOLINE; } break; - case 51: -#line 543 "perly.y" + case 50: +#line 419 "perly.y" { OP *list; if ((ps[(2) - (2)].val.opval)) { OP *term = (ps[(2) - (2)].val.opval); - DO_MAD(term = newUNOP(OP_NULL, 0, term)); list = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), term); } else { -#ifdef MAD - OP *op = newNULLLIST(); - list = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), op); -#else list = (ps[(1) - (2)].val.opval); -#endif } if (PL_parser->copline == NOLINE) PL_parser->copline = CopLINE(PL_curcop)-1; @@ -546,225 +441,194 @@ case 2: } break; - case 52: -#line 566 "perly.y" + case 51: +#line 436 "perly.y" { (yyval.opval) = NULL; } break; - case 53: -#line 568 "perly.y" + case 52: +#line 438 "perly.y" { (yyval.opval) = op_unscope((ps[(2) - (3)].val.opval)); } break; - case 54: -#line 573 "perly.y" + case 53: +#line 443 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 55: -#line 575 "perly.y" + case 54: +#line 445 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; + case 55: +#line 447 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); } + break; + case 56: -#line 577 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i'); - } +#line 449 "perly.y" + { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); } break; case 57: -#line 581 "perly.y" - { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i'); - } +#line 451 "perly.y" + { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval)); } break; case 58: -#line 585 "perly.y" - { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w'); - } +#line 453 "perly.y" + { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); } break; case 59: -#line 589 "perly.y" - { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w'); - } - break; - - case 60: -#line 593 "perly.y" +#line 455 "perly.y" { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval), (OP*)NULL); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w'); - PL_parser->copline = (line_t)IVAL((ps[(2) - (3)].val.i_tkval)); - } + PL_parser->copline = (line_t)(ps[(2) - (3)].val.ival); } break; - case 61: -#line 598 "perly.y" + case 60: +#line 458 "perly.y" { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), op_scope((ps[(1) - (3)].val.opval))); } break; - case 62: -#line 603 "perly.y" + case 61: +#line 463 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 63: -#line 605 "perly.y" + case 62: +#line 465 "perly.y" { ((ps[(2) - (2)].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 64: -#line 611 "perly.y" - { PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval)); + case 63: +#line 470 "perly.y" + { PL_parser->copline = (line_t)(ps[(1) - (6)].val.ival); (yyval.opval) = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,(ps[(3) - (6)].val.opval)), op_scope((ps[(5) - (6)].val.opval)), (ps[(6) - (6)].val.opval)); PL_hints |= HINT_BLOCK_SCOPE; - TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'I'); - TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),')'); } break; - case 65: -#line 624 "perly.y" + case 64: +#line 480 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 66: -#line 626 "perly.y" - { - (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } + case 65: +#line 482 "perly.y" + { (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); } break; - case 67: -#line 634 "perly.y" + case 66: +#line 487 "perly.y" { (yyval.ival) = (PL_min_intro_pending && PL_max_intro_pending >= PL_min_intro_pending); intro_my(); } break; - case 68: -#line 640 "perly.y" + case 67: +#line 493 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 70: -#line 646 "perly.y" + case 69: +#line 499 "perly.y" { YYSTYPE tmplval; (void)scan_num("1", &tmplval); (yyval.opval) = tmplval.opval; } break; - case 72: -#line 654 "perly.y" + case 71: +#line 507 "perly.y" { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); } break; - case 73: -#line 659 "perly.y" + case 72: +#line 512 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); } break; - case 74: -#line 663 "perly.y" + case 73: +#line 516 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); } break; - case 75: -#line 667 "perly.y" + case 74: +#line 520 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); } break; - case 76: -#line 670 "perly.y" + case 75: +#line 523 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 77: -#line 671 "perly.y" + case 76: +#line 524 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 78: -#line 675 "perly.y" + case 77: +#line 528 "perly.y" { (yyval.ival) = start_subparse(FALSE, 0); SAVEFREESV(PL_compcv); } break; - case 79: -#line 681 "perly.y" + case 78: +#line 534 "perly.y" { (yyval.ival) = start_subparse(FALSE, CVf_ANON); SAVEFREESV(PL_compcv); } break; - case 80: -#line 686 "perly.y" + case 79: +#line 539 "perly.y" { (yyval.ival) = start_subparse(TRUE, 0); SAVEFREESV(PL_compcv); } break; - case 83: -#line 697 "perly.y" + case 82: +#line 550 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 85: -#line 703 "perly.y" + case 84: +#line 556 "perly.y" { (yyval.opval) = (OP*)NULL; } break; + case 85: +#line 558 "perly.y" + { (yyval.opval) = (ps[(2) - (2)].val.opval); } + break; + case 86: -#line 705 "perly.y" - { (yyval.opval) = (ps[(2) - (2)].val.opval); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':'); - } +#line 560 "perly.y" + { (yyval.opval) = (OP*)NULL; } break; case 87: -#line 709 "perly.y" - { (yyval.opval) = IF_MAD( - newOP(OP_NULL, 0), - (OP*)NULL - ); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),':'); - } +#line 565 "perly.y" + { (yyval.opval) = (ps[(2) - (2)].val.opval); } break; case 88: -#line 719 "perly.y" - { (yyval.opval) = (ps[(2) - (2)].val.opval); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':'); - } +#line 567 "perly.y" + { (yyval.opval) = (OP*)NULL; } break; case 89: -#line 723 "perly.y" - { (yyval.opval) = IF_MAD( - newOP(OP_NULL, 0), - (OP*)NULL - ); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),':'); - } - break; - - case 90: -#line 732 "perly.y" +#line 571 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 91: -#line 734 "perly.y" + case 90: +#line 573 "perly.y" { if (!FEATURE_SIGNATURES_IS_ENABLED) Perl_croak(aTHX_ "Experimental " @@ -776,8 +640,8 @@ case 2: } break; - case 92: -#line 744 "perly.y" + case 91: +#line 583 "perly.y" { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(2) - (3)].val.opval), newSTATEOP(0, NULL, sawparens(newNULLLIST()))); @@ -785,121 +649,89 @@ case 2: } break; - case 93: -#line 753 "perly.y" + case 92: +#line 592 "perly.y" { - if (PL_parser->copline > (line_t)IVAL((ps[(3) - (5)].val.i_tkval))) - PL_parser->copline = (line_t)IVAL((ps[(3) - (5)].val.i_tkval)); + if (PL_parser->copline > (line_t)(ps[(3) - (5)].val.ival)) + PL_parser->copline = (line_t)(ps[(3) - (5)].val.ival); (yyval.opval) = block_end((ps[(1) - (5)].val.ival), op_append_list(OP_LINESEQ, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval))); - TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); } break; - case 94: -#line 764 "perly.y" + case 93: +#line 601 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 95: -#line 765 "perly.y" - { (yyval.opval) = IF_MAD( - newOP(OP_NULL,0), - (OP*)NULL - ); + case 94: +#line 602 "perly.y" + { (yyval.opval) = (OP*)NULL; PL_parser->expect = XSTATE; - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),';'); } break; + case 95: +#line 609 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } + break; + case 96: -#line 776 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 611 "perly.y" + { (yyval.opval) = newLOGOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } break; case 97: -#line 780 "perly.y" - { (yyval.opval) = newLOGOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 613 "perly.y" + { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } break; - case 98: -#line 784 "perly.y" - { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } + case 99: +#line 619 "perly.y" + { (yyval.opval) = (ps[(1) - (2)].val.opval); } break; case 100: -#line 792 "perly.y" - { -#ifdef MAD - OP* op = newNULLLIST(); - token_getmad((ps[(2) - (2)].val.i_tkval),op,','); - (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (2)].val.opval), op); -#else - (yyval.opval) = (ps[(1) - (2)].val.opval); -#endif - } - break; - - case 101: -#line 802 "perly.y" +#line 621 "perly.y" { OP* term = (ps[(3) - (3)].val.opval); - DO_MAD( - term = newUNOP(OP_NULL, 0, term); - token_getmad((ps[(2) - (3)].val.i_tkval),term,','); - ) (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (3)].val.opval), term); } break; - case 103: -#line 815 "perly.y" - { (yyval.opval) = convert(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_STACKED, - op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (3)].val.i_tkval)),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) ); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); + case 102: +#line 630 "perly.y" + { (yyval.opval) = convert((ps[(1) - (3)].val.ival), OPf_STACKED, + op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (3)].val.ival),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) ); } break; - case 104: -#line 820 "perly.y" - { (yyval.opval) = convert(IVAL((ps[(1) - (5)].val.i_tkval)), OPf_STACKED, - op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (5)].val.i_tkval)),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) ); - TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o'); - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')'); + case 103: +#line 634 "perly.y" + { (yyval.opval) = convert((ps[(1) - (5)].val.ival), OPf_STACKED, + op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (5)].val.ival),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) ); } break; - case 105: -#line 827 "perly.y" + case 104: +#line 638 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)), newUNOP(OP_METHOD, 0, (ps[(3) - (6)].val.opval)))); - TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'A'); - TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),')'); } break; - case 106: -#line 836 "perly.y" + case 105: +#line 644 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)), newUNOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval)))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'A'); } break; - case 107: -#line 842 "perly.y" + case 106: +#line 649 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)), @@ -907,349 +739,241 @@ case 2: } break; - case 108: -#line 848 "perly.y" + case 107: +#line 655 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)), newUNOP(OP_METHOD, 0, (ps[(1) - (5)].val.opval)))); - TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')'); } break; - case 109: -#line 856 "perly.y" - { (yyval.opval) = convert(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } + case 108: +#line 661 "perly.y" + { (yyval.opval) = convert((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); } break; - case 110: -#line 860 "perly.y" - { (yyval.opval) = convert(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval)); - TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o'); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')'); - } + case 109: +#line 663 "perly.y" + { (yyval.opval) = convert((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); } break; - case 111: -#line 866 "perly.y" + case 110: +#line 665 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); } break; - case 112: -#line 869 "perly.y" + case 111: +#line 668 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval))); } break; - case 115: -#line 884 "perly.y" + case 114: +#line 683 "perly.y" { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval))); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); } break; - case 116: -#line 891 "perly.y" + case 115: +#line 687 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval))); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); } break; - case 117: -#line 896 "perly.y" + case 116: +#line 690 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV), scalar((ps[(4) - (5)].val.opval))); - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'a'); - TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),']'); } break; - case 118: -#line 904 "perly.y" + case 117: +#line 695 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV), scalar((ps[(3) - (4)].val.opval))); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); } break; - case 119: -#line 911 "perly.y" + case 118: +#line 700 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval))); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); } break; - case 120: -#line 918 "perly.y" + case 119: +#line 704 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV), jmaybe((ps[(4) - (6)].val.opval))); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'a'); - TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(5) - (6)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),'}'); } break; - case 121: -#line 928 "perly.y" + case 120: +#line 710 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV), jmaybe((ps[(3) - (5)].val.opval))); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); } break; + case 121: +#line 716 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + newCVREF(0, scalar((ps[(1) - (4)].val.opval)))); } + break; + case 122: -#line 937 "perly.y" +#line 719 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, - newCVREF(0, scalar((ps[(1) - (4)].val.opval)))); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'a'); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')'); - } + op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval), + newCVREF(0, scalar((ps[(1) - (5)].val.opval))))); } break; case 123: -#line 944 "perly.y" +#line 724 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, - op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval), - newCVREF(0, scalar((ps[(1) - (5)].val.opval))))); - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'a'); - TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')'); - } + op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), + newCVREF(0, scalar((ps[(1) - (4)].val.opval))))); } break; case 124: -#line 953 "perly.y" +#line 728 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, - op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), - newCVREF(0, scalar((ps[(1) - (4)].val.opval))))); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')'); - } + newCVREF(0, scalar((ps[(1) - (3)].val.opval)))); } break; case 125: -#line 960 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, - newCVREF(0, scalar((ps[(1) - (3)].val.opval)))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); - } +#line 731 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval)); } break; case 126: -#line 966 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval)); - TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),')'); - TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),']'); - } +#line 733 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval)); } break; case 127: -#line 973 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval)); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); - } +#line 735 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL); } break; case 128: -#line 978 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL); - TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),')'); - TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),']'); - } +#line 740 "perly.y" + { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), (ps[(2) - (3)].val.ival), (ps[(3) - (3)].val.opval)); } break; case 129: -#line 988 "perly.y" - { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 742 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 130: -#line 992 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); +#line 744 "perly.y" + { if ((ps[(2) - (3)].val.ival) != OP_REPEAT) + scalar((ps[(1) - (3)].val.opval)); + (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval))); } break; case 131: -#line 996 "perly.y" - { if (IVAL((ps[(2) - (3)].val.i_tkval)) != OP_REPEAT) - scalar((ps[(1) - (3)].val.opval)); - (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 749 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 132: -#line 1002 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 751 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 133: -#line 1006 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 753 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 134: -#line 1010 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 755 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 135: -#line 1014 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 757 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 136: -#line 1018 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 759 "perly.y" + { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 137: -#line 1022 "perly.y" - { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 761 "perly.y" + { (yyval.opval) = newRANGE((ps[(2) - (3)].val.ival), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); } break; case 138: -#line 1026 "perly.y" - { - (yyval.opval) = newRANGE(IVAL((ps[(2) - (3)].val.i_tkval)), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); - DO_MAD({ - UNOP *op; - op = (UNOP*)(yyval.opval); - op = (UNOP*)op->op_first; /* get to flop */ - op = (UNOP*)op->op_first; /* get to flip */ - op = (UNOP*)op->op_first; /* get to range */ - token_getmad((ps[(2) - (3)].val.i_tkval),(OP*)op,'o'); - }); - } +#line 763 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } break; case 139: -#line 1038 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 765 "perly.y" + { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } break; case 140: -#line 1042 "perly.y" - { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 767 "perly.y" + { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } break; case 141: -#line 1046 "perly.y" - { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); - } +#line 769 "perly.y" + { (yyval.opval) = bind_match((ps[(2) - (3)].val.ival), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); } break; case 142: -#line 1050 "perly.y" - { (yyval.opval) = bind_match(IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval), - ((yyval.opval)->op_type == OP_NOT - ? ((UNOP*)(yyval.opval))->op_first : (yyval.opval)), - '~'); - } +#line 774 "perly.y" + { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval))); } break; case 143: -#line 1060 "perly.y" - { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 776 "perly.y" + { (yyval.opval) = (ps[(2) - (2)].val.opval); } break; case 144: -#line 1064 "perly.y" - { (yyval.opval) = IF_MAD( - newUNOP(OP_NULL, 0, (ps[(2) - (2)].val.opval)), - (ps[(2) - (2)].val.opval) - ); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'+'); - } +#line 779 "perly.y" + { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); } break; case 145: -#line 1071 "perly.y" - { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 781 "perly.y" + { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval))); } break; case 146: -#line 1075 "perly.y" - { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } - break; - - case 147: -#line 1079 "perly.y" +#line 783 "perly.y" { (yyval.opval) = newUNOP(OP_POSTINC, 0, - op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC)); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o'); - } + op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC)); } break; - case 148: -#line 1084 "perly.y" + case 147: +#line 786 "perly.y" { (yyval.opval) = newUNOP(OP_POSTDEC, 0, - op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC)); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o'); - } + op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));} break; - case 149: -#line 1089 "perly.y" + case 148: +#line 789 "perly.y" { (yyval.opval) = convert(OP_JOIN, 0, op_append_elem( OP_LIST, @@ -1259,164 +983,124 @@ case 2: )), (ps[(1) - (2)].val.opval) )); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 150: -#line 1101 "perly.y" + case 149: +#line 800 "perly.y" { (yyval.opval) = newUNOP(OP_PREINC, 0, - op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } + op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC)); } break; - case 151: -#line 1106 "perly.y" + case 150: +#line 803 "perly.y" { (yyval.opval) = newUNOP(OP_PREDEC, 0, - op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } + op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC)); } + break; + + case 151: +#line 810 "perly.y" + { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval)); } break; case 152: -#line 1115 "perly.y" - { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval)); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),']'); - } +#line 812 "perly.y" + { (yyval.opval) = newANONLIST((OP*)NULL);} break; case 153: -#line 1120 "perly.y" - { (yyval.opval) = newANONLIST((OP*)NULL); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),']'); - } +#line 814 "perly.y" + { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval)); } break; case 154: -#line 1125 "perly.y" - { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval)); - TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}'); - } +#line 816 "perly.y" + { (yyval.opval) = newANONHASH((OP*)NULL); } break; case 155: -#line 1131 "perly.y" - { (yyval.opval) = newANONHASH((OP*)NULL); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'}'); - } +#line 818 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); + (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)); } break; case 156: -#line 1137 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); - (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)); - TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o'); - OP_GETMAD((ps[(3) - (5)].val.opval),(yyval.opval),'s'); - OP_GETMAD((ps[(4) - (5)].val.opval),(yyval.opval),'a'); - } +#line 825 "perly.y" + { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), (ps[(1) - (2)].val.ival));} break; case 157: -#line 1148 "perly.y" - { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), IVAL((ps[(1) - (2)].val.i_tkval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 827 "perly.y" + { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval)));} break; - case 158: -#line 1152 "perly.y" - { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'D'); - } + case 162: +#line 835 "perly.y" + { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval)); } break; case 163: -#line 1162 "perly.y" - { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval)); - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'?'); - TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),':'); - } +#line 837 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN)); } break; case 164: -#line 1167 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 839 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 165: -#line 1171 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } +#line 841 "perly.y" + { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); } break; case 166: -#line 1173 "perly.y" - { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'k'); - } +#line 843 "perly.y" + { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); } break; case 167: -#line 1177 "perly.y" - { (yyval.opval) = sawparens(IF_MAD(newUNOP(OP_NULL,0,(ps[(2) - (3)].val.opval)), (ps[(2) - (3)].val.opval))); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); - } +#line 845 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 168: -#line 1182 "perly.y" - { (yyval.opval) = IF_MAD(newUNOP(OP_NULL,0,(ps[(1) - (1)].val.opval)), (ps[(1) - (1)].val.opval)); } +#line 847 "perly.y" + { (yyval.opval) = sawparens(newNULLLIST()); } break; case 169: -#line 1184 "perly.y" - { (yyval.opval) = sawparens(newNULLLIST()); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')'); - } +#line 849 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 170: -#line 1189 "perly.y" +#line 851 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 171: -#line 1191 "perly.y" +#line 853 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 172: -#line 1193 "perly.y" +#line 855 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 173: -#line 1195 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } - break; - - case 174: -#line 1197 "perly.y" +#line 857 "perly.y" { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));} break; - case 175: -#line 1199 "perly.y" + case 174: +#line 859 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 176: -#line 1201 "perly.y" + case 175: +#line 861 "perly.y" { (yyval.opval) = op_prepend_elem(OP_ASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_ASLICE, 0, @@ -1425,13 +1109,11 @@ case 2: if ((yyval.opval) && (ps[(1) - (4)].val.opval)) (yyval.opval)->op_private |= (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING; - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); } break; - case 177: -#line 1213 "perly.y" + case 176: +#line 871 "perly.y" { (yyval.opval) = op_prepend_elem(OP_KVASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVASLICE, 0, @@ -1440,13 +1122,11 @@ case 2: if ((yyval.opval) && (ps[(1) - (4)].val.opval)) (yyval.opval)->op_private |= (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING; - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); } break; - case 178: -#line 1225 "perly.y" + case 177: +#line 881 "perly.y" { (yyval.opval) = op_prepend_elem(OP_HSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_HSLICE, 0, @@ -1456,14 +1136,11 @@ case 2: (yyval.opval)->op_private |= (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING; PL_parser->expect = XOPERATOR; - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); } break; - case 179: -#line 1239 "perly.y" + case 178: +#line 892 "perly.y" { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVHSLICE, 0, @@ -1473,216 +1150,157 @@ case 2: (yyval.opval)->op_private |= (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING; PL_parser->expect = XOPERATOR; - TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); - TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';'); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); } break; - case 180: -#line 1253 "perly.y" + case 179: +#line 903 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 181: -#line 1255 "perly.y" + case 180: +#line 905 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); } break; - case 182: -#line 1257 "perly.y" + case 181: +#line 907 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval))); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); } break; - case 183: -#line 1262 "perly.y" + case 182: +#line 910 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval)))); - DO_MAD({ - OP* op = (yyval.opval); - if (op->op_type == OP_CONST) { /* defeat const fold */ - op = (OP*)op->op_madprop->mad_val; - } - token_getmad((ps[(2) - (4)].val.i_tkval),op,'('); - token_getmad((ps[(4) - (4)].val.i_tkval),op,')'); - }); } break; - case 184: -#line 1275 "perly.y" + case 183: +#line 915 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval)))); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); } break; + case 184: +#line 919 "perly.y" + { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval)); } + break; + case 185: -#line 1280 "perly.y" - { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval)); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'$'); - } +#line 921 "perly.y" + { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); } break; case 186: -#line 1284 "perly.y" - { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'@'); - } +#line 923 "perly.y" + { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval)); } break; case 187: -#line 1288 "perly.y" - { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval)); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'%'); - } +#line 925 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, + scalar(newCVREF((ps[(3) - (4)].val.ival),(ps[(1) - (4)].val.opval)))); } break; case 188: -#line 1292 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, - scalar(newCVREF(IVAL((ps[(3) - (4)].val.i_tkval)),(ps[(1) - (4)].val.opval)))); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'&'); - } +#line 928 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval)); } break; case 189: -#line 1297 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval)); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'*'); - } +#line 930 "perly.y" + { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), OPf_SPECIAL); + PL_hints |= HINT_BLOCK_SCOPE; } break; case 190: -#line 1301 "perly.y" - { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), OPf_SPECIAL); - PL_hints |= HINT_BLOCK_SCOPE; - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); - } +#line 933 "perly.y" + { (yyval.opval) = newLOOPEX((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); } break; case 191: -#line 1306 "perly.y" - { (yyval.opval) = newLOOPEX(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 935 "perly.y" + { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); } break; case 192: -#line 1310 "perly.y" - { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 937 "perly.y" + { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); } break; case 193: -#line 1314 "perly.y" - { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); - } +#line 939 "perly.y" + { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); } break; case 194: -#line 1318 "perly.y" - { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 941 "perly.y" + { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); } break; case 195: -#line 1322 "perly.y" - { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 943 "perly.y" + { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.ival) ? OPf_SPECIAL : 0); } break; case 196: -#line 1326 "perly.y" - { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.i_tkval) ? OPf_SPECIAL : 0); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); - } +#line 945 "perly.y" + { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.ival) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); } break; case 197: -#line 1330 "perly.y" - { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.i_tkval) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); - } +#line 947 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } break; case 198: -#line 1334 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } +#line 949 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); } break; case 199: -#line 1336 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, - op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); } +#line 952 "perly.y" + { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); } break; case 200: -#line 1339 "perly.y" - { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); - } +#line 954 "perly.y" + { (yyval.opval) = newOP((ps[(1) - (3)].val.ival), 0);} break; case 201: -#line 1343 "perly.y" - { (yyval.opval) = newOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); - } +#line 956 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 202: -#line 1349 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } +#line 958 "perly.y" + { (yyval.opval) = (ps[(1) - (3)].val.opval); } break; case 203: -#line 1351 "perly.y" - { (yyval.opval) = (ps[(1) - (3)].val.opval); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); - } +#line 960 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } break; case 204: -#line 1356 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, - scalar((ps[(1) - (1)].val.opval))); } +#line 962 "perly.y" + { (yyval.opval) = ((ps[(1) - (3)].val.ival) == OP_NOT) + ? newUNOP((ps[(1) - (3)].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0))) + : newOP((ps[(1) - (3)].val.ival), OPf_SPECIAL); } break; case 205: -#line 1359 "perly.y" - { (yyval.opval) = (IVAL((ps[(1) - (3)].val.i_tkval)) == OP_NOT) - ? newUNOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0, newSVOP(OP_CONST, 0, newSViv(0))) - : newOP(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_SPECIAL); - - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); - TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); - } +#line 966 "perly.y" + { (yyval.opval) = newUNOP((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); } break; case 206: -#line 1368 "perly.y" - { (yyval.opval) = newUNOP(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval)); - TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o'); - TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')'); - } - break; - - case 207: -#line 1374 "perly.y" +#line 968 "perly.y" { if ( (ps[(1) - (1)].val.opval)->op_type != OP_TRANS && (ps[(1) - (1)].val.opval)->op_type != OP_TRANSR @@ -1695,186 +1313,150 @@ case 2: } break; - case 208: -#line 1385 "perly.y" - { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival)); - TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')'); - } + case 207: +#line 979 "perly.y" + { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival)); } break; - case 211: -#line 1392 "perly.y" + case 210: +#line 983 "perly.y" { (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); - TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'X'); } break; + case 212: +#line 992 "perly.y" + { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval)); } + break; + case 213: -#line 1402 "perly.y" - { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval)); - DO_MAD( - token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'d'); - append_madprops((ps[(3) - (3)].val.opval)->op_madprop, (yyval.opval), 'a'); - (ps[(3) - (3)].val.opval)->op_madprop = 0; - ); - } +#line 994 "perly.y" + { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); } break; case 214: -#line 1410 "perly.y" - { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval))); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d'); - } +#line 999 "perly.y" + { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); } break; case 215: -#line 1417 "perly.y" - { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); - TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); - } +#line 1001 "perly.y" + { (yyval.opval) = sawparens(newNULLLIST()); } break; case 216: -#line 1422 "perly.y" - { (yyval.opval) = sawparens(newNULLLIST()); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'('); - TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')'); - } +#line 1004 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 217: -#line 1427 "perly.y" +#line 1006 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 218: -#line 1429 "perly.y" +#line 1008 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 219: -#line 1431 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } +#line 1013 "perly.y" + { (yyval.opval) = (OP*)NULL; } break; case 220: -#line 1436 "perly.y" - { (yyval.opval) = (OP*)NULL; } +#line 1015 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 221: -#line 1438 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } +#line 1019 "perly.y" + { (yyval.opval) = (OP*)NULL; } break; case 222: -#line 1442 "perly.y" - { (yyval.opval) = (OP*)NULL; } +#line 1021 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; case 223: -#line 1444 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } +#line 1027 "perly.y" + { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); } break; case 224: -#line 1450 "perly.y" - { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); } +#line 1031 "perly.y" + { (yyval.opval) = newCVREF((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); } break; case 225: -#line 1454 "perly.y" - { (yyval.opval) = newCVREF(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'&'); - } +#line 1035 "perly.y" + { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval)); } break; case 226: -#line 1460 "perly.y" - { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'$'); +#line 1039 "perly.y" + { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); + if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival); } break; case 227: -#line 1466 "perly.y" - { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); - if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'@'); +#line 1045 "perly.y" + { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval)); + if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival); } break; case 228: -#line 1473 "perly.y" - { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval)); - if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'%'); - } +#line 1051 "perly.y" + { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); } break; case 229: -#line 1480 "perly.y" - { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'l'); - } +#line 1053 "perly.y" + { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); } break; case 230: -#line 1484 "perly.y" - { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); - TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'l'); - } +#line 1057 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval)); } break; - case 231: -#line 1490 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval)); - TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'*'); - } + case 232: +#line 1062 "perly.y" + { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval)); } break; - case 233: -#line 1497 "perly.y" - { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'@'); - } + case 234: +#line 1067 "perly.y" + { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval)); } break; - case 235: -#line 1504 "perly.y" - { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'@'); - } + case 236: +#line 1072 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval)); } break; case 237: -#line 1511 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval)); - TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'*'); - } +#line 1077 "perly.y" + { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } break; case 238: -#line 1518 "perly.y" +#line 1079 "perly.y" { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } break; case 239: -#line 1520 "perly.y" - { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } - break; - - case 240: -#line 1522 "perly.y" +#line 1081 "perly.y" { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); } break; - case 241: -#line 1525 "perly.y" + case 240: +#line 1084 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; @@ -1882,6 +1464,6 @@ case 2: /* Generated from: - * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y - * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl + * 7e6c275bbd1dbc800c205a8a8b0cd785e4859f94976ee7372149598471f16f81 perly.y + * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl * ex: set ro: */ @@ -19,10 +19,6 @@ * restriction. This special exception was added by the Free * Software Foundation in version 1.24 of Bison. * - * Note that this file is also #included in madly.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. */ #include "EXTERN.h" @@ -144,9 +140,6 @@ yy_stack_print (pTHX_ const yy_parser *parser) : "(Nullop)" ); break; -#ifndef PERL_IN_MADLY_C - case toketype_i_tkval: -#endif case toketype_ival: PerlIO_printf(Perl_debug_log, " %8"IVdf, (IV)ps->val.ival); break; @@ -241,11 +234,7 @@ S_clear_yystack(pTHX_ const yy_parser *parser) `----------*/ int -#ifdef PERL_IN_MADLY_C -Perl_madparse (pTHX_ int gramtype) -#else Perl_yyparse (pTHX_ int gramtype) -#endif { dVAR; int yystate; @@ -265,13 +254,6 @@ Perl_yyparse (pTHX_ int gramtype) action routines: ie $$. */ YYSTYPE yyval; -#ifndef PERL_IN_MADLY_C -# ifdef PERL_MAD - if (PL_madskills) - return madparse(gramtype); -# endif -#endif - YYDPRINTF ((Perl_debug_log, "Starting parse\n")); parser = PL_parser; @@ -338,11 +320,7 @@ Perl_yyparse (pTHX_ int gramtype) /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (parser->yychar == YYEMPTY) { YYDPRINTF ((Perl_debug_log, "Reading a token: ")); -#ifdef PERL_IN_MADLY_C - parser->yychar = PL_madskills ? madlex() : yylex(); -#else parser->yychar = yylex(); -#endif /* perly.tab is shipped based on an ASCII system; if it were to be regenerated * on a platform that doesn't use ASCII, this translation back would need to be @@ -435,26 +413,6 @@ Perl_yyparse (pTHX_ int gramtype) switch (yyn) { -#ifdef PERL_IN_MADLY_C -# define IVAL(i) (i)->tk_lval.ival -# define PVAL(p) (p)->tk_lval.pval -# define TOKEN_GETMAD(a,b,c) token_getmad((a),(b),(c)) -# define TOKEN_FREE(a) token_free(a) -# define OP_GETMAD(a,b,c) op_getmad((a),(b),(c)) -# define IF_MAD(a,b) (a) -# define DO_MAD(a) a -# define MAD -#else -# define IVAL(i) (i) -# define PVAL(p) (p) -# define TOKEN_GETMAD(a,b,c) -# define TOKEN_FREE(a) -# define OP_GETMAD(a,b,c) -# define IF_MAD(a,b) (b) -# define DO_MAD(a) -# undef MAD -#endif - /* contains all the rule actions; auto-generated from perly.y */ #include "perly.act" @@ -5,11 +5,11 @@ */ #ifdef PERL_CORE -/* A Bison parser, made by GNU Bison 2.5. */ +/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,6 +37,13 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif /* Tokens. */ #ifndef YYTOKENTYPE @@ -123,8 +130,7 @@ POSTINC = 334, PREDEC = 335, PREINC = 336, - ARROW = 337, - PEG = 338 + ARROW = 337 }; #endif @@ -209,8 +215,6 @@ #define PREDEC 335 #define PREINC 336 #define ARROW 337 -#define PEG 338 - #ifdef PERL_IN_TOKE_C @@ -239,28 +243,16 @@ S_is_opval_token(int type) { #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { - -/* Line 2068 of yacc.c */ +/* Line 2053 of yacc.c */ I32 ival; /* __DEFAULT__ (marker for regen_perly.pl; must always be 1st union member) */ char *pval; OP *opval; GV *gvval; -#ifdef PERL_IN_MADLY_C - TOKEN* p_tkval; - TOKEN* i_tkval; -#else - char *p_tkval; - I32 i_tkval; -#endif -#ifdef PERL_MAD - TOKEN* tkval; -#endif - -/* Line 2068 of yacc.c */ +/* Line 2053 of yacc.c */ } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -268,10 +260,22 @@ typedef union YYSTYPE #endif - +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ /* Generated from: - * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y - * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl + * 7e6c275bbd1dbc800c205a8a8b0cd785e4859f94976ee7372149598471f16f81 perly.y + * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl * ex: set ro: */ @@ -6,20 +6,20 @@ #define YYFINAL 14 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2731 +#define YYLAST 2763 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 105 +#define YYNTOKENS 104 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 72 /* YYNRULES -- Number of rules. */ -#define YYNRULES 241 +#define YYNRULES 240 /* YYNRULES -- Number of states. */ -#define YYNSTATES 475 +#define YYNSTATES 474 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 338 +#define YYMAXUTOK 337 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -60,7 +60,7 @@ static const yytype_uint8 yytranslate[] = 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 84, 85, 86, 87, 88, 89, 90, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 104 + 94, 95, 96, 97, 98, 99, 100, 101 }; #if YYDEBUG @@ -70,151 +70,151 @@ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 4, 9, 10, 14, 15, 19, 20, 24, 25, 29, 30, 34, 39, 47, 48, 53, 54, - 55, 58, 59, 62, 64, 66, 69, 72, 74, 76, - 81, 82, 90, 95, 96, 104, 112, 120, 127, 134, - 137, 146, 155, 167, 177, 186, 194, 197, 198, 207, - 210, 212, 215, 216, 220, 222, 224, 228, 232, 236, - 240, 244, 248, 249, 252, 259, 260, 263, 264, 265, - 267, 268, 270, 272, 274, 276, 278, 280, 281, 282, - 283, 284, 286, 288, 289, 291, 292, 295, 297, 300, - 302, 303, 304, 308, 314, 316, 318, 322, 326, 330, - 332, 335, 339, 341, 345, 351, 358, 362, 366, 372, - 375, 380, 381, 387, 389, 391, 397, 402, 408, 413, - 419, 426, 432, 437, 443, 448, 452, 459, 464, 470, - 474, 478, 482, 486, 490, 494, 498, 502, 506, 510, - 514, 518, 522, 526, 529, 532, 535, 538, 541, 544, - 547, 550, 553, 557, 560, 565, 569, 575, 578, 581, - 583, 585, 587, 589, 595, 598, 600, 603, 607, 609, - 612, 614, 616, 618, 620, 622, 624, 629, 634, 640, - 646, 648, 650, 654, 659, 663, 668, 673, 678, 683, - 688, 690, 693, 696, 698, 701, 704, 706, 709, 711, - 714, 716, 720, 722, 726, 728, 732, 737, 738, 744, - 746, 748, 750, 752, 756, 759, 763, 766, 768, 770, - 772, 773, 775, 776, 778, 780, 783, 786, 789, 792, - 795, 800, 803, 805, 809, 811, 815, 817, 821, 823, - 825, 827 + 55, 58, 59, 62, 64, 66, 69, 72, 74, 79, + 80, 88, 93, 94, 102, 110, 118, 125, 132, 135, + 144, 153, 165, 175, 184, 192, 195, 196, 205, 208, + 210, 213, 214, 218, 220, 222, 226, 230, 234, 238, + 242, 246, 247, 250, 257, 258, 261, 262, 263, 265, + 266, 268, 270, 272, 274, 276, 278, 279, 280, 281, + 282, 284, 286, 287, 289, 290, 293, 295, 298, 300, + 301, 302, 306, 312, 314, 316, 320, 324, 328, 330, + 333, 337, 339, 343, 349, 356, 360, 364, 370, 373, + 378, 379, 385, 387, 389, 395, 400, 406, 411, 417, + 424, 430, 435, 441, 446, 450, 457, 462, 468, 472, + 476, 480, 484, 488, 492, 496, 500, 504, 508, 512, + 516, 520, 524, 527, 530, 533, 536, 539, 542, 545, + 548, 551, 555, 558, 563, 567, 573, 576, 579, 581, + 583, 585, 587, 593, 596, 598, 601, 605, 607, 610, + 612, 614, 616, 618, 620, 622, 627, 632, 638, 644, + 646, 648, 652, 657, 661, 666, 671, 676, 681, 686, + 688, 691, 694, 696, 699, 702, 704, 707, 709, 712, + 714, 718, 720, 724, 726, 730, 735, 736, 742, 744, + 746, 748, 750, 754, 757, 761, 764, 766, 768, 770, + 771, 773, 774, 776, 778, 781, 784, 787, 790, 793, + 798, 801, 803, 807, 809, 813, 815, 819, 821, 823, + 825 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 106, 0, -1, -1, 3, 107, 115, 118, -1, -1, - 4, 108, 165, -1, -1, 5, 109, 113, -1, -1, - 6, 110, 122, -1, -1, 7, 111, 120, -1, -1, - 8, 112, 118, -1, 9, 115, 118, 10, -1, 21, - 115, 20, 74, 119, 20, 22, -1, -1, 9, 117, - 118, 10, -1, -1, -1, 118, 120, -1, -1, 119, - 126, -1, 122, -1, 121, -1, 36, 122, -1, 36, - 121, -1, 35, -1, 104, -1, 37, 141, 138, 114, - -1, -1, 38, 142, 139, 123, 143, 144, 149, -1, - 40, 23, 23, 20, -1, -1, 41, 139, 124, 23, - 23, 164, 20, -1, 44, 103, 115, 135, 102, 116, - 129, -1, 45, 103, 115, 137, 102, 116, 129, -1, - 50, 103, 115, 135, 102, 116, -1, 51, 103, 115, - 135, 102, 116, -1, 52, 113, -1, 42, 103, 115, - 133, 102, 131, 116, 130, -1, 43, 103, 115, 134, - 102, 131, 116, 130, -1, 49, 103, 115, 136, 20, - 133, 20, 131, 136, 102, 116, -1, 49, 70, 115, - 166, 103, 135, 102, 116, 130, -1, 49, 168, 103, - 115, 135, 102, 116, 130, -1, 49, 103, 115, 135, - 102, 116, 130, -1, 113, 130, -1, -1, 40, 23, - 23, 9, 115, 125, 118, 10, -1, 128, 20, -1, - 20, -1, 26, 127, -1, -1, 73, 118, 74, -1, - 1, -1, 150, -1, 150, 44, 150, -1, 150, 45, - 150, -1, 150, 42, 150, -1, 150, 43, 134, -1, - 150, 49, 150, -1, 150, 51, 150, -1, -1, 46, - 116, -1, 47, 103, 135, 102, 116, 129, -1, -1, - 48, 113, -1, -1, -1, 128, -1, -1, 150, -1, - 150, -1, 150, -1, 132, -1, 134, -1, 23, -1, - -1, -1, -1, -1, 23, -1, 28, -1, -1, 26, - -1, -1, 72, 26, -1, 72, -1, 72, 26, -1, - 72, -1, -1, -1, 103, 147, 102, -1, 115, 146, - 9, 118, 10, -1, 148, -1, 20, -1, 150, 78, - 150, -1, 150, 77, 150, -1, 150, 76, 150, -1, - 151, -1, 151, 80, -1, 151, 80, 160, -1, 160, - -1, 60, 176, 151, -1, 58, 103, 176, 150, 102, - -1, 160, 101, 154, 103, 165, 102, -1, 160, 101, - 154, -1, 24, 176, 164, -1, 25, 176, 103, 165, - 102, -1, 60, 164, -1, 58, 103, 165, 102, -1, - -1, 33, 140, 113, 153, 164, -1, 24, -1, 168, - -1, 175, 9, 150, 20, 10, -1, 168, 11, 150, - 12, -1, 160, 101, 11, 150, 12, -1, 155, 11, - 150, 12, -1, 168, 9, 150, 20, 10, -1, 160, - 101, 9, 150, 20, 10, -1, 155, 9, 150, 20, - 10, -1, 160, 101, 103, 102, -1, 160, 101, 103, - 150, 102, -1, 155, 103, 150, 102, -1, 155, 103, - 102, -1, 103, 150, 102, 11, 150, 12, -1, 29, - 11, 150, 12, -1, 103, 102, 11, 150, 12, -1, - 160, 81, 160, -1, 160, 95, 160, -1, 160, 63, - 160, -1, 160, 64, 160, -1, 160, 89, 160, -1, - 160, 61, 160, -1, 160, 62, 160, -1, 160, 88, - 160, -1, 160, 87, 160, -1, 160, 54, 160, -1, - 160, 86, 160, -1, 160, 85, 160, -1, 160, 84, - 160, -1, 160, 90, 160, -1, 13, 160, -1, 14, - 160, -1, 91, 160, -1, 92, 160, -1, 160, 98, - -1, 160, 97, -1, 160, 96, -1, 100, 160, -1, - 99, 160, -1, 11, 150, 12, -1, 11, 12, -1, - 67, 150, 20, 10, -1, 67, 20, 10, -1, 39, - 140, 143, 144, 148, -1, 66, 160, -1, 66, 113, - -1, 156, -1, 157, -1, 158, -1, 159, -1, 160, - 82, 160, 83, 160, -1, 93, 160, -1, 162, -1, - 69, 160, -1, 103, 150, 102, -1, 29, -1, 103, - 102, -1, 168, -1, 172, -1, 170, -1, 169, -1, - 171, -1, 155, -1, 173, 11, 150, 12, -1, 174, - 11, 150, 12, -1, 173, 9, 150, 20, 10, -1, - 174, 9, 150, 20, 10, -1, 26, -1, 167, -1, - 167, 103, 102, -1, 167, 103, 150, 102, -1, 68, - 142, 164, -1, 160, 101, 15, 18, -1, 160, 101, - 16, 18, -1, 160, 101, 17, 18, -1, 160, 101, - 19, 18, -1, 160, 101, 18, 18, -1, 53, -1, - 53, 160, -1, 79, 151, -1, 59, -1, 59, 113, - -1, 59, 160, -1, 71, -1, 71, 160, -1, 32, - -1, 32, 160, -1, 56, -1, 56, 103, 102, -1, - 30, -1, 30, 103, 102, -1, 31, -1, 57, 103, - 102, -1, 57, 103, 150, 102, -1, -1, 27, 161, - 103, 151, 102, -1, 23, -1, 152, -1, 55, -1, - 34, -1, 70, 163, 145, -1, 70, 163, -1, 103, - 150, 102, -1, 103, 102, -1, 168, -1, 170, -1, - 169, -1, -1, 151, -1, -1, 150, -1, 168, -1, - 19, 176, -1, 15, 176, -1, 16, 176, -1, 17, - 176, -1, 65, 176, -1, 160, 101, 65, 18, -1, - 18, 176, -1, 169, -1, 160, 101, 16, -1, 170, - -1, 160, 101, 17, -1, 172, -1, 160, 101, 18, - -1, 23, -1, 168, -1, 113, -1, 28, -1 + 105, 0, -1, -1, 3, 106, 114, 117, -1, -1, + 4, 107, 164, -1, -1, 5, 108, 112, -1, -1, + 6, 109, 121, -1, -1, 7, 110, 119, -1, -1, + 8, 111, 117, -1, 9, 114, 117, 10, -1, 21, + 114, 20, 74, 118, 20, 22, -1, -1, 9, 116, + 117, 10, -1, -1, -1, 117, 119, -1, -1, 118, + 125, -1, 121, -1, 120, -1, 36, 121, -1, 36, + 120, -1, 35, -1, 37, 140, 137, 113, -1, -1, + 38, 141, 138, 122, 142, 143, 148, -1, 40, 23, + 23, 20, -1, -1, 41, 138, 123, 23, 23, 163, + 20, -1, 44, 103, 114, 134, 102, 115, 128, -1, + 45, 103, 114, 136, 102, 115, 128, -1, 50, 103, + 114, 134, 102, 115, -1, 51, 103, 114, 134, 102, + 115, -1, 52, 112, -1, 42, 103, 114, 132, 102, + 130, 115, 129, -1, 43, 103, 114, 133, 102, 130, + 115, 129, -1, 49, 103, 114, 135, 20, 132, 20, + 130, 135, 102, 115, -1, 49, 70, 114, 165, 103, + 134, 102, 115, 129, -1, 49, 167, 103, 114, 134, + 102, 115, 129, -1, 49, 103, 114, 134, 102, 115, + 129, -1, 112, 129, -1, -1, 40, 23, 23, 9, + 114, 124, 117, 10, -1, 127, 20, -1, 20, -1, + 26, 126, -1, -1, 73, 117, 74, -1, 1, -1, + 149, -1, 149, 44, 149, -1, 149, 45, 149, -1, + 149, 42, 149, -1, 149, 43, 133, -1, 149, 49, + 149, -1, 149, 51, 149, -1, -1, 46, 115, -1, + 47, 103, 134, 102, 115, 128, -1, -1, 48, 112, + -1, -1, -1, 127, -1, -1, 149, -1, 149, -1, + 149, -1, 131, -1, 133, -1, 23, -1, -1, -1, + -1, -1, 23, -1, 28, -1, -1, 26, -1, -1, + 72, 26, -1, 72, -1, 72, 26, -1, 72, -1, + -1, -1, 103, 146, 102, -1, 114, 145, 9, 117, + 10, -1, 147, -1, 20, -1, 149, 78, 149, -1, + 149, 77, 149, -1, 149, 76, 149, -1, 150, -1, + 150, 80, -1, 150, 80, 159, -1, 159, -1, 60, + 175, 150, -1, 58, 103, 175, 149, 102, -1, 159, + 101, 153, 103, 164, 102, -1, 159, 101, 153, -1, + 24, 175, 163, -1, 25, 175, 103, 164, 102, -1, + 60, 163, -1, 58, 103, 164, 102, -1, -1, 33, + 139, 112, 152, 163, -1, 24, -1, 167, -1, 174, + 9, 149, 20, 10, -1, 167, 11, 149, 12, -1, + 159, 101, 11, 149, 12, -1, 154, 11, 149, 12, + -1, 167, 9, 149, 20, 10, -1, 159, 101, 9, + 149, 20, 10, -1, 154, 9, 149, 20, 10, -1, + 159, 101, 103, 102, -1, 159, 101, 103, 149, 102, + -1, 154, 103, 149, 102, -1, 154, 103, 102, -1, + 103, 149, 102, 11, 149, 12, -1, 29, 11, 149, + 12, -1, 103, 102, 11, 149, 12, -1, 159, 81, + 159, -1, 159, 95, 159, -1, 159, 63, 159, -1, + 159, 64, 159, -1, 159, 89, 159, -1, 159, 61, + 159, -1, 159, 62, 159, -1, 159, 88, 159, -1, + 159, 87, 159, -1, 159, 54, 159, -1, 159, 86, + 159, -1, 159, 85, 159, -1, 159, 84, 159, -1, + 159, 90, 159, -1, 13, 159, -1, 14, 159, -1, + 91, 159, -1, 92, 159, -1, 159, 98, -1, 159, + 97, -1, 159, 96, -1, 100, 159, -1, 99, 159, + -1, 11, 149, 12, -1, 11, 12, -1, 67, 149, + 20, 10, -1, 67, 20, 10, -1, 39, 139, 142, + 143, 147, -1, 66, 159, -1, 66, 112, -1, 155, + -1, 156, -1, 157, -1, 158, -1, 159, 82, 159, + 83, 159, -1, 93, 159, -1, 161, -1, 69, 159, + -1, 103, 149, 102, -1, 29, -1, 103, 102, -1, + 167, -1, 171, -1, 169, -1, 168, -1, 170, -1, + 154, -1, 172, 11, 149, 12, -1, 173, 11, 149, + 12, -1, 172, 9, 149, 20, 10, -1, 173, 9, + 149, 20, 10, -1, 26, -1, 166, -1, 166, 103, + 102, -1, 166, 103, 149, 102, -1, 68, 141, 163, + -1, 159, 101, 15, 18, -1, 159, 101, 16, 18, + -1, 159, 101, 17, 18, -1, 159, 101, 19, 18, + -1, 159, 101, 18, 18, -1, 53, -1, 53, 159, + -1, 79, 150, -1, 59, -1, 59, 112, -1, 59, + 159, -1, 71, -1, 71, 159, -1, 32, -1, 32, + 159, -1, 56, -1, 56, 103, 102, -1, 30, -1, + 30, 103, 102, -1, 31, -1, 57, 103, 102, -1, + 57, 103, 149, 102, -1, -1, 27, 160, 103, 150, + 102, -1, 23, -1, 151, -1, 55, -1, 34, -1, + 70, 162, 144, -1, 70, 162, -1, 103, 149, 102, + -1, 103, 102, -1, 167, -1, 169, -1, 168, -1, + -1, 150, -1, -1, 149, -1, 167, -1, 19, 175, + -1, 15, 175, -1, 16, 175, -1, 17, 175, -1, + 65, 175, -1, 159, 101, 65, 18, -1, 18, 175, + -1, 168, -1, 159, 101, 16, -1, 169, -1, 159, + 101, 17, -1, 171, -1, 159, 101, 18, -1, 23, + -1, 167, -1, 112, -1, 28, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 142, 142, 141, 151, 150, 160, 159, 172, 171, - 184, 183, 196, 195, 207, 217, 227, 230, 240, 245, - 246, 256, 257, 266, 274, 278, 286, 296, 298, 303, - 321, 320, 370, 386, 385, 402, 411, 420, 431, 433, - 435, 445, 455, 476, 485, 494, 503, 510, 509, 526, - 532, 542, 566, 567, 572, 574, 576, 580, 584, 588, - 592, 597, 603, 604, 610, 624, 625, 634, 640, 641, - 646, 649, 653, 658, 662, 666, 670, 671, 675, 681, - 686, 691, 692, 697, 698, 703, 704, 708, 718, 722, - 732, 734, 733, 752, 764, 765, 775, 779, 783, 787, - 791, 801, 810, 814, 819, 826, 835, 841, 847, 855, - 859, 866, 865, 876, 877, 881, 890, 895, 903, 910, - 917, 927, 936, 943, 952, 959, 965, 972, 977, 987, - 991, 995, 1001, 1005, 1009, 1013, 1017, 1021, 1025, 1037, - 1041, 1045, 1049, 1059, 1063, 1070, 1074, 1078, 1083, 1088, - 1100, 1105, 1114, 1119, 1124, 1130, 1136, 1147, 1151, 1157, - 1158, 1159, 1160, 1161, 1166, 1170, 1172, 1176, 1181, 1183, - 1188, 1190, 1192, 1194, 1196, 1198, 1200, 1212, 1224, 1238, - 1252, 1254, 1256, 1261, 1274, 1279, 1283, 1287, 1291, 1296, - 1300, 1305, 1309, 1313, 1317, 1321, 1325, 1329, 1333, 1335, - 1338, 1342, 1348, 1350, 1355, 1358, 1367, 1374, 1373, 1389, - 1390, 1391, 1397, 1401, 1409, 1416, 1421, 1426, 1428, 1430, - 1435, 1437, 1442, 1443, 1449, 1453, 1459, 1465, 1472, 1479, - 1483, 1489, 1495, 1496, 1502, 1503, 1509, 1510, 1517, 1519, - 1521, 1524 + 0, 114, 114, 113, 123, 122, 132, 131, 144, 143, + 156, 155, 168, 167, 179, 187, 195, 198, 206, 211, + 212, 222, 223, 232, 236, 240, 244, 251, 253, 264, + 263, 295, 303, 302, 310, 316, 322, 333, 335, 337, + 344, 351, 366, 371, 377, 383, 390, 389, 404, 409, + 418, 436, 437, 442, 444, 446, 448, 450, 452, 454, + 457, 463, 464, 469, 480, 481, 487, 493, 494, 499, + 502, 506, 511, 515, 519, 523, 524, 528, 534, 539, + 544, 545, 550, 551, 556, 557, 559, 564, 566, 571, + 573, 572, 591, 601, 602, 608, 610, 612, 614, 618, + 620, 625, 629, 633, 637, 643, 648, 654, 660, 662, + 665, 664, 675, 676, 680, 686, 689, 694, 699, 703, + 709, 715, 718, 723, 727, 730, 732, 734, 739, 741, + 743, 748, 750, 752, 754, 756, 758, 760, 762, 764, + 766, 768, 773, 775, 778, 780, 782, 785, 788, 799, + 802, 809, 811, 813, 815, 817, 824, 826, 830, 831, + 832, 833, 834, 836, 838, 840, 842, 844, 846, 848, + 850, 852, 854, 856, 858, 860, 870, 880, 891, 902, + 904, 906, 909, 914, 918, 920, 922, 924, 927, 929, + 932, 934, 936, 938, 940, 942, 944, 946, 948, 951, + 953, 955, 957, 959, 961, 965, 968, 967, 980, 981, + 982, 987, 991, 993, 998, 1000, 1003, 1005, 1007, 1012, + 1014, 1019, 1020, 1026, 1030, 1034, 1038, 1044, 1050, 1052, + 1056, 1060, 1061, 1065, 1066, 1070, 1071, 1076, 1078, 1080, + 1083 }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +#if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = @@ -233,18 +233,18 @@ static const char *const yytname[] = "ANDOP", "NOTOP", "','", "ASSIGNOP", "'?'", "':'", "DORDOR", "OROR", "ANDAND", "BITOROP", "BITANDOP", "SHIFTOP", "MATCHOP", "'!'", "'~'", "REFGEN", "UMINUS", "POWOP", "POSTJOIN", "POSTDEC", "POSTINC", "PREDEC", - "PREINC", "ARROW", "')'", "'('", "PEG", "$accept", "grammar", "$@1", - "$@2", "$@3", "$@4", "$@5", "$@6", "block", "formblock", "remember", - "mblock", "mremember", "stmtseq", "formstmtseq", "fullstmt", - "labfullstmt", "barestmt", "$@7", "$@8", "$@9", "formline", "formarg", - "sideff", "else", "cont", "mintro", "nexpr", "texpr", "iexpr", "mexpr", - "mnexpr", "miexpr", "formname", "startsub", "startanonsub", - "startformsub", "subname", "proto", "subattrlist", "myattrlist", - "subsignature", "@10", "realsubbody", "optsubbody", "expr", "listexpr", - "listop", "@11", "method", "subscripted", "termbinop", "termunop", - "anonymous", "termdo", "term", "@12", "myattrterm", "myterm", - "optlistexpr", "optexpr", "my_scalar", "amper", "scalar", "ary", "hsh", - "arylen", "star", "sliceme", "kvslice", "gelem", "indirob", 0 + "PREINC", "ARROW", "')'", "'('", "$accept", "grammar", "$@1", "$@2", + "$@3", "$@4", "$@5", "$@6", "block", "formblock", "remember", "mblock", + "mremember", "stmtseq", "formstmtseq", "fullstmt", "labfullstmt", + "barestmt", "$@7", "$@8", "$@9", "formline", "formarg", "sideff", "else", + "cont", "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "miexpr", + "formname", "startsub", "startanonsub", "startformsub", "subname", + "proto", "subattrlist", "myattrlist", "subsignature", "@10", + "realsubbody", "optsubbody", "expr", "listexpr", "listop", "@11", + "method", "subscripted", "termbinop", "termunop", "anonymous", "termdo", + "term", "@12", "myattrterm", "myterm", "optlistexpr", "optexpr", + "my_scalar", "amper", "scalar", "ary", "hsh", "arylen", "star", + "sliceme", "kvslice", "gelem", "indirob", YY_NULL }; #endif @@ -263,38 +263,38 @@ static const yytype_uint16 yytoknum[] = 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 44, 321, 63, 58, 322, 323, 324, 325, 326, 327, 328, 33, 126, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 41, 40, 338 + 336, 337, 41, 40 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 105, 107, 106, 108, 106, 109, 106, 110, 106, - 111, 106, 112, 106, 113, 114, 115, 116, 117, 118, - 118, 119, 119, 120, 120, 121, 121, 122, 122, 122, - 123, 122, 122, 124, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 125, 122, 122, - 122, 126, 127, 127, 128, 128, 128, 128, 128, 128, - 128, 128, 129, 129, 129, 130, 130, 131, 132, 132, - 133, 133, 134, 135, 136, 137, 138, 138, 139, 140, - 141, 142, 142, 143, 143, 144, 144, 144, 145, 145, - 146, 147, 146, 148, 149, 149, 150, 150, 150, 150, - 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, - 152, 153, 152, 154, 154, 155, 155, 155, 155, 155, - 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, - 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, - 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 158, 158, 158, 158, 158, 159, 159, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, - 160, 160, 160, 162, 162, 163, 163, 163, 163, 163, - 164, 164, 165, 165, 166, 167, 168, 169, 170, 171, - 171, 172, 173, 173, 174, 174, 175, 175, 176, 176, - 176, 176 + 0, 104, 106, 105, 107, 105, 108, 105, 109, 105, + 110, 105, 111, 105, 112, 113, 114, 115, 116, 117, + 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, + 121, 121, 123, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 124, 121, 121, 121, + 125, 126, 126, 127, 127, 127, 127, 127, 127, 127, + 127, 128, 128, 128, 129, 129, 130, 131, 131, 132, + 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, + 141, 141, 142, 142, 143, 143, 143, 144, 144, 145, + 146, 145, 147, 148, 148, 149, 149, 149, 149, 150, + 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, + 152, 151, 153, 153, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 157, 157, 157, 157, 157, 158, 158, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 160, 159, 159, 159, + 159, 159, 161, 161, 162, 162, 162, 162, 162, 163, + 163, 164, 164, 165, 166, 167, 168, 169, 170, 170, + 171, 172, 172, 173, 173, 174, 174, 175, 175, 175, + 175 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -302,29 +302,29 @@ static const yytype_uint8 yyr2[] = { 0, 2, 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 4, 7, 0, 4, 0, 0, - 2, 0, 2, 1, 1, 2, 2, 1, 1, 4, - 0, 7, 4, 0, 7, 7, 7, 6, 6, 2, - 8, 8, 11, 9, 8, 7, 2, 0, 8, 2, - 1, 2, 0, 3, 1, 1, 3, 3, 3, 3, - 3, 3, 0, 2, 6, 0, 2, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 0, 2, 1, 2, 1, - 0, 0, 3, 5, 1, 1, 3, 3, 3, 1, - 2, 3, 1, 3, 5, 6, 3, 3, 5, 2, - 4, 0, 5, 1, 1, 5, 4, 5, 4, 5, - 6, 5, 4, 5, 4, 3, 6, 4, 5, 3, + 2, 0, 2, 1, 1, 2, 2, 1, 4, 0, + 7, 4, 0, 7, 7, 7, 6, 6, 2, 8, + 8, 11, 9, 8, 7, 2, 0, 8, 2, 1, + 2, 0, 3, 1, 1, 3, 3, 3, 3, 3, + 3, 0, 2, 6, 0, 2, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 2, 1, 2, 1, 0, + 0, 3, 5, 1, 1, 3, 3, 3, 1, 2, + 3, 1, 3, 5, 6, 3, 3, 5, 2, 4, + 0, 5, 1, 1, 5, 4, 5, 4, 5, 6, + 5, 4, 5, 4, 3, 6, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 4, 3, 5, 2, 2, 1, - 1, 1, 1, 5, 2, 1, 2, 3, 1, 2, - 1, 1, 1, 1, 1, 1, 4, 4, 5, 5, - 1, 1, 3, 4, 3, 4, 4, 4, 4, 4, - 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, - 1, 3, 1, 3, 1, 3, 4, 0, 5, 1, - 1, 1, 1, 3, 2, 3, 2, 1, 1, 1, - 0, 1, 0, 1, 1, 2, 2, 2, 2, 2, - 4, 2, 1, 3, 1, 3, 1, 3, 1, 1, - 1, 1 + 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 2, 4, 3, 5, 2, 2, 1, 1, + 1, 1, 5, 2, 1, 2, 3, 1, 2, 1, + 1, 1, 1, 1, 1, 4, 4, 5, 5, 1, + 1, 3, 4, 3, 4, 4, 4, 4, 4, 1, + 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, + 3, 1, 3, 1, 3, 4, 0, 5, 1, 1, + 1, 1, 3, 2, 3, 2, 1, 1, 1, 0, + 1, 0, 1, 1, 2, 2, 2, 2, 2, 4, + 2, 1, 3, 1, 3, 1, 3, 1, 1, 1, + 1 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. @@ -332,345 +332,362 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 2, 4, 6, 8, 10, 12, 0, 16, 222, + 0, 2, 4, 6, 8, 10, 12, 0, 16, 221, 0, 0, 0, 19, 1, 19, 0, 0, 0, 0, - 0, 0, 0, 0, 209, 0, 0, 180, 207, 168, - 202, 204, 198, 79, 212, 79, 190, 211, 200, 0, - 0, 193, 220, 0, 0, 0, 0, 0, 0, 196, - 0, 0, 0, 0, 0, 0, 0, 223, 99, 210, - 175, 159, 160, 161, 162, 102, 165, 5, 181, 170, - 173, 172, 174, 171, 0, 0, 0, 16, 7, 54, - 50, 27, 80, 0, 0, 78, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 65, 9, 0, 55, 0, - 11, 24, 23, 0, 0, 153, 0, 143, 144, 238, - 241, 240, 239, 226, 227, 228, 231, 225, 220, 0, - 0, 0, 0, 199, 0, 83, 191, 0, 0, 222, - 194, 195, 238, 221, 109, 239, 0, 229, 158, 157, - 0, 0, 81, 82, 220, 166, 0, 214, 217, 219, - 218, 197, 192, 145, 146, 164, 151, 150, 169, 0, - 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 208, 0, 0, 179, 206, 167, + 201, 203, 197, 78, 211, 78, 189, 210, 199, 0, + 0, 192, 219, 0, 0, 0, 0, 0, 0, 195, + 0, 0, 0, 0, 0, 0, 0, 222, 98, 209, + 174, 158, 159, 160, 161, 101, 164, 5, 180, 169, + 172, 171, 173, 170, 0, 0, 0, 16, 7, 53, + 49, 27, 79, 0, 0, 77, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 9, 0, 54, 0, 11, + 24, 23, 0, 0, 152, 0, 142, 143, 237, 240, + 239, 238, 225, 226, 227, 230, 224, 219, 0, 0, + 0, 0, 198, 0, 82, 190, 0, 0, 221, 193, + 194, 237, 220, 108, 238, 0, 228, 157, 156, 0, + 0, 80, 81, 219, 165, 0, 213, 216, 218, 217, + 196, 191, 144, 145, 163, 150, 149, 168, 0, 0, + 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 149, 148, 147, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 77, 78, 0, 33, 16, - 16, 16, 16, 16, 16, 0, 16, 16, 39, 0, - 46, 49, 0, 0, 0, 0, 0, 0, 26, 25, - 20, 152, 107, 222, 0, 0, 203, 111, 84, 85, - 201, 205, 0, 0, 0, 103, 155, 0, 184, 216, - 0, 89, 213, 0, 167, 98, 97, 96, 101, 0, - 0, 125, 0, 138, 134, 135, 131, 132, 129, 0, - 141, 140, 139, 137, 136, 133, 142, 130, 0, 0, - 0, 233, 235, 237, 0, 113, 0, 0, 106, 114, - 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 0, 30, 0, 0, 70, 0, 0, 0, 0, - 0, 16, 0, 0, 66, 58, 59, 72, 56, 57, - 60, 61, 0, 0, 127, 220, 87, 16, 206, 110, - 0, 154, 215, 88, 0, 0, 0, 118, 124, 0, - 0, 0, 185, 186, 187, 189, 188, 230, 122, 0, - 222, 183, 0, 116, 0, 176, 0, 177, 0, 14, - 16, 29, 83, 16, 32, 0, 0, 71, 0, 0, - 73, 75, 0, 0, 224, 69, 74, 0, 0, 55, - 0, 0, 0, 108, 208, 112, 86, 90, 156, 104, - 128, 0, 121, 163, 0, 117, 123, 0, 119, 178, - 179, 115, 0, 85, 47, 220, 67, 67, 0, 0, - 0, 0, 70, 0, 0, 0, 91, 0, 126, 120, - 105, 0, 16, 19, 0, 0, 0, 18, 62, 62, - 0, 65, 0, 0, 37, 38, 0, 19, 21, 95, - 94, 31, 0, 34, 65, 65, 19, 0, 0, 35, - 36, 0, 45, 67, 65, 92, 0, 0, 48, 40, - 41, 0, 63, 0, 65, 0, 44, 93, 0, 52, - 22, 17, 0, 43, 0, 15, 19, 51, 0, 0, - 0, 62, 42, 53, 64 + 0, 148, 147, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 76, 77, 0, 32, 16, 16, + 16, 16, 16, 16, 0, 16, 16, 38, 0, 45, + 48, 0, 0, 0, 0, 0, 0, 26, 25, 20, + 151, 106, 221, 0, 0, 202, 110, 83, 84, 200, + 204, 0, 0, 0, 102, 154, 0, 183, 215, 0, + 88, 212, 0, 166, 97, 96, 95, 100, 0, 0, + 124, 0, 137, 133, 134, 130, 131, 128, 0, 140, + 139, 138, 136, 135, 132, 141, 129, 0, 0, 0, + 232, 234, 236, 0, 112, 0, 0, 105, 113, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, + 0, 29, 0, 0, 69, 0, 0, 0, 0, 0, + 16, 0, 0, 65, 57, 58, 71, 55, 56, 59, + 60, 0, 0, 126, 219, 86, 16, 205, 109, 0, + 153, 214, 87, 0, 0, 0, 117, 123, 0, 0, + 0, 184, 185, 186, 188, 187, 229, 121, 0, 221, + 182, 0, 115, 0, 175, 0, 176, 0, 14, 16, + 28, 82, 16, 31, 0, 0, 70, 0, 0, 72, + 74, 0, 0, 223, 68, 73, 0, 0, 54, 0, + 0, 0, 107, 207, 111, 85, 89, 155, 103, 127, + 0, 120, 162, 0, 116, 122, 0, 118, 177, 178, + 114, 0, 84, 46, 219, 66, 66, 0, 0, 0, + 0, 69, 0, 0, 0, 90, 0, 125, 119, 104, + 0, 16, 19, 0, 0, 0, 18, 61, 61, 0, + 64, 0, 0, 36, 37, 0, 19, 21, 94, 93, + 30, 0, 33, 64, 64, 19, 0, 0, 34, 35, + 0, 44, 66, 64, 91, 0, 0, 47, 39, 40, + 0, 62, 0, 64, 0, 43, 92, 0, 51, 22, + 17, 0, 42, 0, 15, 19, 50, 0, 0, 0, + 61, 41, 52, 63 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 7, 8, 9, 10, 11, 12, 13, 111, 351, - 377, 418, 436, 103, 447, 220, 101, 102, 352, 294, - 413, 460, 467, 97, 439, 210, 415, 366, 356, 306, - 359, 368, 362, 291, 198, 124, 195, 144, 229, 317, - 242, 407, 426, 378, 431, 98, 58, 59, 315, 278, - 60, 61, 62, 63, 64, 65, 120, 66, 147, 134, - 67, 363, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 113 + -1, 7, 8, 9, 10, 11, 12, 13, 110, 350, + 376, 417, 435, 102, 446, 219, 100, 101, 351, 293, + 412, 459, 466, 96, 438, 209, 414, 365, 355, 305, + 358, 367, 361, 290, 197, 123, 194, 143, 228, 316, + 241, 406, 425, 377, 430, 97, 58, 59, 314, 277, + 60, 61, 62, 63, 64, 65, 119, 66, 146, 133, + 67, 362, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 112 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -401 +#define YYPACT_NINF -408 static const yytype_int16 yypact[] = { - 709, -401, -401, -401, -401, -401, -401, 15, -401, 2565, - 19, 1216, 1120, -401, -401, -401, 1825, 2565, 2565, 379, - 379, 379, 379, 379, -401, 379, 379, -401, -401, 13, - -51, -401, 2565, -401, -401, -401, 2565, -401, -45, -39, - -17, 1732, 1639, 379, 1732, 1916, 26, 2565, 10, 2565, - 2565, 2565, 2565, 2565, 2565, 2565, 2007, -21, 11, -401, - 1, -401, -401, -401, -401, 2585, -401, -401, -7, 54, - 108, 131, -401, 91, 156, 221, 92, -401, -401, -401, - -401, -401, -401, 26, 99, -401, 20, 52, 53, 65, - -11, 69, 89, 19, -401, 116, -401, 158, 368, 1120, - -401, -401, -401, 448, 544, -401, -1, 250, 250, -401, - -401, -401, -401, -401, -401, -401, -401, -401, 2565, 90, - 94, 2565, 96, 1901, 19, 182, 2585, 125, 2100, 1639, - -401, 1901, 1545, 11, -401, 1466, 2565, -401, -401, 1901, - 208, 68, -401, -401, 2565, 1901, 2193, 167, -401, -401, - -401, 1901, 11, 250, 250, 250, 520, 520, 231, 139, - 2565, 2565, 2565, 2565, 2565, 2565, 2286, 2565, 2565, 2565, - 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, - 2565, 2565, -401, -401, -401, 63, 2379, 2565, 2565, 2565, - 2565, 2565, 2565, 2565, -401, 222, -401, 223, -401, -401, - -401, -401, -401, -401, -401, 141, -401, -401, -401, 19, - -401, -401, 2565, 2565, 2565, 2565, 2565, 2565, -401, -401, - -401, -401, -401, 2565, 2565, 61, -401, -401, -401, 191, - -401, -401, 160, 162, 2565, 11, -401, 257, -401, -401, - 213, 247, -401, 2565, 269, 199, 199, -401, 2585, 75, - 72, -401, 233, 1298, 1810, 1624, 529, 273, 2585, 295, - 342, 342, 1436, 1515, 1717, 1348, 250, 250, 2565, 2565, - 515, 267, 288, 289, 290, -401, 296, 2472, 178, -401, - -401, 349, 157, 93, 248, 98, 255, 103, 263, 640, - -401, 297, -401, 12, 264, 2565, 2565, 2565, 2565, 301, - 1310, -401, 2565, 2565, -401, -21, -401, -21, -21, -21, - -21, -21, 217, -66, -401, 2565, 302, -401, -401, -401, - 418, -401, -401, -401, 118, 2565, 311, -401, -401, 2565, - 266, 124, -401, -401, -401, -401, -401, -401, -401, 434, - 2565, -401, 317, -401, 320, -401, 340, -401, 343, -401, - -401, -401, 182, -401, -401, 329, 252, -21, 253, 258, - -21, -401, 259, 261, -401, -401, -401, 271, 366, 227, - 2565, 285, 287, -401, -401, -401, -401, 292, -401, -401, - -401, 129, -401, 2630, 388, -401, -401, 298, -401, -401, - -401, -401, 394, 191, -401, 2565, -401, -401, 399, 399, - 2565, 399, 2565, 314, 399, 399, -401, 409, -401, -401, - -401, 346, 401, -401, 403, 399, 399, -401, 23, 23, - 331, 116, 414, 399, -401, -401, 333, -401, -401, -401, - -401, -401, 736, -401, 116, 116, -401, 399, 339, -401, - -401, 399, -401, -401, 116, -401, 832, 9, -401, -401, - -401, 928, -401, 2565, 116, 1403, -401, -401, 425, 380, - -401, -401, 350, -401, 353, -401, -401, -401, 399, 399, - 1024, 23, -401, -401, -401 + 714, -408, -408, -408, -408, -408, -408, 5, -408, 2549, + 20, 1201, 1108, -408, -408, -408, 1809, 2549, 2549, 608, + 608, 608, 608, 608, -408, 608, 608, -408, -408, 48, + -67, -408, 2549, -408, -408, -408, 2549, -408, -54, -41, + -26, 1716, 1623, 608, 1716, 1900, 50, 2549, 40, 2549, + 2549, 2549, 2549, 2549, 2549, 2549, 1991, 226, 21, -408, + 11, -408, -408, -408, -408, 2617, -408, -408, -8, 107, + 136, 155, -408, 98, 220, 251, 110, -408, -408, -408, + -408, -408, -408, 50, 77, -408, 19, 26, 37, 41, + 1, 45, 51, 20, 93, -408, 135, 367, 1108, -408, + -408, -408, 447, 542, -408, -2, 614, 614, -408, -408, + -408, -408, -408, -408, -408, -408, -408, 2549, 56, 100, + 2549, 92, 1701, 20, 188, 2617, 124, 2084, 1623, -408, + 1701, 1529, 21, -408, 1450, 2549, -408, -408, 1701, 225, + 3, -408, -408, 2549, 1701, 2177, 168, -408, -408, -408, + 1701, 21, 614, 614, 614, 354, 354, 232, -50, 2549, + 2549, 2549, 2549, 2549, 2549, 2270, 2549, 2549, 2549, 2549, + 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, + 2549, -408, -408, -408, 252, 2363, 2549, 2549, 2549, 2549, + 2549, 2549, 2549, -408, 221, -408, 259, -408, -408, -408, + -408, -408, -408, -408, 171, -408, -408, -408, 20, -408, + -408, 2549, 2549, 2549, 2549, 2549, 2549, -408, -408, -408, + -408, -408, 2549, 2549, 9, -408, -408, -408, 211, -408, + -408, 140, 184, 2549, 21, -408, 295, -408, -408, 212, + 284, -408, 2549, 302, 240, 240, -408, 2617, 74, 13, + -408, 291, 341, 1608, 245, 529, 432, 2617, 2572, 289, + 289, 1279, 1420, 1499, 1332, 614, 614, 2549, 2549, 257, + 309, 313, 321, 326, -408, 327, 2456, 217, -408, -408, + 304, 101, 60, 119, 91, 129, 94, 156, 637, -408, + 328, -408, 15, 324, 2549, 2549, 2549, 2549, 339, 1294, + -408, 2549, 2549, -408, 226, -408, 226, 226, 226, 226, + 226, 254, -48, -408, 2549, 334, -408, -408, -408, 433, + -408, -408, -408, 97, 2549, 352, -408, -408, 2549, 160, + 115, -408, -408, -408, -408, -408, -408, -408, 443, 2549, + -408, 353, -408, 360, -408, 362, -408, 363, -408, -408, + -408, 188, -408, -408, 365, 287, 226, 290, 292, 226, + -408, 297, 288, -408, -408, -408, 299, 377, 281, 2549, + 306, 311, -408, -408, -408, -408, 312, -408, -408, -408, + 123, -408, 2662, 407, -408, -408, 317, -408, -408, -408, + -408, 400, 211, -408, 2549, -408, -408, 413, 413, 2549, + 413, 2549, 322, 413, 413, -408, 423, -408, -408, -408, + 359, 414, -408, 421, 413, 413, -408, 23, 23, 344, + 93, 434, 413, -408, -408, 355, -408, -408, -408, -408, + -408, 732, -408, 93, 93, -408, 413, 366, -408, -408, + 413, -408, -408, 93, -408, 827, 38, -408, -408, -408, + 922, -408, 2549, 93, 1387, -408, -408, 446, 402, -408, + -408, 391, -408, 392, -408, -408, -408, 413, 413, 1015, + 23, -408, -408, -408 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -401, -401, -401, -401, -401, -401, -401, -401, -10, -401, - 22, -103, -401, -12, -401, 444, 359, 7, -401, -401, - -401, -401, -401, -295, -400, 88, -381, -401, 67, -189, - -280, 21, -401, -401, 274, 467, -401, 438, 173, 133, - -401, -401, -401, 117, -401, -3, -33, -401, -401, -401, - -401, -401, -401, -401, -401, 80, -401, -401, -401, -111, - -121, -401, -401, 18, 480, 483, -401, -401, -401, -401, - -401, 25 + -408, -408, -408, -408, -408, -408, -408, -408, -10, -408, + 22, -103, -408, -12, -408, 489, 410, 7, -408, -408, + -408, -408, -408, -291, -407, -105, -377, -408, 122, -18, + -287, 70, -408, -408, 330, 496, -408, 449, 183, 144, + -408, -408, -408, 126, -408, -3, -33, -408, -408, -408, + -408, -408, -408, -408, -408, 79, -408, -408, -408, -110, + -124, -408, -408, 18, 493, 500, -408, -408, -408, -408, + -408, 25 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -237 +#define YYTABLE_NINF -236 static const yytype_int16 yytable[] = { - 78, 95, 95, 104, 19, 365, 57, 222, 233, 133, - 164, 221, 165, 106, 163, 14, 416, 152, 96, 440, - 367, 353, 371, 372, 121, 19, 20, 21, 77, 458, - 15, 130, 354, 238, 138, 459, 374, 112, 112, 112, - 112, 112, 141, 112, 112, 114, 115, 116, 117, 142, - 118, 119, 122, 159, 143, 160, 161, 162, 127, 203, - 135, 112, 455, 187, 128, 188, 148, 136, 137, 437, - 438, 474, 268, 314, 269, 160, 161, 162, 270, 271, - 272, 273, 274, 208, 327, 133, 129, 275, 237, 95, - 403, 163, 204, 95, 95, 326, 186, 107, 108, 194, - -236, 193, 312, 235, 166, 343, 219, 358, 205, 361, - 345, 133, 123, 146, 227, 347, 126, -232, 225, -232, - 420, 131, 197, 199, 139, 232, 57, 145, 276, 151, - 380, 153, 154, 155, 156, 157, 385, 160, 161, 162, - -234, 408, -234, 240, 160, 161, 162, 135, 160, 161, - 162, 160, 161, 162, 234, 200, 201, 245, 246, 247, - 365, 249, 250, 252, 209, 189, 277, 190, 202, 160, - 161, 162, 206, 462, 160, 161, 162, 342, 211, 160, - 161, 162, 289, 281, 282, 283, 284, 285, 286, 287, - 288, 313, 207, 223, 160, 161, 162, 224, 226, 304, - 160, 161, 162, 279, 375, 160, 161, 162, 228, 305, - 307, 308, 309, 310, 311, 160, 161, 162, 236, 387, - 57, 295, 296, 297, 298, 299, 300, 230, 302, 303, - 191, 320, 192, 160, 161, 162, 160, 161, 162, 241, - 324, 244, 243, 248, 301, 290, 293, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 318, 316, 319, 330, 331, 321, 344, 212, - 213, 214, 215, 323, 339, 346, 216, 162, 217, 95, - 325, 340, 133, 348, 414, 333, 384, 355, 112, 160, - 161, 162, 357, 307, 360, 307, 419, 369, 421, 360, - 360, 424, 425, 160, 161, 162, 334, 335, 336, 160, - 161, 162, 434, 435, 337, 322, 19, 364, 350, 373, - 444, 382, 381, 370, 160, 161, 162, 388, 376, -73, - 389, 160, 161, 162, 452, 328, 170, 57, 454, 160, - 161, 162, 160, 161, 162, 181, 182, 183, 184, 167, - 390, 185, 395, 391, 396, 397, 168, 169, 170, 171, - 398, 399, 133, 180, 400, 471, 472, 360, 181, 182, - 183, 184, 392, 401, 185, 394, 172, 173, 329, 174, - 175, 176, 177, 178, 179, 180, 402, 404, 77, 405, - 181, 182, 183, 184, 19, 406, 185, 360, 409, 357, - 410, 432, 109, 168, 169, 170, 171, 110, 417, 383, - 212, 213, 214, 215, 411, 446, 423, 216, 427, 217, - 428, 429, 95, 433, 451, 160, 161, 162, 176, 177, - 178, 179, 180, 441, 443, 445, 95, 181, 182, 183, - 184, 95, 453, 185, 160, 161, 162, 465, -13, 79, - 360, 341, 468, 466, 470, 469, 100, 77, 218, 16, - 95, 17, 18, 19, 20, 21, 22, 23, 80, 422, - 292, 24, 25, 26, 27, 28, 464, 29, 30, 31, - 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, - 86, 87, 88, 89, 160, 161, 162, 90, 91, 92, - 93, 36, 125, 37, 38, 39, 40, 41, 42, 442, - 160, 161, 162, 43, 44, 45, 46, 47, 48, 49, - 379, 196, 449, 450, 77, 393, 412, 50, 149, 430, - 19, 150, 456, 332, 0, 0, 386, 0, 109, 51, - 52, 53, 463, 110, -3, 79, 0, 54, 55, 0, - 0, 56, 94, 77, 0, 16, 0, 17, 18, 19, - 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, - 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, - 99, 82, 83, 35, 84, 85, 86, 87, 88, 89, - 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, - 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, - 44, 45, 46, 47, 48, 49, -237, -237, -237, 180, - 0, 185, 0, 50, 181, 182, 183, 184, 0, 0, - 185, 0, 0, 0, 0, 51, 52, 53, 0, 0, - 0, 79, 0, 54, 55, 0, 0, 56, 94, 77, - 349, 16, 0, 17, 18, 19, 20, 21, 22, 23, - 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, - 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, - 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, - 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, - 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, - 48, 49, 1, 2, 3, 4, 5, 6, 0, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, - 55, 0, 0, 56, 94, 77, 448, 16, 0, 17, - 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, - 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, - 34, 81, 99, 82, 83, 35, 84, 85, 86, 87, - 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, - 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, - 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 0, 0, 0, 79, 0, 54, 55, 0, 0, 56, - 94, 77, 457, 16, 0, 17, 18, 19, 20, 21, + 78, 94, 94, 103, 232, 14, 57, 221, 364, 132, + 220, 439, 366, 105, 370, 371, 19, 151, 95, 415, + 163, 313, 164, 236, 352, 326, 159, 160, 161, 77, + 15, 129, 162, 237, 137, 353, 121, 111, 111, 111, + 111, 111, 140, 111, 111, 113, 114, 115, 116, 126, + 117, 118, 243, 158, 373, 19, 20, 21, 457, 120, + 134, 111, 127, 473, 458, 454, 147, 135, 136, 436, + 437, 202, 342, 141, 159, 160, 161, 128, 142, 159, + 160, 161, 402, 207, 132, 159, 160, 161, 94, 159, + 160, 161, 94, 94, 325, 185, 106, 107, 311, 193, + 196, 162, 234, 344, 203, 218, 346, -235, 204, 379, + 132, 122, 419, 226, 165, 125, 186, 224, 187, 192, + 130, 341, 198, 138, 231, 57, 144, 384, 150, 199, + 152, 153, 154, 155, 156, 407, 159, 160, 161, 343, + 200, 208, 239, 145, 201, -231, 134, -231, 205, 345, + 159, 160, 161, 233, 206, 210, 244, 245, 246, 222, + 248, 249, 251, 364, -233, 461, -233, 159, 160, 161, + 159, 160, 161, 159, 160, 161, 347, 159, 160, 161, + 383, 288, 280, 281, 282, 283, 284, 285, 286, 287, + 312, 159, 160, 161, 225, 159, 160, 161, 303, 159, + 160, 161, 278, 223, 374, 159, 160, 161, 304, 306, + 307, 308, 309, 310, 227, 386, 159, 160, 161, 57, + 294, 295, 296, 297, 298, 299, 229, 301, 302, 188, + 319, 189, 159, 160, 161, 235, 159, 160, 161, 323, + 240, 247, 317, 242, 289, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 190, 267, 191, 268, 329, 330, 77, 269, 270, 271, + 272, 273, 19, 338, 300, 331, 274, 357, 94, 360, + 108, 132, 292, 315, 413, 109, 318, 111, 159, 160, + 161, 356, 306, 359, 306, 418, 368, 420, 359, 359, + 423, 424, 159, 160, 161, 320, 167, -236, 169, 170, + 322, 433, 434, 324, 321, 441, 363, 275, 161, 443, + 339, 380, 369, 211, 212, 213, 214, 332, 448, 449, + 215, 333, 216, 451, 178, 179, 57, 453, 455, 334, + 180, 181, 182, 183, 335, 336, 184, 354, 462, 349, + 167, 168, 169, 170, 19, 276, 372, 159, 160, 161, + 375, 132, 381, 387, 470, 471, 359, 159, 160, 161, + 388, 391, 389, 390, 393, 175, 176, 177, 178, 179, + 159, 160, 161, -72, 180, 181, 182, 183, 394, 395, + 184, 399, 396, 327, 397, -236, 359, 401, 356, 398, + 431, 400, 167, 168, 169, 170, 340, 382, 403, 211, + 212, 213, 214, 404, 445, 405, 215, 408, 216, 409, + 410, 94, 416, 450, 422, 173, 174, 175, 176, 177, + 178, 179, 426, 427, 428, 94, 180, 181, 182, 183, + 94, 432, 184, 159, 160, 161, 440, -13, 79, 359, + -236, -236, -236, 469, 442, 184, 77, 444, 16, 94, + 17, 18, 19, 20, 21, 22, 23, 80, 464, 452, + 24, 25, 26, 27, 28, 465, 29, 30, 31, 32, + 33, 34, 81, 98, 82, 83, 35, 84, 85, 86, + 87, 88, 89, 467, 468, 169, 90, 91, 92, 93, + 36, 99, 37, 38, 39, 40, 41, 42, 217, 159, + 160, 161, 43, 44, 45, 46, 47, 48, 49, 159, + 160, 161, 179, 421, 463, 291, 50, 180, 181, 182, + 183, 124, 195, 184, 392, 378, 411, 429, 51, 52, + 53, 148, -3, 79, 0, 385, 54, 55, 149, 0, + 56, 77, 0, 16, 0, 17, 18, 19, 20, 21, + 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, + 0, 29, 30, 31, 32, 33, 34, 81, 98, 82, + 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, + 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, + 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, + 46, 47, 48, 49, 0, 0, 0, 77, 0, 179, + 0, 50, 0, 19, 180, 181, 182, 183, 0, 0, + 184, 108, 0, 51, 52, 53, 109, 0, 79, 0, + 0, 54, 55, 0, 0, 56, 77, 348, 16, 0, + 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, + 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, + 33, 34, 81, 98, 82, 83, 35, 84, 85, 86, + 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, + 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, + 0, 0, 43, 44, 45, 46, 47, 48, 49, 180, + 181, 182, 183, 0, 0, 184, 50, 1, 2, 3, + 4, 5, 6, 0, 0, 0, 0, 0, 51, 52, + 53, 0, 0, 79, 0, 0, 54, 55, 0, 0, + 56, 77, 447, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, - 0, 29, 30, 31, 32, 33, 34, 81, 99, 82, + 0, 29, 30, 31, 32, 33, 34, 81, 98, 82, 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 51, 52, 53, 0, 0, 0, 79, - 0, 54, 55, 0, 0, 56, 94, 77, 461, 16, + 0, 0, 0, 51, 52, 53, 0, 0, 79, 0, + 0, 54, 55, 0, 0, 56, 77, 456, 16, 0, + 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, + 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, + 33, 34, 81, 98, 82, 83, 35, 84, 85, 86, + 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, + 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, + 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, + 53, 0, 0, 79, 0, 0, 54, 55, 0, 0, + 56, 77, 460, 16, 0, 17, 18, 19, 20, 21, + 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, + 0, 29, 30, 31, 32, 33, 34, 81, 98, 82, + 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, + 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, + 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, + 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 52, 53, 79, 0, 0, 0, + 0, 54, 55, 0, 77, 56, 16, 0, 17, 18, + 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, + 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, + 81, 98, 82, 83, 35, 84, 85, 86, 87, 88, + 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, + 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, + 43, 44, 45, 46, 47, 48, 49, 0, 0, 472, + 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 51, 52, 53, 79, + 0, 0, 0, 0, 54, 55, 0, 77, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, - 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, + 32, 33, 34, 81, 98, 82, 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 52, 53, 0, 0, 0, 79, 0, 54, 55, 0, - 0, 56, 94, 77, 0, 16, 0, 17, 18, 19, - 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, - 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, - 99, 82, 83, 35, 84, 85, 86, 87, 88, 89, - 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, + 52, 53, 79, 0, 0, 0, 0, 54, 55, 0, + 77, 56, 16, 0, 17, 18, 19, 20, 21, 22, + 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, + 29, 30, 31, 32, 33, 34, 81, 0, 82, 83, + 35, 84, 85, 86, 87, 88, 89, 0, 0, 0, + 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, + 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, + 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 51, 52, 53, 79, 0, 0, 0, 0, + 54, 55, 0, 0, 56, 16, 0, 17, 18, 19, + 20, 21, 22, 23, -67, 0, 0, 24, 25, 26, + 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, + 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, + 167, 168, 169, 170, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, - 44, 45, 46, 47, 48, 49, 0, 0, 473, 0, - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, - 0, 79, 0, 54, 55, 0, 0, 56, 94, 77, - 0, 16, 0, 17, 18, 19, 20, 21, 22, 23, - 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, - 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, - 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, - 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, - 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, - 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, - 55, 0, 0, 56, 94, 77, 0, 16, 0, 17, - 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, + 44, 45, 46, 47, 48, 49, 176, 177, 178, 179, + 0, 0, 0, 50, 180, 181, 182, 183, 0, 0, + 184, 0, 0, 0, 0, 51, 52, 53, 79, 0, + 0, 0, 0, 54, 55, 169, 170, 56, 16, 0, + 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, + 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, + 33, 34, 179, 0, 0, 0, 35, 180, 181, 182, + 183, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, + -169, 0, 43, 44, 45, 46, 47, 48, 49, 186, + 0, 187, -169, 0, 0, 0, 50, 0, 0, 0, + -169, 0, 0, 0, 0, 0, 0, 0, 51, 52, + 53, 167, 168, 169, 170, 0, 54, 55, 0, -67, + 56, 0, -169, -169, -169, -169, 0, 0, 0, -169, + 0, -169, 0, 0, -169, 0, 0, 0, 177, 178, + 179, -169, -169, -169, -169, 180, 181, 182, 183, 0, + 0, 184, 0, 0, 0, 0, -169, -169, -169, -208, + -169, -169, -169, -169, -169, -169, -169, -169, -169, -169, + -169, -208, 0, 0, 0, -169, -169, -169, -169, -208, + 0, -169, -169, 0, 0, 0, 0, 0, 0, 0, + 167, 168, 169, 170, 0, 0, 0, 0, 0, 0, + 0, -208, -208, -208, -208, 0, 0, 0, -208, 0, + -208, 0, 0, -208, 0, 0, 0, 0, 178, 179, + -208, -208, -208, -208, 180, 181, 182, 183, 0, 0, + 184, 0, 0, 0, 0, -208, -208, -208, 0, -208, + -208, -208, -208, -208, -208, -208, -208, -208, -208, -208, + 0, 0, 0, 0, -208, -208, -208, -208, 0, 0, + -208, -208, 77, 0, 16, 0, 17, 18, 19, 20, + 21, 22, 23, 0, 0, 0, 131, 25, 26, 27, + 28, 109, 29, 30, 31, 32, 33, 34, 0, 0, + 0, 0, 35, 0, 0, 0, 0, 0, 0, -236, + 0, 169, 170, 0, 0, 0, 36, 0, 37, 38, + 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, + 45, 46, 47, 48, 49, 0, 0, 178, 179, 0, + 0, 0, 50, 180, 181, 182, 183, 0, 0, 184, + 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, + 0, 0, 54, 55, 0, 77, 56, 16, 0, 17, + 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, - 34, 81, 0, 82, 83, 35, 84, 85, 86, 87, - 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, + 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, + 0, 0, 0, 0, 169, 170, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 0, 79, 0, 0, 0, 54, 55, 0, 0, 56, - 94, 16, 0, 17, 18, 19, 20, 21, 22, 23, - -68, 0, 0, 24, 25, 26, 27, 28, 0, 29, - 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, - 0, 0, -237, 0, 0, 0, 0, 0, 0, 168, - 169, 170, 171, 36, 0, 37, 38, 39, 40, 41, - 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, - 48, 49, 174, 175, 176, 177, 178, 179, 180, 50, - 0, 0, 0, 181, 182, 183, 184, 0, 0, 185, - 0, 51, 52, 53, 79, 0, 0, 0, 0, 54, - 55, 170, 171, 56, 16, 0, 17, 18, 19, 20, - 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, - 28, 0, 29, 30, 31, 32, 33, 34, 180, 0, - 0, 0, 35, 181, 182, 183, 184, 0, 0, 185, - 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, - 39, 40, 41, 42, 0, 0, -170, 0, 43, 44, - 45, 46, 47, 48, 49, 187, 0, 188, -170, 0, - 0, 0, 50, 0, 0, 0, -170, 0, 0, 0, - 0, 0, 0, 0, 51, 52, 53, 168, 169, 170, - 171, 0, 54, 55, 0, -68, 56, 0, -170, -170, - -170, -170, 0, 0, 0, -170, 0, -170, 0, 0, - -170, 0, 0, 177, 178, 179, 180, -170, -170, -170, - -170, 181, 182, 183, 184, 0, 0, 185, 0, 0, - 0, 0, -170, -170, -170, -209, -170, -170, -170, -170, - -170, -170, -170, -170, -170, -170, -170, -209, 0, 0, - 0, -170, -170, -170, -170, -209, 0, -170, -170, 0, - 0, 0, 0, 0, 0, 0, 168, 169, 170, 171, - 0, 0, 0, 0, 0, 0, 0, -209, -209, -209, - -209, 0, 0, 0, -209, 0, -209, 0, 0, -209, - 0, 0, 0, 178, 179, 180, -209, -209, -209, -209, - 181, 182, 183, 184, 0, 0, 185, 0, 0, 0, - 0, -209, -209, -209, 0, -209, -209, -209, -209, -209, - -209, -209, -209, -209, -209, -209, 0, 0, 0, 0, - -209, -209, -209, -209, 0, 0, -209, -209, 77, 0, - 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, - 0, 0, 132, 25, 26, 27, 28, 110, 29, 30, + 178, 179, 0, 0, 0, 50, 180, 181, 182, 183, + 0, 0, 184, 0, 0, 0, 0, 51, 52, 53, + 0, 0, 0, 0, 0, 54, 55, 0, 0, 56, + 16, 104, 17, 18, 19, 20, 21, 22, 23, 0, + 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, - 0, 0, 0, 0, 0, 168, -237, 170, 171, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, - 49, 0, 0, 179, 180, 0, 0, 0, 50, 181, - 182, 183, 184, 0, 0, 185, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, 54, 55, - 0, 77, 56, 16, 0, 17, 18, 19, 20, 21, - 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, - 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, - 0, 35, 0, 0, 0, 0, 0, 0, 168, 169, - 170, 171, 0, 0, 0, 36, 0, 37, 38, 39, - 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, - 46, 47, 48, 49, 0, 0, 179, 180, 0, 0, - 0, 50, 181, 182, 183, 184, 0, 0, 185, 0, - 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, - 0, 54, 55, 0, 0, 56, 16, 105, 17, 18, - 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, - 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, - 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, - 0, -237, 0, 170, 171, 0, 0, 0, 36, 0, - 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, - 43, 44, 45, 46, 47, 48, 49, 0, 0, 179, - 180, 0, 0, 0, 50, 181, 182, 183, 184, 0, - 0, 185, 0, 0, 0, 0, 51, 52, 53, 0, - 0, 0, 0, 0, 54, 55, 0, 16, 56, 17, - 18, 19, 20, 21, 22, 23, 140, 0, 0, 24, - 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, - 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, - 0, 0, 0, 0, 170, 171, 0, 0, 0, 36, - 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, - 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, - 179, 180, 0, 0, 0, 50, 181, 182, 183, 184, - 0, 0, 185, 0, 0, 0, 0, 51, 52, 53, - 0, 0, 0, 0, 0, 54, 55, 0, 16, 56, + 0, 16, 56, 17, 18, 19, 20, 21, 22, 23, + 139, 0, 0, 24, 25, 26, 27, 28, 0, 29, + 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, + 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, + 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 51, 52, 53, 0, 0, 0, 0, 0, 54, + 55, 0, 16, 56, 17, 18, 19, 20, 21, 22, + 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, + 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, + 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 0, 37, 38, 39, 40, + 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, + 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, + 54, 55, 0, 157, 56, 16, 0, 17, 18, 19, + 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, + 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, + 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, + 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, + 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, + 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, + 0, 0, 0, 54, 55, 0, 230, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, @@ -679,7 +696,7 @@ static const yytype_int16 yytable[] = 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, - 53, 0, 0, 0, 0, 0, 54, 55, 0, 158, + 53, 0, 0, 0, 0, 0, 54, 55, 0, 238, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, @@ -689,7 +706,7 @@ static const yytype_int16 yytable[] = 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, 54, - 55, 0, 231, 56, 16, 0, 17, 18, 19, 20, + 55, 0, 250, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, @@ -698,7 +715,7 @@ static const yytype_int16 yytable[] = 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, - 0, 0, 54, 55, 0, 239, 56, 16, 0, 17, + 0, 0, 54, 55, 0, 279, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, @@ -707,137 +724,132 @@ static const yytype_int16 yytable[] = 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 0, 0, 0, 0, 0, 54, 55, 0, 251, 56, + 0, 0, 0, 0, 0, 54, 55, 0, 337, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, - 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, 166, 0, 50, 0, + 0, 0, 0, 167, 168, 169, 170, 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, 54, 55, - 0, 280, 56, 16, 0, 17, 18, 19, 20, 21, - 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, - 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, - 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 36, 0, 37, 38, 39, - 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, - 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, - 0, 54, 55, 0, 338, 56, 16, 0, 17, 18, - 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, - 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, - 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, - 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, - 43, 44, 45, 46, 47, 48, 49, 0, 0, 167, - 0, 0, 0, 0, 50, 0, 168, 169, 170, 171, - 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, - 0, 0, 0, 0, 54, 55, 172, 173, 56, 174, - 175, 176, 177, 178, 179, 180, 0, 0, 0, 0, - 181, 182, 183, 184, 167, 0, 185, 0, 0, 0, - 0, 168, 169, 170, 171, 0, 0, 0, 0, 0, + 0, 0, 56, 171, 172, 328, 173, 174, 175, 176, + 177, 178, 179, 0, 0, 0, 0, 180, 181, 182, + 183, 166, 0, 184, 0, 0, 0, 0, 167, 168, + 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 172, + 0, 173, 174, 175, 176, 177, 178, 179, 0, 0, + 0, 0, 180, 181, 182, 183, 166, 0, 184, 0, + 0, 0, 0, 167, 168, 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 174, 175, 176, 177, 178, 179, - 180, 0, 0, 0, 0, 181, 182, 183, 184, 0, - 0, 185 + 0, 0, 0, 0, 172, 0, 173, 174, 175, 176, + 177, 178, 179, 0, 0, 0, 0, 180, 181, 182, + 183, 0, 0, 184 }; -#define yypact_value_is_default(yystate) \ - ((yystate) == (-401)) +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-408))) -#define yytable_value_is_error(yytable_value) \ - ((yytable_value) == (-237)) +#define yytable_value_is_error(Yytable_value) \ + (!!((Yytable_value) == (-236))) static const yytype_int16 yycheck[] = { - 10, 11, 12, 15, 15, 300, 9, 118, 129, 42, - 9, 12, 11, 16, 80, 0, 397, 50, 11, 419, - 300, 9, 302, 303, 11, 15, 16, 17, 9, 20, - 8, 41, 20, 144, 44, 26, 102, 19, 20, 21, - 22, 23, 45, 25, 26, 20, 21, 22, 23, 23, - 25, 26, 103, 56, 28, 76, 77, 78, 103, 70, - 42, 43, 443, 9, 103, 11, 48, 42, 43, 46, - 47, 471, 9, 12, 11, 76, 77, 78, 15, 16, - 17, 18, 19, 93, 12, 118, 103, 24, 20, 99, - 370, 80, 103, 103, 104, 20, 103, 17, 18, 77, - 9, 9, 223, 136, 103, 12, 99, 296, 90, 298, - 12, 144, 32, 103, 124, 12, 36, 9, 121, 11, - 400, 41, 23, 103, 44, 128, 129, 47, 65, 49, - 12, 51, 52, 53, 54, 55, 12, 76, 77, 78, - 9, 12, 11, 146, 76, 77, 78, 129, 76, 77, - 78, 76, 77, 78, 129, 103, 103, 160, 161, 162, - 455, 164, 165, 166, 48, 9, 103, 11, 103, 76, - 77, 78, 103, 453, 76, 77, 78, 20, 20, 76, - 77, 78, 194, 186, 187, 188, 189, 190, 191, 192, - 193, 224, 103, 103, 76, 77, 78, 103, 102, 209, - 76, 77, 78, 185, 315, 76, 77, 78, 26, 212, - 213, 214, 215, 216, 217, 76, 77, 78, 10, 340, - 223, 199, 200, 201, 202, 203, 204, 102, 206, 207, - 9, 234, 11, 76, 77, 78, 76, 77, 78, 72, - 243, 102, 11, 163, 103, 23, 23, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 102, 72, 102, 268, 269, 10, 20, 42, - 43, 44, 45, 26, 277, 20, 49, 78, 51, 289, - 11, 103, 315, 20, 395, 18, 20, 23, 270, 76, - 77, 78, 295, 296, 297, 298, 399, 300, 401, 302, - 303, 404, 405, 76, 77, 78, 18, 18, 18, 76, - 77, 78, 415, 416, 18, 102, 15, 299, 21, 102, - 423, 10, 325, 301, 76, 77, 78, 10, 26, 102, - 10, 76, 77, 78, 437, 102, 63, 340, 441, 76, - 77, 78, 76, 77, 78, 95, 96, 97, 98, 54, - 10, 101, 23, 10, 102, 102, 61, 62, 63, 64, - 102, 102, 395, 90, 103, 468, 469, 370, 95, 96, - 97, 98, 350, 102, 101, 353, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 20, 102, 9, 102, - 95, 96, 97, 98, 15, 103, 101, 400, 10, 402, - 102, 413, 23, 61, 62, 63, 64, 28, 9, 329, - 42, 43, 44, 45, 20, 427, 102, 49, 9, 51, - 74, 20, 432, 20, 436, 76, 77, 78, 86, 87, - 88, 89, 90, 102, 20, 102, 446, 95, 96, 97, - 98, 451, 103, 101, 76, 77, 78, 22, 0, 1, - 453, 102, 102, 73, 466, 102, 12, 9, 99, 11, - 470, 13, 14, 15, 16, 17, 18, 19, 20, 402, - 196, 23, 24, 25, 26, 27, 455, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 76, 77, 78, 49, 50, 51, - 52, 53, 35, 55, 56, 57, 58, 59, 60, 421, - 76, 77, 78, 65, 66, 67, 68, 69, 70, 71, - 102, 83, 434, 435, 9, 352, 393, 79, 48, 412, - 15, 48, 444, 18, -1, -1, 102, -1, 23, 91, - 92, 93, 454, 28, 0, 1, -1, 99, 100, -1, - -1, 103, 104, 9, -1, 11, -1, 13, 14, 15, - 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, - 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, - 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, - 66, 67, 68, 69, 70, 71, 96, 97, 98, 90, - -1, 101, -1, 79, 95, 96, 97, 98, -1, -1, - 101, -1, -1, -1, -1, 91, 92, 93, -1, -1, - -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, - 10, 11, -1, 13, 14, 15, 16, 17, 18, 19, - 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, - 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, - 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, - 70, 71, 3, 4, 5, 6, 7, 8, -1, 79, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, - 100, -1, -1, 103, 104, 9, 10, 11, -1, 13, - 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, - 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, - -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, - -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, - -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, - -1, -1, -1, 1, -1, 99, 100, -1, -1, 103, - 104, 9, 10, 11, -1, 13, 14, 15, 16, 17, + 10, 11, 12, 15, 128, 0, 9, 117, 299, 42, + 12, 418, 299, 16, 301, 302, 15, 50, 11, 396, + 9, 12, 11, 20, 9, 12, 76, 77, 78, 9, + 8, 41, 80, 143, 44, 20, 103, 19, 20, 21, + 22, 23, 45, 25, 26, 20, 21, 22, 23, 103, + 25, 26, 102, 56, 102, 15, 16, 17, 20, 11, + 42, 43, 103, 470, 26, 442, 48, 42, 43, 46, + 47, 70, 12, 23, 76, 77, 78, 103, 28, 76, + 77, 78, 369, 93, 117, 76, 77, 78, 98, 76, + 77, 78, 102, 103, 20, 103, 17, 18, 222, 77, + 23, 80, 135, 12, 103, 98, 12, 9, 90, 12, + 143, 32, 399, 123, 103, 36, 9, 120, 11, 9, + 41, 20, 103, 44, 127, 128, 47, 12, 49, 103, + 51, 52, 53, 54, 55, 12, 76, 77, 78, 20, + 103, 48, 145, 103, 103, 9, 128, 11, 103, 20, + 76, 77, 78, 128, 103, 20, 159, 160, 161, 103, + 163, 164, 165, 454, 9, 452, 11, 76, 77, 78, + 76, 77, 78, 76, 77, 78, 20, 76, 77, 78, + 20, 193, 185, 186, 187, 188, 189, 190, 191, 192, + 223, 76, 77, 78, 102, 76, 77, 78, 208, 76, + 77, 78, 184, 103, 314, 76, 77, 78, 211, 212, + 213, 214, 215, 216, 26, 339, 76, 77, 78, 222, + 198, 199, 200, 201, 202, 203, 102, 205, 206, 9, + 233, 11, 76, 77, 78, 10, 76, 77, 78, 242, + 72, 162, 102, 11, 23, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 9, 9, 11, 11, 267, 268, 9, 15, 16, 17, + 18, 19, 15, 276, 103, 18, 24, 295, 288, 297, + 23, 314, 23, 72, 394, 28, 102, 269, 76, 77, + 78, 294, 295, 296, 297, 398, 299, 400, 301, 302, + 403, 404, 76, 77, 78, 10, 61, 62, 63, 64, + 26, 414, 415, 11, 102, 420, 298, 65, 78, 422, + 103, 324, 300, 42, 43, 44, 45, 18, 433, 434, + 49, 18, 51, 436, 89, 90, 339, 440, 443, 18, + 95, 96, 97, 98, 18, 18, 101, 23, 453, 21, + 61, 62, 63, 64, 15, 103, 102, 76, 77, 78, + 26, 394, 10, 10, 467, 468, 369, 76, 77, 78, + 10, 349, 10, 10, 352, 86, 87, 88, 89, 90, + 76, 77, 78, 102, 95, 96, 97, 98, 23, 102, + 101, 103, 102, 102, 102, 54, 399, 20, 401, 102, + 412, 102, 61, 62, 63, 64, 102, 328, 102, 42, + 43, 44, 45, 102, 426, 103, 49, 10, 51, 102, + 20, 431, 9, 435, 102, 84, 85, 86, 87, 88, + 89, 90, 9, 74, 20, 445, 95, 96, 97, 98, + 450, 20, 101, 76, 77, 78, 102, 0, 1, 452, + 96, 97, 98, 465, 20, 101, 9, 102, 11, 469, + 13, 14, 15, 16, 17, 18, 19, 20, 22, 103, + 23, 24, 25, 26, 27, 73, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 102, 102, 63, 49, 50, 51, 52, + 53, 12, 55, 56, 57, 58, 59, 60, 98, 76, + 77, 78, 65, 66, 67, 68, 69, 70, 71, 76, + 77, 78, 90, 401, 454, 195, 79, 95, 96, 97, + 98, 35, 83, 101, 351, 102, 392, 411, 91, 92, + 93, 48, 0, 1, -1, 102, 99, 100, 48, -1, + 103, 9, -1, 11, -1, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, + -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, + -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, + 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, + 68, 69, 70, 71, -1, -1, -1, 9, -1, 90, + -1, 79, -1, 15, 95, 96, 97, 98, -1, -1, + 101, 23, -1, 91, 92, 93, 28, -1, 1, -1, + -1, 99, 100, -1, -1, 103, 9, 10, 11, -1, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, -1, -1, -1, 49, 50, 51, 52, + 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, + -1, -1, 65, 66, 67, 68, 69, 70, 71, 95, + 96, 97, 98, -1, -1, 101, 79, 3, 4, 5, + 6, 7, 8, -1, -1, -1, -1, -1, 91, 92, + 93, -1, -1, 1, -1, -1, 99, 100, -1, -1, + 103, 9, 10, 11, -1, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, + -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, + -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, + 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, + 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, + -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 91, 92, 93, -1, -1, 1, -1, + -1, 99, 100, -1, -1, 103, 9, 10, 11, -1, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, -1, -1, -1, 49, 50, 51, 52, + 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, + -1, -1, 65, 66, 67, 68, 69, 70, 71, -1, + -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, + 93, -1, -1, 1, -1, -1, 99, 100, -1, -1, + 103, 9, 10, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, @@ -845,8 +857,17 @@ static const yytype_int16 yycheck[] = 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, 92, 93, -1, -1, -1, 1, - -1, 99, 100, -1, -1, 103, 104, 9, 10, 11, + -1, -1, -1, 91, 92, 93, 1, -1, -1, -1, + -1, 99, 100, -1, 9, 103, 11, -1, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, + 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, -1, -1, -1, 49, 50, 51, 52, 53, -1, + 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, + 65, 66, 67, 68, 69, 70, 71, -1, -1, 74, + -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 91, 92, 93, 1, + -1, -1, -1, -1, 99, 100, -1, 9, 103, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, @@ -855,98 +876,60 @@ static const yytype_int16 yycheck[] = -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, - 92, 93, -1, -1, -1, 1, -1, 99, 100, -1, - -1, 103, 104, 9, -1, 11, -1, 13, 14, 15, + 92, 93, 1, -1, -1, -1, -1, 99, 100, -1, + 9, 103, 11, -1, 13, 14, 15, 16, 17, 18, + 19, 20, -1, -1, 23, 24, 25, 26, 27, -1, + 29, 30, 31, 32, 33, 34, 35, -1, 37, 38, + 39, 40, 41, 42, 43, 44, 45, -1, -1, -1, + 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, + 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, + 69, 70, 71, -1, -1, -1, -1, -1, -1, -1, + 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, 92, 93, 1, -1, -1, -1, -1, + 99, 100, -1, -1, 103, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, - 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, + 26, 27, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, + 61, 62, 63, 64, -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, - 66, 67, 68, 69, 70, 71, -1, -1, 74, -1, - -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, - -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, - -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, - 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, - 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, - 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, - 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, - 100, -1, -1, 103, 104, 9, -1, 11, -1, 13, - 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, - 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, - 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, - 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, - -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, - -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, - -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, - -1, 1, -1, -1, -1, 99, 100, -1, -1, 103, - 104, 11, -1, 13, 14, 15, 16, 17, 18, 19, - 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, - 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, - -1, -1, 54, -1, -1, -1, -1, -1, -1, 61, - 62, 63, 64, 53, -1, 55, 56, 57, 58, 59, - 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, - 70, 71, 84, 85, 86, 87, 88, 89, 90, 79, - -1, -1, -1, 95, 96, 97, 98, -1, -1, 101, - -1, 91, 92, 93, 1, -1, -1, -1, -1, 99, - 100, 63, 64, 103, 11, -1, 13, 14, 15, 16, + 66, 67, 68, 69, 70, 71, 87, 88, 89, 90, + -1, -1, -1, 79, 95, 96, 97, 98, -1, -1, + 101, -1, -1, -1, -1, 91, 92, 93, 1, -1, + -1, -1, -1, 99, 100, 63, 64, 103, 11, -1, + 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, + 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, + 33, 34, 90, -1, -1, -1, 39, 95, 96, 97, + 98, -1, -1, 101, -1, -1, -1, -1, -1, -1, + 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, + 0, -1, 65, 66, 67, 68, 69, 70, 71, 9, + -1, 11, 12, -1, -1, -1, 79, -1, -1, -1, + 20, -1, -1, -1, -1, -1, -1, -1, 91, 92, + 93, 61, 62, 63, 64, -1, 99, 100, -1, 102, + 103, -1, 42, 43, 44, 45, -1, -1, -1, 49, + -1, 51, -1, -1, 54, -1, -1, -1, 88, 89, + 90, 61, 62, 63, 64, 95, 96, 97, 98, -1, + -1, 101, -1, -1, -1, -1, 76, 77, 78, 0, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 12, -1, -1, -1, 95, 96, 97, 98, 20, + -1, 101, 102, -1, -1, -1, -1, -1, -1, -1, + 61, 62, 63, 64, -1, -1, -1, -1, -1, -1, + -1, 42, 43, 44, 45, -1, -1, -1, 49, -1, + 51, -1, -1, 54, -1, -1, -1, -1, 89, 90, + 61, 62, 63, 64, 95, 96, 97, 98, -1, -1, + 101, -1, -1, -1, -1, 76, 77, 78, -1, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, 95, 96, 97, 98, -1, -1, + 101, 102, 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, 25, 26, - 27, -1, 29, 30, 31, 32, 33, 34, 90, -1, - -1, -1, 39, 95, 96, 97, 98, -1, -1, 101, - -1, -1, -1, -1, -1, -1, 53, -1, 55, 56, - 57, 58, 59, 60, -1, -1, 0, -1, 65, 66, - 67, 68, 69, 70, 71, 9, -1, 11, 12, -1, - -1, -1, 79, -1, -1, -1, 20, -1, -1, -1, - -1, -1, -1, -1, 91, 92, 93, 61, 62, 63, - 64, -1, 99, 100, -1, 102, 103, -1, 42, 43, - 44, 45, -1, -1, -1, 49, -1, 51, -1, -1, - 54, -1, -1, 87, 88, 89, 90, 61, 62, 63, - 64, 95, 96, 97, 98, -1, -1, 101, -1, -1, - -1, -1, 76, 77, 78, 0, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 12, -1, -1, - -1, 95, 96, 97, 98, 20, -1, 101, 102, -1, - -1, -1, -1, -1, -1, -1, 61, 62, 63, 64, - -1, -1, -1, -1, -1, -1, -1, 42, 43, 44, - 45, -1, -1, -1, 49, -1, 51, -1, -1, 54, - -1, -1, -1, 88, 89, 90, 61, 62, 63, 64, - 95, 96, 97, 98, -1, -1, 101, -1, -1, -1, - -1, 76, 77, 78, -1, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - 95, 96, 97, 98, -1, -1, 101, 102, 9, -1, - 11, -1, 13, 14, 15, 16, 17, 18, 19, -1, - -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, - -1, -1, -1, -1, -1, 61, 62, 63, 64, -1, - -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, - -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, - 71, -1, -1, 89, 90, -1, -1, -1, 79, 95, - 96, 97, 98, -1, -1, 101, -1, -1, -1, -1, - 91, 92, 93, -1, -1, -1, -1, -1, 99, 100, - -1, 9, 103, 11, -1, 13, 14, 15, 16, 17, - 18, 19, -1, -1, -1, 23, 24, 25, 26, 27, - -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, - -1, 39, -1, -1, -1, -1, -1, -1, 61, 62, - 63, 64, -1, -1, -1, 53, -1, 55, 56, 57, - 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, - 68, 69, 70, 71, -1, -1, 89, 90, -1, -1, - -1, 79, 95, 96, 97, 98, -1, -1, 101, -1, - -1, -1, -1, 91, 92, 93, -1, -1, -1, -1, - -1, 99, 100, -1, -1, 103, 11, 12, 13, 14, - 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, - 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, - -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, - -1, 61, -1, 63, 64, -1, -1, -1, 53, -1, - 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, - 65, 66, 67, 68, 69, 70, 71, -1, -1, 89, - 90, -1, -1, -1, 79, 95, 96, 97, 98, -1, - -1, 101, -1, -1, -1, -1, 91, 92, 93, -1, - -1, -1, -1, -1, 99, 100, -1, 11, 103, 13, - 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, + 27, 28, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, 39, -1, -1, -1, -1, -1, -1, 61, + -1, 63, 64, -1, -1, -1, 53, -1, 55, 56, + 57, 58, 59, 60, -1, -1, -1, -1, 65, 66, + 67, 68, 69, 70, 71, -1, -1, 89, 90, -1, + -1, -1, 79, 95, 96, 97, 98, -1, -1, 101, + -1, -1, -1, -1, 91, 92, 93, -1, -1, -1, + -1, -1, 99, 100, -1, 9, 103, 11, -1, 13, + 14, 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, 53, @@ -954,7 +937,44 @@ static const yytype_int16 yycheck[] = -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, 89, 90, -1, -1, -1, 79, 95, 96, 97, 98, -1, -1, 101, -1, -1, -1, -1, 91, 92, 93, - -1, -1, -1, -1, -1, 99, 100, -1, 11, 103, + -1, -1, -1, -1, -1, 99, 100, -1, -1, 103, + 11, 12, 13, 14, 15, 16, 17, 18, 19, -1, + -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, + -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, + 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91, 92, 93, -1, -1, -1, -1, -1, 99, 100, + -1, 11, 103, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, + 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, + 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 91, 92, 93, -1, -1, -1, -1, -1, 99, + 100, -1, 11, 103, 13, 14, 15, 16, 17, 18, + 19, -1, -1, -1, 23, 24, 25, 26, 27, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 53, -1, 55, 56, 57, 58, + 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, + 69, 70, 71, -1, -1, -1, -1, -1, -1, -1, + 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, 92, 93, -1, -1, -1, -1, -1, + 99, 100, -1, 102, 103, 11, -1, 13, 14, 15, + 16, 17, 18, 19, -1, -1, -1, 23, 24, 25, + 26, 27, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 53, -1, 55, + 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, + 66, 67, 68, 69, 70, 71, -1, -1, -1, -1, + -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, + -1, -1, -1, 99, 100, -1, 102, 103, 11, -1, 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, -1, @@ -998,127 +1018,113 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, - 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 71, -1, -1, -1, -1, -1, 54, -1, 79, -1, + -1, -1, -1, 61, 62, 63, 64, -1, -1, -1, 91, 92, 93, -1, -1, -1, -1, -1, 99, 100, - -1, 102, 103, 11, -1, 13, 14, 15, 16, 17, - 18, 19, -1, -1, -1, 23, 24, 25, 26, 27, - -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, - -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 53, -1, 55, 56, 57, - 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, - 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, - -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, 92, 93, -1, -1, -1, -1, - -1, 99, 100, -1, 102, 103, 11, -1, 13, 14, - 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, - 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, - -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, - 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, - 65, 66, 67, 68, 69, 70, 71, -1, -1, 54, - -1, -1, -1, -1, 79, -1, 61, 62, 63, 64, - -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, - -1, -1, -1, -1, 99, 100, 81, 82, 103, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - 95, 96, 97, 98, 54, -1, 101, -1, -1, -1, - -1, 61, 62, 63, 64, -1, -1, -1, -1, -1, + -1, -1, 103, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, -1, -1, -1, -1, 95, 96, 97, + 98, 54, -1, 101, -1, -1, -1, -1, 61, 62, + 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 81, 82, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, 95, 96, 97, 98, 54, -1, 101, -1, + -1, -1, -1, 61, 62, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 82, -1, 84, 85, 86, 87, 88, 89, - 90, -1, -1, -1, -1, 95, 96, 97, 98, -1, - -1, 101 + -1, -1, -1, -1, 82, -1, 84, 85, 86, 87, + 88, 89, 90, -1, -1, -1, -1, 95, 96, 97, + 98, -1, -1, 101 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 3, 4, 5, 6, 7, 8, 106, 107, 108, - 109, 110, 111, 112, 0, 115, 11, 13, 14, 15, + 0, 3, 4, 5, 6, 7, 8, 105, 106, 107, + 108, 109, 110, 111, 0, 114, 11, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 39, 53, 55, 56, 57, 58, 59, 60, 65, 66, 67, 68, 69, 70, 71, - 79, 91, 92, 93, 99, 100, 103, 150, 151, 152, - 155, 156, 157, 158, 159, 160, 162, 165, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 9, 113, 1, + 79, 91, 92, 93, 99, 100, 103, 149, 150, 151, + 154, 155, 156, 157, 158, 159, 161, 164, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 9, 112, 1, 20, 35, 37, 38, 40, 41, 42, 43, 44, 45, - 49, 50, 51, 52, 104, 113, 122, 128, 150, 36, - 120, 121, 122, 118, 118, 12, 150, 160, 160, 23, - 28, 113, 168, 176, 176, 176, 176, 176, 176, 176, - 161, 11, 103, 160, 140, 140, 160, 103, 103, 103, - 113, 160, 23, 151, 164, 168, 176, 176, 113, 160, - 20, 150, 23, 28, 142, 160, 103, 163, 168, 169, - 170, 160, 151, 160, 160, 160, 160, 160, 102, 150, - 76, 77, 78, 80, 9, 11, 103, 54, 61, 62, - 63, 64, 81, 82, 84, 85, 86, 87, 88, 89, - 90, 95, 96, 97, 98, 101, 103, 9, 11, 9, - 11, 9, 11, 9, 115, 141, 142, 23, 139, 103, - 103, 103, 103, 70, 103, 168, 103, 103, 113, 48, - 130, 20, 42, 43, 44, 45, 49, 51, 121, 122, - 120, 12, 164, 103, 103, 150, 102, 113, 26, 143, - 102, 102, 150, 165, 176, 151, 10, 20, 164, 102, - 150, 72, 145, 11, 102, 150, 150, 150, 160, 150, - 150, 102, 150, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 9, 11, - 15, 16, 17, 18, 19, 24, 65, 103, 154, 168, - 102, 150, 150, 150, 150, 150, 150, 150, 150, 118, - 23, 138, 139, 23, 124, 115, 115, 115, 115, 115, - 115, 103, 115, 115, 113, 150, 134, 150, 150, 150, - 150, 150, 165, 151, 12, 153, 72, 144, 102, 102, - 150, 10, 102, 26, 150, 11, 20, 12, 102, 83, - 150, 150, 18, 18, 18, 18, 18, 18, 102, 150, - 103, 102, 20, 12, 20, 12, 20, 12, 20, 10, - 21, 114, 123, 9, 20, 23, 133, 150, 134, 135, - 150, 134, 137, 166, 168, 128, 132, 135, 136, 150, - 115, 135, 135, 102, 102, 164, 26, 115, 148, 102, - 12, 150, 10, 160, 20, 12, 102, 165, 10, 10, - 10, 10, 115, 143, 115, 23, 102, 102, 102, 102, - 103, 102, 20, 135, 102, 102, 103, 146, 12, 10, - 102, 20, 144, 125, 164, 131, 131, 9, 116, 116, - 135, 116, 133, 102, 116, 116, 147, 9, 74, 20, - 148, 149, 118, 20, 116, 116, 117, 46, 47, 129, - 129, 102, 130, 20, 116, 102, 118, 119, 10, 130, - 130, 118, 116, 103, 116, 131, 130, 10, 20, 26, - 126, 10, 135, 130, 136, 22, 73, 127, 102, 102, - 118, 116, 116, 74, 129 + 49, 50, 51, 52, 112, 121, 127, 149, 36, 119, + 120, 121, 117, 117, 12, 149, 159, 159, 23, 28, + 112, 167, 175, 175, 175, 175, 175, 175, 175, 160, + 11, 103, 159, 139, 139, 159, 103, 103, 103, 112, + 159, 23, 150, 163, 167, 175, 175, 112, 159, 20, + 149, 23, 28, 141, 159, 103, 162, 167, 168, 169, + 159, 150, 159, 159, 159, 159, 159, 102, 149, 76, + 77, 78, 80, 9, 11, 103, 54, 61, 62, 63, + 64, 81, 82, 84, 85, 86, 87, 88, 89, 90, + 95, 96, 97, 98, 101, 103, 9, 11, 9, 11, + 9, 11, 9, 114, 140, 141, 23, 138, 103, 103, + 103, 103, 70, 103, 167, 103, 103, 112, 48, 129, + 20, 42, 43, 44, 45, 49, 51, 120, 121, 119, + 12, 163, 103, 103, 149, 102, 112, 26, 142, 102, + 102, 149, 164, 175, 150, 10, 20, 163, 102, 149, + 72, 144, 11, 102, 149, 149, 149, 159, 149, 149, + 102, 149, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 9, 11, 15, + 16, 17, 18, 19, 24, 65, 103, 153, 167, 102, + 149, 149, 149, 149, 149, 149, 149, 149, 117, 23, + 137, 138, 23, 123, 114, 114, 114, 114, 114, 114, + 103, 114, 114, 112, 149, 133, 149, 149, 149, 149, + 149, 164, 150, 12, 152, 72, 143, 102, 102, 149, + 10, 102, 26, 149, 11, 20, 12, 102, 83, 149, + 149, 18, 18, 18, 18, 18, 18, 102, 149, 103, + 102, 20, 12, 20, 12, 20, 12, 20, 10, 21, + 113, 122, 9, 20, 23, 132, 149, 133, 134, 149, + 133, 136, 165, 167, 127, 131, 134, 135, 149, 114, + 134, 134, 102, 102, 163, 26, 114, 147, 102, 12, + 149, 10, 159, 20, 12, 102, 164, 10, 10, 10, + 10, 114, 142, 114, 23, 102, 102, 102, 102, 103, + 102, 20, 134, 102, 102, 103, 145, 12, 10, 102, + 20, 143, 124, 163, 130, 130, 9, 115, 115, 134, + 115, 132, 102, 115, 115, 146, 9, 74, 20, 147, + 148, 117, 20, 115, 115, 116, 46, 47, 128, 128, + 102, 129, 20, 115, 102, 117, 118, 10, 129, 129, + 117, 115, 103, 115, 130, 129, 10, 20, 26, 125, + 10, 134, 129, 135, 22, 73, 126, 102, 102, 117, + 115, 115, 74, 128 }; typedef enum { - toketype_i_tkval, toketype_ival, toketype_opval, toketype_p_tkval + toketype_ival, toketype_opval, toketype_pval } toketypes; /* type of each token/terminal */ static const toketypes yy_type_tab[] = { toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_p_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, - toketype_i_tkval, toketype_i_tkval, toketype_i_tkval, toketype_ival, toketype_ival, toketype_ival, + toketype_opval, toketype_pval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_i_tkval, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_ival, - toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval + toketype_opval, toketype_opval, toketype_opval, toketype_opval }; /* Generated from: - * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y - * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl + * 7e6c275bbd1dbc800c205a8a8b0cd785e4859f94976ee7372149598471f16f81 perly.y + * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl * ex: set ro: */ @@ -20,20 +20,6 @@ * to run regen_perly.pl, which re-creates the files perly.h, perly.tab * and perly.act which are derived from this. * - * Note that these derived files are included and compiled twice; once - * from perly.c, and once from madly.c. The second time, a number of MAD - * macros are defined, which compile in extra code that allows the parse - * tree to be accurately dumped. In particular: - * - * MAD defined if compiling madly.c - * DO_MAD(A) expands to A under madly.c, to null otherwise - * IF_MAD(a,b) expands to A under madly.c, to B otherwise - * TOKEN_GETMAD() expands to token_getmad() under madly.c, to null otherwise - * TOKEN_FREE() similarly - * OP_GETMAD() similarly - * IVAL(i) expands to (i)->tk_lval.ival or (i) - * PVAL(p) expands to (p)->tk_lval.pval or (p) - * * The main job of of this grammar is to call the various newFOO() * functions in op.c to build a syntax tree of OP structs. * It relies on the lexer in toke.c to do the tokenizing. @@ -47,8 +33,6 @@ %pure_parser -/* FIXME for MAD - is the new mintro on while and until important? */ - %start grammar %union { @@ -57,39 +41,29 @@ char *pval; OP *opval; GV *gvval; -#ifdef PERL_IN_MADLY_C - TOKEN* p_tkval; - TOKEN* i_tkval; -#else - char *p_tkval; - I32 i_tkval; -#endif -#ifdef PERL_MAD - TOKEN* tkval; -#endif } %token <ival> GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ -%token <i_tkval> '{' '}' '[' ']' '-' '+' '$' '@' '%' '*' '&' ';' '=' '.' +%token <ival> '{' '}' '[' ']' '-' '+' '$' '@' '%' '*' '&' ';' '=' '.' %token <opval> WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST %token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB %token <opval> PLUGEXPR PLUGSTMT -%token <p_tkval> LABEL -%token <i_tkval> FORMAT SUB ANONSUB PACKAGE USE -%token <i_tkval> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR -%token <i_tkval> GIVEN WHEN DEFAULT -%token <i_tkval> LOOPEX DOTDOT YADAYADA -%token <i_tkval> FUNC0 FUNC1 FUNC UNIOP LSTOP -%token <i_tkval> RELOP EQOP MULOP ADDOP -%token <i_tkval> DOLSHARP DO HASHBRACK NOAMP -%token <i_tkval> LOCAL MY REQUIRE -%token <i_tkval> COLONATTR FORMLBRACK FORMRBRACK +%token <pval> LABEL +%token <ival> FORMAT SUB ANONSUB PACKAGE USE +%token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR +%token <ival> GIVEN WHEN DEFAULT +%token <ival> LOOPEX DOTDOT YADAYADA +%token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP +%token <ival> RELOP EQOP MULOP ADDOP +%token <ival> DOLSHARP DO HASHBRACK NOAMP +%token <ival> LOCAL MY REQUIRE +%token <ival> COLONATTR FORMLBRACK FORMRBRACK %type <ival> grammar remember mremember %type <ival> startsub startanonsub startformsub -/* FIXME for MAD - are these two ival? */ + %type <ival> mintro %type <opval> stmtseq fullstmt labfullstmt barestmt block mblock else @@ -102,39 +76,37 @@ %type <opval> realsubbody subsignature termbinop termunop anonymous termdo %type <opval> formstmtseq formline formarg -%nonassoc <i_tkval> PREC_LOW +%nonassoc <ival> PREC_LOW %nonassoc LOOPEX -%left <i_tkval> OROP DOROP -%left <i_tkval> ANDOP -%right <i_tkval> NOTOP +%left <ival> OROP DOROP +%left <ival> ANDOP +%right <ival> NOTOP %nonassoc LSTOP LSTOPSUB -%left <i_tkval> ',' -%right <i_tkval> ASSIGNOP -%right <i_tkval> '?' ':' +%left <ival> ',' +%right <ival> ASSIGNOP +%right <ival> '?' ':' %nonassoc DOTDOT YADAYADA -%left <i_tkval> OROR DORDOR -%left <i_tkval> ANDAND -%left <i_tkval> BITOROP -%left <i_tkval> BITANDOP +%left <ival> OROR DORDOR +%left <ival> ANDAND +%left <ival> BITOROP +%left <ival> BITANDOP %nonassoc EQOP %nonassoc RELOP %nonassoc UNIOP UNIOPSUB %nonassoc REQUIRE -%left <i_tkval> SHIFTOP +%left <ival> SHIFTOP %left ADDOP %left MULOP -%left <i_tkval> MATCHOP -%right <i_tkval> '!' '~' UMINUS REFGEN -%right <i_tkval> POWOP -%nonassoc <i_tkval> PREINC PREDEC POSTINC POSTDEC POSTJOIN -%left <i_tkval> ARROW -%nonassoc <i_tkval> ')' -%left <i_tkval> '(' +%left <ival> MATCHOP +%right <ival> '!' '~' UMINUS REFGEN +%right <ival> POWOP +%nonassoc <ival> PREINC PREDEC POSTINC POSTDEC POSTJOIN +%left <ival> ARROW +%nonassoc <ival> ')' +%left <ival> '(' %left '[' '{' -%token <i_tkval> PEG - %% /* RULES */ /* Top-level choice of what kind of thing yyparse was called to parse */ @@ -205,21 +177,17 @@ grammar : GRAMPROG /* An ordinary block */ block : '{' remember stmtseq '}' - { if (PL_parser->copline > (line_t)IVAL($1)) - PL_parser->copline = (line_t)IVAL($1); + { if (PL_parser->copline > (line_t)$1) + PL_parser->copline = (line_t)$1; $$ = block_end($2, $3); - TOKEN_GETMAD($1,$$,'{'); - TOKEN_GETMAD($4,$$,'}'); } ; /* format body */ formblock: '=' remember ';' FORMRBRACK formstmtseq ';' '.' - { if (PL_parser->copline > (line_t)IVAL($1)) - PL_parser->copline = (line_t)IVAL($1); + { if (PL_parser->copline > (line_t)$1) + PL_parser->copline = (line_t)$1; $$ = block_end($2, $5); - TOKEN_GETMAD($1,$$,'{'); - TOKEN_GETMAD($7,$$,'}'); } ; @@ -228,11 +196,9 @@ remember: /* NULL */ /* start a full lexical scope */ ; mblock : '{' mremember stmtseq '}' - { if (PL_parser->copline > (line_t)IVAL($1)) - PL_parser->copline = (line_t)IVAL($1); + { if (PL_parser->copline > (line_t)$1) + PL_parser->copline = (line_t)$1; $$ = block_end($2, $3); - TOKEN_GETMAD($1,$$,'{'); - TOKEN_GETMAD($4,$$,'}'); } ; @@ -265,11 +231,7 @@ formstmtseq: /* NULL */ /* A statement in the program, including optional labels */ fullstmt: barestmt { - if($1) { - $$ = newSTATEOP(0, NULL, $1); - } else { - $$ = IF_MAD(newOP(OP_NULL, 0), NULL); - } + $$ = $1 ? newSTATEOP(0, NULL, $1) : NULL; } | labfullstmt { $$ = $1; } @@ -277,41 +239,22 @@ fullstmt: barestmt labfullstmt: LABEL barestmt { - $$ = newSTATEOP(SVf_UTF8 - * PVAL($1)[strlen(PVAL($1))+1], - PVAL($1), $2); - TOKEN_GETMAD($1, - $2 ? cLISTOPx($$)->op_first : $$, 'L'); + $$ = newSTATEOP(SVf_UTF8 * $1[strlen($1)+1], $1, $2); } | LABEL labfullstmt { - $$ = newSTATEOP(SVf_UTF8 - * PVAL($1)[strlen(PVAL($1))+1], - PVAL($1), $2); - TOKEN_GETMAD($1, cLISTOPx($$)->op_first, 'L'); + $$ = newSTATEOP(SVf_UTF8 * $1[strlen($1)+1], $1, $2); } ; /* A bare statement, lacking label and other aspects of state op */ barestmt: PLUGSTMT { $$ = $1; } - | PEG - { - $$ = newOP(OP_NULL,0); - TOKEN_GETMAD($1,$$,'p'); - } | FORMAT startformsub formname formblock { CV *fmtcv = PL_compcv; -#ifdef MAD - $$ = newFORM($2, $3, $4); - prepend_madprops($1->tk_mad, $$, 'F'); - $1->tk_mad = 0; - token_free($1); -#else newFORM($2, $3, $4); $$ = (OP*)NULL; -#endif if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) { SvREFCNT_inc_simple_void(fmtcv); pad_add_anon(fmtcv, OP_NULL); @@ -342,80 +285,39 @@ barestmt: PLUGSTMT proto subattrlist optsubbody { SvREFCNT_inc_simple_void(PL_compcv); -#ifdef MAD - { - OP* o = newSVOP(OP_ANONCODE, 0, - (SV*)( -#endif $2->op_type == OP_CONST ? newATTRSUB($3, $2, $5, $6, $7) : newMYSUB($3, $2, $5, $6, $7) -#ifdef MAD - )); - $$ = newOP(OP_NULL,0); - op_getmad(o,$$,'&'); - op_getmad($2,$$,'n'); - op_getmad($5,$$,'s'); - op_getmad($6,$$,'a'); - token_getmad($1,$$,'d'); - append_madprops($7->op_madprop, $$, 0); - $7->op_madprop = 0; - } -#else ; $$ = (OP*)NULL; -#endif intro_my(); } | PACKAGE WORD WORD ';' { -#ifdef MAD - $$ = package($3); - token_getmad($1,$$,'o'); - if ($2) - package_version($2); - token_getmad($4,$$,';'); -#else package($3); if ($2) package_version($2); $$ = (OP*)NULL; -#endif } | USE startsub { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } WORD WORD optlistexpr ';' { SvREFCNT_inc_simple_void(PL_compcv); -#ifdef MAD - $$ = utilize(IVAL($1), $2, $4, $5, $6); - token_getmad($1,$$,'o'); - token_getmad($7,$$,';'); - if (PL_parser->rsfp_filters && - AvFILLp(PL_parser->rsfp_filters) >= 0) - append_madprops(newMADPROP('!', MAD_NULL, NULL, 0), $$, 0); -#else - utilize(IVAL($1), $2, $4, $5, $6); + utilize($1, $2, $4, $5, $6); $$ = (OP*)NULL; -#endif } | IF '(' remember mexpr ')' mblock else { $$ = block_end($3, newCONDOP(0, $4, op_scope($6), $7)); - TOKEN_GETMAD($1,$$,'I'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | UNLESS '(' remember miexpr ')' mblock else { $$ = block_end($3, newCONDOP(0, $4, op_scope($6), $7)); - TOKEN_GETMAD($1,$$,'I'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | GIVEN '(' remember mexpr ')' mblock { @@ -426,7 +328,7 @@ barestmt: PLUGSTMT || PAD_COMPNAME_FLAGS_isOUR(offset) ? 0 : offset)); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | WHEN '(' remember mexpr ')' mblock { $$ = block_end($3, newWHENOP($4, op_scope($6))); } @@ -437,25 +339,19 @@ barestmt: PLUGSTMT $$ = block_end($3, newWHILEOP(0, 1, (LOOP*)(OP*)NULL, $4, $7, $8, $6)); - TOKEN_GETMAD($1,$$,'W'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | UNTIL '(' remember iexpr ')' mintro mblock cont { $$ = block_end($3, newWHILEOP(0, 1, (LOOP*)(OP*)NULL, $4, $7, $8, $6)); - TOKEN_GETMAD($1,$$,'W'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | FOR '(' remember mnexpr ';' texpr ';' mintro mnexpr ')' mblock { - OP *initop = IF_MAD($4 ? $4 : newOP(OP_NULL, 0), $4); + OP *initop = $4; OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, scalar($6), $11, $9, $8); if (initop) { @@ -464,41 +360,25 @@ barestmt: PLUGSTMT newOP(OP_UNSTACK, OPf_SPECIAL), forop)); } - DO_MAD({ forop = newUNOP(OP_NULL, 0, forop); }) $$ = block_end($3, forop); - TOKEN_GETMAD($1,$$,'3'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,'1'); - TOKEN_GETMAD($7,$$,'2'); - TOKEN_GETMAD($10,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | FOR MY remember my_scalar '(' mexpr ')' mblock cont { $$ = block_end($3, newFOROP(0, $4, $6, $8, $9)); - TOKEN_GETMAD($1,$$,'W'); - TOKEN_GETMAD($2,$$,'d'); - TOKEN_GETMAD($5,$$,'('); - TOKEN_GETMAD($7,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | FOR scalar '(' remember mexpr ')' mblock cont { $$ = block_end($4, newFOROP(0, op_lvalue($2, OP_ENTERLOOP), $5, $7, $8)); - TOKEN_GETMAD($1,$$,'W'); - TOKEN_GETMAD($3,$$,'('); - TOKEN_GETMAD($6,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | FOR '(' remember mexpr ')' mblock cont { $$ = block_end($3, newFOROP(0, (OP*)NULL, $4, $6, $7)); - TOKEN_GETMAD($1,$$,'W'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,')'); - PL_parser->copline = (line_t)IVAL($1); + PL_parser->copline = (line_t)$1; } | block cont { @@ -518,22 +398,18 @@ barestmt: PLUGSTMT /* a block is a loop that happens once */ $$ = newWHILEOP(0, 1, (LOOP*)(OP*)NULL, (OP*)NULL, block_end($5, $7), (OP*)NULL, 0); - TOKEN_GETMAD($4,$$,'{'); - TOKEN_GETMAD($8,$$,'}'); - if (PL_parser->copline > (line_t)IVAL($4)) - PL_parser->copline = (line_t)IVAL($4); + if (PL_parser->copline > (line_t)$4) + PL_parser->copline = (line_t)$4; } | sideff ';' { PL_parser->expect = XSTATE; $$ = $1; - TOKEN_GETMAD($2,$$,';'); } | ';' { PL_parser->expect = XSTATE; - $$ = IF_MAD(newOP(OP_NULL, 0), (OP*)NULL); - TOKEN_GETMAD($1,$$,';'); + $$ = (OP*)NULL; PL_parser->copline = NOLINE; } ; @@ -543,16 +419,10 @@ formline: THING formarg { OP *list; if ($2) { OP *term = $2; - DO_MAD(term = newUNOP(OP_NULL, 0, term)); list = op_append_elem(OP_LIST, $1, term); } else { -#ifdef MAD - OP *op = newNULLLIST(); - list = op_append_elem(OP_LIST, $1, op); -#else list = $1; -#endif } if (PL_parser->copline == NOLINE) PL_parser->copline = CopLINE(PL_curcop)-1; @@ -574,26 +444,16 @@ sideff : error | expr { $$ = $1; } | expr IF expr - { $$ = newLOGOP(OP_AND, 0, $3, $1); - TOKEN_GETMAD($2,$$,'i'); - } + { $$ = newLOGOP(OP_AND, 0, $3, $1); } | expr UNLESS expr - { $$ = newLOGOP(OP_OR, 0, $3, $1); - TOKEN_GETMAD($2,$$,'i'); - } + { $$ = newLOGOP(OP_OR, 0, $3, $1); } | expr WHILE expr - { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1); - TOKEN_GETMAD($2,$$,'w'); - } + { $$ = newLOOPOP(OPf_PARENS, 1, scalar($3), $1); } | expr UNTIL iexpr - { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1); - TOKEN_GETMAD($2,$$,'w'); - } + { $$ = newLOOPOP(OPf_PARENS, 1, $3, $1); } | expr FOR expr { $$ = newFOROP(0, (OP*)NULL, $3, $1, (OP*)NULL); - TOKEN_GETMAD($2,$$,'w'); - PL_parser->copline = (line_t)IVAL($2); - } + PL_parser->copline = (line_t)$2; } | expr WHEN expr { $$ = newWHENOP($3, op_scope($1)); } ; @@ -605,17 +465,13 @@ else : /* NULL */ { ($2)->op_flags |= OPf_PARENS; $$ = op_scope($2); - TOKEN_GETMAD($1,$$,'o'); } | ELSIF '(' mexpr ')' mblock else - { PL_parser->copline = (line_t)IVAL($1); + { PL_parser->copline = (line_t)$1; $$ = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,$3), op_scope($5), $6); PL_hints |= HINT_BLOCK_SCOPE; - TOKEN_GETMAD($1,$$,'I'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($4,$$,')'); } ; @@ -623,10 +479,7 @@ else : /* NULL */ cont : /* NULL */ { $$ = (OP*)NULL; } | CONTINUE block - { - $$ = op_scope($2); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = op_scope($2); } ; /* determine whether there are any new my declarations */ @@ -702,30 +555,16 @@ proto : /* NULL */ subattrlist: /* NULL */ { $$ = (OP*)NULL; } | COLONATTR THING - { $$ = $2; - TOKEN_GETMAD($1,$$,':'); - } + { $$ = $2; } | COLONATTR - { $$ = IF_MAD( - newOP(OP_NULL, 0), - (OP*)NULL - ); - TOKEN_GETMAD($1,$$,':'); - } + { $$ = (OP*)NULL; } ; /* List of attributes for a "my" variable declaration */ myattrlist: COLONATTR THING - { $$ = $2; - TOKEN_GETMAD($1,$$,':'); - } + { $$ = $2; } | COLONATTR - { $$ = IF_MAD( - newOP(OP_NULL, 0), - (OP*)NULL - ); - TOKEN_GETMAD($1,$$,':'); - } + { $$ = (OP*)NULL; } ; /* Optional subroutine signature */ @@ -751,60 +590,36 @@ subsignature: /* NULL */ { $$ = (OP*)NULL; } /* Subroutine body - block with optional signature */ realsubbody: remember subsignature '{' stmtseq '}' { - if (PL_parser->copline > (line_t)IVAL($3)) - PL_parser->copline = (line_t)IVAL($3); + if (PL_parser->copline > (line_t)$3) + PL_parser->copline = (line_t)$3; $$ = block_end($1, op_append_list(OP_LINESEQ, $2, $4)); - TOKEN_GETMAD($3,$$,'{'); - TOKEN_GETMAD($5,$$,'}'); } ; /* Optional subroutine body, for named subroutine declaration */ optsubbody: realsubbody { $$ = $1; } - | ';' { $$ = IF_MAD( - newOP(OP_NULL,0), - (OP*)NULL - ); + | ';' { $$ = (OP*)NULL; PL_parser->expect = XSTATE; - TOKEN_GETMAD($1,$$,';'); } ; /* Ordinary expressions; logical combinations */ expr : expr ANDOP expr - { $$ = newLOGOP(OP_AND, 0, $1, $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newLOGOP(OP_AND, 0, $1, $3); } | expr OROP expr - { $$ = newLOGOP(IVAL($2), 0, $1, $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newLOGOP($2, 0, $1, $3); } | expr DOROP expr - { $$ = newLOGOP(OP_DOR, 0, $1, $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newLOGOP(OP_DOR, 0, $1, $3); } | listexpr %prec PREC_LOW ; /* Expressions are a list of terms joined by commas */ listexpr: listexpr ',' - { -#ifdef MAD - OP* op = newNULLLIST(); - token_getmad($2,op,','); - $$ = op_append_elem(OP_LIST, $1, op); -#else - $$ = $1; -#endif - } + { $$ = $1; } | listexpr ',' term { OP* term = $3; - DO_MAD( - term = newUNOP(OP_NULL, 0, term); - token_getmad($2,term,','); - ) $$ = op_append_elem(OP_LIST, $1, term); } | term %prec PREC_LOW @@ -812,31 +627,23 @@ listexpr: listexpr ',' /* List operators */ listop : LSTOP indirob listexpr /* map {...} @args or print $fh @args */ - { $$ = convert(IVAL($1), OPf_STACKED, - op_prepend_elem(OP_LIST, newGVREF(IVAL($1),$2), $3) ); - TOKEN_GETMAD($1,$$,'o'); + { $$ = convert($1, OPf_STACKED, + op_prepend_elem(OP_LIST, newGVREF($1,$2), $3) ); } | FUNC '(' indirob expr ')' /* print ($fh @args */ - { $$ = convert(IVAL($1), OPf_STACKED, - op_prepend_elem(OP_LIST, newGVREF(IVAL($1),$3), $4) ); - TOKEN_GETMAD($1,$$,'o'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($5,$$,')'); + { $$ = convert($1, OPf_STACKED, + op_prepend_elem(OP_LIST, newGVREF($1,$3), $4) ); } | term ARROW method '(' optexpr ')' /* $foo->bar(list) */ { $$ = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar($1), $5), newUNOP(OP_METHOD, 0, $3))); - TOKEN_GETMAD($2,$$,'A'); - TOKEN_GETMAD($4,$$,'('); - TOKEN_GETMAD($6,$$,')'); } | term ARROW method /* $foo->bar */ { $$ = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar($1), newUNOP(OP_METHOD, 0, $3))); - TOKEN_GETMAD($2,$$,'A'); } | METHOD indirob optlistexpr /* new Class @args */ { $$ = convert(OP_ENTERSUB, OPf_STACKED, @@ -849,19 +656,11 @@ listop : LSTOP indirob listexpr /* map {...} @args or print $fh @args */ op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, $2, $4), newUNOP(OP_METHOD, 0, $1))); - TOKEN_GETMAD($3,$$,'('); - TOKEN_GETMAD($5,$$,')'); } | LSTOP optlistexpr /* print @args */ - { $$ = convert(IVAL($1), 0, $2); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = convert($1, 0, $2); } | FUNC '(' optexpr ')' /* print (@args) */ - { $$ = convert(IVAL($1), 0, $3); - TOKEN_GETMAD($1,$$,'o'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($4,$$,')'); - } + { $$ = convert($1, 0, $3); } | LSTOPSUB startanonsub block /* sub f(&@); f { foo } ... */ { SvREFCNT_inc_simple_void(PL_compcv); $<opval>$ = newANONATTRSUB($2, 0, (OP*)NULL, $3); } @@ -883,208 +682,109 @@ subscripted: gelem '{' expr ';' '}' /* *main::{something} */ * provided by the tokeniser */ { $$ = newBINOP(OP_GELEM, 0, $1, scalar($3)); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD($2,$$,'{'); - TOKEN_GETMAD($4,$$,';'); - TOKEN_GETMAD($5,$$,'}'); } | scalar '[' expr ']' /* $array[$element] */ { $$ = newBINOP(OP_AELEM, 0, oopsAV($1), scalar($3)); - TOKEN_GETMAD($2,$$,'['); - TOKEN_GETMAD($4,$$,']'); } | term ARROW '[' expr ']' /* somearef->[$element] */ { $$ = newBINOP(OP_AELEM, 0, ref(newAVREF($1),OP_RV2AV), scalar($4)); - TOKEN_GETMAD($2,$$,'a'); - TOKEN_GETMAD($3,$$,'['); - TOKEN_GETMAD($5,$$,']'); } | subscripted '[' expr ']' /* $foo->[$bar]->[$baz] */ { $$ = newBINOP(OP_AELEM, 0, ref(newAVREF($1),OP_RV2AV), scalar($3)); - TOKEN_GETMAD($2,$$,'['); - TOKEN_GETMAD($4,$$,']'); } | scalar '{' expr ';' '}' /* $foo{bar();} */ { $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3)); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD($2,$$,'{'); - TOKEN_GETMAD($4,$$,';'); - TOKEN_GETMAD($5,$$,'}'); } | term ARROW '{' expr ';' '}' /* somehref->{bar();} */ { $$ = newBINOP(OP_HELEM, 0, ref(newHVREF($1),OP_RV2HV), jmaybe($4)); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD($2,$$,'a'); - TOKEN_GETMAD($3,$$,'{'); - TOKEN_GETMAD($5,$$,';'); - TOKEN_GETMAD($6,$$,'}'); } | subscripted '{' expr ';' '}' /* $foo->[bar]->{baz;} */ { $$ = newBINOP(OP_HELEM, 0, ref(newHVREF($1),OP_RV2HV), jmaybe($3)); PL_parser->expect = XOPERATOR; - TOKEN_GETMAD($2,$$,'{'); - TOKEN_GETMAD($4,$$,';'); - TOKEN_GETMAD($5,$$,'}'); } | term ARROW '(' ')' /* $subref->() */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, - newCVREF(0, scalar($1))); - TOKEN_GETMAD($2,$$,'a'); - TOKEN_GETMAD($3,$$,'('); - TOKEN_GETMAD($4,$$,')'); - } + newCVREF(0, scalar($1))); } | term ARROW '(' expr ')' /* $subref->(@args) */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, $4, - newCVREF(0, scalar($1)))); - TOKEN_GETMAD($2,$$,'a'); - TOKEN_GETMAD($3,$$,'('); - TOKEN_GETMAD($5,$$,')'); - } + newCVREF(0, scalar($1)))); } | subscripted '(' expr ')' /* $foo->{bar}->(@args) */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, $3, - newCVREF(0, scalar($1)))); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($4,$$,')'); - } + newCVREF(0, scalar($1)))); } | subscripted '(' ')' /* $foo->{bar}->() */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, - newCVREF(0, scalar($1))); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($3,$$,')'); - } + newCVREF(0, scalar($1))); } | '(' expr ')' '[' expr ']' /* list slice */ - { $$ = newSLICEOP(0, $5, $2); - TOKEN_GETMAD($1,$$,'('); - TOKEN_GETMAD($3,$$,')'); - TOKEN_GETMAD($4,$$,'['); - TOKEN_GETMAD($6,$$,']'); - } + { $$ = newSLICEOP(0, $5, $2); } | QWLIST '[' expr ']' /* list literal slice */ - { $$ = newSLICEOP(0, $3, $1); - TOKEN_GETMAD($2,$$,'['); - TOKEN_GETMAD($4,$$,']'); - } + { $$ = newSLICEOP(0, $3, $1); } | '(' ')' '[' expr ']' /* empty list slice! */ - { $$ = newSLICEOP(0, $4, (OP*)NULL); - TOKEN_GETMAD($1,$$,'('); - TOKEN_GETMAD($2,$$,')'); - TOKEN_GETMAD($3,$$,'['); - TOKEN_GETMAD($5,$$,']'); - } + { $$ = newSLICEOP(0, $4, (OP*)NULL); } ; /* Binary operators between terms */ termbinop: term ASSIGNOP term /* $x = $y */ - { $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); } | term POWOP term /* $x ** $y */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term MULOP term /* $x * $y, $x x $y */ - { if (IVAL($2) != OP_REPEAT) + { if ($2 != OP_REPEAT) scalar($1); - $$ = newBINOP(IVAL($2), 0, $1, scalar($3)); - TOKEN_GETMAD($2,$$,'o'); + $$ = newBINOP($2, 0, $1, scalar($3)); } | term ADDOP term /* $x + $y */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term SHIFTOP term /* $x >> $y, $x << $y */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term RELOP term /* $x > $y, etc. */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term EQOP term /* $x == $y, $x eq $y */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term BITANDOP term /* $x & $y */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term BITOROP term /* $x | $y */ - { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3)); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newBINOP($2, 0, scalar($1), scalar($3)); } | term DOTDOT term /* $x..$y, $x...$y */ - { - $$ = newRANGE(IVAL($2), scalar($1), scalar($3)); - DO_MAD({ - UNOP *op; - op = (UNOP*)$$; - op = (UNOP*)op->op_first; /* get to flop */ - op = (UNOP*)op->op_first; /* get to flip */ - op = (UNOP*)op->op_first; /* get to range */ - token_getmad($2,(OP*)op,'o'); - }); - } + { $$ = newRANGE($2, scalar($1), scalar($3)); } | term ANDAND term /* $x && $y */ - { $$ = newLOGOP(OP_AND, 0, $1, $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newLOGOP(OP_AND, 0, $1, $3); } | term OROR term /* $x || $y */ - { $$ = newLOGOP(OP_OR, 0, $1, $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newLOGOP(OP_OR, 0, $1, $3); } | term DORDOR term /* $x // $y */ - { $$ = newLOGOP(OP_DOR, 0, $1, $3); - TOKEN_GETMAD($2,$$,'o'); - } + { $$ = newLOGOP(OP_DOR, 0, $1, $3); } | term MATCHOP term /* $x =~ /$y/ */ - { $$ = bind_match(IVAL($2), $1, $3); - TOKEN_GETMAD($2, - ($$->op_type == OP_NOT - ? ((UNOP*)$$)->op_first : $$), - '~'); - } + { $$ = bind_match($2, $1, $3); } ; /* Unary operators and terms */ termunop : '-' term %prec UMINUS /* -$x */ - { $$ = newUNOP(OP_NEGATE, 0, scalar($2)); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP(OP_NEGATE, 0, scalar($2)); } | '+' term %prec UMINUS /* +$x */ - { $$ = IF_MAD( - newUNOP(OP_NULL, 0, $2), - $2 - ); - TOKEN_GETMAD($1,$$,'+'); - } + { $$ = $2; } + | '!' term /* !$x */ - { $$ = newUNOP(OP_NOT, 0, scalar($2)); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP(OP_NOT, 0, scalar($2)); } | '~' term /* ~$x */ - { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2)); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP(OP_COMPLEMENT, 0, scalar($2)); } | term POSTINC /* $x++ */ { $$ = newUNOP(OP_POSTINC, 0, - op_lvalue(scalar($1), OP_POSTINC)); - TOKEN_GETMAD($2,$$,'o'); - } + op_lvalue(scalar($1), OP_POSTINC)); } | term POSTDEC /* $x-- */ { $$ = newUNOP(OP_POSTDEC, 0, - op_lvalue(scalar($1), OP_POSTDEC)); - TOKEN_GETMAD($2,$$,'o'); - } + op_lvalue(scalar($1), OP_POSTDEC));} | term POSTJOIN /* implicit join after interpolated ->@ */ { $$ = convert(OP_JOIN, 0, op_append_elem( @@ -1095,63 +795,36 @@ termunop : '-' term %prec UMINUS /* -$x */ )), $1 )); - TOKEN_GETMAD($2,$$,'o'); } | PREINC term /* ++$x */ { $$ = newUNOP(OP_PREINC, 0, - op_lvalue(scalar($2), OP_PREINC)); - TOKEN_GETMAD($1,$$,'o'); - } + op_lvalue(scalar($2), OP_PREINC)); } | PREDEC term /* --$x */ { $$ = newUNOP(OP_PREDEC, 0, - op_lvalue(scalar($2), OP_PREDEC)); - TOKEN_GETMAD($1,$$,'o'); - } + op_lvalue(scalar($2), OP_PREDEC)); } ; /* Constructors for anonymous data */ anonymous: '[' expr ']' - { $$ = newANONLIST($2); - TOKEN_GETMAD($1,$$,'['); - TOKEN_GETMAD($3,$$,']'); - } + { $$ = newANONLIST($2); } | '[' ']' - { $$ = newANONLIST((OP*)NULL); - TOKEN_GETMAD($1,$$,'['); - TOKEN_GETMAD($2,$$,']'); - } + { $$ = newANONLIST((OP*)NULL);} | HASHBRACK expr ';' '}' %prec '(' /* { foo => "Bar" } */ - { $$ = newANONHASH($2); - TOKEN_GETMAD($1,$$,'{'); - TOKEN_GETMAD($3,$$,';'); - TOKEN_GETMAD($4,$$,'}'); - } + { $$ = newANONHASH($2); } | HASHBRACK ';' '}' %prec '(' /* { } (';' by tokener) */ - { $$ = newANONHASH((OP*)NULL); - TOKEN_GETMAD($1,$$,'{'); - TOKEN_GETMAD($2,$$,';'); - TOKEN_GETMAD($3,$$,'}'); - } + { $$ = newANONHASH((OP*)NULL); } | ANONSUB startanonsub proto subattrlist realsubbody %prec '(' { SvREFCNT_inc_simple_void(PL_compcv); - $$ = newANONATTRSUB($2, $3, $4, $5); - TOKEN_GETMAD($1,$$,'o'); - OP_GETMAD($3,$$,'s'); - OP_GETMAD($4,$$,'a'); - } + $$ = newANONATTRSUB($2, $3, $4, $5); } ; /* Things called with "do" */ termdo : DO term %prec UNIOP /* do $filename */ - { $$ = dofile($2, IVAL($1)); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = dofile($2, $1);} | DO block %prec '(' /* do { code */ - { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($2)); - TOKEN_GETMAD($1,$$,'D'); - } + { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($2));} ; term : termbinop @@ -1159,32 +832,19 @@ term : termbinop | anonymous | termdo | term '?' term ':' term - { $$ = newCONDOP(0, $1, $3, $5); - TOKEN_GETMAD($2,$$,'?'); - TOKEN_GETMAD($4,$$,':'); - } + { $$ = newCONDOP(0, $1, $3, $5); } | REFGEN term /* \$x, \@y, \%z */ - { $$ = newUNOP(OP_REFGEN, 0, op_lvalue($2,OP_REFGEN)); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP(OP_REFGEN, 0, op_lvalue($2,OP_REFGEN)); } | myattrterm %prec UNIOP { $$ = $1; } | LOCAL term %prec UNIOP - { $$ = localize($2,IVAL($1)); - TOKEN_GETMAD($1,$$,'k'); - } + { $$ = localize($2,$1); } | '(' expr ')' - { $$ = sawparens(IF_MAD(newUNOP(OP_NULL,0,$2), $2)); - TOKEN_GETMAD($1,$$,'('); - TOKEN_GETMAD($3,$$,')'); - } + { $$ = sawparens($2); } | QWLIST - { $$ = IF_MAD(newUNOP(OP_NULL,0,$1), $1); } + { $$ = $1; } | '(' ')' - { $$ = sawparens(newNULLLIST()); - TOKEN_GETMAD($1,$$,'('); - TOKEN_GETMAD($2,$$,')'); - } + { $$ = sawparens(newNULLLIST()); } | scalar %prec '(' { $$ = $1; } | star %prec '(' @@ -1206,8 +866,6 @@ term : termbinop if ($$ && $1) $$->op_private |= $1->op_private & OPpSLICEWARNING; - TOKEN_GETMAD($2,$$,'['); - TOKEN_GETMAD($4,$$,']'); } | kvslice '[' expr ']' /* array key/value slice */ { $$ = op_prepend_elem(OP_KVASLICE, @@ -1218,8 +876,6 @@ term : termbinop if ($$ && $1) $$->op_private |= $1->op_private & OPpSLICEWARNING; - TOKEN_GETMAD($2,$$,'['); - TOKEN_GETMAD($4,$$,']'); } | sliceme '{' expr ';' '}' /* @hash{@keys} */ { $$ = op_prepend_elem(OP_HSLICE, @@ -1231,9 +887,6 @@ term : termbinop $$->op_private |= $1->op_private & OPpSLICEWARNING; PL_parser->expect = XOPERATOR; - TOKEN_GETMAD($2,$$,'{'); - TOKEN_GETMAD($4,$$,';'); - TOKEN_GETMAD($5,$$,'}'); } | kvslice '{' expr ';' '}' /* %hash{@keys} */ { $$ = op_prepend_elem(OP_KVHSLICE, @@ -1245,9 +898,6 @@ term : termbinop $$->op_private |= $1->op_private & OPpSLICEWARNING; PL_parser->expect = XOPERATOR; - TOKEN_GETMAD($2,$$,'{'); - TOKEN_GETMAD($4,$$,';'); - TOKEN_GETMAD($5,$$,'}'); } | THING %prec '(' { $$ = $1; } @@ -1255,121 +905,65 @@ term : termbinop { $$ = newUNOP(OP_ENTERSUB, 0, scalar($1)); } | amper '(' ')' /* &foo() or foo() */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($3,$$,')'); } | amper '(' expr ')' /* &foo(@args) or foo(@args) */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, $3, scalar($1))); - DO_MAD({ - OP* op = $$; - if (op->op_type == OP_CONST) { /* defeat const fold */ - op = (OP*)op->op_madprop->mad_val; - } - token_getmad($2,op,'('); - token_getmad($4,op,')'); - }); } | NOAMP subname optlistexpr /* foo @args (no parens) */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, $3, scalar($2))); - TOKEN_GETMAD($1,$$,'o'); } | term ARROW '$' '*' - { $$ = newSVREF($1); - TOKEN_GETMAD($3,$$,'$'); - } + { $$ = newSVREF($1); } | term ARROW '@' '*' - { $$ = newAVREF($1); - TOKEN_GETMAD($3,$$,'@'); - } + { $$ = newAVREF($1); } | term ARROW '%' '*' - { $$ = newHVREF($1); - TOKEN_GETMAD($3,$$,'%'); - } + { $$ = newHVREF($1); } | term ARROW '&' '*' { $$ = newUNOP(OP_ENTERSUB, 0, - scalar(newCVREF(IVAL($3),$1))); - TOKEN_GETMAD($3,$$,'&'); - } + scalar(newCVREF($3,$1))); } | term ARROW '*' '*' %prec '(' - { $$ = newGVREF(0,$1); - TOKEN_GETMAD($3,$$,'*'); - } + { $$ = newGVREF(0,$1); } | LOOPEX /* loop exiting command (goto, last, dump, etc) */ - { $$ = newOP(IVAL($1), OPf_SPECIAL); - PL_hints |= HINT_BLOCK_SCOPE; - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newOP($1, OPf_SPECIAL); + PL_hints |= HINT_BLOCK_SCOPE; } | LOOPEX term - { $$ = newLOOPEX(IVAL($1),$2); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newLOOPEX($1,$2); } | NOTOP listexpr /* not $foo */ - { $$ = newUNOP(OP_NOT, 0, scalar($2)); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP(OP_NOT, 0, scalar($2)); } | UNIOP /* Unary op, $_ implied */ - { $$ = newOP(IVAL($1), 0); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newOP($1, 0); } | UNIOP block /* eval { foo }* */ - { $$ = newUNOP(IVAL($1), 0, $2); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP($1, 0, $2); } | UNIOP term /* Unary op */ - { $$ = newUNOP(IVAL($1), 0, $2); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP($1, 0, $2); } | REQUIRE /* require, $_ implied */ - { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0); } | REQUIRE term /* require Foo */ - { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2); } | UNIOPSUB { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); } | UNIOPSUB term /* Sub treated as unop */ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, $2, scalar($1))); } | FUNC0 /* Nullary operator */ - { $$ = newOP(IVAL($1), 0); - TOKEN_GETMAD($1,$$,'o'); - } + { $$ = newOP($1, 0); } | FUNC0 '(' ')' - { $$ = newOP(IVAL($1), 0); - TOKEN_GETMAD($1,$$,'o'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($3,$$,')'); - } + { $$ = newOP($1, 0);} | FUNC0OP /* Same as above, but op created in toke.c */ { $$ = $1; } | FUNC0OP '(' ')' - { $$ = $1; - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($3,$$,')'); - } + { $$ = $1; } | FUNC0SUB /* Sub treated as nullop */ - { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, - scalar($1)); } + { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); } | FUNC1 '(' ')' /* not () */ - { $$ = (IVAL($1) == OP_NOT) - ? newUNOP(IVAL($1), 0, newSVOP(OP_CONST, 0, newSViv(0))) - : newOP(IVAL($1), OPf_SPECIAL); - - TOKEN_GETMAD($1,$$,'o'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($3,$$,')'); - } + { $$ = ($1 == OP_NOT) + ? newUNOP($1, 0, newSVOP(OP_CONST, 0, newSViv(0))) + : newOP($1, OPf_SPECIAL); } | FUNC1 '(' expr ')' /* not($foo) */ - { $$ = newUNOP(IVAL($1), 0, $3); - TOKEN_GETMAD($1,$$,'o'); - TOKEN_GETMAD($2,$$,'('); - TOKEN_GETMAD($4,$$,')'); - } + { $$ = newUNOP($1, 0, $3); } | PMFUNC /* m//, s///, qr//, tr/// */ { if ( $1->op_type != OP_TRANS @@ -1382,47 +976,30 @@ term : termbinop $<ival>$ = 0; } '(' listexpr ')' - { $$ = pmruntime($1, $4, 1, $<ival>2); - TOKEN_GETMAD($3,$$,'('); - TOKEN_GETMAD($5,$$,')'); - } + { $$ = pmruntime($1, $4, 1, $<ival>2); } | WORD | listop | YADAYADA { $$ = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); - TOKEN_GETMAD($1,$$,'X'); } | PLUGEXPR ; /* "my" declarations, with optional attributes */ myattrterm: MY myterm myattrlist - { $$ = my_attrs($2,$3); - DO_MAD( - token_getmad($1,$$,'d'); - append_madprops($3->op_madprop, $$, 'a'); - $3->op_madprop = 0; - ); - } + { $$ = my_attrs($2,$3); } | MY myterm - { $$ = localize($2,IVAL($1)); - TOKEN_GETMAD($1,$$,'d'); - } + { $$ = localize($2,$1); } ; /* Things that can be "my"'d */ myterm : '(' expr ')' - { $$ = sawparens($2); - TOKEN_GETMAD($1,$$,'('); - TOKEN_GETMAD($3,$$,')'); - } + { $$ = sawparens($2); } | '(' ')' - { $$ = sawparens(newNULLLIST()); - TOKEN_GETMAD($1,$$,'('); - TOKEN_GETMAD($2,$$,')'); - } + { $$ = sawparens(newNULLLIST()); } + | scalar %prec '(' { $$ = $1; } | hsh %prec '(' @@ -1451,66 +1028,48 @@ my_scalar: scalar ; amper : '&' indirob - { $$ = newCVREF(IVAL($1),$2); - TOKEN_GETMAD($1,$$,'&'); - } + { $$ = newCVREF($1,$2); } ; scalar : '$' indirob - { $$ = newSVREF($2); - TOKEN_GETMAD($1,$$,'$'); - } + { $$ = newSVREF($2); } ; ary : '@' indirob { $$ = newAVREF($2); - if ($$) $$->op_private |= IVAL($1); - TOKEN_GETMAD($1,$$,'@'); + if ($$) $$->op_private |= $1; } ; hsh : '%' indirob { $$ = newHVREF($2); - if ($$) $$->op_private |= IVAL($1); - TOKEN_GETMAD($1,$$,'%'); + if ($$) $$->op_private |= $1; } ; arylen : DOLSHARP indirob - { $$ = newAVREF($2); - TOKEN_GETMAD($1,$$,'l'); - } + { $$ = newAVREF($2); } | term ARROW DOLSHARP '*' - { $$ = newAVREF($1); - TOKEN_GETMAD($3,$$,'l'); - } + { $$ = newAVREF($1); } ; star : '*' indirob - { $$ = newGVREF(0,$2); - TOKEN_GETMAD($1,$$,'*'); - } + { $$ = newGVREF(0,$2); } ; sliceme : ary | term ARROW '@' - { $$ = newAVREF($1); - TOKEN_GETMAD($3,$$,'@'); - } + { $$ = newAVREF($1); } ; kvslice : hsh | term ARROW '%' - { $$ = newHVREF($1); - TOKEN_GETMAD($3,$$,'@'); - } + { $$ = newHVREF($1); } ; gelem : star | term ARROW '*' - { $$ = newGVREF(0,$1); - TOKEN_GETMAD($3,$$,'*'); - } + { $$ = newGVREF(0,$1); } ; /* Indirect objects */ @@ -3164,13 +3164,7 @@ PP(pp_exit) #endif } PL_exit_flags |= PERL_EXIT_EXPECTED; -#ifdef PERL_MAD - /* KLUDGE: disable exit 0 in BEGIN blocks when we're just compiling */ - if (anum || !(PL_minus_c && PL_madskills)) - my_exit(anum); -#else my_exit(anum); -#endif PUSHs(&PL_sv_undef); RETURN; } @@ -3405,8 +3399,7 @@ S_doeval(pTHX_ int gimme, CV* outside, U32 seq, HV *hh) PL_op = NULL; /* avoid PL_op and PL_curpad referring to different CVs */ - if (!PL_madskills) - SAVEMORTALIZESV(evalcv); /* must remain until end of current statement */ + SAVEMORTALIZESV(evalcv); /* must remain until end of current statement */ /* make sure we compile in the right package */ @@ -3424,10 +3417,6 @@ S_doeval(pTHX_ int gimme, CV* outside, U32 seq, HV *hh) PL_unitcheckav = newAV(); SAVEFREESV(PL_unitcheckav); -#ifdef PERL_MAD - SAVEBOOL(PL_madskills); - PL_madskills = 0; -#endif ENTER_with_name("evalcomp"); SAVESPTR(PL_compcv); @@ -2773,6 +2773,7 @@ PERL_CALLCONV OP* Perl_newCVREF(pTHX_ I32 flags, OP* o) __attribute__malloc__ __attribute__warn_unused_result__; +PERL_CALLCONV void Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block); PERL_CALLCONV OP* Perl_newFOROP(pTHX_ I32 flags, OP* sv, OP* expr, OP* block, OP* cont) __attribute__malloc__ __attribute__warn_unused_result__ @@ -3130,6 +3131,11 @@ PERL_CALLCONV void Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *pat #define PERL_ARGS_ASSERT_PACK_CAT \ assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist); assert(next_in_list) +PERL_CALLCONV void Perl_package(pTHX_ OP* o) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_PACKAGE \ + assert(o) + PERL_CALLCONV void Perl_package_version(pTHX_ OP* v) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_PACKAGE_VERSION \ @@ -4863,6 +4869,11 @@ PERL_CALLCONV UV Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *r #define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI \ assert(s) +PERL_CALLCONV void Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg) + __attribute__nonnull__(pTHX_4); +#define PERL_ARGS_ASSERT_UTILIZE \ + assert(idop) + /* PERL_CALLCONV U8* uvchr_to_utf8(pTHX_ U8 *d, UV uv) __attribute__nonnull__(pTHX_1); */ @@ -5099,19 +5110,6 @@ PERL_CALLCONV void* Perl_my_cxt_init(pTHX_ int *index, size_t size) # endif #endif -#if !(defined(PERL_MAD)) -PERL_CALLCONV void Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block); -PERL_CALLCONV void Perl_package(pTHX_ OP* o) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_PACKAGE \ - assert(o) - -PERL_CALLCONV void Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg) - __attribute__nonnull__(pTHX_4); -#define PERL_ARGS_ASSERT_UTILIZE \ - assert(idop) - -#endif #if !(defined(WIN32)) /* PERL_CALLCONV char* my_setlocale(pTHX_ int category, const char* locale) __attribute__pure__; */ @@ -5844,15 +5842,6 @@ STATIC SV* S_pm_description(pTHX_ const PMOP *pm) assert(pm) STATIC UV S_sequence_num(pTHX_ const OP *o); -# if defined(PERL_MAD) -STATIC void S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...) - __attribute__format__(__printf__,pTHX_3,pTHX_4) - __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); -#define PERL_ARGS_ASSERT_XMLDUMP_ATTR \ - assert(file); assert(pat) - -# endif #endif #if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C) PERL_CALLCONV void Perl_hv_kill_backrefs(pTHX_ HV *hv) @@ -7692,25 +7681,6 @@ STATIC int S_yywarn(pTHX_ const char *const s, U32 flags) #define PERL_ARGS_ASSERT_YYWARN \ assert(s) -# if defined(PERL_MAD) -STATIC void S_curmad(pTHX_ char slot, SV *sv); -STATIC char* S_skipspace0(pTHX_ char *s) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_SKIPSPACE0 \ - assert(s) - -STATIC char* S_skipspace1(pTHX_ char *s) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_SKIPSPACE1 \ - assert(s) - -STATIC char* S_skipspace2(pTHX_ char *s, SV **sv) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_SKIPSPACE2 \ - assert(s) - -STATIC void S_start_force(pTHX_ int where); -# endif #endif #if defined(PERL_IN_UNIVERSAL_C) STATIC bool S_isa_lookup(pTHX_ HV *stash, const char * const name, STRLEN len, U32 flags) @@ -7793,129 +7763,6 @@ STATIC void S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesiz # endif #endif -#if defined(PERL_MAD) -PERL_CALLCONV void Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot); -PERL_CALLCONV void Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot); -PERL_CALLCONV void Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_DO_OP_XMLDUMP \ - assert(file) - -PERL_CALLCONV void Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP \ - assert(file) - -PERL_CALLCONV void Perl_mad_free(pTHX_ MADPROP* mp); -PERL_CALLCONV int Perl_madlex(pTHX); -PERL_CALLCONV int Perl_madparse(pTHX_ int gramtype); -PERL_CALLCONV OP* Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block); -PERL_CALLCONV MADPROP* Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen); -PERL_CALLCONV MADPROP* Perl_newMADsv(pTHX_ char key, SV* sv) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_NEWMADSV \ - assert(sv) - -PERL_CALLCONV TOKEN* Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop); -PERL_CALLCONV void Perl_op_getmad(pTHX_ OP* from, OP* o, char slot); -PERL_CALLCONV void Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot); -PERL_CALLCONV void Perl_op_xmldump(pTHX_ const OP *o) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_OP_XMLDUMP \ - assert(o) - -PERL_CALLCONV OP* Perl_package(pTHX_ OP* o) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_PACKAGE \ - assert(o) - -PERL_CALLCONV void Perl_pad_peg(const char* s) - __attribute__nonnull__(1); -#define PERL_ARGS_ASSERT_PAD_PEG \ - assert(s) - -PERL_CALLCONV void Perl_pmop_xmldump(pTHX_ const PMOP* pm); -PERL_CALLCONV void Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot); -PERL_CALLCONV char* Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8) - __attribute__nonnull__(pTHX_1) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_SV_CATXMLPV \ - assert(dsv); assert(pv) - -PERL_CALLCONV char* Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8) - __attribute__nonnull__(pTHX_1) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_SV_CATXMLPVN \ - assert(dsv); assert(pv) - -PERL_CALLCONV char* Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv) - __attribute__nonnull__(pTHX_1) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_SV_CATXMLSV \ - assert(dsv); assert(ssv) - -PERL_CALLCONV char* Perl_sv_xmlpeek(pTHX_ SV* sv) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_SV_XMLPEEK \ - assert(sv) - -PERL_CALLCONV void Perl_token_free(pTHX_ TOKEN *tk) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_TOKEN_FREE \ - assert(tk) - -PERL_CALLCONV void Perl_token_getmad(pTHX_ TOKEN *tk, OP *o, char slot) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_TOKEN_GETMAD \ - assert(tk) - -PERL_CALLCONV OP * Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg) - __attribute__nonnull__(pTHX_4); -#define PERL_ARGS_ASSERT_UTILIZE \ - assert(idop) - -PERL_CALLCONV void Perl_xmldump_all(pTHX); -PERL_CALLCONV void Perl_xmldump_all_perl(pTHX_ bool justperl); -PERL_CALLCONV void Perl_xmldump_eval(pTHX); -PERL_CALLCONV void Perl_xmldump_form(pTHX_ const GV* gv) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_XMLDUMP_FORM \ - assert(gv) - -PERL_CALLCONV void Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...) - __attribute__format__(__printf__,pTHX_3,pTHX_4) - __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); -#define PERL_ARGS_ASSERT_XMLDUMP_INDENT \ - assert(file); assert(pat) - -PERL_CALLCONV void Perl_xmldump_packsubs(pTHX_ const HV* stash) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS \ - assert(stash) - -PERL_CALLCONV void Perl_xmldump_packsubs_perl(pTHX_ const HV* stash, bool justperl) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL \ - assert(stash) - -PERL_CALLCONV void Perl_xmldump_sub(pTHX_ const GV* gv) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_XMLDUMP_SUB \ - assert(gv) - -PERL_CALLCONV void Perl_xmldump_sub_perl(pTHX_ const GV* gv, bool justperl) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL \ - assert(gv) - -PERL_CALLCONV void Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args) - __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); -#define PERL_ARGS_ASSERT_XMLDUMP_VINDENT \ - assert(file); assert(pat) - -#endif #if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C) STATIC void S_pidgone(pTHX_ Pid_t pid, int status); #endif diff --git a/regen_perly.pl b/regen_perly.pl index b96275639c..bf484bbed6 100644 --- a/regen_perly.pl +++ b/regen_perly.pl @@ -272,7 +272,7 @@ sub make_type_tab { my $default_token; open my $fh, '<', $y_file or die "Can't open $y_file: $!\n"; while (<$fh>) { - if (/(\$\d+)\s*=/) { + if (/(\$\d+)\s*=[^=]/) { warn "$y_file:$.: dangerous assignment to $1: $_"; } @@ -11928,27 +11928,9 @@ Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param) Copy(proto->tokenbuf, parser->tokenbuf, 256, char); -#ifdef PERL_MAD - parser->endwhite = proto->endwhite; - parser->faketokens = proto->faketokens; - parser->lasttoke = proto->lasttoke; - parser->nextwhite = proto->nextwhite; - parser->realtokenstart = proto->realtokenstart; - parser->skipwhite = proto->skipwhite; - parser->thisclose = proto->thisclose; - parser->thismad = proto->thismad; - parser->thisopen = proto->thisopen; - parser->thisstuff = proto->thisstuff; - parser->thistoken = proto->thistoken; - parser->thiswhite = proto->thiswhite; - - Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE); - parser->curforce = proto->curforce; -#else Copy(proto->nextval, parser->nextval, 5, YYSTYPE); Copy(proto->nexttype, parser->nexttype, 5, I32); parser->nexttoke = proto->nexttoke; -#endif /* XXX should clone saved_curcop here, but we aren't passed * proto_perl; so do it in perl_clone_using instead */ diff --git a/t/run/mad.t b/t/run/mad.t deleted file mode 100644 index 83023c53ef..0000000000 --- a/t/run/mad.t +++ /dev/null @@ -1,46 +0,0 @@ -#!./perl -# -# Tests for Perl mad environment -# -# $PERL_XMLDUMP - -BEGIN { - chdir 't' if -d 't'; - @INC = '../lib'; - require Config; import Config; - require './test.pl'; - skip_all_without_config('mad'); -} - -use File::Path; -use File::Spec; - -my $tempdir = tempfile; - -mkdir $tempdir, 0700 or die "Can't mkdir '$tempdir': $!"; -unshift @INC, '../../lib'; -my $cleanup = 1; - -END { - if ($cleanup) { - rmtree($tempdir); - } -} - -plan tests => 4; - -{ - delete local $ENV{$_} for keys %ENV; - my $fn = File::Spec->catfile(File::Spec->curdir(), "withoutT.xml"); - $ENV{PERL_XMLDUMP} = $fn; - fresh_perl_is('print q/hello/', '', {}, 'mad without -T'); - ok(-f $fn, "xml file created without -T as expected"); -} - -{ - delete local $ENV{$_} for keys %ENV; - my $fn = File::Spec->catfile(File::Spec->curdir(), "withT.xml"); - fresh_perl_is('print q/hello/', 'hello', { switches => [ "-T" ] }, - 'mad with -T'); - ok(!-e $fn, "no xml file created with -T as expected"); -} @@ -87,37 +87,13 @@ Individual members of C<PL_parser> have their own documentation. #define PL_multi_end (PL_parser->multi_end) #define PL_error_count (PL_parser->error_count) -#ifdef PERL_MAD -# define PL_endwhite (PL_parser->endwhite) -# define PL_faketokens (PL_parser->faketokens) -# define PL_lasttoke (PL_parser->lasttoke) -# define PL_nextwhite (PL_parser->nextwhite) -# define PL_realtokenstart (PL_parser->realtokenstart) -# define PL_skipwhite (PL_parser->skipwhite) -# define PL_thisclose (PL_parser->thisclose) -# define PL_thismad (PL_parser->thismad) -# define PL_thisopen (PL_parser->thisopen) -# define PL_thisstuff (PL_parser->thisstuff) -# define PL_thistoken (PL_parser->thistoken) -# define PL_thiswhite (PL_parser->thiswhite) -# define PL_thiswhite (PL_parser->thiswhite) -# define PL_nexttoke (PL_parser->nexttoke) -# define PL_curforce (PL_parser->curforce) -#else # define PL_nexttoke (PL_parser->nexttoke) # define PL_nexttype (PL_parser->nexttype) # define PL_nextval (PL_parser->nextval) -#endif static const char* const ident_too_long = "Identifier too long"; -#ifdef PERL_MAD -# define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; } -# define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val -#else -# define CURMAD(slot,sv) # define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke] -#endif #define XENUMMASK 0x3f #define XFAKEEOF 0x40 @@ -187,17 +163,10 @@ static const char* const lex_state_names[] = { #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline)) -#ifdef PERL_MAD -# define SKIPSPACE0(s) skipspace0(s) -# define SKIPSPACE1(s) skipspace1(s) -# define SKIPSPACE2(s,tsv) skipspace2(s,&tsv) -# define PEEKSPACE(s) skipspace2(s,0) -#else # define SKIPSPACE0(s) skipspace(s) # define SKIPSPACE1(s) skipspace(s) # define SKIPSPACE2(s,tsv) skipspace(s) # define PEEKSPACE(s) skipspace(s) -#endif /* * Convenience functions to return different tokens and prime the @@ -374,7 +343,6 @@ static struct debug_tokens { { OROP, TOKENTYPE_IVAL, "OROP" }, { OROR, TOKENTYPE_NONE, "OROR" }, { PACKAGE, TOKENTYPE_NONE, "PACKAGE" }, - { PEG, TOKENTYPE_NONE, "PEG" }, { PLUGEXPR, TOKENTYPE_OPVAL, "PLUGEXPR" }, { PLUGSTMT, TOKENTYPE_OPVAL, "PLUGSTMT" }, { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" }, @@ -728,11 +696,7 @@ Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags) /* initialise lexer state */ -#ifdef PERL_MAD - parser->curforce = -1; -#else parser->nexttoke = 0; -#endif parser->error_count = oparser ? oparser->error_count : 0; parser->copline = parser->preambling = NOLINE; parser->lex_state = LEX_NORMAL; @@ -807,23 +771,9 @@ Perl_parser_free(pTHX_ const yy_parser *parser) void Perl_parser_free_nexttoke_ops(pTHX_ yy_parser *parser, OPSLAB *slab) { -#ifdef PERL_MAD - I32 nexttoke = parser->lasttoke; -#else I32 nexttoke = parser->nexttoke; -#endif PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS; while (nexttoke--) { -#ifdef PERL_MAD - if (S_is_opval_token(parser->nexttoke[nexttoke].next_type - & 0xffff) - && parser->nexttoke[nexttoke].next_val.opval - && parser->nexttoke[nexttoke].next_val.opval->op_slabbed - && OpSLAB(parser->nexttoke[nexttoke].next_val.opval) == slab) { - op_free(parser->nexttoke[nexttoke].next_val.opval); - parser->nexttoke[nexttoke].next_val.opval = NULL; - } -#else if (S_is_opval_token(parser->nexttype[nexttoke] & 0xffff) && parser->nextval[nexttoke].opval && parser->nextval[nexttoke].opval->op_slabbed @@ -831,7 +781,6 @@ Perl_parser_free_nexttoke_ops(pTHX_ yy_parser *parser, OPSLAB *slab) op_free(parser->nextval[nexttoke].opval); parser->nextval[nexttoke].opval = NULL; } -#endif } } @@ -1358,10 +1307,6 @@ Perl_lex_next_chunk(pTHX_ U32 flags) (void)PerlIO_close(PL_parser->rsfp); PL_parser->rsfp = NULL; PL_parser->in_pod = PL_parser->filtered = 0; -#ifdef PERL_MAD - if (PL_madskills && !PL_in_eval && (PL_minus_p || PL_minus_n)) - PL_faketokens = 1; -#endif if (!PL_in_eval && PL_minus_p) { sv_catpvs(linestr, /*{*/";}continue{print or die qq(-p destination: $!\\n);}"); @@ -1535,14 +1480,6 @@ Perl_lex_read_space(pTHX_ U32 flags) bool need_incline = 0; if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK|LEX_NO_INCLINE)) Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space"); -#ifdef PERL_MAD - if (PL_skipwhite) { - sv_free(PL_skipwhite); - PL_skipwhite = NULL; - } - if (PL_madskills) - PL_skipwhite = newSVpvs(""); -#endif /* PERL_MAD */ s = PL_parser->bufptr; bufend = PL_parser->bufend; while (1) { @@ -1565,10 +1502,6 @@ Perl_lex_read_space(pTHX_ U32 flags) } else if (c == 0 && s == bufend) { bool got_more; line_t l; -#ifdef PERL_MAD - if (PL_madskills) - sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr); -#endif /* PERL_MAD */ if (flags & LEX_NO_NEXT_CHUNK) break; PL_parser->bufptr = s; @@ -1588,10 +1521,6 @@ Perl_lex_read_space(pTHX_ U32 flags) break; } } -#ifdef PERL_MAD - if (PL_madskills) - sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr); -#endif /* PERL_MAD */ PL_parser->bufptr = s; } @@ -1828,85 +1757,6 @@ S_incline(pTHX_ const char *s) #define skipspace(s) skipspace_flags(s, 0) -#ifdef PERL_MAD -/* skip space before PL_thistoken */ - -STATIC char * -S_skipspace0(pTHX_ char *s) -{ - PERL_ARGS_ASSERT_SKIPSPACE0; - - s = skipspace(s); - if (!PL_madskills) - return s; - if (PL_skipwhite) { - if (!PL_thiswhite) - PL_thiswhite = newSVpvs(""); - sv_catsv(PL_thiswhite, PL_skipwhite); - sv_free(PL_skipwhite); - PL_skipwhite = 0; - } - PL_realtokenstart = s - SvPVX(PL_linestr); - return s; -} - -/* skip space after PL_thistoken */ - -STATIC char * -S_skipspace1(pTHX_ char *s) -{ - const char *start = s; - I32 startoff = start - SvPVX(PL_linestr); - - PERL_ARGS_ASSERT_SKIPSPACE1; - - s = skipspace(s); - if (!PL_madskills) - return s; - start = SvPVX(PL_linestr) + startoff; - if (!PL_thistoken && PL_realtokenstart >= 0) { - const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart; - PL_thistoken = newSVpvn(tstart, start - tstart); - } - PL_realtokenstart = -1; - if (PL_skipwhite) { - if (!PL_nextwhite) - PL_nextwhite = newSVpvs(""); - sv_catsv(PL_nextwhite, PL_skipwhite); - sv_free(PL_skipwhite); - PL_skipwhite = 0; - } - return s; -} - -STATIC char * -S_skipspace2(pTHX_ char *s, SV **svp) -{ - char *start; - const I32 startoff = s - SvPVX(PL_linestr); - - PERL_ARGS_ASSERT_SKIPSPACE2; - - s = skipspace(s); - if (!PL_madskills || !svp) - return s; - start = SvPVX(PL_linestr) + startoff; - if (!PL_thistoken && PL_realtokenstart >= 0) { - char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart; - PL_thistoken = newSVpvn(tstart, start - tstart); - PL_realtokenstart = -1; - } - if (PL_skipwhite) { - if (!*svp) - *svp = newSVpvs(""); - sv_setsv(*svp, PL_skipwhite); - sv_free(PL_skipwhite); - PL_skipwhite = 0; - } - - return s; -} -#endif STATIC void S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len) @@ -1942,16 +1792,7 @@ S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len) STATIC char * S_skipspace_flags(pTHX_ char *s, U32 flags) { -#ifdef PERL_MAD - char *start = s; -#endif /* PERL_MAD */ PERL_ARGS_ASSERT_SKIPSPACE_FLAGS; -#ifdef PERL_MAD - if (PL_skipwhite) { - sv_free(PL_skipwhite); - PL_skipwhite = NULL; - } -#endif /* PERL_MAD */ if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) { while (s < PL_bufend && SPACE_OR_TAB(*s)) s++; @@ -1967,10 +1808,6 @@ S_skipspace_flags(pTHX_ char *s, U32 flags) PL_bufptr = PL_linestart; return s; } -#ifdef PERL_MAD - if (PL_madskills) - PL_skipwhite = newSVpvn(start, s-start); -#endif /* PERL_MAD */ return s; } @@ -2033,13 +1870,8 @@ S_lop(pTHX_ I32 f, int x, char *s) PL_bufptr = s; PL_last_lop = PL_oldbufptr; PL_last_lop_op = (OPCODE)f; -#ifdef PERL_MAD - if (PL_lasttoke) - goto lstop; -#else if (PL_nexttoke) goto lstop; -#endif if (*s == '(') return REPORT(FUNC); s = PEEKSPACE(s); @@ -2053,83 +1885,13 @@ S_lop(pTHX_ I32 f, int x, char *s) } } -#ifdef PERL_MAD - /* - * S_start_force - * Sets up for an eventual force_next(). start_force(0) basically does - * an unshift, while start_force(-1) does a push. yylex removes items - * on the "pop" end. - */ - -STATIC void -S_start_force(pTHX_ int where) -{ - int i; - - if (where < 0) /* so people can duplicate start_force(PL_curforce) */ - where = PL_lasttoke; - assert(PL_curforce < 0 || PL_curforce == where); - if (PL_curforce != where) { - for (i = PL_lasttoke; i > where; --i) { - PL_nexttoke[i] = PL_nexttoke[i-1]; - } - PL_lasttoke++; - } - if (PL_curforce < 0) /* in case of duplicate start_force() */ - Zero(&PL_nexttoke[where], 1, NEXTTOKE); - PL_curforce = where; - if (PL_nextwhite) { - if (PL_madskills) - curmad('^', newSVpvs("")); - CURMAD('_', PL_nextwhite); - } -} - -STATIC void -S_curmad(pTHX_ char slot, SV *sv) -{ - MADPROP **where; - - if (!sv) - return; - if (PL_curforce < 0) - where = &PL_thismad; - else - where = &PL_nexttoke[PL_curforce].next_mad; - - if (PL_faketokens) - sv_setpvs(sv, ""); - else { - if (!IN_BYTES) { - if (UTF && is_utf8_string((U8*)SvPVX(sv), SvCUR(sv))) - SvUTF8_on(sv); - else if (PL_encoding) { - sv_recode_to_utf8(sv, PL_encoding); - } - } - } - - /* keep a slot open for the head of the list? */ - if (slot != '_' && *where && (*where)->mad_key == '^') { - (*where)->mad_key = slot; - sv_free(MUTABLE_SV(((*where)->mad_val))); - (*where)->mad_val = (void*)sv; - } - else - addmad(newMADsv(slot, sv), where, 0); -} -#else -# define start_force(where) NOOP -# define curmad(slot, sv) NOOP -#endif - /* * S_force_next * When the lexer realizes it knows the next token (for instance, * it is reordering tokens for the parser) then it can call S_force_next * to know what token to return the next time the lexer is called. Caller - * will need to set PL_nextval[] (or PL_nexttoke[].next_val with PERL_MAD), - * and possibly PL_expect to ensure the lexer handles the token correctly. + * will need to set PL_nextval[] and possibly PL_expect to ensure + * the lexer handles the token correctly. */ STATIC void @@ -2142,16 +1904,6 @@ S_force_next(pTHX_ I32 type) tokereport(type, &NEXTVAL_NEXTTOKE); } #endif -#ifdef PERL_MAD - if (PL_curforce < 0) - start_force(PL_lasttoke); - PL_nexttoke[PL_curforce].next_type = type; - if (PL_lex_state != LEX_KNOWNEXT) - PL_lex_defer = PL_lex_state; - PL_lex_state = LEX_KNOWNEXT; - PL_lex_expect = PL_expect; - PL_curforce = -1; -#else PL_nexttype[PL_nexttoke] = type; PL_nexttoke++; if (PL_lex_state != LEX_KNOWNEXT) { @@ -2159,7 +1911,6 @@ S_force_next(pTHX_ I32 type) PL_lex_expect = PL_expect; PL_lex_state = LEX_KNOWNEXT; } -#endif } /* @@ -2182,10 +1933,8 @@ S_postderef(pTHX_ int const funny, char const next) if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) { assert('@' == funny || '$' == funny || DOLSHARP == funny); PL_lex_state = LEX_INTERPEND; - start_force(PL_curforce); force_next(POSTJOIN); } - start_force(PL_curforce); force_next(next); PL_bufptr+=2; } @@ -2205,7 +1954,6 @@ Perl_yyunlex(pTHX) int yyc = PL_parser->yychar; if (yyc != YYEMPTY) { if (yyc) { - start_force(-1); NEXTVAL_NEXTTOKE = PL_parser->yylval; if (yyc == '{'/*}*/ || yyc == HASHBRACK || yyc == '['/*]*/) { PL_lex_allbrackets--; @@ -2272,9 +2020,6 @@ S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack) if (keyword(s2, len, 0)) return start; } - start_force(PL_curforce); - if (PL_madskills) - curmad('X', newSVpvn(start,s-start)); if (token == METHOD) { s = SKIPSPACE1(s); if (*s == '(') @@ -2283,8 +2028,6 @@ S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack) PL_expect = XOPERATOR; } } - if (PL_madskills) - curmad('g', newSVpvs( "forced" )); NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST,0, S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len)); @@ -2314,7 +2057,6 @@ S_force_ident(pTHX_ const char *s, int kind) const STRLEN len = s[1] ? strlen(s) : 1; /* s = "\"" see yylex */ OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn_flags(s, len, UTF ? SVf_UTF8 : 0)); - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = o; force_next(WORD); if (kind) { @@ -2337,7 +2079,6 @@ S_force_ident(pTHX_ const char *s, int kind) static void S_force_ident_maybe_lex(pTHX_ char pit) { - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = pit; force_next('p'); } @@ -2384,9 +2125,6 @@ S_force_version(pTHX_ char *s, int guessing) dVAR; OP *version = NULL; char *d; -#ifdef PERL_MAD - I32 startoff = s - SvPVX(PL_linestr); -#endif PERL_ARGS_ASSERT_FORCE_VERSION; @@ -2398,12 +2136,6 @@ S_force_version(pTHX_ char *s, int guessing) if (isDIGIT(*d)) { while (isDIGIT(*d) || *d == '_' || *d == '.') d++; -#ifdef PERL_MAD - if (PL_madskills) { - start_force(PL_curforce); - curmad('X', newSVpvn(s,d-s)); - } -#endif if (*d == ';' || isSPACE(*d) || *d == '{' || *d == '}' || !*d) { SV *ver; s = scan_num(s, &pl_yylval); @@ -2416,26 +2148,11 @@ S_force_version(pTHX_ char *s, int guessing) } } else if (guessing) { -#ifdef PERL_MAD - if (PL_madskills) { - sv_free(PL_nextwhite); /* let next token collect whitespace */ - PL_nextwhite = 0; - s = SvPVX(PL_linestr) + startoff; - } -#endif return s; } } -#ifdef PERL_MAD - if (PL_madskills && !version) { - sv_free(PL_nextwhite); /* let next token collect whitespace */ - PL_nextwhite = 0; - s = SvPVX(PL_linestr) + startoff; - } -#endif /* NOTE: The parser sees the package name and the VERSION swapped */ - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = version; force_next(WORD); @@ -2452,9 +2169,6 @@ S_force_strict_version(pTHX_ char *s) { dVAR; OP *version = NULL; -#ifdef PERL_MAD - I32 startoff = s - SvPVX(PL_linestr); -#endif const char *errstr = NULL; PERL_ARGS_ASSERT_FORCE_STRICT_VERSION; @@ -2476,15 +2190,7 @@ S_force_strict_version(pTHX_ char *s) return s; } -#ifdef PERL_MAD - if (PL_madskills && !version) { - sv_free(PL_nextwhite); /* let next token collect whitespace */ - PL_nextwhite = 0; - s = SvPVX(PL_linestr) + startoff; - } -#endif /* NOTE: The parser sees the package name and the VERSION swapped */ - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = version; force_next(WORD); @@ -2773,20 +2479,6 @@ S_sublex_done(pTHX) } else { const line_t l = CopLINE(PL_curcop); -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thiswhite) { - if (!PL_endwhite) - PL_endwhite = newSVpvs(""); - sv_catsv(PL_endwhite, PL_thiswhite); - PL_thiswhite = 0; - } - if (PL_thistoken) - sv_setpvs(PL_thistoken,""); - else - PL_realtokenstart = -1; - } -#endif LEAVE; if (PL_multi_close == '<') PL_parser->herelines += l - PL_multi_end; @@ -4144,9 +3836,6 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv) char tmpbuf[sizeof PL_tokenbuf]; STRLEN len; GV* indirgv; -#ifdef PERL_MAD - int soff; -#endif PERL_ARGS_ASSERT_INTUIT_METHOD; @@ -4166,13 +3855,7 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv) if (cv || PL_last_lop_op == OP_PRINT || PL_last_lop_op == OP_SAY || isUPPER(*PL_tokenbuf)) return 0; -#ifdef PERL_MAD - len = start - SvPVX(PL_linestr); -#endif s = PEEKSPACE(s); -#ifdef PERL_MAD - start = SvPVX(PL_linestr) + len; -#endif PL_bufptr = start; PL_expect = XREF; return *s == '(' ? FUNCMETH : METHOD; @@ -4188,9 +3871,6 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv) if (len > 2 && tmpbuf[len - 2] == ':' && tmpbuf[len - 1] == ':') { len -= 2; tmpbuf[len] = '\0'; -#ifdef PERL_MAD - soff = s - SvPVX(PL_linestr); -#endif goto bare_package; } indirgv = gv_fetchpvn_flags(tmpbuf, len, ( UTF ? SVf_UTF8 : 0 ), SVt_PVCV); @@ -4198,26 +3878,16 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv) return 0; /* filehandle or package name makes it a method */ if (!cv || GvIO(indirgv) || gv_stashpvn(tmpbuf, len, UTF ? SVf_UTF8 : 0)) { -#ifdef PERL_MAD - soff = s - SvPVX(PL_linestr); -#endif s = PEEKSPACE(s); if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>') return 0; /* no assumptions -- "=>" quotes bareword */ bare_package: - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, S_newSV_maybe_utf8(aTHX_ tmpbuf, len)); NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE; - if (PL_madskills) - curmad('X', newSVpvn_flags(start,SvPVX(PL_linestr) + soff - start, - ( UTF ? SVf_UTF8 : 0 ))); PL_expect = XTERM; force_next(WORD); PL_bufptr = s; -#ifdef PERL_MAD - PL_bufptr = SvPVX(PL_linestr) + soff; /* restart before space */ -#endif return *s == '(' ? FUNCMETH : METHOD; } } @@ -4481,186 +4151,6 @@ S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len) return gv_stashpvn(pkgname, len, UTF ? SVf_UTF8 : 0); } -#ifdef PERL_MAD - /* - * Perl_madlex - * The intent of this yylex wrapper is to minimize the changes to the - * tokener when we aren't interested in collecting madprops. It remains - * to be seen how successful this strategy will be... - */ - -int -Perl_madlex(pTHX) -{ - int optype; - char *s = PL_bufptr; - - /* make sure PL_thiswhite is initialized */ - PL_thiswhite = 0; - PL_thismad = 0; - - /* previous token ate up our whitespace? */ - if (!PL_lasttoke && PL_nextwhite) { - PL_thiswhite = PL_nextwhite; - PL_nextwhite = 0; - } - - /* isolate the token, and figure out where it is without whitespace */ - PL_realtokenstart = -1; - PL_thistoken = 0; - optype = yylex(); - s = PL_bufptr; - assert(PL_curforce < 0); - - if (!PL_thismad || PL_thismad->mad_key == '^') { /* not forced already? */ - if (!PL_thistoken) { - if (PL_realtokenstart < 0 || !CopLINE(PL_curcop)) - PL_thistoken = newSVpvs(""); - else { - char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart; - PL_thistoken = newSVpvn(tstart, s - tstart); - } - } - if (PL_thismad) /* install head */ - CURMAD('X', PL_thistoken); - } - - /* last whitespace of a sublex? */ - if (optype == ')' && PL_endwhite) { - CURMAD('X', PL_endwhite); - } - - if (!PL_thismad) { - - /* if no whitespace and we're at EOF, bail. Otherwise fake EOF below. */ - if (!PL_thiswhite && !PL_endwhite && !optype) { - sv_free(PL_thistoken); - PL_thistoken = 0; - return 0; - } - - /* put off final whitespace till peg */ - if (optype == ';' && !PL_rsfp && !PL_parser->filtered) { - PL_nextwhite = PL_thiswhite; - PL_thiswhite = 0; - } - else if (PL_thisopen) { - CURMAD('q', PL_thisopen); - if (PL_thistoken) - sv_free(PL_thistoken); - PL_thistoken = 0; - } - else { - /* Store actual token text as madprop X */ - CURMAD('X', PL_thistoken); - } - - if (PL_thiswhite) { - /* add preceding whitespace as madprop _ */ - CURMAD('_', PL_thiswhite); - } - - if (PL_thisstuff) { - /* add quoted material as madprop = */ - CURMAD('=', PL_thisstuff); - } - - if (PL_thisclose) { - /* add terminating quote as madprop Q */ - CURMAD('Q', PL_thisclose); - } - } - - /* special processing based on optype */ - - switch (optype) { - - /* opval doesn't need a TOKEN since it can already store mp */ - case WORD: - case METHOD: - case FUNCMETH: - case THING: - case PMFUNC: - case PRIVATEREF: - case FUNC0SUB: - case UNIOPSUB: - case LSTOPSUB: - if (pl_yylval.opval) - append_madprops(PL_thismad, pl_yylval.opval, 0); - PL_thismad = 0; - return optype; - - /* fake EOF */ - case 0: - optype = PEG; - if (PL_endwhite) { - addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0); - PL_endwhite = 0; - } - break; - - /* pval */ - case LABEL: - break; - - case ']': - case '}': - if (PL_faketokens) - break; - /* remember any fake bracket that lexer is about to discard */ - if (PL_lex_brackets == 1 && - ((expectation)PL_lex_brackstack[0] & XFAKEBRACK)) - { - s = PL_bufptr; - while (s < PL_bufend && (*s == ' ' || *s == '\t')) - s++; - if (*s == '}') { - PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr); - addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0); - PL_thiswhite = 0; - PL_bufptr = s - 1; - break; /* don't bother looking for trailing comment */ - } - else - s = PL_bufptr; - } - if (optype == ']') - break; - /* FALLTHROUGH */ - - /* attach a trailing comment to its statement instead of next token */ - case ';': - if (PL_faketokens) - break; - if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) { - s = PL_bufptr; - while (s < PL_bufend && (*s == ' ' || *s == '\t')) - s++; - if (*s == '\n' || *s == '#') { - while (s < PL_bufend && *s != '\n') - s++; - if (s < PL_bufend) - s++; - PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr); - addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0); - PL_thiswhite = 0; - PL_bufptr = s; - } - } - break; - - /* ival */ - default: - break; - - } - - /* Create new token struct. Note: opvals return early above. */ - pl_yylval.tkval = newTOKEN(optype, pl_yylval, PL_thismad); - PL_thismad = 0; - return optype; -} -#endif STATIC char * S_tokenize_use(pTHX_ int is_use, char *s) { @@ -4677,7 +4167,6 @@ S_tokenize_use(pTHX_ int is_use, char *s) { s = force_version(s, TRUE); if (*s == ';' || *s == '}' || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) { - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = NULL; force_next(WORD); } @@ -4805,27 +4294,6 @@ Perl_yylex(pTHX) /* when we've already built the next token, just pull it out of the queue */ case LEX_KNOWNEXT: -#ifdef PERL_MAD - PL_lasttoke--; - pl_yylval = PL_nexttoke[PL_lasttoke].next_val; - if (PL_madskills) { - PL_thismad = PL_nexttoke[PL_lasttoke].next_mad; - PL_nexttoke[PL_lasttoke].next_mad = 0; - if (PL_thismad && PL_thismad->mad_key == '_') { - PL_thiswhite = MUTABLE_SV(PL_thismad->mad_val); - PL_thismad->mad_val = 0; - mad_free(PL_thismad); - PL_thismad = 0; - } - } - if (!PL_lasttoke) { - PL_lex_state = PL_lex_defer; - PL_expect = PL_lex_expect; - PL_lex_defer = LEX_NORMAL; - if (!PL_nexttoke[PL_lasttoke].next_type) - return yylex(); - } -#else PL_nexttoke--; pl_yylval = PL_nextval[PL_nexttoke]; if (!PL_nexttoke) { @@ -4833,14 +4301,9 @@ Perl_yylex(pTHX) PL_expect = PL_lex_expect; PL_lex_defer = LEX_NORMAL; } -#endif { I32 next_type; -#ifdef PERL_MAD - next_type = PL_nexttoke[PL_lasttoke].next_type; -#else next_type = PL_nexttype[PL_nexttoke]; -#endif if (next_type & (7<<24)) { if (next_type & (1<<24)) { if (PL_lex_brackets > 100) @@ -4879,10 +4342,6 @@ Perl_yylex(pTHX) || oldmod == 'F')) { PL_bufptr += 2; PL_lex_state = LEX_INTERPCONCAT; -#ifdef PERL_MAD - if (PL_madskills) - PL_thistoken = newSVpvs("\\E"); -#endif } PL_lex_allbrackets--; return REPORT(')'); @@ -4892,20 +4351,8 @@ Perl_yylex(pTHX) Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of \\E"); } -#ifdef PERL_MAD - while (PL_bufptr != PL_bufend && - PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') { - if (PL_madskills) { - if (!PL_thiswhite) - PL_thiswhite = newSVpvs(""); - sv_catpvn(PL_thiswhite, PL_bufptr, 2); - } - PL_bufptr += 2; - } -#else if (PL_bufptr != PL_bufend) PL_bufptr += 2; -#endif PL_lex_state = LEX_INTERPCONCAT; return yylex(); } @@ -4914,22 +4361,14 @@ Perl_yylex(pTHX) "### Saw case modifier\n"); }); s = PL_bufptr + 1; if (s[1] == '\\' && s[2] == 'E') { -#ifdef PERL_MAD - if (PL_madskills) { - if (!PL_thiswhite) - PL_thiswhite = newSVpvs(""); - sv_catpvn(PL_thiswhite, PL_bufptr, 4); - } -#endif PL_bufptr = s + 3; PL_lex_state = LEX_INTERPCONCAT; return yylex(); } else { I32 tmp; - if (!PL_madskills) /* when just compiling don't need correct */ - if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3)) - tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */ + if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3)) + tmp = *s, *s = s[2], s[2] = (char)tmp; /* misordered... */ if ((*s == 'L' || *s == 'U' || *s == 'F') && (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U') @@ -4943,10 +4382,8 @@ Perl_yylex(pTHX) PL_lex_casestack[PL_lex_casemods++] = *s; PL_lex_casestack[PL_lex_casemods] = '\0'; PL_lex_state = LEX_INTERPCONCAT; - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next((2<<24)|'('); - start_force(PL_curforce); if (*s == 'l') NEXTVAL_NEXTTOKE.ival = OP_LCFIRST; else if (*s == 'u') @@ -4961,26 +4398,12 @@ Perl_yylex(pTHX) NEXTVAL_NEXTTOKE.ival = OP_FC; else Perl_croak(aTHX_ "panic: yylex, *s=%u", *s); - if (PL_madskills) { - SV* const tmpsv = newSVpvs("\\ "); - /* replace the space with the character we want to escape - */ - SvPVX(tmpsv)[1] = *s; - curmad('_', tmpsv); - } PL_bufptr = s + 1; } force_next(FUNC); if (PL_lex_starts) { s = PL_bufptr; PL_lex_starts = 0; -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thistoken) - sv_free(PL_thistoken); - PL_thistoken = newSVpvs(""); - } -#endif /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */ if (PL_lex_casemods == 1 && PL_lex_inpat) OPERATOR(','); @@ -5006,18 +4429,13 @@ Perl_yylex(pTHX) && (!PL_lex_inpat || PL_lex_casemods)); PL_lex_state = LEX_INTERPNORMAL; if (PL_lex_dojoin) { - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next(','); - start_force(PL_curforce); force_ident("\"", '$'); - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next('$'); - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next((2<<24)|'('); - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */ force_next(FUNC); } @@ -5027,21 +4445,12 @@ Perl_yylex(pTHX) PL_bufptr += 2; if (*PL_bufptr != '{') PL_bufptr++; - start_force(PL_curforce); - /* XXX probably need a CURMAD(something) here */ PL_expect = XTERMBLOCK; force_next(DO); } if (PL_lex_starts++) { s = PL_bufptr; -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thistoken) - sv_free(PL_thistoken); - PL_thistoken = newSVpvs(""); - } -#endif /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */ if (!PL_lex_casemods && PL_lex_inpat) OPERATOR(','); @@ -5062,13 +4471,6 @@ Perl_yylex(pTHX) const U8 dojoin_was = PL_lex_dojoin; PL_lex_dojoin = FALSE; PL_lex_state = LEX_INTERPCONCAT; -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thistoken) - sv_free(PL_thistoken); - PL_thistoken = newSVpvs(""); - } -#endif PL_lex_allbrackets--; return REPORT(dojoin_was == 1 ? ')' : POSTJOIN); } @@ -5100,8 +4502,6 @@ Perl_yylex(pTHX) } else sv = newSVpvn(PL_parser->lex_shared->re_eval_start, PL_bufptr - PL_parser->lex_shared->re_eval_start); - start_force(PL_curforce); - /* XXX probably need a CURMAD(something) here */ NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, sv); @@ -5137,21 +4537,10 @@ Perl_yylex(pTHX) } if (s != PL_bufptr) { - start_force(PL_curforce); - if (PL_madskills) { - curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr)); - } NEXTVAL_NEXTTOKE = pl_yylval; PL_expect = XTERM; force_next(THING); if (PL_lex_starts++) { -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thistoken) - sv_free(PL_thistoken); - PL_thistoken = newSVpvs(""); - } -#endif /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */ if (!PL_lex_casemods && PL_lex_inpat) OPERATOR(','); @@ -5184,13 +4573,6 @@ Perl_yylex(pTHX) PL_parser->saw_infix_sigil = 0; retry: -#ifdef PERL_MAD - if (PL_thistoken) { - sv_free(PL_thistoken); - PL_thistoken = 0; - } - PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */ -#endif switch (*s) { default: if (UTF ? isIDFIRST_utf8((U8*)s) : isALNUMC(*s)) @@ -5216,10 +4598,6 @@ Perl_yylex(pTHX) case 26: goto fake_eof; /* emulate EOF on ^D or ^Z */ case 0: -#ifdef PERL_MAD - if (PL_madskills) - PL_faketokens = 0; -#endif if (!PL_rsfp && (!PL_parser->filtered || s+1 < PL_bufend)) { PL_last_uni = 0; PL_last_lop = 0; @@ -5241,10 +4619,6 @@ Perl_yylex(pTHX) PL_last_lop = 0; if (!PL_in_eval && !PL_preambled) { PL_preambled = TRUE; -#ifdef PERL_MAD - if (PL_madskills) - PL_faketokens = 1; -#endif if (PL_perldb) { /* Generate a string of Perl code to load the debugger. * If PERL5DB is set, it will return the contents of that, @@ -5330,10 +4704,6 @@ Perl_yylex(pTHX) TOKEN(';'); /* not infinite loop because rsfp is NULL now */ } CopLINE_dec(PL_curcop); -#ifdef PERL_MAD - if (!PL_rsfp) - PL_realtokenstart = -1; -#endif s = PL_bufptr; /* If it looks like the start of a BOM or raw UTF-16, * check if it in fact is. */ @@ -5356,10 +4726,6 @@ Perl_yylex(pTHX) } if (PL_parser->in_pod) { /* Incest with pod. */ -#ifdef PERL_MAD - if (PL_madskills) - sv_catsv(PL_thiswhite, PL_linestr); -#endif if (*s == '=' && strnEQ(s, "=cut", 4) && !isALPHA(s[4])) { sv_setpvs(PL_linestr, ""); PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr); @@ -5379,10 +4745,6 @@ Perl_yylex(pTHX) s++; if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */ s++; -#ifdef PERL_MAD - if (PL_madskills) - PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart); -#endif d = NULL; if (!PL_in_eval) { if (*s == '#' && *(s+1) == '!') @@ -5568,7 +4930,6 @@ Perl_yylex(pTHX) } if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) { PL_lex_state = LEX_FORMLINE; - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next(FORMRBRACK); TOKEN(';'); @@ -5581,100 +4942,54 @@ Perl_yylex(pTHX) "\t(Maybe you didn't strip carriage returns after a network transfer?)\n"); #endif case ' ': case '\t': case '\f': case 013: -#ifdef PERL_MAD - PL_realtokenstart = -1; - if (PL_madskills) { - if (!PL_thiswhite) - PL_thiswhite = newSVpvs(""); - sv_catpvn(PL_thiswhite, s, 1); - } -#endif s++; goto retry; case '#': case '\n': -#ifdef PERL_MAD - PL_realtokenstart = -1; - if (PL_madskills) - PL_faketokens = 0; -#endif if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp && !PL_parser->filtered)) { + const bool in_comment = *s == '#'; if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp && !PL_parser->filtered) { /* handle eval qq[#line 1 "foo"\n ...] */ CopLINE_dec(PL_curcop); incline(s); } - if (PL_madskills && !PL_lex_formbrack && !PL_in_eval) { - s = SKIPSPACE0(s); - if (!PL_in_eval || PL_rsfp || PL_parser->filtered) - incline(s); - } - else { - const bool in_comment = *s == '#'; - d = s; - while (d < PL_bufend && *d != '\n') - d++; - if (d < PL_bufend) - d++; - else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */ - Perl_croak(aTHX_ "panic: input overflow, %p > %p", - d, PL_bufend); -#ifdef PERL_MAD - if (PL_madskills) - PL_thiswhite = newSVpvn(s, d - s); -#endif - s = d; - if (in_comment && d == PL_bufend - && PL_lex_state == LEX_INTERPNORMAL - && PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr - && SvEVALED(PL_lex_repl) && d[-1] == '}') s--; - else incline(s); - } + d = s; + while (d < PL_bufend && *d != '\n') + d++; + if (d < PL_bufend) + d++; + else if (d > PL_bufend) + /* Found by Ilya: feed random input to Perl. */ + Perl_croak(aTHX_ "panic: input overflow, %p > %p", + d, PL_bufend); + s = d; + if (in_comment && d == PL_bufend + && PL_lex_state == LEX_INTERPNORMAL + && PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr + && SvEVALED(PL_lex_repl) && d[-1] == '}') s--; + else + incline(s); if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) { PL_lex_state = LEX_FORMLINE; - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next(FORMRBRACK); TOKEN(';'); } } else { -#ifdef PERL_MAD - if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) { - if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') { - PL_faketokens = 0; - s = SKIPSPACE0(s); - TOKEN(PEG); /* make sure any #! line is accessible */ - } - s = SKIPSPACE0(s); - } - else { -#endif - if (PL_madskills) d = s; - while (s < PL_bufend && *s != '\n') - s++; - if (s < PL_bufend) - { - s++; - if (s < PL_bufend) - incline(s); - } - else if (s > PL_bufend) /* Found by Ilya: feed random input to Perl. */ - Perl_croak(aTHX_ "panic: input overflow"); -#ifdef PERL_MAD - if (PL_madskills && CopLINE(PL_curcop) >= 1) { - if (!PL_thiswhite) - PL_thiswhite = newSVpvs(""); - if (CopLINE(PL_curcop) == 1) { - sv_setpvs(PL_thiswhite, ""); - PL_faketokens = 0; - } - sv_catpvn(PL_thiswhite, d, s - d); - } - } -#endif + while (s < PL_bufend && *s != '\n') + s++; + if (s < PL_bufend) + { + s++; + if (s < PL_bufend) + incline(s); + } + else if (s > PL_bufend) + /* Found by Ilya: feed random input to Perl. */ + Perl_croak(aTHX_ "panic: input overflow"); } goto retry; case '-': @@ -5920,9 +5235,6 @@ Perl_yylex(pTHX) s++; switch (PL_expect) { OP *attrs; -#ifdef PERL_MAD - I32 stuffstart; -#endif case XOPERATOR: if (!PL_in_my || PL_lex_state != LEX_NORMAL) break; @@ -5938,9 +5250,6 @@ Perl_yylex(pTHX) case XATTRTERM: PL_expect = XTERMBLOCK; grabattrs: -#ifdef PERL_MAD - stuffstart = s - SvPVX(PL_linestr) - 1; -#endif s = PEEKSPACE(s); attrs = NULL; while (isIDFIRST_lazy_if(s,UTF)) { @@ -6060,17 +5369,9 @@ Perl_yylex(pTHX) } got_attrs: if (attrs) { - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = attrs; - CURMAD('_', PL_nextwhite); force_next(THING); } -#ifdef PERL_MAD - if (PL_madskills) { - PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart, - (s - SvPVX(PL_linestr)) - stuffstart); - } -#endif TOKEN(COLONATTR); } if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_CLOSING) { @@ -6314,19 +5615,9 @@ Perl_yylex(pTHX) PL_bufptr = s; return yylex(); /* ignore fake brackets */ } - start_force(PL_curforce); - if (PL_madskills) { - curmad('X', newSVpvn(s-1,1)); - CURMAD('_', PL_thiswhite); - } force_next(formbrack ? '.' : '}'); if (formbrack) LEAVE; -#ifdef PERL_MAD - if (PL_madskills && !PL_thistoken) - PL_thistoken = newSVpvs(""); -#endif if (formbrack == 2) { /* means . where arguments were expected */ - start_force(PL_curforce); force_next(';'); TOKEN(FORMRBRACK); } @@ -6438,14 +5729,6 @@ Perl_yylex(pTHX) } goto retry; } -#ifdef PERL_MAD - if (PL_madskills) { - if (!PL_thiswhite) - PL_thiswhite = newSVpvs(""); - sv_catpvn(PL_thiswhite, PL_linestart, - PL_bufend - PL_linestart); - } -#endif s = PL_bufend; PL_parser->in_pod = 1; goto retry; @@ -6864,7 +6147,7 @@ Perl_yylex(pTHX) TERM(THING); case '\'': - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) missingterm(NULL); COPLINE_SET_FROM_MULTI_END; @@ -6880,7 +6163,7 @@ Perl_yylex(pTHX) TERM(sublex_start()); case '"': - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); DEBUG_T( { if (s) printbuf("### Saw string before %s\n", s); @@ -6911,7 +6194,7 @@ Perl_yylex(pTHX) TERM(sublex_start()); case '`': - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } ); if (PL_expect == XOPERATOR) no_op("Backticks",s); @@ -7212,9 +6495,6 @@ Perl_yylex(pTHX) lastchar && PL_bufptr - 2 >= PL_linestart ? PL_bufptr[-2] : 0; -#ifdef PERL_MAD - SV *nextPL_nextwhite = 0; -#endif /* Get the rest if it looks like a package qualifier */ @@ -7246,7 +6526,7 @@ Perl_yylex(pTHX) in which case Foo is a bareword (and a package name). */ - if (len > 2 && !PL_madskills && + if (len > 2 && PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':') { if (ckWARN(WARN_BAREWORD) @@ -7284,13 +6564,6 @@ Perl_yylex(pTHX) SvREFCNT_dec(tmp_sv); } -#ifdef PERL_MAD - if (PL_madskills && !PL_thistoken) { - char *start = SvPVX(PL_linestr) + PL_realtokenstart; - PL_thistoken = newSVpvn(start,s - start); - PL_realtokenstart = s - SvPVX(PL_linestr); - } -#endif /* Presume this is going to be a bareword of some sort. */ CLINE; @@ -7323,9 +6596,6 @@ Perl_yylex(pTHX) /* (Now we can afford to cross potential line boundary.) */ s = SKIPSPACE2(s,nextPL_nextwhite); -#ifdef PERL_MAD - PL_nextwhite = nextPL_nextwhite; /* assume no & deception */ -#endif /* Two barewords in a row may indicate method call. */ @@ -7357,13 +6627,7 @@ Perl_yylex(pTHX) } PL_expect = XOPERATOR; -#ifdef PERL_MAD - if (isSPACE(*s)) - s = SKIPSPACE2(s,nextPL_nextwhite); - PL_nextwhite = nextPL_nextwhite; -#else s = skipspace(s); -#endif /* Is this a word before a => operator? */ if (*s == '=' && s[1] == '>' && !pkgname) { @@ -7391,23 +6655,9 @@ Perl_yylex(pTHX) goto its_constant; } } -#ifdef PERL_MAD - if (PL_madskills) { - PL_nextwhite = PL_thiswhite; - PL_thiswhite = 0; - } - start_force(PL_curforce); -#endif NEXTVAL_NEXTTOKE.opval = off ? rv2cv_op : pl_yylval.opval; PL_expect = XOPERATOR; -#ifdef PERL_MAD - if (PL_madskills) { - PL_nextwhite = nextPL_nextwhite; - curmad('X', PL_thistoken); - PL_thistoken = newSVpvs(""); - } -#endif if (off) op_free(pl_yylval.opval), force_next(PRIVATEREF); else op_free(rv2cv_op), force_next(WORD); @@ -7474,9 +6724,6 @@ Perl_yylex(pTHX) PL_last_lop_op = OP_ENTERSUB; /* Is there a prototype? */ if ( -#ifdef PERL_MAD - cv && -#endif SvPOK(cv)) { STRLEN protolen = CvPROTOLEN(cv); @@ -7520,71 +6767,6 @@ Perl_yylex(pTHX) PREBLOCK(LSTOPSUB); } } -#ifdef PERL_MAD - { - if (PL_madskills) { - PL_nextwhite = PL_thiswhite; - PL_thiswhite = 0; - } - start_force(PL_curforce); - NEXTVAL_NEXTTOKE.opval = pl_yylval.opval; - PL_expect = XTERM; - if (PL_madskills) { - PL_nextwhite = nextPL_nextwhite; - curmad('X', PL_thistoken); - PL_thistoken = newSVpvs(""); - } - force_next(off ? PRIVATEREF : WORD); - if (!PL_lex_allbrackets && - PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) - PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; - TOKEN(NOAMP); - } - } - - /* Guess harder when madskills require "best effort". */ - if (PL_madskills && (!gv || !GvCVu(gv))) { - int probable_sub = 0; - if (strchr("\"'`$@%0123456789!*+{[<", *s)) - probable_sub = 1; - else if (isALPHA(*s)) { - char tmpbuf[1024]; - STRLEN tmplen; - d = s; - d = scan_word(d, tmpbuf, sizeof tmpbuf, TRUE, &tmplen); - if (!keyword(tmpbuf, tmplen, 0)) - probable_sub = 1; - else { - while (d < PL_bufend && isSPACE(*d)) - d++; - if (*d == '=' && d[1] == '>') - probable_sub = 1; - } - } - if (probable_sub) { - gv = gv_fetchpv(PL_tokenbuf, GV_ADD | ( UTF ? SVf_UTF8 : 0 ), - SVt_PVCV); - op_free(pl_yylval.opval); - pl_yylval.opval = - off ? (OP *)newCVREF(0, rv2cv_op) : rv2cv_op; - pl_yylval.opval->op_private |= OPpENTERSUB_NOPAREN; - PL_last_lop = PL_oldbufptr; - PL_last_lop_op = OP_ENTERSUB; - PL_nextwhite = PL_thiswhite; - PL_thiswhite = 0; - start_force(PL_curforce); - NEXTVAL_NEXTTOKE.opval = pl_yylval.opval; - PL_expect = XTERM; - PL_nextwhite = nextPL_nextwhite; - curmad('X', PL_thistoken); - PL_thistoken = newSVpvs(""); - force_next(off ? PRIVATEREF : WORD); - if (!PL_lex_allbrackets && - PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) - PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; - TOKEN(NOAMP); - } -#else NEXTVAL_NEXTTOKE.opval = pl_yylval.opval; PL_expect = XTERM; force_next(off ? PRIVATEREF : WORD); @@ -7592,7 +6774,6 @@ Perl_yylex(pTHX) PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; TOKEN(NOAMP); -#endif } /* Call it a bare word */ @@ -7737,21 +6918,6 @@ Perl_yylex(pTHX) } } #endif -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_realtokenstart >= 0) { - char *tstart = SvPVX(PL_linestr) + PL_realtokenstart; - if (!PL_endwhite) - PL_endwhite = newSVpvs(""); - sv_catsv(PL_endwhite, PL_thiswhite); - PL_thiswhite = 0; - sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart); - PL_realtokenstart = -1; - } - while ((s = filter_gets(PL_endwhite, SvCUR(PL_endwhite))) - != NULL) ; - } -#endif PL_rsfp = NULL; } goto fake_eof; @@ -7961,8 +7127,6 @@ Perl_yylex(pTHX) UNI(OP_EXISTS); case KEY_exit: - if (PL_madskills) - UNI(OP_INT); UNI(OP_EXIT); case KEY_eval: @@ -8018,9 +7182,6 @@ Perl_yylex(pTHX) s = SKIPSPACE1(s); if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) { char *p = s; -#ifdef PERL_MAD - int soff = s - SvPVX(PL_linestr); /* for skipspace realloc */ -#endif if ((PL_bufend - p) >= 3 && strnEQ(p, "my", 2) && isSPACE(*(p + 2))) @@ -8036,9 +7197,6 @@ Perl_yylex(pTHX) } if (*p != '$') Perl_croak(aTHX_ "Missing $ on loop variable"); -#ifdef PERL_MAD - s = SvPVX(PL_linestr) + soff; -#endif } OPERATOR(FOR); @@ -8273,9 +7431,6 @@ Perl_yylex(pTHX) PL_in_my = (U16)tmp; s = SKIPSPACE1(s); if (isIDFIRST_lazy_if(s,UTF)) { -#ifdef PERL_MAD - char* start = s; -#endif s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len); if (len == 3 && strnEQ(PL_tokenbuf, "sub", 3)) { @@ -8296,13 +7451,6 @@ Perl_yylex(pTHX) my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf); yyerror_pv(tmpbuf, UTF ? SVf_UTF8 : 0); } -#ifdef PERL_MAD - if (PL_madskills) { /* just add type to declarator token */ - sv_catsv(PL_thistoken, PL_nextwhite); - PL_nextwhite = 0; - sv_catpvn(PL_thistoken, start, s - start); - } -#endif } pl_yylval.ival = 1; OPERATOR(MY); @@ -8401,7 +7549,7 @@ Perl_yylex(pTHX) LOP(OP_PIPE_OP,XTERM); case KEY_q: - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) missingterm(NULL); COPLINE_SET_FROM_MULTI_END; @@ -8413,7 +7561,7 @@ Perl_yylex(pTHX) case KEY_qw: { OP *words = NULL; - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) missingterm(NULL); COPLINE_SET_FROM_MULTI_END; @@ -8464,7 +7612,7 @@ Perl_yylex(pTHX) } case KEY_qq: - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) missingterm(NULL); pl_yylval.ival = OP_STRINGIFY; @@ -8477,7 +7625,7 @@ Perl_yylex(pTHX) TERM(sublex_start()); case KEY_qx: - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) missingterm(NULL); pl_yylval.ival = OP_BACKTICK; @@ -8697,44 +7845,21 @@ Perl_yylex(pTHX) expectation attrful; bool have_name, have_proto; const int key = tmp; -#ifndef PERL_MAD SV *format_name = NULL; -#endif - -#ifdef PERL_MAD - SV *tmpwhite = 0; - - char *tstart = SvPVX(PL_linestr) + PL_realtokenstart; - SV *subtoken = PL_madskills - ? newSVpvn_flags(tstart, s - tstart, SvUTF8(PL_linestr)) - : NULL; - PL_thistoken = 0; d = s; - s = SKIPSPACE2(s,tmpwhite); -#else - d = s; s = skipspace(s); -#endif if (isIDFIRST_lazy_if(s,UTF) || *s == '\'' || (*s == ':' && s[1] == ':')) { -#ifdef PERL_MAD - SV *nametoke = NULL; -#endif PL_expect = XBLOCK; attrful = XATTRBLOCK; d = scan_word(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE, &len); -#ifdef PERL_MAD - if (PL_madskills) - nametoke = newSVpvn_flags(s, d - s, SvUTF8(PL_linestr)); -#else if (key == KEY_format) format_name = S_newSV_maybe_utf8(aTHX_ s, d - s); -#endif *PL_tokenbuf = '&'; if (memchr(tmpbuf, ':', len) || key != KEY_sub || pad_findmy_pvn( @@ -8751,16 +7876,7 @@ Perl_yylex(pTHX) have_name = TRUE; -#ifdef PERL_MAD - start_force(0); - CURMAD('X', nametoke); - CURMAD('_', tmpwhite); - force_ident_maybe_lex('&'); - - s = SKIPSPACE2(d,tmpwhite); -#else s = skipspace(d); -#endif } else { if (key == KEY_my || key == KEY_our || key==KEY_state) @@ -8777,45 +7893,25 @@ Perl_yylex(pTHX) } if (key == KEY_format) { -#ifdef PERL_MAD - PL_thistoken = subtoken; - s = d; -#else if (format_name) { - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST,0, format_name); NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE; force_next(WORD); } -#endif PREBLOCK(FORMAT); } /* Look for a prototype */ if (*s == '(' && !FEATURE_SIGNATURES_IS_ENABLED) { - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); COPLINE_SET_FROM_MULTI_END; if (!s) Perl_croak(aTHX_ "Prototype not terminated"); (void)validate_proto(PL_subname, PL_lex_stuff, ckWARN(WARN_ILLEGALPROTO)); have_proto = TRUE; -#ifdef PERL_MAD - start_force(0); - CURMAD('q', PL_thisopen); - CURMAD('_', tmpwhite); - CURMAD('=', PL_thisstuff); - CURMAD('Q', PL_thisclose); - NEXTVAL_NEXTTOKE.opval = - (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff); - PL_lex_stuff = NULL; - force_next(THING); - - s = SKIPSPACE2(s,tmpwhite); -#else s = skipspace(s); -#endif } else have_proto = FALSE; @@ -8829,25 +7925,12 @@ Perl_yylex(pTHX) Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, SVfARG(PL_subname)); } -#ifdef PERL_MAD - start_force(0); - if (tmpwhite) { - if (PL_madskills) - curmad('^', newSVpvs("")); - CURMAD('_', tmpwhite); - } - force_next(0); - - PL_thistoken = subtoken; - PERL_UNUSED_VAR(have_proto); -#else if (have_proto) { NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff); PL_lex_stuff = NULL; force_next(THING); } -#endif if (!have_name) { if (PL_curstash) sv_setpvs(PL_subname, "__ANON__"); @@ -8855,9 +7938,7 @@ Perl_yylex(pTHX) sv_setpvs(PL_subname, "__ANON__::__ANON__"); TOKEN(ANONSUB); } -#ifndef PERL_MAD force_ident_maybe_lex('&'); -#endif TOKEN(SUB); } @@ -9718,9 +8799,6 @@ S_scan_pat(pTHX_ char *start, I32 type) const char * const valid_flags = (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS); char charset = '\0'; /* character set modifier */ -#ifdef PERL_MAD - char *modstart; -#endif PERL_ARGS_ASSERT_SCAN_PAT; @@ -9757,9 +8835,6 @@ S_scan_pat(pTHX_ char *start, I32 type) PmopSTASH_set(pm,PL_curstash); } } -#ifdef PERL_MAD - modstart = s; -#endif /* if qr/...(?{..}).../, then need to parse the pattern within a new * anon CV. False positives like qr/[(?{]/ are harmless */ @@ -9780,12 +8855,6 @@ S_scan_pat(pTHX_ char *start, I32 type) } while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags), &s, &charset)) {}; -#ifdef PERL_MAD - if (PL_madskills && modstart != s) { - SV* tmptoken = newSVpvn(modstart, s - modstart); - append_madprops(newMADPROP('m', MAD_SV, tmptoken, 0), (OP*)pm, 0); - } -#endif /* issue a warning if /c is specified,but /g is not */ if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)) { @@ -9808,9 +8877,6 @@ S_scan_subst(pTHX_ char *start) line_t first_line; I32 es = 0; char charset = '\0'; /* character set modifier */ -#ifdef PERL_MAD - char *modstart; -#endif char *t; PERL_ARGS_ASSERT_SCAN_SUBST; @@ -9823,19 +8889,10 @@ S_scan_subst(pTHX_ char *start) Perl_croak(aTHX_ "Substitution pattern not terminated"); s = t; -#ifdef PERL_MAD - if (PL_madskills) { - CURMAD('q', PL_thisopen); - CURMAD('_', PL_thiswhite); - CURMAD('E', PL_thisstuff); - CURMAD('Q', PL_thisclose); - PL_realtokenstart = s - SvPVX(PL_linestr); - } -#endif first_start = PL_multi_start; first_line = CopLINE(PL_curcop); - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) { if (PL_lex_stuff) { SvREFCNT_dec(PL_lex_stuff); @@ -9847,14 +8904,6 @@ S_scan_subst(pTHX_ char *start) pm = (PMOP*)newPMOP(OP_SUBST, 0); -#ifdef PERL_MAD - if (PL_madskills) { - CURMAD('z', PL_thisopen); - CURMAD('R', PL_thisstuff); - CURMAD('Z', PL_thisclose); - } - modstart = s; -#endif while (*s) { if (*s == EXEC_PAT_MOD) { @@ -9867,14 +8916,6 @@ S_scan_subst(pTHX_ char *start) } } -#ifdef PERL_MAD - if (PL_madskills) { - if (modstart != s) - curmad('m', newSVpvn(modstart, s - modstart)); - append_madprops(PL_thismad, (OP*)pm, 0); - PL_thismad = 0; - } -#endif if ((pm->op_pmflags & PMf_CONTINUE)) { Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" ); } @@ -9919,31 +8960,19 @@ S_scan_trans(pTHX_ char *start) U8 del; U8 complement; bool nondestruct = 0; -#ifdef PERL_MAD - char *modstart; -#endif char *t; PERL_ARGS_ASSERT_SCAN_TRANS; pl_yylval.ival = OP_NULL; - s = scan_str(start,!!PL_madskills,FALSE,FALSE,&t); + s = scan_str(start,FALSE,FALSE,FALSE,&t); if (!s) Perl_croak(aTHX_ "Transliteration pattern not terminated"); s = t; -#ifdef PERL_MAD - if (PL_madskills) { - CURMAD('q', PL_thisopen); - CURMAD('_', PL_thiswhite); - CURMAD('E', PL_thisstuff); - CURMAD('Q', PL_thisclose); - PL_realtokenstart = s - SvPVX(PL_linestr); - } -#endif - s = scan_str(s,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(s,FALSE,FALSE,FALSE,NULL); if (!s) { if (PL_lex_stuff) { SvREFCNT_dec(PL_lex_stuff); @@ -9951,16 +8980,8 @@ S_scan_trans(pTHX_ char *start) } Perl_croak(aTHX_ "Transliteration replacement not terminated"); } - if (PL_madskills) { - CURMAD('z', PL_thisopen); - CURMAD('R', PL_thisstuff); - CURMAD('Z', PL_thisclose); - } complement = del = squash = 0; -#ifdef PERL_MAD - modstart = s; -#endif while (1) { switch (*s) { case 'c': @@ -9991,14 +9012,6 @@ S_scan_trans(pTHX_ char *start) PL_lex_op = o; pl_yylval.ival = nondestruct ? OP_TRANSR : OP_TRANS; -#ifdef PERL_MAD - if (PL_madskills) { - if (modstart != s) - curmad('m', newSVpvn(modstart, s - modstart)); - append_madprops(PL_thismad, o, 0); - PL_thismad = 0; - } -#endif return s; } @@ -10041,12 +9054,6 @@ S_scan_heredoc(pTHX_ char *s) const bool infile = PL_rsfp || PL_parser->filtered; const line_t origline = CopLINE(PL_curcop); LEXSHARED *shared = PL_parser->lex_shared; -#ifdef PERL_MAD - I32 stuffstart = s - SvPVX(PL_linestr); - char *tstart; - - PL_realtokenstart = -1; -#endif PERL_ARGS_ASSERT_SCAN_HEREDOC; @@ -10085,15 +9092,6 @@ S_scan_heredoc(pTHX_ char *s) *d = '\0'; len = d - PL_tokenbuf; -#ifdef PERL_MAD - if (PL_madskills) { - tstart = PL_tokenbuf + 1; - PL_thisclose = newSVpvn(tstart, len - 1); - tstart = SvPVX(PL_linestr) + stuffstart; - PL_thisopen = newSVpvn(tstart, s - tstart); - stuffstart = s - SvPVX(PL_linestr); - } -#endif #ifndef PERL_STRICT_CR d = strchr(s, '\r'); if (d) { @@ -10118,17 +9116,6 @@ S_scan_heredoc(pTHX_ char *s) s = olds; } #endif -#ifdef PERL_MAD - if (PL_madskills) { - tstart = SvPVX(PL_linestr) + stuffstart; - if (PL_thisstuff) - sv_catpvn(PL_thisstuff, tstart, s - tstart); - else - PL_thisstuff = newSVpvn(tstart, s - tstart); - } - - stuffstart = s - SvPVX(PL_linestr); -#endif tmpstr = newSV_type(SVt_PVIV); SvGROW(tmpstr, 80); @@ -10194,15 +9181,6 @@ S_scan_heredoc(pTHX_ char *s) goto interminable; } sv_setpvn(tmpstr,d+1,s-d); -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thisstuff) - sv_catpvn(PL_thisstuff, d + 1, s - d); - else - PL_thisstuff = newSVpvn(d + 1, s - d); - stuffstart = s - SvPVX(PL_linestr); - } -#endif s += len - 1; /* the preceding stmt passes a newline */ PL_parser->herelines++; @@ -10252,15 +9230,6 @@ S_scan_heredoc(pTHX_ char *s) PL_linestr = newSVpvs(""); PL_bufend = SvPVX(PL_linestr); while (1) { -#ifdef PERL_MAD - if (PL_madskills) { - tstart = SvPVX(PL_linestr) + stuffstart; - if (PL_thisstuff) - sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart); - else - PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart); - } -#endif PL_bufptr = PL_bufend; CopLINE_set(PL_curcop, origline + 1 + PL_parser->herelines); @@ -10278,9 +9247,6 @@ S_scan_heredoc(pTHX_ char *s) PL_bufend = SvEND(PL_linestr); } s = PL_bufptr; -#ifdef PERL_MAD - stuffstart = s - SvPVX(PL_linestr); -#endif PL_parser->herelines++; PL_last_lop = PL_last_uni = NULL; #ifndef PERL_STRICT_CR @@ -10396,7 +9362,7 @@ S_scan_inputsymbol(pTHX_ char *start) if (d - PL_tokenbuf != len) { pl_yylval.ival = OP_GLOB; - s = scan_str(start,!!PL_madskills,FALSE,FALSE,NULL); + s = scan_str(start,FALSE,FALSE,FALSE,NULL); if (!s) Perl_croak(aTHX_ "Glob not terminated"); return s; @@ -10555,10 +9521,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re STRLEN termlen; /* length of terminating string */ int last_off = 0; /* last position for nesting bracket */ line_t herelines; -#ifdef PERL_MAD - int stuffstart; - char *tstart; -#endif PERL_ARGS_ASSERT_SCAN_STR; @@ -10567,14 +9529,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re s = PEEKSPACE(s); } -#ifdef PERL_MAD - if (PL_realtokenstart >= 0) { - stuffstart = PL_realtokenstart; - PL_realtokenstart = -1; - } - else - stuffstart = start - SvPVX(PL_linestr); -#endif /* mark where we are, in case we need to report errors */ CLINE; @@ -10617,13 +9571,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re if (keep_delims) sv_catpvn(sv, s, termlen); s += termlen; -#ifdef PERL_MAD - tstart = SvPVX(PL_linestr) + stuffstart; - if (PL_madskills && !PL_thisopen && !keep_delims) { - PL_thisopen = newSVpvn(tstart, s - tstart); - stuffstart = s - SvPVX(PL_linestr); - } -#endif for (;;) { if (PL_encoding && !UTF && !re_reparse) { bool cont = TRUE; @@ -10831,15 +9778,6 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re /* if we're out of file, or a read fails, bail and reset the current line marker so we can report where the unterminated string began */ -#ifdef PERL_MAD - if (PL_madskills) { - char * const tstart = SvPVX(PL_linestr) + stuffstart; - if (PL_thisstuff) - sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart); - else - PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart); - } -#endif COPLINE_INC_WITH_HERELINES; PL_bufptr = PL_bufend; if (!lex_next_chunk(0)) { @@ -10848,45 +9786,16 @@ S_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int re return NULL; } s = PL_bufptr; -#ifdef PERL_MAD - stuffstart = 0; -#endif } /* at this point, we have successfully read the delimited string */ if (!PL_encoding || UTF || re_reparse) { -#ifdef PERL_MAD - if (PL_madskills) { - char * const tstart = SvPVX(PL_linestr) + stuffstart; - const int len = s - tstart; - if (PL_thisstuff) - sv_catpvn(PL_thisstuff, tstart, len); - else - PL_thisstuff = newSVpvn(tstart, len); - if (!PL_thisclose && !keep_delims) - PL_thisclose = newSVpvn(s,termlen); - } -#endif if (keep_delims) sv_catpvn(sv, s, termlen); s += termlen; } -#ifdef PERL_MAD - else { - if (PL_madskills) { - char * const tstart = SvPVX(PL_linestr) + stuffstart; - const int len = s - tstart - termlen; - if (PL_thisstuff) - sv_catpvn(PL_thisstuff, tstart, len); - else - PL_thisstuff = newSVpvn(tstart, len); - if (!PL_thisclose && !keep_delims) - PL_thisclose = newSVpvn(s - termlen,termlen); - } - } -#endif if (has_utf8 || (PL_encoding && !re_reparse)) SvUTF8_on(sv); @@ -11322,15 +10231,6 @@ S_scan_formline(pTHX_ char *s) SV * const stuff = newSVpvs(""); bool needargs = FALSE; bool eofmt = FALSE; -#ifdef PERL_MAD - char *tokenstart = s; - SV* savewhite = NULL; - - if (PL_madskills) { - savewhite = PL_thiswhite; - PL_thiswhite = 0; - } -#endif PERL_ARGS_ASSERT_SCAN_FORMLINE; @@ -11379,22 +10279,11 @@ S_scan_formline(pTHX_ char *s) if ((PL_rsfp || PL_parser->filtered) && PL_parser->form_lex_state == LEX_NORMAL) { bool got_some; -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thistoken) - sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart); - else - PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart); - } -#endif PL_bufptr = PL_bufend; COPLINE_INC_WITH_HERELINES; got_some = lex_next_chunk(0); CopLINE_dec(PL_curcop); s = PL_bufptr; -#ifdef PERL_MAD - tokenstart = PL_bufptr; -#endif if (!got_some) break; } @@ -11411,12 +10300,10 @@ S_scan_formline(pTHX_ char *s) || *s2 == 013) s2++; if (*s2 == '{') { - start_force(PL_curforce); PL_expect = XTERMBLOCK; NEXTVAL_NEXTTOKE.ival = 0; force_next(DO); } - start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; force_next(FORMLBRACK); } @@ -11426,7 +10313,6 @@ S_scan_formline(pTHX_ char *s) else if (PL_encoding) sv_recode_to_utf8(stuff, PL_encoding); } - start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff); force_next(THING); } @@ -11435,15 +10321,6 @@ S_scan_formline(pTHX_ char *s) if (eofmt) PL_lex_formbrack = 0; } -#ifdef PERL_MAD - if (PL_madskills) { - if (PL_thistoken) - sv_catpvn(PL_thistoken, tokenstart, s - tokenstart); - else - PL_thistoken = newSVpvn(tokenstart, s - tokenstart); - PL_thiswhite = savewhite; - } -#endif return s; } @@ -4390,12 +4390,6 @@ /*#define PERL_PRIeldbl "lle" / **/ /*#define PERL_SCNfldbl "llf" / **/ -/* 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 @@ -4748,6 +4742,6 @@ #endif /* Generated from: - * 4cb92587c221c8c3b0fe3f9c2fbab1293d6798f426cca6a0be90491d0fd04185 config_h.SH - * 87a71147b46045d5a12e0e15b269db96e2af06d021d25ab516cfe4d0efb6b87b uconfig.sh + * a37f46da5285428077feb313bcbe68661740bac16d76fa658d723d9fcc91c2c4 config_h.SH + * 4b709c0b049c660c04c0932eaa8481f9ca6fdc697ec4ffaa86b7bef21ee886a8 uconfig.sh * ex: set ro: */ diff --git a/uconfig.sh b/uconfig.sh index 0dc4171937..e8df3c2ea0 100644 --- a/uconfig.sh +++ b/uconfig.sh @@ -653,7 +653,6 @@ longlongsize=8 longsize='4' lseeksize=4 lseektype=int -mad='undef' malloctype='int*' malloctype='void *' mmaptype='void *' diff --git a/win32/config_H.gc b/win32/config_H.gc index da310afd6f..228bee33e0 100644 --- a/win32/config_H.gc +++ b/win32/config_H.gc @@ -4372,12 +4372,6 @@ /*#define PERL_PRIeldbl "e" / **/ /*#define PERL_SCNfldbl "f" / **/ -/* 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 diff --git a/win32/config_H.vc b/win32/config_H.vc index 4c1ae3d428..2d9ebfd066 100644 --- a/win32/config_H.vc +++ b/win32/config_H.vc @@ -4366,12 +4366,6 @@ /*#define PERL_PRIeldbl "e" / **/ /*#define PERL_SCNfldbl "f" / **/ -/* 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 |