home *** CD-ROM | disk | FTP | other *** search
/ Chip: Windows 2000 Professional Resource Kit / W2KPRK.iso / apps / perl / ActivePerl.exe / data.z / op.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-10-14  |  9.3 KB  |  326 lines

  1. /*    op.h
  2.  *
  3.  *    Copyright (c) 1991-1999, 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. #define NOT_IN_PAD ((PADOFFSET) -1)
  28.  
  29. #ifdef DEBUGGING_OPS
  30. #define OPCODE opcode
  31. #else
  32. #define OPCODE U16
  33. #endif
  34.  
  35. #ifdef BASEOP_DEFINITION
  36. #define BASEOP BASEOP_DEFINITION
  37. #else
  38. #define BASEOP                \
  39.     OP*        op_next;        \
  40.     OP*        op_sibling;        \
  41.     OP*        (CPERLscope(*op_ppaddr))_((ARGSproto));        \
  42.     PADOFFSET    op_targ;        \
  43.     OPCODE    op_type;        \
  44.     U16        op_seq;            \
  45.     U8        op_flags;        \
  46.     U8        op_private;
  47. #endif
  48.  
  49. #define OP_GIMME(op,dfl) \
  50.     (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
  51.      ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
  52.      ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
  53.      dfl)
  54.  
  55. #define GIMME_V        OP_GIMME(PL_op, block_gimme())
  56.  
  57. /* Public flags */
  58.  
  59. #define OPf_WANT    3    /* Mask for "want" bits: */
  60. #define  OPf_WANT_VOID     1    /*   Want nothing */
  61. #define  OPf_WANT_SCALAR 2    /*   Want single value */
  62. #define  OPf_WANT_LIST     3    /*   Want list of any length */
  63. #define OPf_KIDS    4    /* There is a firstborn child. */
  64. #define OPf_PARENS    8    /* This operator was parenthesized. */
  65.                 /*  (Or block needs explicit scope entry.) */
  66. #define OPf_REF        16    /* Certified reference. */
  67.                 /*  (Return container, not containee). */
  68. #define OPf_MOD        32    /* Will modify (lvalue). */
  69. #define OPf_STACKED    64    /* Some arg is arriving on the stack. */
  70. #define OPf_SPECIAL    128    /* Do something weird for this op: */
  71.                 /*  On local LVAL, don't init local value. */
  72.                 /*  On OP_SORT, subroutine is inlined. */
  73.                 /*  On OP_NOT, inversion was implicit. */
  74.                 /*  On OP_LEAVE, don't restore curpm. */
  75.                 /*  On truncate, we truncate filehandle */
  76.                 /*  On control verbs, we saw no label */
  77.                 /*  On flipflop, we saw ... instead of .. */
  78.                 /*  On UNOPs, saw bare parens, e.g. eof(). */
  79.                 /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
  80.                 /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
  81.                 /*  On OP_ENTERITER, loop var is per-thread */
  82.  
  83. /* old names; don't use in new code, but don't break them, either */
  84. #define OPf_LIST    OPf_WANT_LIST
  85. #define OPf_KNOW    OPf_WANT
  86. #define GIMME \
  87.       (PL_op->op_flags & OPf_WANT                    \
  88.        ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST        \
  89.           ? G_ARRAY                            \
  90.           : G_SCALAR)                        \
  91.        : dowantarray())
  92.  
  93. /* Private for lvalues */
  94. #define OPpLVAL_INTRO    128    /* Lvalue must be localized */
  95.  
  96. /* Private for OP_AASSIGN */
  97. #define OPpASSIGN_COMMON    64    /* Left & right have syms in common. */
  98.  
  99. /* Private for OP_SASSIGN */
  100. #define OPpASSIGN_BACKWARDS    64    /* Left & right switched. */
  101.  
  102. /* Private for OP_MATCH and OP_SUBST{,CONST} */
  103. #define OPpRUNTIME        64    /* Pattern coming in on the stack */
  104.  
  105. /* Private for OP_TRANS */
  106. #define OPpTRANS_COUNTONLY    8
  107. #define OPpTRANS_SQUASH        16
  108. #define OPpTRANS_DELETE        32
  109. #define OPpTRANS_COMPLEMENT    64
  110.  
  111. /* Private for OP_REPEAT */
  112. #define OPpREPEAT_DOLIST    64    /* List replication. */
  113.  
  114. /* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */
  115. #define OPpDEREF        (32|64)    /* Want ref to something: */
  116. #define OPpDEREF_AV        32    /*   Want ref to AV. */
  117. #define OPpDEREF_HV        64    /*   Want ref to HV. */
  118. #define OPpDEREF_SV        (32|64)    /*   Want ref to SV. */
  119.   /* OP_ENTERSUB only */
  120. #define OPpENTERSUB_DB        16    /* Debug subroutine. */
  121.   /* OP_RV2CV only */
  122. #define OPpENTERSUB_AMPER    8    /* Used & form to call. */
  123. #define OPpENTERSUB_NOPAREN    128    /* bare sub call (without parens) */
  124.   /* OP_?ELEM only */
  125. #define OPpLVAL_DEFER        16    /* Defer creation of array/hash elem */
  126.   /* for OP_RV2?V, lower bits carry hints */
  127.  
  128. /* Private for OP_CONST */
  129. #define    OPpCONST_STRICT        8    /* bearword subject to strict 'subs' */
  130. #define OPpCONST_ENTERED    16    /* Has been entered as symbol. */
  131. #define OPpCONST_ARYBASE    32    /* Was a $[ translated to constant. */
  132. #define OPpCONST_BARE        64    /* Was a bare word (filehandle?). */
  133.  
  134. /* Private for OP_FLIP/FLOP */
  135. #define OPpFLIP_LINENUM        64    /* Range arg potentially a line num. */
  136.  
  137. /* Private for OP_LIST */
  138. #define OPpLIST_GUESSED        64    /* Guessed that pushmark was needed. */
  139.  
  140. /* Private for OP_DELETE */
  141. #define OPpSLICE        64    /* Operating on a list of keys */
  142.  
  143. /* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */
  144. #define OPpLOCALE        64    /* Use locale */
  145.  
  146. /* Private for OP_THREADSV */
  147. #define OPpDONE_SVREF        64    /* Been through newSVREF once */
  148.  
  149. struct op {
  150.     BASEOP
  151. };
  152.  
  153. struct unop {
  154.     BASEOP
  155.     OP *    op_first;
  156. };
  157.  
  158. struct binop {
  159.     BASEOP
  160.     OP *    op_first;
  161.     OP *    op_last;
  162. };
  163.  
  164. struct logop {
  165.     BASEOP
  166.     OP *    op_first;
  167.     OP *    op_other;
  168. };
  169.  
  170. struct condop {
  171.     BASEOP
  172.     OP *    op_first;
  173.     OP *    op_true;
  174.     OP *    op_false;
  175. };
  176.  
  177. struct listop {
  178.     BASEOP
  179.     OP *    op_first;
  180.     OP *    op_last;
  181.     U32        op_children;
  182. };
  183.  
  184. struct pmop {
  185.     BASEOP
  186.     OP *    op_first;
  187.     OP *    op_last;
  188.     U32        op_children;
  189.     OP *    op_pmreplroot;
  190.     OP *    op_pmreplstart;
  191.     PMOP *    op_pmnext;        /* list of all scanpats */
  192.     REGEXP *    op_pmregexp;        /* compiled expression */
  193.     U16        op_pmflags;
  194.     U16        op_pmpermflags;
  195.     U8        op_pmdynflags;
  196. };
  197.  
  198. #define PMdf_USED    0x01        /* pm has been used once already */
  199. #define PMdf_TAINTED    0x02        /* pm compiled from tainted pattern */
  200.  
  201. #define PMf_RETAINT    0x0001        /* taint $1 etc. if target tainted */
  202. #define PMf_ONCE    0x0002        /* use pattern only once per reset */
  203. #define PMf_REVERSED    0x0004        /* Should be matched right->left */
  204. #define PMf_MAYBE_CONST    0x0008        /* replacement contains variables */
  205. #define PMf_SKIPWHITE    0x0010        /* skip leading whitespace for split */
  206. #define PMf_WHITE    0x0020        /* pattern is \s+ */
  207. #define PMf_CONST    0x0040        /* subst replacement is constant */
  208. #define PMf_KEEP    0x0080        /* keep 1st runtime pattern forever */
  209. #define PMf_GLOBAL    0x0100        /* pattern had a g modifier */
  210. #define PMf_CONTINUE    0x0200        /* don't reset pos() if //g fails */
  211. #define PMf_EVAL    0x0400        /* evaluating replacement as expr */
  212. #define PMf_LOCALE    0x0800        /* use locale for character types */
  213. #define PMf_MULTILINE    0x1000        /* assume multiple lines */
  214. #define PMf_SINGLELINE    0x2000        /* assume single line */
  215. #define PMf_FOLD    0x4000        /* case insensitivity */
  216. #define PMf_EXTENDED    0x8000        /* chuck embedded whitespace */
  217.  
  218. /* mask of bits stored in regexp->reganch */
  219. #define PMf_COMPILETIME    (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED)
  220.  
  221. struct svop {
  222.     BASEOP
  223.     SV *    op_sv;
  224. };
  225.  
  226. struct gvop {
  227.     BASEOP
  228.     GV *    op_gv;
  229. };
  230.  
  231. struct pvop {
  232.     BASEOP
  233.     char *    op_pv;
  234. };
  235.  
  236. struct loop {
  237.     BASEOP
  238.     OP *    op_first;
  239.     OP *    op_last;
  240.     U32        op_children;
  241.     OP *    op_redoop;
  242.     OP *    op_nextop;
  243.     OP *    op_lastop;
  244. };
  245.  
  246. #define cUNOP ((UNOP*)PL_op)
  247. #define cBINOP ((BINOP*)PL_op)
  248. #define cLISTOP ((LISTOP*)PL_op)
  249. #define cLOGOP ((LOGOP*)PL_op)
  250. #define cCONDOP ((CONDOP*)PL_op)
  251. #define cPMOP ((PMOP*)PL_op)
  252. #define cSVOP ((SVOP*)PL_op)
  253. #define cGVOP ((GVOP*)PL_op)
  254. #define cPVOP ((PVOP*)PL_op)
  255. #define cCOP ((COP*)PL_op)
  256. #define cLOOP ((LOOP*)PL_op)
  257.  
  258. #define cUNOPo ((UNOP*)o)
  259. #define cBINOPo ((BINOP*)o)
  260. #define cLISTOPo ((LISTOP*)o)
  261. #define cLOGOPo ((LOGOP*)o)
  262. #define cCONDOPo ((CONDOP*)o)
  263. #define cPMOPo ((PMOP*)o)
  264. #define cSVOPo ((SVOP*)o)
  265. #define cGVOPo ((GVOP*)o)
  266. #define cPVOPo ((PVOP*)o)
  267. #define cCVOPo ((CVOP*)o)
  268. #define cCOPo ((COP*)o)
  269. #define cLOOPo ((LOOP*)o)
  270.  
  271. #define kUNOP ((UNOP*)kid)
  272. #define kBINOP ((BINOP*)kid)
  273. #define kLISTOP ((LISTOP*)kid)
  274. #define kLOGOP ((LOGOP*)kid)
  275. #define kCONDOP ((CONDOP*)kid)
  276. #define kPMOP ((PMOP*)kid)
  277. #define kSVOP ((SVOP*)kid)
  278. #define kGVOP ((GVOP*)kid)
  279. #define kPVOP ((PVOP*)kid)
  280. #define kCOP ((COP*)kid)
  281. #define kLOOP ((LOOP*)kid)
  282.  
  283. #define Nullop Null(OP*)
  284.  
  285. /* Lowest byte of opargs */
  286. #define OA_MARK 1
  287. #define OA_FOLDCONST 2
  288. #define OA_RETSCALAR 4
  289. #define OA_TARGET 8
  290. #define OA_RETINTEGER 16
  291. #define OA_OTHERINT 32
  292. #define OA_DANGEROUS 64
  293. #define OA_DEFGV 128
  294.  
  295. /* The next 4 bits encode op class information */
  296. #define OA_CLASS_MASK (15 << 8)
  297.  
  298. #define OA_BASEOP (0 << 8)
  299. #define OA_UNOP (1 << 8)
  300. #define OA_BINOP (2 << 8)
  301. #define OA_LOGOP (3 << 8)
  302. #define OA_CONDOP (4 << 8)
  303. #define OA_LISTOP (5 << 8)
  304. #define OA_PMOP (6 << 8)
  305. #define OA_SVOP (7 << 8)
  306. #define OA_GVOP (8 << 8)
  307. #define OA_PVOP (9 << 8)
  308. #define OA_LOOP (10 << 8)
  309. #define OA_COP (11 << 8)
  310. #define OA_BASEOP_OR_UNOP (12 << 8)
  311. #define OA_FILESTATOP (13 << 8)
  312. #define OA_LOOPEXOP (14 << 8)
  313.  
  314. #define OASHIFT 12
  315.  
  316. /* Remaining nybbles of opargs */
  317. #define OA_SCALAR 1
  318. #define OA_LIST 2
  319. #define OA_AVREF 3
  320. #define OA_HVREF 4
  321. #define OA_CVREF 5
  322. #define OA_FILEREF 6
  323. #define OA_SCALARREF 7
  324. #define OA_OPTIONAL 8
  325.  
  326.