home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / perl / Perl / op.h < prev    next >
C/C++ Source or Header  |  1995-06-22  |  7KB  |  251 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 U16 PADOFFSET;
  27.  
  28. #ifdef DEBUGGING
  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 OPpDEREF_DB        16    /* Debug subroutine. */
  87. #define OPpDEREF_AV        32    /* Want ref to AV. */
  88. #define OPpDEREF_HV        64    /* Want ref to HV. */
  89.  
  90. /* Private for OP_CONST */
  91. #define OPpCONST_ENTERED    16    /* Has been entered as symbol. */
  92. #define OPpCONST_ARYBASE    32    /* Was a $[ translated to constant. */
  93. #define OPpCONST_BARE        64    /* Was a bare word (filehandle?). */
  94.  
  95. /* Private for OP_FLIP/FLOP */
  96. #define OPpFLIP_LINENUM        64    /* Range arg potentially a line num. */
  97.  
  98. /* Private for OP_LIST */
  99. #define OPpLIST_GUESSED        64    /* Guessed that pushmark was needed. */
  100.  
  101. /* Private for OP_LEAVE and friends */
  102. #define OPpLEAVE_VOID        64    /* No need to copy out values. */
  103.  
  104. struct op {
  105.     BASEOP
  106. };
  107.  
  108. struct unop {
  109.     BASEOP
  110.     OP *    op_first;
  111. };
  112.  
  113. struct binop {
  114.     BASEOP
  115.     OP *    op_first;
  116.     OP *    op_last;
  117. };
  118.  
  119. struct logop {
  120.     BASEOP
  121.     OP *    op_first;
  122.     OP *    op_other;
  123. };
  124.  
  125. struct condop {
  126.     BASEOP
  127.     OP *    op_first;
  128.     OP *    op_true;
  129.     OP *    op_false;
  130. };
  131.  
  132. struct listop {
  133.     BASEOP
  134.     OP *    op_first;
  135.     OP *    op_last;
  136.     U32        op_children;
  137. };
  138.  
  139. struct pmop {
  140.     BASEOP
  141.     OP *    op_first;
  142.     OP *    op_last;
  143.     U32        op_children;
  144.     OP *    op_pmreplroot;
  145.     OP *    op_pmreplstart;
  146.     PMOP *    op_pmnext;        /* list of all scanpats */
  147.     REGEXP *    op_pmregexp;        /* compiled expression */
  148.     SV *    op_pmshort;        /* for a fast bypass of execute() */
  149.     U16        op_pmflags;
  150.     char    op_pmslen;
  151. };
  152.  
  153. #define PMf_USED    0x0001        /* pm has been used once already */
  154. #define PMf_ONCE    0x0002        /* use pattern only once per reset */
  155. #define PMf_SCANFIRST    0x0004        /* initial constant not anchored */
  156. #define PMf_ALL        0x0008        /* initial constant is whole pat */
  157. #define PMf_SKIPWHITE    0x0010        /* skip leading whitespace for split */
  158. #define PMf_FOLD    0x0020        /* case insensitivity */
  159. #define PMf_CONST    0x0040        /* subst replacement is constant */
  160. #define PMf_KEEP    0x0080        /* keep 1st runtime pattern forever */
  161. #define PMf_GLOBAL    0x0100        /* pattern had a g modifier */
  162. #define PMf_RUNTIME    0x0200        /* pattern coming in on the stack */
  163. #define PMf_EVAL    0x0400        /* evaluating replacement as expr */
  164. #define PMf_WHITE    0x0800        /* pattern is \s+ */
  165. #define PMf_MULTILINE    0x1000        /* assume multiple lines */
  166. #define PMf_SINGLELINE    0x2000        /* assume single line */
  167. #define PMf_UNUSED    0x4000        /* (unused) */
  168. #define PMf_EXTENDED    0x8000        /* chuck embedded whitespace */
  169.  
  170. struct svop {
  171.     BASEOP
  172.     SV *    op_sv;
  173. };
  174.  
  175. struct gvop {
  176.     BASEOP
  177.     GV *    op_gv;
  178. };
  179.  
  180. struct pvop {
  181.     BASEOP
  182.     char *    op_pv;
  183. };
  184.  
  185. struct cvop {
  186.     BASEOP
  187.     CV *    op_cv;
  188.     OP *    op_cont;
  189. };
  190.  
  191. struct loop {
  192.     BASEOP
  193.     OP *    op_first;
  194.     OP *    op_last;
  195.     U32        op_children;
  196.     OP *    op_redoop;
  197.     OP *    op_nextop;
  198.     OP *    op_lastop;
  199. };
  200.  
  201. #define cUNOP ((UNOP*)op)
  202. #define cBINOP ((BINOP*)op)
  203. #define cLISTOP ((LISTOP*)op)
  204. #define cLOGOP ((LOGOP*)op)
  205. #define cCONDOP ((CONDOP*)op)
  206. #define cPMOP ((PMOP*)op)
  207. #define cSVOP ((SVOP*)op)
  208. #define cGVOP ((GVOP*)op)
  209. #define cPVOP ((PVOP*)op)
  210. #define cCVOP ((CVOP*)op)
  211. #define cCOP ((COP*)op)
  212. #define cLOOP ((LOOP*)op)
  213.  
  214. #define kUNOP ((UNOP*)kid)
  215. #define kBINOP ((BINOP*)kid)
  216. #define kLISTOP ((LISTOP*)kid)
  217. #define kLOGOP ((LOGOP*)kid)
  218. #define kCONDOP ((CONDOP*)kid)
  219. #define kPMOP ((PMOP*)kid)
  220. #define kSVOP ((SVOP*)kid)
  221. #define kGVOP ((GVOP*)kid)
  222. #define kPVOP ((PVOP*)kid)
  223. #define kCVOP ((CVOP*)kid)
  224. #define kCOP ((COP*)kid)
  225. #define kLOOP ((LOOP*)kid)
  226.  
  227. #define Nullop Null(OP*)
  228.  
  229. /* Lowest byte of opargs */
  230. #define OA_MARK 1
  231. #define OA_FOLDCONST 2
  232. #define OA_RETSCALAR 4
  233. #define OA_TARGET 8
  234. #define OA_RETINTEGER 16
  235. #define OA_OTHERINT 32
  236. #define OA_DANGEROUS 64
  237. #define OA_DEFGV 128
  238.  
  239. #define OASHIFT 8
  240.  
  241. /* Remaining nybbles of opargs */
  242. #define OA_SCALAR 1
  243. #define OA_LIST 2
  244. #define OA_AVREF 3
  245. #define OA_HVREF 4
  246. #define OA_CVREF 5
  247. #define OA_FILEREF 6
  248. #define OA_SCALARREF 7
  249. #define OA_OPTIONAL 8
  250.  
  251.