perl/op.h
<<
>>
Prefs
   1/*    op.h
   2 *
   3 *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
   4 *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
   5 *
   6 *    You may distribute under the terms of either the GNU General Public
   7 *    License or the Artistic License, as specified in the README file.
   8 *
   9 */
  10
  11/*
  12 * The fields of BASEOP are:
  13 *      op_next         Pointer to next ppcode to execute after this one.
  14 *                      (Top level pre-grafted op points to first op,
  15 *                      but this is replaced when op is grafted in, when
  16 *                      this op will point to the real next op, and the new
  17 *                      parent takes over role of remembering starting op.)
  18 *      op_ppaddr       Pointer to current ppcode's function.
  19 *      op_type         The type of the operation.
  20 *      op_opt          Whether or not the op has been optimised by the
  21 *                      peephole optimiser.
  22 *
  23 *                      See the comments in S_clear_yystack() for more
  24 *                      details on the following three flags:
  25 *
  26 *      op_latefree     tell op_free() to clear this op (and free any kids)
  27 *                      but not yet deallocate the struct. This means that
  28 *                      the op may be safely op_free()d multiple times
  29 *      op_latefreed    an op_latefree op has been op_free()d
  30 *      op_attached     this op (sub)tree has been attached to a CV
  31 *
  32 *      op_spare        three spare bits!
  33 *      op_flags        Flags common to all operations.  See OPf_* below.
  34 *      op_private      Flags peculiar to a particular operation (BUT,
  35 *                      by default, set to the number of children until
  36 *                      the operation is privatized by a check routine,
  37 *                      which may or may not check number of children).
  38 */
  39
  40#define OPCODE U16
  41
  42#ifdef PERL_MAD
  43#  define MADPROP_IN_BASEOP     MADPROP*        op_madprop;
  44#else
  45#  define MADPROP_IN_BASEOP
  46#endif
  47
  48typedef PERL_BITFIELD16 Optype;
  49
  50#ifdef BASEOP_DEFINITION
  51#define BASEOP BASEOP_DEFINITION
  52#else
  53#define BASEOP                          \
  54    OP*         op_next;                \
  55    OP*         op_sibling;             \
  56    OP*         (CPERLscope(*op_ppaddr))(pTHX);         \
  57    MADPROP_IN_BASEOP                   \
  58    PADOFFSET   op_targ;                \
  59    PERL_BITFIELD16 op_type:9;          \
  60    PERL_BITFIELD16 op_opt:1;           \
  61    PERL_BITFIELD16 op_latefree:1;      \
  62    PERL_BITFIELD16 op_latefreed:1;     \
  63    PERL_BITFIELD16 op_attached:1;      \
  64    PERL_BITFIELD16 op_spare:3;         \
  65    U8          op_flags;               \
  66    U8          op_private;
  67#endif
  68
  69/* If op_type:9 is changed to :10, also change PUSHEVAL in cop.h.
  70   Also, if the type of op_type is ever changed (e.g. to PERL_BITFIELD32)
  71   then all the other bit-fields before/after it should change their
  72   types too to let VC pack them into the same 4 byte integer.*/
  73
  74#define OP_GIMME(op,dfl) \
  75        (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
  76         ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
  77         ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
  78         dfl)
  79
  80#define OP_GIMME_REVERSE(flags)                 \
  81        ((flags & G_VOID) ? OPf_WANT_VOID :     \
  82        (flags & G_ARRAY) ? OPf_WANT_LIST :     \
  83                            OPf_WANT_SCALAR)
  84
  85/*
  86=head1 "Gimme" Values
  87
  88=for apidoc Amn|U32|GIMME_V
  89The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
  90C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
  91respectively.
  92
  93=for apidoc Amn|U32|GIMME
  94A backward-compatible version of C<GIMME_V> which can only return
  95C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
  96Deprecated.  Use C<GIMME_V> instead.
  97
  98=cut
  99*/
 100
 101#define GIMME_V         OP_GIMME(PL_op, block_gimme())
 102
 103/* Public flags */
 104
 105#define OPf_WANT        3       /* Mask for "want" bits: */
 106#define  OPf_WANT_VOID   1      /*   Want nothing */
 107#define  OPf_WANT_SCALAR 2      /*   Want single value */
 108#define  OPf_WANT_LIST   3      /*   Want list of any length */
 109#define OPf_KIDS        4       /* There is a firstborn child. */
 110#define OPf_PARENS      8       /* This operator was parenthesized. */
 111                                /*  (Or block needs explicit scope entry.) */
 112#define OPf_REF         16      /* Certified reference. */
 113                                /*  (Return container, not containee). */
 114#define OPf_MOD         32      /* Will modify (lvalue). */
 115#define OPf_STACKED     64      /* Some arg is arriving on the stack. */
 116#define OPf_SPECIAL     128     /* Do something weird for this op: */
 117                                /*  On local LVAL, don't init local value. */
 118                                /*  On OP_CONST, value is the hints hash for
 119                                    eval, so return a copy from pp_const() */
 120                                /*  On OP_SORT, subroutine is inlined. */
 121                                /*  On OP_NOT, inversion was implicit. */
 122                                /*  On OP_LEAVE, don't restore curpm. */
 123                                /*  On truncate, we truncate filehandle */
 124                                /*  On control verbs, we saw no label */
 125                                /*  On flipflop, we saw ... instead of .. */
 126                                /*  On UNOPs, saw bare parens, e.g. eof(). */
 127                                /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
 128                                /*  On OP_EXISTS, treat av as av, not avhv.  */
 129                                /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
 130                                /*  On OP_ENTERITER, loop var is per-thread */
 131                                /*  On pushre, rx is used as part of split, e.g. split " " */
 132                                /*  On regcomp, "use re 'eval'" was in scope */
 133                                /*  On OP_READLINE, was <$filehandle> */
 134                                /*  On RV2[ACGHS]V, don't create GV--in
 135                                    defined()*/
 136                                /*  On OP_DBSTATE, indicates breakpoint
 137                                 *    (runtime property) */
 138                                /*  On OP_AELEMFAST, indiciates pad var */
 139                                /*  On OP_REQUIRE, was seen as CORE::require */
 140                                /*  On OP_ENTERWHEN, there's no condition */
 141                                /*  On OP_BREAK, an implicit break */
 142                                /*  On OP_SMARTMATCH, an implicit smartmatch */
 143                                /*  On OP_ANONHASH and OP_ANONLIST, create a
 144                                    reference to the new anon hash or array */
 145
 146/* old names; don't use in new code, but don't break them, either */
 147#define OPf_LIST        OPf_WANT_LIST
 148#define OPf_KNOW        OPf_WANT
 149
 150#define GIMME \
 151          (PL_op->op_flags & OPf_WANT                                   \
 152           ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST             \
 153              ? G_ARRAY                                                 \
 154              : G_SCALAR)                                               \
 155           : dowantarray())
 156
 157/* NOTE: OP_NEXTSTATE, OP_DBSTATE, and OP_SETSTATE (i.e. COPs) carry lower
 158 * bits of PL_hints in op_private */
 159
 160/* Private for lvalues */
 161#define OPpLVAL_INTRO   128     /* Lvalue must be localized or lvalue sub */
 162
 163/* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */
 164#define OPpREFCOUNTED           64      /* op_targ carries a refcount */
 165
 166/* Private for OP_AASSIGN */
 167#define OPpASSIGN_COMMON        64      /* Left & right have syms in common. */
 168
 169/* Private for OP_SASSIGN */
 170#define OPpASSIGN_BACKWARDS     64      /* Left & right switched. */
 171#define OPpASSIGN_CV_TO_GV      128     /* Possible optimisation for constants. */
 172
 173/* Private for OP_MATCH and OP_SUBST{,CONST} */
 174#define OPpRUNTIME              64      /* Pattern coming in on the stack */
 175
 176/* Private for OP_TRANS */
 177#define OPpTRANS_FROM_UTF       1
 178#define OPpTRANS_TO_UTF         2
 179#define OPpTRANS_IDENTICAL      4       /* right side is same as left */
 180#define OPpTRANS_SQUASH         8
 181    /* 16 is used for OPpTARGET_MY */
 182#define OPpTRANS_COMPLEMENT     32
 183#define OPpTRANS_GROWS          64
 184#define OPpTRANS_DELETE         128
 185#define OPpTRANS_ALL    (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
 186
 187/* Private for OP_REPEAT */
 188#define OPpREPEAT_DOLIST        64      /* List replication. */
 189
 190/* Private for OP_RV2GV, OP_RV2SV, OP_AELEM, OP_HELEM, OP_PADSV */
 191#define OPpDEREF                (32|64) /* autovivify: Want ref to something: */
 192#define OPpDEREF_AV             32      /*   Want ref to AV. */
 193#define OPpDEREF_HV             64      /*   Want ref to HV. */
 194#define OPpDEREF_SV             (32|64) /*   Want ref to SV. */
 195  /* OP_ENTERSUB only */
 196#define OPpENTERSUB_DB          16      /* Debug subroutine. */
 197#define OPpENTERSUB_HASTARG     32      /* Called from OP tree. */
 198#define OPpENTERSUB_NOMOD       64      /* Immune to mod() for :attrlist. */
 199  /* OP_ENTERSUB and OP_RV2CV only */
 200#define OPpENTERSUB_AMPER       8       /* Used & form to call. */
 201#define OPpENTERSUB_NOPAREN     128     /* bare sub call (without parens) */
 202#define OPpENTERSUB_INARGS      4       /* Lval used as arg to a sub. */
 203  /* OP_GV only */
 204#define OPpEARLY_CV             32      /* foo() called before sub foo was parsed */
 205  /* OP_?ELEM only */
 206#define OPpLVAL_DEFER           16      /* Defer creation of array/hash elem */
 207  /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */
 208#define OPpOUR_INTRO            16      /* Variable was in an our() */
 209  /* OP_RV2[AGH]V, OP_PAD[AH]V, OP_[AH]ELEM */
 210#define OPpMAYBE_LVSUB          8       /* We might be an lvalue to return */
 211  /* OP_PADSV only */
 212#define OPpPAD_STATE            16      /* is a "state" pad */
 213  /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
 214
 215  /* OP_RV2GV only */
 216#define OPpDONT_INIT_GV         4       /* Call gv_fetchpv with GV_NOINIT */
 217/* (Therefore will return whatever is currently in the symbol table, not
 218   guaranteed to be a PVGV)  */
 219
 220  /* OP_RV2CV only */
 221#define OPpMAY_RETURN_CONSTANT  1       /* If a constant sub, return the constant */
 222
 223/* Private for OPs with TARGLEX */
 224  /* (lower bits may carry MAXARG) */
 225#define OPpTARGET_MY            16      /* Target is PADMY. */
 226
 227/* Private for OP_ENTERITER and OP_ITER */
 228#define OPpITER_REVERSED        4       /* for (reverse ...) */
 229#define OPpITER_DEF             8       /* for $_ or for my $_ */
 230
 231/* Private for OP_CONST */
 232#define OPpCONST_NOVER          2       /* no 6; */
 233#define OPpCONST_SHORTCIRCUIT   4       /* eg the constant 5 in (5 || foo) */
 234#define OPpCONST_STRICT         8       /* bearword subject to strict 'subs' */
 235#define OPpCONST_ENTERED        16      /* Has been entered as symbol. */
 236#define OPpCONST_ARYBASE        32      /* Was a $[ translated to constant. */
 237#define OPpCONST_BARE           64      /* Was a bare word (filehandle?). */
 238#define OPpCONST_WARNING        128     /* Was a $^W translated to constant. */
 239
 240/* Private for OP_FLIP/FLOP */
 241#define OPpFLIP_LINENUM         64      /* Range arg potentially a line num. */
 242
 243/* Private for OP_LIST */
 244#define OPpLIST_GUESSED         64      /* Guessed that pushmark was needed. */
 245
 246/* Private for OP_DELETE */
 247#define OPpSLICE                64      /* Operating on a list of keys */
 248
 249/* Private for OP_EXISTS */
 250#define OPpEXISTS_SUB           64      /* Checking for &sub, not {} or [].  */
 251
 252/* Private for OP_SORT */
 253#define OPpSORT_NUMERIC         1       /* Optimized away { $a <=> $b } */
 254#define OPpSORT_INTEGER         2       /* Ditto while under "use integer" */
 255#define OPpSORT_REVERSE         4       /* Reversed sort */
 256#define OPpSORT_INPLACE         8       /* sort in-place; eg @a = sort @a */
 257#define OPpSORT_DESCEND         16      /* Descending sort */
 258#define OPpSORT_QSORT           32      /* Use quicksort (not mergesort) */
 259#define OPpSORT_STABLE          64      /* Use a stable algorithm */
 260
 261/* Private for OP_OPEN and OP_BACKTICK */
 262#define OPpOPEN_IN_RAW          16      /* binmode(F,":raw") on input fh */
 263#define OPpOPEN_IN_CRLF         32      /* binmode(F,":crlf") on input fh */
 264#define OPpOPEN_OUT_RAW         64      /* binmode(F,":raw") on output fh */
 265#define OPpOPEN_OUT_CRLF        128     /* binmode(F,":crlf") on output fh */
 266
 267/* Private for OP_EXIT, HUSH also for OP_DIE */
 268#define OPpHUSH_VMSISH          64      /* hush DCL exit msg vmsish mode*/
 269#define OPpEXIT_VMSISH          128     /* exit(0) vs. exit(1) vmsish mode*/
 270
 271/* Private for OP_FTXXX */
 272#define OPpFT_ACCESS            2       /* use filetest 'access' */
 273#define OPpFT_STACKED           4       /* stacked filetest, as in "-f -x $f" */
 274#define OP_IS_FILETEST_ACCESS(op)               \
 275        (((op)->op_type) == OP_FTRREAD  ||      \
 276         ((op)->op_type) == OP_FTRWRITE ||      \
 277         ((op)->op_type) == OP_FTREXEC  ||      \
 278         ((op)->op_type) == OP_FTEREAD  ||      \
 279         ((op)->op_type) == OP_FTEWRITE ||      \
 280         ((op)->op_type) == OP_FTEEXEC)
 281
 282/* Private for OP_(MAP|GREP)(WHILE|START) */
 283#define OPpGREP_LEX             2       /* iterate over lexical $_ */
 284    
 285/* Private for OP_ENTEREVAL */
 286#define OPpEVAL_HAS_HH          2       /* Does it have a copy of %^H */
 287    
 288struct op {
 289    BASEOP
 290};
 291
 292struct unop {
 293    BASEOP
 294    OP *        op_first;
 295};
 296
 297struct binop {
 298    BASEOP
 299    OP *        op_first;
 300    OP *        op_last;
 301};
 302
 303struct logop {
 304    BASEOP
 305    OP *        op_first;
 306    OP *        op_other;
 307};
 308
 309struct listop {
 310    BASEOP
 311    OP *        op_first;
 312    OP *        op_last;
 313};
 314
 315struct pmop {
 316    BASEOP
 317    OP *        op_first;
 318    OP *        op_last;
 319#ifdef USE_ITHREADS
 320    IV          op_pmoffset;
 321#else
 322    REGEXP *    op_pmregexp;            /* compiled expression */
 323#endif
 324    U32         op_pmflags;
 325    union {
 326        OP *    op_pmreplroot;          /* For OP_SUBST */
 327#ifdef USE_ITHREADS
 328        PADOFFSET  op_pmtargetoff;      /* For OP_PUSHRE */
 329#else
 330        GV *    op_pmtargetgv;
 331#endif
 332    }   op_pmreplrootu;
 333    union {
 334        OP *    op_pmreplstart; /* Only used in OP_SUBST */
 335#ifdef USE_ITHREADS
 336        char *  op_pmstashpv;   /* Only used in OP_MATCH, with PMf_ONCE set */
 337#else
 338        HV *    op_pmstash;
 339#endif
 340    }           op_pmstashstartu;
 341};
 342
 343#ifdef USE_ITHREADS
 344#define PM_GETRE(o)     (INT2PTR(REGEXP*,SvIVX(PL_regex_pad[(o)->op_pmoffset])))
 345/* The assignment is just to enforce type safety (or at least get a warning).
 346 */
 347#define PM_SETRE(o,r)   STMT_START {                                    \
 348                            const REGEXP *const slosh = (r);            \
 349                            PM_SETRE_OFFSET((o), PTR2IV(slosh));        \
 350                        } STMT_END
 351/* Actually you can assign any IV, not just an offset. And really should it be
 352   UV? */
 353#define PM_SETRE_OFFSET(o,iv) \
 354                        STMT_START { \
 355                            SV* const sv = PL_regex_pad[(o)->op_pmoffset]; \
 356                            sv_setiv(sv, (iv)); \
 357                        } STMT_END
 358
 359#  ifndef PERL_CORE
 360/* No longer used anywhere in the core.  Migrate to Devel::PPPort?  */
 361#define PM_GETRE_SAFE(o) (PL_regex_pad ? PM_GETRE(o) : (REGEXP*)0)
 362#define PM_SETRE_SAFE(o,r) if (PL_regex_pad) PM_SETRE(o,r)
 363#  endif
 364#else
 365#define PM_GETRE(o)     ((o)->op_pmregexp)
 366#define PM_SETRE(o,r)   ((o)->op_pmregexp = (r))
 367#  ifndef PERL_CORE
 368#define PM_GETRE_SAFE PM_GETRE
 369#define PM_SETRE_SAFE PM_SETRE
 370#  endif
 371#endif
 372
 373
 374#define PMf_RETAINT     0x0001          /* taint $1 etc. if target tainted */
 375#define PMf_ONCE        0x0002          /* match successfully only once per
 376                                           reset, with related flag RXf_USED
 377                                           in re->extflags holding state.
 378                                           This is used only for ?? matches,
 379                                           and only on OP_MATCH and OP_QR */
 380
 381#define PMf_UNUSED      0x0004          /* free for use */
 382#define PMf_MAYBE_CONST 0x0008          /* replacement contains variables */
 383
 384#define PMf_USED        0x0010          /* PMf_ONCE has matched successfully.
 385                                           Not used under threading. */
 386
 387#define PMf_CONST       0x0040          /* subst replacement is constant */
 388#define PMf_KEEP        0x0080          /* keep 1st runtime pattern forever */
 389#define PMf_GLOBAL      0x0100          /* pattern had a g modifier */
 390#define PMf_CONTINUE    0x0200          /* don't reset pos() if //g fails */
 391#define PMf_EVAL        0x0400          /* evaluating replacement as expr */
 392
 393/* The following flags have exact equivalents in regcomp.h with the prefix RXf_
 394 * which are stored in the regexp->extflags member. If you change them here,
 395 * you have to change them there, and vice versa.
 396 */
 397#define PMf_LOCALE      0x00800         /* use locale for character types */
 398#define PMf_MULTILINE   0x01000         /* assume multiple lines */
 399#define PMf_SINGLELINE  0x02000         /* assume single line */
 400#define PMf_FOLD        0x04000         /* case insensitivity */
 401#define PMf_EXTENDED    0x08000         /* chuck embedded whitespace */
 402#define PMf_KEEPCOPY    0x10000         /* copy the string when matching */
 403
 404/* mask of bits that need to be transfered to re->extflags */
 405#define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED|PMf_KEEPCOPY)
 406
 407#ifdef USE_ITHREADS
 408
 409#  define PmopSTASHPV(o)                                                \
 410    (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstashpv : NULL)
 411#  if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
 412#    define PmopSTASHPV_set(o,pv)       ({                              \
 413        assert((o)->op_pmflags & PMf_ONCE);                             \
 414        ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv));        \
 415    })
 416#  else
 417#    define PmopSTASHPV_set(o,pv)                                       \
 418    ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv))
 419#  endif
 420#  define PmopSTASH(o)          (PmopSTASHPV(o) \
 421                                 ? gv_stashpv((o)->op_pmstashstartu.op_pmstashpv,GV_ADD) : NULL)
 422#  define PmopSTASH_set(o,hv)   PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : NULL))
 423#  define PmopSTASH_free(o)     PerlMemShared_free(PmopSTASHPV(o))
 424
 425#else
 426#  define PmopSTASH(o)                                                  \
 427    (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstash : NULL)
 428#  if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
 429#    define PmopSTASH_set(o,hv)         ({                              \
 430        assert((o)->op_pmflags & PMf_ONCE);                             \
 431        ((o)->op_pmstashstartu.op_pmstash = (hv));                      \
 432    })
 433#  else
 434#    define PmopSTASH_set(o,hv) ((o)->op_pmstashstartu.op_pmstash = (hv))
 435#  endif
 436#  define PmopSTASHPV(o)        (PmopSTASH(o) ? HvNAME_get(PmopSTASH(o)) : NULL)
 437   /* op_pmstashstartu.op_pmstash is not refcounted */
 438#  define PmopSTASHPV_set(o,pv) PmopSTASH_set((o), gv_stashpv(pv,GV_ADD))
 439/* Note that if this becomes non-empty, then S_forget_pmop in op.c will need
 440   changing */
 441#  define PmopSTASH_free(o)    
 442#endif
 443
 444struct svop {
 445    BASEOP
 446    SV *        op_sv;
 447};
 448
 449struct padop {
 450    BASEOP
 451    PADOFFSET   op_padix;
 452};
 453
 454struct pvop {
 455    BASEOP
 456    char *      op_pv;
 457};
 458
 459struct loop {
 460    BASEOP
 461    OP *        op_first;
 462    OP *        op_last;
 463    OP *        op_redoop;
 464    OP *        op_nextop;
 465    OP *        op_lastop;
 466};
 467
 468#define cUNOPx(o)       ((UNOP*)o)
 469#define cBINOPx(o)      ((BINOP*)o)
 470#define cLISTOPx(o)     ((LISTOP*)o)
 471#define cLOGOPx(o)      ((LOGOP*)o)
 472#define cPMOPx(o)       ((PMOP*)o)
 473#define cSVOPx(o)       ((SVOP*)o)
 474#define cPADOPx(o)      ((PADOP*)o)
 475#define cPVOPx(o)       ((PVOP*)o)
 476#define cCOPx(o)        ((COP*)o)
 477#define cLOOPx(o)       ((LOOP*)o)
 478
 479#define cUNOP           cUNOPx(PL_op)
 480#define cBINOP          cBINOPx(PL_op)
 481#define cLISTOP         cLISTOPx(PL_op)
 482#define cLOGOP          cLOGOPx(PL_op)
 483#define cPMOP           cPMOPx(PL_op)
 484#define cSVOP           cSVOPx(PL_op)
 485#define cPADOP          cPADOPx(PL_op)
 486#define cPVOP           cPVOPx(PL_op)
 487#define cCOP            cCOPx(PL_op)
 488#define cLOOP           cLOOPx(PL_op)
 489
 490#define cUNOPo          cUNOPx(o)
 491#define cBINOPo         cBINOPx(o)
 492#define cLISTOPo        cLISTOPx(o)
 493#define cLOGOPo         cLOGOPx(o)
 494#define cPMOPo          cPMOPx(o)
 495#define cSVOPo          cSVOPx(o)
 496#define cPADOPo         cPADOPx(o)
 497#define cPVOPo          cPVOPx(o)
 498#define cCOPo           cCOPx(o)
 499#define cLOOPo          cLOOPx(o)
 500
 501#define kUNOP           cUNOPx(kid)
 502#define kBINOP          cBINOPx(kid)
 503#define kLISTOP         cLISTOPx(kid)
 504#define kLOGOP          cLOGOPx(kid)
 505#define kPMOP           cPMOPx(kid)
 506#define kSVOP           cSVOPx(kid)
 507#define kPADOP          cPADOPx(kid)
 508#define kPVOP           cPVOPx(kid)
 509#define kCOP            cCOPx(kid)
 510#define kLOOP           cLOOPx(kid)
 511
 512
 513#ifdef USE_ITHREADS
 514#  define       cGVOPx_gv(o)    ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
 515#  define       IS_PADGV(v)     (v && SvTYPE(v) == SVt_PVGV && isGV_with_GP(v) \
 516                                 && GvIN_PAD(v))
 517#  define       IS_PADCONST(v)  (v && SvREADONLY(v))
 518#  define       cSVOPx_sv(v)    (cSVOPx(v)->op_sv \
 519                                 ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
 520#  define       cSVOPx_svp(v)   (cSVOPx(v)->op_sv \
 521                                 ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ))
 522#else
 523#  define       cGVOPx_gv(o)    ((GV*)cSVOPx(o)->op_sv)
 524#  define       IS_PADGV(v)     FALSE
 525#  define       IS_PADCONST(v)  FALSE
 526#  define       cSVOPx_sv(v)    (cSVOPx(v)->op_sv)
 527#  define       cSVOPx_svp(v)   (&cSVOPx(v)->op_sv)
 528#endif
 529
 530#define cGVOP_gv                cGVOPx_gv(PL_op)
 531#define cGVOPo_gv               cGVOPx_gv(o)
 532#define kGVOP_gv                cGVOPx_gv(kid)
 533#define cSVOP_sv                cSVOPx_sv(PL_op)
 534#define cSVOPo_sv               cSVOPx_sv(o)
 535#define kSVOP_sv                cSVOPx_sv(kid)
 536
 537#define Nullop ((OP*)NULL)
 538
 539/* Lowest byte-and-a-bit of PL_opargs */
 540#define OA_MARK 1
 541#define OA_FOLDCONST 2
 542#define OA_RETSCALAR 4
 543#define OA_TARGET 8
 544#define OA_RETINTEGER 16
 545#define OA_OTHERINT 32
 546#define OA_DANGEROUS 64
 547#define OA_DEFGV 128
 548#define OA_TARGLEX 256
 549
 550/* The next 4 bits encode op class information */
 551#define OCSHIFT 9
 552
 553#define OA_CLASS_MASK (15 << OCSHIFT)
 554
 555#define OA_BASEOP (0 << OCSHIFT)
 556#define OA_UNOP (1 << OCSHIFT)
 557#define OA_BINOP (2 << OCSHIFT)
 558#define OA_LOGOP (3 << OCSHIFT)
 559#define OA_LISTOP (4 << OCSHIFT)
 560#define OA_PMOP (5 << OCSHIFT)
 561#define OA_SVOP (6 << OCSHIFT)
 562#define OA_PADOP (7 << OCSHIFT)
 563#define OA_PVOP_OR_SVOP (8 << OCSHIFT)
 564#define OA_LOOP (9 << OCSHIFT)
 565#define OA_COP (10 << OCSHIFT)
 566#define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
 567#define OA_FILESTATOP (12 << OCSHIFT)
 568#define OA_LOOPEXOP (13 << OCSHIFT)
 569
 570#define OASHIFT 13
 571
 572/* Remaining nybbles of PL_opargs */
 573#define OA_SCALAR 1
 574#define OA_LIST 2
 575#define OA_AVREF 3
 576#define OA_HVREF 4
 577#define OA_CVREF 5
 578#define OA_FILEREF 6
 579#define OA_SCALARREF 7
 580#define OA_OPTIONAL 8
 581
 582/* Op_REFCNT is a reference count at the head of each op tree: needed
 583 * since the tree is shared between threads, and between cloned closure
 584 * copies in the same thread. OP_REFCNT_LOCK/UNLOCK is used when modifying
 585 * this count.
 586 * The same mutex is used to protect the refcounts of the reg_trie_data
 587 * and reg_ac_data structures, which are shared between duplicated
 588 * regexes.
 589 */
 590
 591#ifdef USE_ITHREADS
 592#  define OP_REFCNT_INIT                MUTEX_INIT(&PL_op_mutex)
 593#  ifdef PERL_CORE
 594#    define OP_REFCNT_LOCK              MUTEX_LOCK(&PL_op_mutex)
 595#    define OP_REFCNT_UNLOCK            MUTEX_UNLOCK(&PL_op_mutex)
 596#  else
 597#    define OP_REFCNT_LOCK              op_refcnt_lock()
 598#    define OP_REFCNT_UNLOCK            op_refcnt_unlock()
 599#  endif
 600#  define OP_REFCNT_TERM                MUTEX_DESTROY(&PL_op_mutex)
 601#else
 602#  define OP_REFCNT_INIT                NOOP
 603#  define OP_REFCNT_LOCK                NOOP
 604#  define OP_REFCNT_UNLOCK              NOOP
 605#  define OP_REFCNT_TERM                NOOP
 606#endif
 607
 608#define OpREFCNT_set(o,n)               ((o)->op_targ = (n))
 609#ifdef PERL_DEBUG_READONLY_OPS
 610#  define OpREFCNT_inc(o)               Perl_op_refcnt_inc(aTHX_ o)
 611#  define OpREFCNT_dec(o)               Perl_op_refcnt_dec(aTHX_ o)
 612#else
 613#  define OpREFCNT_inc(o)               ((o) ? (++(o)->op_targ, (o)) : NULL)
 614#  define OpREFCNT_dec(o)               (--(o)->op_targ)
 615#endif
 616
 617/* flags used by Perl_load_module() */
 618#define PERL_LOADMOD_DENY               0x1     /* no Module */
 619#define PERL_LOADMOD_NOIMPORT           0x2     /* use Module () */
 620#define PERL_LOADMOD_IMPORT_OPS         0x4     /* use Module (...) */
 621
 622#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C)
 623#define ref(o, type) doref(o, type, TRUE)
 624#endif
 625
 626/* no longer used anywhere in core */
 627#ifndef PERL_CORE
 628#define cv_ckproto(cv, gv, p) \
 629   cv_ckproto_len((cv), (gv), (p), (p) ? strlen(p) : 0)
 630#endif
 631
 632#ifdef USE_REENTRANT_API
 633#include "reentr.h"
 634#endif
 635
 636#if defined(PL_OP_SLAB_ALLOC)
 637#define NewOp(m,var,c,type)     \
 638        (var = (type *) Perl_Slab_Alloc(aTHX_ c*sizeof(type)))
 639#define NewOpSz(m,var,size)     \
 640        (var = (OP *) Perl_Slab_Alloc(aTHX_ size))
 641#define FreeOp(p) Perl_Slab_Free(aTHX_ p)
 642#else
 643#define NewOp(m, var, c, type)  \
 644        (var = (MEM_WRAP_CHECK_(c,type) \
 645         (type*)PerlMemShared_calloc(c, sizeof(type))))
 646#define NewOpSz(m, var, size)   \
 647        (var = (OP*)PerlMemShared_calloc(1, size))
 648#define FreeOp(p) PerlMemShared_free(p)
 649#endif
 650
 651#ifdef PERL_MAD
 652#  define MAD_NULL 1
 653#  define MAD_PV 2
 654#  define MAD_OP 3
 655#  define MAD_SV 4
 656
 657struct madprop {
 658    MADPROP* mad_next;
 659    const void *mad_val;
 660    U32 mad_vlen;
 661/*    short mad_count; */
 662    char mad_key;
 663    char mad_type;
 664};
 665
 666struct token {
 667    I32 tk_type;
 668    YYSTYPE tk_lval;
 669    MADPROP* tk_mad;
 670};
 671#endif
 672
 673/*
 674 * Values that can be held by mad_key :
 675 * ^       unfilled head spot
 676 * ,       literal ,
 677 * ;       literal ; (blank if implicit ; at end of block)
 678 * :       literal : from ?: or attr list
 679 * +       unary +
 680 * ?       literal ? from ?:
 681 * (       literal (
 682 * )       literal )
 683 * [       literal [
 684 * ]       literal ]
 685 * {       literal {
 686 * }       literal }
 687 * @       literal @ sigil
 688 * $       literal $ sigil
 689 * *       literal * sigil
 690 * !       use is source filtered
 691 * &       & or sub
 692 * #       whitespace/comment following ; or }
 693 * #       $# sigil
 694 * 1       1st ; from for(;;)
 695 * 1       retired protasis
 696 * 2       2nd ; from for(;;)
 697 * 2       retired apodosis
 698 * 3       C-style for list
 699 * a       sub or var attributes
 700 * a       non-method arrow operator
 701 * A       method arrow operator
 702 * A       use import args
 703 * b       format block
 704 * B       retired stub block
 705 * C       constant conditional op
 706 * d       declarator
 707 * D       do block
 708 * e       unreached "else" (see C)
 709 * e       expression producing E
 710 * E       tr/E/R/, /E/
 711 * f       folded constant op
 712 * F       peg op for format
 713 * g       op was forced to be a word
 714 * i       if/unless modifier
 715 * I       if/elsif/unless statement
 716 * k       local declarator
 717 * K       retired kid op
 718 * l       last index of array ($#foo)
 719 * L       label
 720 * m       modifier on regex
 721 * n       sub or format name
 722 * o       current operator/declarator name
 723 * o       else/continue
 724 * O       generic optimized op
 725 * p       peg to hold extra whitespace at statement level
 726 * P       peg op for package declaration
 727 * q       opening quote
 728 * =       quoted material
 729 * Q       closing quote
 730 * Q       optimized qw//
 731 * r       expression producing R
 732 * R       tr/E/R/ s/E/R/
 733 * s       sub signature
 734 * S       use import stub (no import)
 735 * S       retired sort block
 736 * t       unreached "then" (see C)
 737 * U       use import op
 738 * v       private sv of for loop
 739 * V       use version
 740 * w       while/until modifier
 741 * W       while/for statement
 742 * x       optimized qw
 743 * X       random thing
 744 * _       whitespace/comments preceding anything else
 745 * ~       =~ operator
 746 */
 747
 748/*
 749 * Local variables:
 750 * c-indentation-style: bsd
 751 * c-basic-offset: 4
 752 * indent-tabs-mode: t
 753 * End:
 754 *
 755 * ex: set ts=8 sts=4 sw=4 noet:
 756 */
 757
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.