X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cop.h;h=e8221b610c3fefdee548ba3b3e4f6dc2dd0e5161;hb=cc50ac46d6f5968c34044ce7c501b06af15fc51a;hp=aa5b6d581327af00bb392d16b0c420e7cc451780;hpb=1aff0e911b5282f0638dc0d8199ffa4edf98f89c;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cop.h b/cop.h index aa5b6d5..e8221b6 100644 --- a/cop.h +++ b/cop.h @@ -1,6 +1,6 @@ /* cop.h * - * Copyright (c) 1991-1997, Larry Wall + * Copyright (c) 1991-1999, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -35,12 +35,15 @@ struct block_sub { AV * argarray; U16 olddepth; U8 hasargs; + U8 lval; /* XXX merge lval and hasargs? */ }; #define PUSHSUB(cx) \ cx->blk_sub.cv = cv; \ cx->blk_sub.olddepth = CvDEPTH(cv); \ - cx->blk_sub.hasargs = hasargs; + cx->blk_sub.hasargs = hasargs; \ + cx->blk_sub.lval = PL_op->op_private & \ + (OPpLVAL_INTRO|OPpENTERSUB_INARGS); #define PUSHFORMAT(cx) \ cx->blk_sub.cv = cv; \ @@ -63,16 +66,22 @@ struct block_sub { #define POPSAVEARRAY() \ STMT_START { \ SvREFCNT_dec(GvAV(PL_defgv)); \ - GvAV(PL_defgv) = cxsub.savearray; \ + GvAV(PL_defgv) = cxsub.savearray; \ } STMT_END #endif /* USE_THREADS */ #define POPSUB2() \ if (cxsub.hasargs) { \ POPSAVEARRAY(); \ - /* destroy arg array */ \ - av_clear(cxsub.argarray); \ - AvREAL_off(cxsub.argarray); \ + /* abandon @_ if it got reified */ \ + if (AvREAL(cxsub.argarray)) { \ + SSize_t fill = AvFILLp(cxsub.argarray); \ + SvREFCNT_dec(cxsub.argarray); \ + cxsub.argarray = newAV(); \ + av_extend(cxsub.argarray, fill); \ + AvFLAGS(cxsub.argarray) = AVf_REIFY; \ + PL_curpad[0] = (SV*)cxsub.argarray; \ + } \ } \ if (cxsub.cv) { \ if (!(CvDEPTH(cxsub.cv) = cxsub.olddepth)) \ @@ -291,12 +300,19 @@ struct context { #define G_ARRAY 1 #define G_VOID 128 /* skip this bit when adding flags below */ -/* extra flags for perl_call_* routines */ +/* extra flags for Perl_call_* routines */ #define G_DISCARD 2 /* Call FREETMPS. */ #define G_EVAL 4 /* Assume eval {} around subroutine call. */ #define G_NOARGS 8 /* Don't construct a @_ array. */ #define G_KEEPERR 16 /* Append errors to $@, don't overwrite it */ #define G_NODEBUG 32 /* Disable debugging at toplevel. */ +#define G_NOCATCH 64 /* Don't do CATCH_SET() */ + +/* flag bits for PL_in_eval */ +#define EVAL_NULL 0 /* not in an eval */ +#define EVAL_INEVAL 1 /* some enclosing scope is an eval */ +#define EVAL_WARNONLY 2 /* used by yywarn() when calling yyerror() */ +#define EVAL_KEEPERR 4 /* set by Perl_call_sv if G_KEEPERR */ /* Support for switching (stack and block) contexts. * This ensures magic doesn't invalidate local stack and cx pointers.