Re: op_seq (was: Freeing code)
[p5sagit/p5-mst-13.2.git] / op.h
diff --git a/op.h b/op.h
index 7f9adc2..c9f1139 100644 (file)
--- a/op.h
+++ b/op.h
@@ -1,6 +1,7 @@
 /*    op.h
  *
- *    Copyright (c) 1991-2002, Larry Wall
+ *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ *    2000, 2001, 2002, 2003, by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *                     parent takes over role of remembering starting op.)
  *     op_ppaddr       Pointer to current ppcode's function.
  *     op_type         The type of the operation.
+ *     op_opt          Whether or not the op has been optimised by the
+ *                     peephole optimiser.
+ *     op_static       Whether or not the op is statically defined.
+ *                     This flag is used by the B::C compiler backend
+ *                     and indicates that the op should not be freed.
+ *     op_spare        Five spare bits!
  *     op_flags        Flags common to all operations.  See OPf_* below.
  *     op_private      Flags peculiar to a particular operation (BUT,
  *                     by default, set to the number of children until
     OP*                op_sibling;             \
     OP*                (CPERLscope(*op_ppaddr))(pTHX);         \
     PADOFFSET  op_targ;                \
-    OPCODE     op_type;                \
-    U16                op_seq;                 \
+    unsigned   op_type:9;              \
+    unsigned   op_opt:1;               \
+    unsigned   op_static:1;            \
+    unsigned   op_spare:5;             \
     U8         op_flags;               \
     U8         op_private;
 #endif
@@ -134,9 +143,11 @@ Deprecated.  Use C<GIMME_V> instead.
 #define OPpTRANS_TO_UTF                2
 #define OPpTRANS_IDENTICAL     4       /* right side is same as left */
 #define OPpTRANS_SQUASH                8
-#define OPpTRANS_DELETE                16
+    /* 16 is used for OPpTARGET_MY */
 #define OPpTRANS_COMPLEMENT    32
 #define OPpTRANS_GROWS         64
+#define OPpTRANS_DELETE                128
+#define OPpTRANS_ALL   (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
 
 /* Private for OP_REPEAT */
 #define OPpREPEAT_DOLIST       64      /* List replication. */
@@ -158,7 +169,7 @@ Deprecated.  Use C<GIMME_V> instead.
 #define OPpEARLY_CV            32      /* foo() called before sub foo was parsed */
   /* OP_?ELEM only */
 #define OPpLVAL_DEFER          16      /* Defer creation of array/hash elem */
-  /* OP_RV2?V, OP_GVSV only */
+  /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */
 #define OPpOUR_INTRO           16      /* Variable was in an our() */
   /* OP_RV2[AH]V, OP_PAD[AH]V, OP_[AH]ELEM */
 #define OPpMAYBE_LVSUB         8       /* We might be an lvalue to return */
@@ -191,6 +202,7 @@ Deprecated.  Use C<GIMME_V> instead.
 #define OPpSORT_NUMERIC                1       /* Optimized away { $a <=> $b } */
 #define OPpSORT_INTEGER                2       /* Ditto while under "use integer" */
 #define OPpSORT_REVERSE                4       /* Descending sort */
+#define OPpSORT_INPLACE                8       /* sort in-place; eg @a = sort @a */
 /* Private for OP_THREADSV */
 #define OPpDONE_SVREF          64      /* Been through newSVREF once */
 
@@ -204,6 +216,20 @@ Deprecated.  Use C<GIMME_V> instead.
 #define OPpHUSH_VMSISH         64      /* hush DCL exit msg vmsish mode*/
 #define OPpEXIT_VMSISH         128     /* exit(0) vs. exit(1) vmsish mode*/
 
+/* Private of OP_FTXXX */
+#define OPpFT_ACCESS           2       /* use filetest 'access' */
+#define OPpFT_STACKED          4       /* stacked filetest, as in "-f -x $f" */
+#define OP_IS_FILETEST_ACCESS(op)              \
+       (((op)->op_type) == OP_FTRREAD  ||      \
+        ((op)->op_type) == OP_FTRWRITE ||      \
+        ((op)->op_type) == OP_FTREXEC  ||      \
+        ((op)->op_type) == OP_FTEREAD  ||      \
+        ((op)->op_type) == OP_FTEWRITE ||      \
+        ((op)->op_type) == OP_FTEEXEC)
+
+/* Private for OP_(MAP|GREP)(WHILE|START) */
+#define OPpGREP_LEX            2       /* iterate over lexical $_ */
+    
 struct op {
     BASEOP
 };
@@ -472,3 +498,15 @@ struct loop {
 #include "reentr.h"
 #endif
 
+#if defined(PL_OP_SLAB_ALLOC)
+#define NewOp(m,var,c,type)    \
+       (var = (type *) Perl_Slab_Alloc(aTHX_ m,c*sizeof(type)))
+#define NewOpSz(m,var,size)    \
+       (var = (OP *) Perl_Slab_Alloc(aTHX_ m,size))
+#define FreeOp(p) Perl_Slab_Free(aTHX_ p)
+#else
+#define NewOp(m, var, c, type) Newz(m, var, c, type)
+#define NewOpSz(m, var, size)  \
+       (var = (OP*)safemalloc(size), memzero(var, size))
+#define FreeOp(p) Safefree(p)
+#endif