Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

521 lines
16 KiB

  1. /* cop.h
  2. *
  3. * Copyright (c) 1991-2001, 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. struct cop {
  10. BASEOP
  11. char * cop_label; /* label for this construct */
  12. #ifdef USE_ITHREADS
  13. char * cop_stashpv; /* package line was compiled in */
  14. char * cop_file; /* file name the following line # is from */
  15. #else
  16. HV * cop_stash; /* package line was compiled in */
  17. GV * cop_filegv; /* file the following line # is from */
  18. #endif
  19. U32 cop_seq; /* parse sequence number */
  20. I32 cop_arybase; /* array base this line was compiled with */
  21. line_t cop_line; /* line # of this command */
  22. SV * cop_warnings; /* lexical warnings bitmask */
  23. };
  24. #define Nullcop Null(COP*)
  25. #ifdef USE_ITHREADS
  26. # define CopFILE(c) ((c)->cop_file)
  27. # define CopFILEGV(c) (CopFILE(c) \
  28. ? gv_fetchfile(CopFILE(c)) : Nullgv)
  29. # define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
  30. # define CopFILESV(c) (CopFILE(c) \
  31. ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
  32. # define CopFILEAV(c) (CopFILE(c) \
  33. ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
  34. # define CopSTASHPV(c) ((c)->cop_stashpv)
  35. # define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
  36. # define CopSTASH(c) (CopSTASHPV(c) \
  37. ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
  38. # define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
  39. # define CopSTASH_eq(c,hv) ((hv) \
  40. && (CopSTASHPV(c) == HvNAME(hv) \
  41. || (CopSTASHPV(c) && HvNAME(hv) \
  42. && strEQ(CopSTASHPV(c), HvNAME(hv)))))
  43. #else
  44. # define CopFILEGV(c) ((c)->cop_filegv)
  45. # define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
  46. # define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
  47. # define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
  48. # define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
  49. # define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
  50. # define CopSTASH(c) ((c)->cop_stash)
  51. # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
  52. # define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
  53. /* cop_stash is not refcounted */
  54. # define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
  55. # define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
  56. #endif /* USE_ITHREADS */
  57. #define CopSTASH_ne(c,hv) (!CopSTASH_eq(c,hv))
  58. #define CopLINE(c) ((c)->cop_line)
  59. #define CopLINE_inc(c) (++CopLINE(c))
  60. #define CopLINE_dec(c) (--CopLINE(c))
  61. #define CopLINE_set(c,l) (CopLINE(c) = (l))
  62. /*
  63. * Here we have some enormously heavy (or at least ponderous) wizardry.
  64. */
  65. /* subroutine context */
  66. struct block_sub {
  67. CV * cv;
  68. GV * gv;
  69. GV * dfoutgv;
  70. #ifndef USE_THREADS
  71. AV * savearray;
  72. #endif /* USE_THREADS */
  73. AV * argarray;
  74. U16 olddepth;
  75. U8 hasargs;
  76. U8 lval; /* XXX merge lval and hasargs? */
  77. SV ** oldcurpad;
  78. };
  79. #define PUSHSUB(cx) \
  80. cx->blk_sub.cv = cv; \
  81. cx->blk_sub.olddepth = (U16)CvDEPTH(cv); \
  82. cx->blk_sub.hasargs = hasargs; \
  83. cx->blk_sub.lval = PL_op->op_private & \
  84. (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
  85. #define PUSHFORMAT(cx) \
  86. cx->blk_sub.cv = cv; \
  87. cx->blk_sub.gv = gv; \
  88. cx->blk_sub.hasargs = 0; \
  89. cx->blk_sub.dfoutgv = PL_defoutgv; \
  90. (void)SvREFCNT_inc(cx->blk_sub.dfoutgv)
  91. #ifdef USE_THREADS
  92. # define POP_SAVEARRAY() NOOP
  93. #else
  94. # define POP_SAVEARRAY() \
  95. STMT_START { \
  96. SvREFCNT_dec(GvAV(PL_defgv)); \
  97. GvAV(PL_defgv) = cx->blk_sub.savearray; \
  98. } STMT_END
  99. #endif /* USE_THREADS */
  100. /* junk in @_ spells trouble when cloning CVs and in pp_caller(), so don't
  101. * leave any (a fast av_clear(ary), basically) */
  102. #define CLEAR_ARGARRAY(ary) \
  103. STMT_START { \
  104. AvMAX(ary) += AvARRAY(ary) - AvALLOC(ary); \
  105. SvPVX(ary) = (char*)AvALLOC(ary); \
  106. AvFILLp(ary) = -1; \
  107. } STMT_END
  108. #define POPSUB(cx,sv) \
  109. STMT_START { \
  110. if (cx->blk_sub.hasargs) { \
  111. POP_SAVEARRAY(); \
  112. /* abandon @_ if it got reified */ \
  113. if (AvREAL(cx->blk_sub.argarray)) { \
  114. SSize_t fill = AvFILLp(cx->blk_sub.argarray); \
  115. SvREFCNT_dec(cx->blk_sub.argarray); \
  116. cx->blk_sub.argarray = newAV(); \
  117. av_extend(cx->blk_sub.argarray, fill); \
  118. AvFLAGS(cx->blk_sub.argarray) = AVf_REIFY; \
  119. cx->blk_sub.oldcurpad[0] = (SV*)cx->blk_sub.argarray; \
  120. } \
  121. else { \
  122. CLEAR_ARGARRAY(cx->blk_sub.argarray); \
  123. } \
  124. } \
  125. sv = (SV*)cx->blk_sub.cv; \
  126. if (sv && (CvDEPTH((CV*)sv) = cx->blk_sub.olddepth)) \
  127. sv = Nullsv; \
  128. } STMT_END
  129. #define LEAVESUB(sv) \
  130. STMT_START { \
  131. if (sv) \
  132. SvREFCNT_dec(sv); \
  133. } STMT_END
  134. #define POPFORMAT(cx) \
  135. setdefout(cx->blk_sub.dfoutgv); \
  136. SvREFCNT_dec(cx->blk_sub.dfoutgv);
  137. /* eval context */
  138. struct block_eval {
  139. I32 old_in_eval;
  140. I32 old_op_type;
  141. SV * old_namesv;
  142. OP * old_eval_root;
  143. SV * cur_text;
  144. CV * cv;
  145. };
  146. #define PUSHEVAL(cx,n,fgv) \
  147. STMT_START { \
  148. cx->blk_eval.old_in_eval = PL_in_eval; \
  149. cx->blk_eval.old_op_type = PL_op->op_type; \
  150. cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : Nullsv); \
  151. cx->blk_eval.old_eval_root = PL_eval_root; \
  152. cx->blk_eval.cur_text = PL_linestr; \
  153. cx->blk_eval.cv = Nullcv; /* set by doeval(), as applicable */ \
  154. } STMT_END
  155. #define POPEVAL(cx) \
  156. STMT_START { \
  157. PL_in_eval = cx->blk_eval.old_in_eval; \
  158. optype = cx->blk_eval.old_op_type; \
  159. PL_eval_root = cx->blk_eval.old_eval_root; \
  160. if (cx->blk_eval.old_namesv) \
  161. sv_2mortal(cx->blk_eval.old_namesv); \
  162. } STMT_END
  163. /* loop context */
  164. struct block_loop {
  165. char * label;
  166. I32 resetsp;
  167. OP * redo_op;
  168. OP * next_op;
  169. OP * last_op;
  170. #ifdef USE_ITHREADS
  171. void * iterdata;
  172. SV ** oldcurpad;
  173. #else
  174. SV ** itervar;
  175. #endif
  176. SV * itersave;
  177. SV * iterlval;
  178. AV * iterary;
  179. IV iterix;
  180. IV itermax;
  181. };
  182. #ifdef USE_ITHREADS
  183. # define CxITERVAR(c) \
  184. ((c)->blk_loop.iterdata \
  185. ? (CxPADLOOP(cx) \
  186. ? &((c)->blk_loop.oldcurpad)[(PADOFFSET)(c)->blk_loop.iterdata] \
  187. : &GvSV((GV*)(c)->blk_loop.iterdata)) \
  188. : (SV**)NULL)
  189. # define CX_ITERDATA_SET(cx,idata) \
  190. cx->blk_loop.oldcurpad = PL_curpad; \
  191. if ((cx->blk_loop.iterdata = (idata))) \
  192. cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));
  193. #else
  194. # define CxITERVAR(c) ((c)->blk_loop.itervar)
  195. # define CX_ITERDATA_SET(cx,ivar) \
  196. if ((cx->blk_loop.itervar = (SV**)(ivar))) \
  197. cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));
  198. #endif
  199. #define PUSHLOOP(cx, dat, s) \
  200. cx->blk_loop.label = PL_curcop->cop_label; \
  201. cx->blk_loop.resetsp = s - PL_stack_base; \
  202. cx->blk_loop.redo_op = cLOOP->op_redoop; \
  203. cx->blk_loop.next_op = cLOOP->op_nextop; \
  204. cx->blk_loop.last_op = cLOOP->op_lastop; \
  205. cx->blk_loop.iterlval = Nullsv; \
  206. cx->blk_loop.iterary = Nullav; \
  207. cx->blk_loop.iterix = -1; \
  208. CX_ITERDATA_SET(cx,dat);
  209. #define POPLOOP(cx) \
  210. SvREFCNT_dec(cx->blk_loop.iterlval); \
  211. if (CxITERVAR(cx)) { \
  212. SV **s_v_p = CxITERVAR(cx); \
  213. sv_2mortal(*s_v_p); \
  214. *s_v_p = cx->blk_loop.itersave; \
  215. } \
  216. if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\
  217. SvREFCNT_dec(cx->blk_loop.iterary);
  218. /* context common to subroutines, evals and loops */
  219. struct block {
  220. I32 blku_oldsp; /* stack pointer to copy stuff down to */
  221. COP * blku_oldcop; /* old curcop pointer */
  222. I32 blku_oldretsp; /* return stack index */
  223. I32 blku_oldmarksp; /* mark stack index */
  224. I32 blku_oldscopesp; /* scope stack index */
  225. PMOP * blku_oldpm; /* values of pattern match vars */
  226. U8 blku_gimme; /* is this block running in list context? */
  227. union {
  228. struct block_sub blku_sub;
  229. struct block_eval blku_eval;
  230. struct block_loop blku_loop;
  231. } blk_u;
  232. };
  233. #define blk_oldsp cx_u.cx_blk.blku_oldsp
  234. #define blk_oldcop cx_u.cx_blk.blku_oldcop
  235. #define blk_oldretsp cx_u.cx_blk.blku_oldretsp
  236. #define blk_oldmarksp cx_u.cx_blk.blku_oldmarksp
  237. #define blk_oldscopesp cx_u.cx_blk.blku_oldscopesp
  238. #define blk_oldpm cx_u.cx_blk.blku_oldpm
  239. #define blk_gimme cx_u.cx_blk.blku_gimme
  240. #define blk_sub cx_u.cx_blk.blk_u.blku_sub
  241. #define blk_eval cx_u.cx_blk.blk_u.blku_eval
  242. #define blk_loop cx_u.cx_blk.blk_u.blku_loop
  243. /* Enter a block. */
  244. #define PUSHBLOCK(cx,t,sp) CXINC, cx = &cxstack[cxstack_ix], \
  245. cx->cx_type = t, \
  246. cx->blk_oldsp = sp - PL_stack_base, \
  247. cx->blk_oldcop = PL_curcop, \
  248. cx->blk_oldmarksp = PL_markstack_ptr - PL_markstack, \
  249. cx->blk_oldscopesp = PL_scopestack_ix, \
  250. cx->blk_oldretsp = PL_retstack_ix, \
  251. cx->blk_oldpm = PL_curpm, \
  252. cx->blk_gimme = (U8)gimme; \
  253. DEBUG_l( PerlIO_printf(Perl_debug_log, "Entering block %ld, type %s\n", \
  254. (long)cxstack_ix, PL_block_type[CxTYPE(cx)]); )
  255. /* Exit a block (RETURN and LAST). */
  256. #define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--], \
  257. newsp = PL_stack_base + cx->blk_oldsp, \
  258. PL_curcop = cx->blk_oldcop, \
  259. PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \
  260. PL_scopestack_ix = cx->blk_oldscopesp, \
  261. PL_retstack_ix = cx->blk_oldretsp, \
  262. pm = cx->blk_oldpm, \
  263. gimme = cx->blk_gimme; \
  264. DEBUG_l( PerlIO_printf(Perl_debug_log, "Leaving block %ld, type %s\n", \
  265. (long)cxstack_ix+1,PL_block_type[CxTYPE(cx)]); )
  266. /* Continue a block elsewhere (NEXT and REDO). */
  267. #define TOPBLOCK(cx) cx = &cxstack[cxstack_ix], \
  268. PL_stack_sp = PL_stack_base + cx->blk_oldsp, \
  269. PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \
  270. PL_scopestack_ix = cx->blk_oldscopesp, \
  271. PL_retstack_ix = cx->blk_oldretsp, \
  272. PL_curpm = cx->blk_oldpm
  273. /* substitution context */
  274. struct subst {
  275. I32 sbu_iters;
  276. I32 sbu_maxiters;
  277. I32 sbu_rflags;
  278. I32 sbu_oldsave;
  279. bool sbu_once;
  280. bool sbu_rxtainted;
  281. char * sbu_orig;
  282. SV * sbu_dstr;
  283. SV * sbu_targ;
  284. char * sbu_s;
  285. char * sbu_m;
  286. char * sbu_strend;
  287. void * sbu_rxres;
  288. REGEXP * sbu_rx;
  289. };
  290. #define sb_iters cx_u.cx_subst.sbu_iters
  291. #define sb_maxiters cx_u.cx_subst.sbu_maxiters
  292. #define sb_rflags cx_u.cx_subst.sbu_rflags
  293. #define sb_oldsave cx_u.cx_subst.sbu_oldsave
  294. #define sb_once cx_u.cx_subst.sbu_once
  295. #define sb_rxtainted cx_u.cx_subst.sbu_rxtainted
  296. #define sb_orig cx_u.cx_subst.sbu_orig
  297. #define sb_dstr cx_u.cx_subst.sbu_dstr
  298. #define sb_targ cx_u.cx_subst.sbu_targ
  299. #define sb_s cx_u.cx_subst.sbu_s
  300. #define sb_m cx_u.cx_subst.sbu_m
  301. #define sb_strend cx_u.cx_subst.sbu_strend
  302. #define sb_rxres cx_u.cx_subst.sbu_rxres
  303. #define sb_rx cx_u.cx_subst.sbu_rx
  304. #define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix], \
  305. cx->sb_iters = iters, \
  306. cx->sb_maxiters = maxiters, \
  307. cx->sb_rflags = r_flags, \
  308. cx->sb_oldsave = oldsave, \
  309. cx->sb_once = once, \
  310. cx->sb_rxtainted = rxtainted, \
  311. cx->sb_orig = orig, \
  312. cx->sb_dstr = dstr, \
  313. cx->sb_targ = targ, \
  314. cx->sb_s = s, \
  315. cx->sb_m = m, \
  316. cx->sb_strend = strend, \
  317. cx->sb_rxres = Null(void*), \
  318. cx->sb_rx = rx, \
  319. cx->cx_type = CXt_SUBST; \
  320. rxres_save(&cx->sb_rxres, rx)
  321. #define POPSUBST(cx) cx = &cxstack[cxstack_ix--]; \
  322. rxres_free(&cx->sb_rxres)
  323. struct context {
  324. U32 cx_type; /* what kind of context this is */
  325. union {
  326. struct block cx_blk;
  327. struct subst cx_subst;
  328. } cx_u;
  329. };
  330. #define CXTYPEMASK 0xff
  331. #define CXt_NULL 0
  332. #define CXt_SUB 1
  333. #define CXt_EVAL 2
  334. #define CXt_LOOP 3
  335. #define CXt_SUBST 4
  336. #define CXt_BLOCK 5
  337. #define CXt_FORMAT 6
  338. /* private flags for CXt_EVAL */
  339. #define CXp_REAL 0x00000100 /* truly eval'', not a lookalike */
  340. #define CXp_TRYBLOCK 0x00000200 /* eval{}, not eval'' or similar */
  341. #ifdef USE_ITHREADS
  342. /* private flags for CXt_LOOP */
  343. # define CXp_PADVAR 0x00000100 /* itervar lives on pad, iterdata
  344. has pad offset; if not set,
  345. iterdata holds GV* */
  346. # define CxPADLOOP(c) (((c)->cx_type & (CXt_LOOP|CXp_PADVAR)) \
  347. == (CXt_LOOP|CXp_PADVAR))
  348. #endif
  349. #define CxTYPE(c) ((c)->cx_type & CXTYPEMASK)
  350. #define CxREALEVAL(c) (((c)->cx_type & (CXt_EVAL|CXp_REAL)) \
  351. == (CXt_EVAL|CXp_REAL))
  352. #define CxTRYBLOCK(c) (((c)->cx_type & (CXt_EVAL|CXp_TRYBLOCK)) \
  353. == (CXt_EVAL|CXp_TRYBLOCK))
  354. #define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
  355. /* "gimme" values */
  356. /*
  357. =for apidoc AmU||G_SCALAR
  358. Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
  359. L<perlcall>.
  360. =for apidoc AmU||G_ARRAY
  361. Used to indicate list context. See C<GIMME_V>, C<GIMME> and
  362. L<perlcall>.
  363. =for apidoc AmU||G_VOID
  364. Used to indicate void context. See C<GIMME_V> and L<perlcall>.
  365. =for apidoc AmU||G_DISCARD
  366. Indicates that arguments returned from a callback should be discarded. See
  367. L<perlcall>.
  368. =for apidoc AmU||G_EVAL
  369. Used to force a Perl C<eval> wrapper around a callback. See
  370. L<perlcall>.
  371. =for apidoc AmU||G_NOARGS
  372. Indicates that no arguments are being sent to a callback. See
  373. L<perlcall>.
  374. =cut
  375. */
  376. #define G_SCALAR 0
  377. #define G_ARRAY 1
  378. #define G_VOID 128 /* skip this bit when adding flags below */
  379. /* extra flags for Perl_call_* routines */
  380. #define G_DISCARD 2 /* Call FREETMPS. */
  381. #define G_EVAL 4 /* Assume eval {} around subroutine call. */
  382. #define G_NOARGS 8 /* Don't construct a @_ array. */
  383. #define G_KEEPERR 16 /* Append errors to $@, don't overwrite it */
  384. #define G_NODEBUG 32 /* Disable debugging at toplevel. */
  385. #define G_METHOD 64 /* Calling method. */
  386. /* flag bits for PL_in_eval */
  387. #define EVAL_NULL 0 /* not in an eval */
  388. #define EVAL_INEVAL 1 /* some enclosing scope is an eval */
  389. #define EVAL_WARNONLY 2 /* used by yywarn() when calling yyerror() */
  390. #define EVAL_KEEPERR 4 /* set by Perl_call_sv if G_KEEPERR */
  391. #define EVAL_INREQUIRE 8 /* The code is being required. */
  392. /* Support for switching (stack and block) contexts.
  393. * This ensures magic doesn't invalidate local stack and cx pointers.
  394. */
  395. #define PERLSI_UNKNOWN -1
  396. #define PERLSI_UNDEF 0
  397. #define PERLSI_MAIN 1
  398. #define PERLSI_MAGIC 2
  399. #define PERLSI_SORT 3
  400. #define PERLSI_SIGNAL 4
  401. #define PERLSI_OVERLOAD 5
  402. #define PERLSI_DESTROY 6
  403. #define PERLSI_WARNHOOK 7
  404. #define PERLSI_DIEHOOK 8
  405. #define PERLSI_REQUIRE 9
  406. struct stackinfo {
  407. AV * si_stack; /* stack for current runlevel */
  408. PERL_CONTEXT * si_cxstack; /* context stack for runlevel */
  409. I32 si_cxix; /* current context index */
  410. I32 si_cxmax; /* maximum allocated index */
  411. I32 si_type; /* type of runlevel */
  412. struct stackinfo * si_prev;
  413. struct stackinfo * si_next;
  414. I32 si_markoff; /* offset where markstack begins for us.
  415. * currently used only with DEBUGGING,
  416. * but not #ifdef-ed for bincompat */
  417. };
  418. typedef struct stackinfo PERL_SI;
  419. #define cxstack (PL_curstackinfo->si_cxstack)
  420. #define cxstack_ix (PL_curstackinfo->si_cxix)
  421. #define cxstack_max (PL_curstackinfo->si_cxmax)
  422. #ifdef DEBUGGING
  423. # define SET_MARK_OFFSET \
  424. PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
  425. #else
  426. # define SET_MARK_OFFSET NOOP
  427. #endif
  428. #define PUSHSTACKi(type) \
  429. STMT_START { \
  430. PERL_SI *next = PL_curstackinfo->si_next; \
  431. if (!next) { \
  432. next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1); \
  433. next->si_prev = PL_curstackinfo; \
  434. PL_curstackinfo->si_next = next; \
  435. } \
  436. next->si_type = type; \
  437. next->si_cxix = -1; \
  438. AvFILLp(next->si_stack) = 0; \
  439. SWITCHSTACK(PL_curstack,next->si_stack); \
  440. PL_curstackinfo = next; \
  441. SET_MARK_OFFSET; \
  442. } STMT_END
  443. #define PUSHSTACK PUSHSTACKi(PERLSI_UNKNOWN)
  444. /* POPSTACK works with PL_stack_sp, so it may need to be bracketed by
  445. * PUTBACK/SPAGAIN to flush/refresh any local SP that may be active */
  446. #define POPSTACK \
  447. STMT_START { \
  448. dSP; \
  449. PERL_SI *prev = PL_curstackinfo->si_prev; \
  450. if (!prev) { \
  451. PerlIO_printf(Perl_error_log, "panic: POPSTACK\n"); \
  452. my_exit(1); \
  453. } \
  454. SWITCHSTACK(PL_curstack,prev->si_stack); \
  455. /* don't free prev here, free them all at the END{} */ \
  456. PL_curstackinfo = prev; \
  457. } STMT_END
  458. #define POPSTACK_TO(s) \
  459. STMT_START { \
  460. while (PL_curstack != s) { \
  461. dounwind(-1); \
  462. POPSTACK; \
  463. } \
  464. } STMT_END