home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / perl-5.003-base.tgz / perl-5.003-base.tar / fsf / perl / op.h < prev    next >
C/C++ Source or Header  |  1996-01-28  |  7KB  |  245 lines

  1. /*    op.h
  2.  *
  3.  *    Copyright (c) 1991-1994, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. /*
  11.  * The fields of BASEOP are:
  12.  *    op_next        Pointer to next ppcode to execute after this one.
  13.  *            (Top level pre-grafted op points to first op,
  14.  *            but this is replaced when op is grafted in, when
  15.  *            this op will point to the real next op, and the new
  16.  *            parent takes over role of remembering starting op.)
  17.  *    op_ppaddr    Pointer to current ppcode's function.
  18.  *    op_type        The type of the operation.
  19.  *    op_flags    Flags common to all operations.  See OPf_* below.
  20.  *    op_private    Flags peculiar to a particular operation (BUT,
  21.  *            by default, set to the number of children until
  22.  *            the operation is privatized by a check routine,
  23.  *            which may or may not check number of children).
  24.  */
  25.  
  26. typedef U32 PADOFFSET;
  27.  
  28. #ifdef DEBUGGING_OPS
  29. #define OPCODE opcode
  30. #else
  31. #define OPCODE U16
  32. #endif
  33.  
  34. #define BASEOP                \
  35.     OP*        op_next;        \
  36.     OP*        op_sibling;        \
  37.     OP*        (*op_ppaddr)();        \
  38.     PADOFFSET    op_targ;        \
  39.     OPCODE    op_type;        \
  40.     U16        op_seq;            \
  41.     U8        op_flags;        \
  42.     U8        op_private;
  43.  
  44. #define GIMME (op->op_flags & OPf_KNOW ? op->op_flags & OPf_LIST : dowantarray())
  45.  
  46. /* Public flags */
  47. #define OPf_LIST    1    /* Do operator in list context. */
  48. #define OPf_KNOW    2    /* Context is known. */
  49. #define OPf_KIDS    4    /* There is a firstborn child. */
  50. #define OPf_PARENS    8    /* This operator was parenthesized. */
  51.                 /*  (Or block needs explicit scope entry.) */
  52. #define OPf_REF        16    /* Certified reference. */
  53.                 /*  (Return container, not containee). */
  54. #define OPf_MOD        32    /* Will modify (lvalue). */
  55. #define OPf_STACKED    64    /* Some arg is arriving on the stack. */
  56. #define OPf_SPECIAL    128    /* Do something weird for this op: */
  57.                 /*  On local LVAL, don't init local value. */
  58.                 /*  On OP_SORT, subroutine is inlined. */
  59.                 /*  On OP_NOT, inversion was implicit. */
  60.                 /*  On OP_LEAVE, don't restore curpm. */
  61.                 /*  On truncate, we truncate filehandle */
  62.                 /*  On control verbs, we saw no label */
  63.                 /*  On flipflop, we saw ... instead of .. */
  64.                 /*  On UNOPs, saw bare parens, e.g. eof(). */
  65.                 /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
  66.  
  67. /* Private for lvalues */
  68. #define OPpLVAL_INTRO    128    /* Lvalue must be localized */
  69.  
  70. /* Private for OP_AASSIGN */
  71. #define OPpASSIGN_COMMON    64    /* Left & right have syms in common. */
  72.  
  73. /* Private for OP_SASSIGN */
  74. #define OPpASSIGN_BACKWARDS    64    /* Left & right switched. */
  75.  
  76. /* Private for OP_TRANS */
  77. #define OPpTRANS_SQUASH        16
  78. #define OPpTRANS_DELETE        32
  79. #define OPpTRANS_COMPLEMENT    64
  80.  
  81. /* Private for OP_REPEAT */
  82. #define OPpREPEAT_DOLIST    64    /* List replication. */
  83.  
  84. /* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */
  85.   /* (lower bits carry hints) */
  86. #define OPpENTERSUB_AMPER    8    /* Used & form to call. */
  87. #define OPpENTERSUB_DB        16    /* Debug subroutine. */
  88. #define OPpDEREF_AV        32    /* Want ref to AV. */
  89. #define OPpDEREF_HV        64    /* Want ref to HV. */
  90.  
  91. /* Private for OP_CONST */
  92. #define OPpCONST_ENTERED    16    /* Has been entered as symbol. */
  93. #define OPpCONST_ARYBASE    32    /* Was a $[ translated to constant. */
  94. #define OPpCONST_BARE        64    /* Was a bare word (filehandle?). */
  95.  
  96. /* Private for OP_FLIP/FLOP */
  97. #define OPpFLIP_LINENUM        64    /* Range arg potentially a line num. */
  98.  
  99. /* Private for OP_LIST */
  100. #define OPpLIST_GUESSED        64    /* Guessed that pushmark was needed. */
  101.  
  102. /* Private for OP_LEAVE and friends */
  103. #define OPpLEAVE_VOID        64    /* No need to copy out values. */
  104.  
  105. struct op {
  106.     BASEOP
  107. };
  108.  
  109. struct unop {
  110.     BASEOP
  111.     OP *    op_first;
  112. };
  113.  
  114. struct binop {
  115.     BASEOP
  116.     OP *    op_first;
  117.     OP *    op_last;
  118. };
  119.  
  120. struct logop {
  121.     BASEOP
  122.     OP *    op_first;
  123.     OP *    op_other;
  124. };
  125.  
  126. struct condop {
  127.     BASEOP
  128.     OP *    op_first;
  129.     OP *    op_true;
  130.     OP *    op_false;
  131. };
  132.  
  133. struct listop {
  134.     BASEOP
  135.     OP *    op_first;
  136.     OP *    op_last;
  137.     U32        op_children;
  138. };
  139.  
  140. struct pmop {
  141.     BASEOP
  142.     OP *    op_first;
  143.     OP *    op_last;
  144.     U32        op_children;
  145.     OP *    op_pmreplroot;
  146.     OP *    op_pmreplstart;
  147.     PMOP *    op_pmnext;        /* list of all scanpats */
  148.     REGEXP *    op_pmregexp;        /* compiled expression */
  149.     SV *    op_pmshort;        /* for a fast bypass of execute() */
  150.     U16        op_pmflags;
  151.     U16        op_pmpermflags;
  152.     char    op_pmslen;
  153. };
  154.  
  155. #define PMf_USED    0x0001        /* pm has been used once already */
  156. #define PMf_ONCE    0x0002        /* use pattern only once per reset */
  157. #define PMf_SCANFIRST    0x0004        /* initial constant not anchored */
  158. #define PMf_ALL        0x0008        /* initial constant is whole pat */
  159. #define PMf_SKIPWHITE    0x0010        /* skip leading whitespace for split */
  160. #define PMf_FOLD    0x0020        /* case insensitivity */
  161. #define PMf_CONST    0x0040        /* subst replacement is constant */
  162. #define PMf_KEEP    0x0080        /* keep 1st runtime pattern forever */
  163. #define PMf_GLOBAL    0x0100        /* pattern had a g modifier */
  164. #define PMf_RUNTIME    0x0200        /* pattern coming in on the stack */
  165. #define PMf_EVAL    0x0400        /* evaluating replacement as expr */
  166. #define PMf_WHITE    0x0800        /* pattern is \s+ */
  167. #define PMf_MULTILINE    0x1000        /* assume multiple lines */
  168. #define PMf_SINGLELINE    0x2000        /* assume single line */
  169. #define PMf_UNUSED    0x4000        /* (unused) */
  170. #define PMf_EXTENDED    0x8000        /* chuck embedded whitespace */
  171.  
  172. struct svop {
  173.     BASEOP
  174.     SV *    op_sv;
  175. };
  176.  
  177. struct gvop {
  178.     BASEOP
  179.     GV *    op_gv;
  180. };
  181.  
  182. struct pvop {
  183.     BASEOP
  184.     char *    op_pv;
  185. };
  186.  
  187. struct loop {
  188.     BASEOP
  189.     OP *    op_first;
  190.     OP *    op_last;
  191.     U32        op_children;
  192.     OP *    op_redoop;
  193.     OP *    op_nextop;
  194.     OP *    op_lastop;
  195. };
  196.  
  197. #define cUNOP ((UNOP*)op)
  198. #define cBINOP ((BINOP*)op)
  199. #define cLISTOP ((LISTOP*)op)
  200. #define cLOGOP ((LOGOP*)op)
  201. #define cCONDOP ((CONDOP*)op)
  202. #define cPMOP ((PMOP*)op)
  203. #define cSVOP ((SVOP*)op)
  204. #define cGVOP ((GVOP*)op)
  205. #define cPVOP ((PVOP*)op)
  206. #define cCOP ((COP*)op)
  207. #define cLOOP ((LOOP*)op)
  208.  
  209. #define kUNOP ((UNOP*)kid)
  210. #define kBINOP ((BINOP*)kid)
  211. #define kLISTOP ((LISTOP*)kid)
  212. #define kLOGOP ((LOGOP*)kid)
  213. #define kCONDOP ((CONDOP*)kid)
  214. #define kPMOP ((PMOP*)kid)
  215. #define kSVOP ((SVOP*)kid)
  216. #define kGVOP ((GVOP*)kid)
  217. #define kPVOP ((PVOP*)kid)
  218. #define kCOP ((COP*)kid)
  219. #define kLOOP ((LOOP*)kid)
  220.  
  221. #define Nullop Null(OP*)
  222.  
  223. /* Lowest byte of opargs */
  224. #define OA_MARK 1
  225. #define OA_FOLDCONST 2
  226. #define OA_RETSCALAR 4
  227. #define OA_TARGET 8
  228. #define OA_RETINTEGER 16
  229. #define OA_OTHERINT 32
  230. #define OA_DANGEROUS 64
  231. #define OA_DEFGV 128
  232.  
  233. #define OASHIFT 8
  234.  
  235. /* Remaining nybbles of opargs */
  236. #define OA_SCALAR 1
  237. #define OA_LIST 2
  238. #define OA_AVREF 3
  239. #define OA_HVREF 4
  240. #define OA_CVREF 5
  241. #define OA_FILEREF 6
  242. #define OA_SCALARREF 7
  243. #define OA_OPTIONAL 8
  244.  
  245.