home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / MacPerl 5.0.3 / MacPerl Source ƒ / Perl5 / op.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-26  |  6.3 KB  |  249 lines  |  [TEXT/MPS ]

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