home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 7: Programming / CDAT7.iso / Share / Editores / Perl5 / perl / lib / CORE / op.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-10  |  7.4 KB  |  272 lines

  1. /*    op.h
  2.  *
  3.  *    Copyright (c) 1991-1997, 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 OP_GIMME(op,dfl) \
  45.     (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
  46.      ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
  47.      ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
  48.      dfl)
  49.  
  50. #define GIMME_V        OP_GIMME(op, block_gimme())
  51.  
  52. /* Public flags */
  53.  
  54. #define OPf_WANT    3    /* Mask for "want" bits: */
  55. #define  OPf_WANT_VOID     1    /*   Want nothing */
  56. #define  OPf_WANT_SCALAR 2    /*   Want single value */
  57. #define  OPf_WANT_LIST     3    /*   Want list of any length */
  58. #define OPf_KIDS    4    /* There is a firstborn child. */
  59. #define OPf_PARENS    8    /* This operator was parenthesized. */
  60.                 /*  (Or block needs explicit scope entry.) */
  61. #define OPf_REF        16    /* Certified reference. */
  62.                 /*  (Return container, not containee). */
  63. #define OPf_MOD        32    /* Will modify (lvalue). */
  64. #define OPf_STACKED    64    /* Some arg is arriving on the stack. */
  65. #define OPf_SPECIAL    128    /* Do something weird for this op: */
  66.                 /*  On local LVAL, don't init local value. */
  67.                 /*  On OP_SORT, subroutine is inlined. */
  68.                 /*  On OP_NOT, inversion was implicit. */
  69.                 /*  On OP_LEAVE, don't restore curpm. */
  70.                 /*  On truncate, we truncate filehandle */
  71.                 /*  On control verbs, we saw no label */
  72.                 /*  On flipflop, we saw ... instead of .. */
  73.                 /*  On UNOPs, saw bare parens, e.g. eof(). */
  74.                 /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
  75.                 /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
  76.  
  77. /* old names; don't use in new code, but don't break them, either */
  78. #define OPf_LIST    1
  79. #define OPf_KNOW    2
  80. #define GIMME \
  81.       (op->op_flags & OPf_KNOW ? op->op_flags & OPf_LIST : dowantarray())
  82.  
  83. /* Private for lvalues */
  84. #define OPpLVAL_INTRO    128    /* Lvalue must be localized */
  85.  
  86. /* Private for OP_AASSIGN */
  87. #define OPpASSIGN_COMMON    64    /* Left & right have syms in common. */
  88.  
  89. /* Private for OP_SASSIGN */
  90. #define OPpASSIGN_BACKWARDS    64    /* Left & right switched. */
  91.  
  92. /* Private for OP_MATCH and OP_SUBST{,CONST} */
  93. #define OPpRUNTIME        64    /* Pattern coming in on the stack */
  94.  
  95. /* Private for OP_TRANS */
  96. #define OPpTRANS_SQUASH        16
  97. #define OPpTRANS_DELETE        32
  98. #define OPpTRANS_COMPLEMENT    64
  99.  
  100. /* Private for OP_REPEAT */
  101. #define OPpREPEAT_DOLIST    64    /* List replication. */
  102.  
  103. /* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */
  104. #define OPpDEREF        (32|64)    /* Want ref to something: */
  105. #define OPpDEREF_AV        32    /*   Want ref to AV. */
  106. #define OPpDEREF_HV        64    /*   Want ref to HV. */
  107. #define OPpDEREF_SV        (32|64)    /*   Want ref to SV. */
  108.   /* OP_ENTERSUB only */
  109. #define OPpENTERSUB_DB        16    /* Debug subroutine. */
  110. #define OPpENTERSUB_AMPER    8    /* Used & form to call. */
  111.   /* OP_?ELEM only */
  112. #define OPpLVAL_DEFER        16    /* Defer creation of array/hash elem */
  113.   /* for OP_RV2?V, lower bits carry hints */
  114.  
  115. /* Private for OP_CONST */
  116. #define OPpCONST_ENTERED    16    /* Has been entered as symbol. */
  117. #define OPpCONST_ARYBASE    32    /* Was a $[ translated to constant. */
  118. #define OPpCONST_BARE        64    /* Was a bare word (filehandle?). */
  119.  
  120. /* Private for OP_FLIP/FLOP */
  121. #define OPpFLIP_LINENUM        64    /* Range arg potentially a line num. */
  122.  
  123. /* Private for OP_LIST */
  124. #define OPpLIST_GUESSED        64    /* Guessed that pushmark was needed. */
  125.  
  126. /* Private for OP_DELETE */
  127. #define OPpSLICE        64    /* Operating on a list of keys */
  128.  
  129. /* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */
  130. #define OPpLOCALE        64    /* Use locale */
  131.  
  132. struct op {
  133.     BASEOP
  134. };
  135.  
  136. struct unop {
  137.     BASEOP
  138.     OP *    op_first;
  139. };
  140.  
  141. struct binop {
  142.     BASEOP
  143.     OP *    op_first;
  144.     OP *    op_last;
  145. };
  146.  
  147. struct logop {
  148.     BASEOP
  149.     OP *    op_first;
  150.     OP *    op_other;
  151. };
  152.  
  153. struct condop {
  154.     BASEOP
  155.     OP *    op_first;
  156.     OP *    op_true;
  157.     OP *    op_false;
  158. };
  159.  
  160. struct listop {
  161.     BASEOP
  162.     OP *    op_first;
  163.     OP *    op_last;
  164.     U32        op_children;
  165. };
  166.  
  167. struct pmop {
  168.     BASEOP
  169.     OP *    op_first;
  170.     OP *    op_last;
  171.     U32        op_children;
  172.     OP *    op_pmreplroot;
  173.     OP *    op_pmreplstart;
  174.     PMOP *    op_pmnext;        /* list of all scanpats */
  175.     REGEXP *    op_pmregexp;        /* compiled expression */
  176.     SV *    op_pmshort;        /* for a fast bypass of execute() */
  177.     U16        op_pmflags;
  178.     U16        op_pmpermflags;
  179.     char    op_pmslen;
  180. };
  181.  
  182. #define PMf_USED    0x0001        /* pm has been used once already */
  183. #define PMf_ONCE    0x0002        /* use pattern only once per reset */
  184. #define PMf_SCANFIRST    0x0004        /* initial constant not anchored */
  185. #define PMf_ALL        0x0008        /* initial constant is whole pat */
  186. #define PMf_SKIPWHITE    0x0010        /* skip leading whitespace for split */
  187. #define PMf_FOLD    0x0020        /* case insensitivity */
  188. #define PMf_CONST    0x0040        /* subst replacement is constant */
  189. #define PMf_KEEP    0x0080        /* keep 1st runtime pattern forever */
  190. #define PMf_GLOBAL    0x0100        /* pattern had a g modifier */
  191. #define PMf_CONTINUE    0x0200        /* don't reset pos() if //g fails */
  192. #define PMf_EVAL    0x0400        /* evaluating replacement as expr */
  193. #define PMf_WHITE    0x0800        /* pattern is \s+ */
  194. #define PMf_MULTILINE    0x1000        /* assume multiple lines */
  195. #define PMf_SINGLELINE    0x2000        /* assume single line */
  196. #define PMf_LOCALE    0x4000        /* use locale for character types */
  197. #define PMf_EXTENDED    0x8000        /* chuck embedded whitespace */
  198.  
  199. struct svop {
  200.     BASEOP
  201.     SV *    op_sv;
  202. };
  203.  
  204. struct gvop {
  205.     BASEOP
  206.     GV *    op_gv;
  207. };
  208.  
  209. struct pvop {
  210.     BASEOP
  211.     char *    op_pv;
  212. };
  213.  
  214. struct loop {
  215.     BASEOP
  216.     OP *    op_first;
  217.     OP *    op_last;
  218.     U32        op_children;
  219.     OP *    op_redoop;
  220.     OP *    op_nextop;
  221.     OP *    op_lastop;
  222. };
  223.  
  224. #define cUNOP ((UNOP*)op)
  225. #define cBINOP ((BINOP*)op)
  226. #define cLISTOP ((LISTOP*)op)
  227. #define cLOGOP ((LOGOP*)op)
  228. #define cCONDOP ((CONDOP*)op)
  229. #define cPMOP ((PMOP*)op)
  230. #define cSVOP ((SVOP*)op)
  231. #define cGVOP ((GVOP*)op)
  232. #define cPVOP ((PVOP*)op)
  233. #define cCOP ((COP*)op)
  234. #define cLOOP ((LOOP*)op)
  235.  
  236. #define kUNOP ((UNOP*)kid)
  237. #define kBINOP ((BINOP*)kid)
  238. #define kLISTOP ((LISTOP*)kid)
  239. #define kLOGOP ((LOGOP*)kid)
  240. #define kCONDOP ((CONDOP*)kid)
  241. #define kPMOP ((PMOP*)kid)
  242. #define kSVOP ((SVOP*)kid)
  243. #define kGVOP ((GVOP*)kid)
  244. #define kPVOP ((PVOP*)kid)
  245. #define kCOP ((COP*)kid)
  246. #define kLOOP ((LOOP*)kid)
  247.  
  248. #define Nullop Null(OP*)
  249.  
  250. /* Lowest byte of opargs */
  251. #define OA_MARK 1
  252. #define OA_FOLDCONST 2
  253. #define OA_RETSCALAR 4
  254. #define OA_TARGET 8
  255. #define OA_RETINTEGER 16
  256. #define OA_OTHERINT 32
  257. #define OA_DANGEROUS 64
  258. #define OA_DEFGV 128
  259.  
  260. #define OASHIFT 8
  261.  
  262. /* Remaining nybbles of opargs */
  263. #define OA_SCALAR 1
  264. #define OA_LIST 2
  265. #define OA_AVREF 3
  266. #define OA_HVREF 4
  267. #define OA_CVREF 5
  268. #define OA_FILEREF 6
  269. #define OA_SCALARREF 7
  270. #define OA_OPTIONAL 8
  271.  
  272.