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_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.

# NOTE: MacOS patches the 'i' of time() away later when the interpreter
# is created because in MacOS time() is already returning times > 2**31-1,
# that is, non-integers.

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 { '' }


