X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/7409d7190cf6c057fdad5f6134646f347f12e367..ffdf997adf37e10c17269569670fa890aba8d1b3:/op.h diff --git a/op.h b/op.h index 789ce58..5fbce83 100644 --- a/op.h +++ b/op.h @@ -1,6 +1,7 @@ /* op.h * - * Copyright (c) 1991-2001, Larry Wall + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + * 2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -16,6 +17,12 @@ * parent takes over role of remembering starting op.) * op_ppaddr Pointer to current ppcode's function. * op_type The type of the operation. + * op_opt Whether or not the op has been optimised by the + * peephole optimiser. + * op_static Whether or not the op is statically defined. + * This flag is used by the B::C compiler backend + * and indicates that the op should not be freed. + * op_spare Five spare bits! * op_flags Flags common to all operations. See OPf_* below. * op_private Flags peculiar to a particular operation (BUT, * by default, set to the number of children until @@ -23,9 +30,6 @@ * which may or may not check number of children). */ -typedef U32 PADOFFSET; -#define NOT_IN_PAD ((PADOFFSET) -1) - #ifdef DEBUGGING_OPS #define OPCODE opcode #else @@ -40,8 +44,10 @@ typedef U32 PADOFFSET; OP* op_sibling; \ OP* (CPERLscope(*op_ppaddr))(pTHX); \ PADOFFSET op_targ; \ - OPCODE op_type; \ - U16 op_seq; \ + unsigned op_type:9; \ + unsigned op_opt:1; \ + unsigned op_static:1; \ + unsigned op_spare:5; \ U8 op_flags; \ U8 op_private; #endif @@ -53,6 +59,8 @@ typedef U32 PADOFFSET; dfl) /* +=head1 "Gimme" Values + =for apidoc Amn|U32|GIMME_V The XSUB-writer's equivalent to Perl's C. Returns C, C or C for void, scalar or list context, @@ -96,6 +104,12 @@ Deprecated. Use C instead. /* On OP_ENTERITER, loop var is per-thread */ /* On pushre, re is /\s+/ imp. by split " " */ /* On regcomp, "use re 'eval'" was in scope */ + /* On OP_READLINE, was <$filehandle> */ + /* On RV2[SG]V, don't create GV--in defined()*/ + /* On OP_DBSTATE, indicates breakpoint + * (runtime property) */ + /* On OP_AELEMFAST, indiciates pad var */ + /* On OP_REQUIRE, was seen as CORE::require */ /* old names; don't use in new code, but don't break them, either */ #define OPf_LIST OPf_WANT_LIST @@ -119,7 +133,6 @@ Deprecated. Use C instead. /* Private for OP_AASSIGN */ #define OPpASSIGN_COMMON 64 /* Left & right have syms in common. */ -#define OPpASSIGN_HASH 32 /* Assigning to possible pseudohash. */ /* Private for OP_SASSIGN */ #define OPpASSIGN_BACKWARDS 64 /* Left & right switched. */ @@ -132,21 +145,24 @@ Deprecated. Use C instead. #define OPpTRANS_TO_UTF 2 #define OPpTRANS_IDENTICAL 4 /* right side is same as left */ #define OPpTRANS_SQUASH 8 -#define OPpTRANS_DELETE 16 + /* 16 is used for OPpTARGET_MY */ #define OPpTRANS_COMPLEMENT 32 #define OPpTRANS_GROWS 64 +#define OPpTRANS_DELETE 128 +#define OPpTRANS_ALL (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE) /* Private for OP_REPEAT */ #define OPpREPEAT_DOLIST 64 /* List replication. */ -/* Private for OP_RV2?V, OP_?ELEM */ -#define OPpDEREF (32|64) /* Want ref to something: */ +/* Private for OP_RV2GV, OP_RV2SV, OP_AELEM, OP_HELEM, OP_PADSV */ +#define OPpDEREF (32|64) /* autovivify: Want ref to something: */ #define OPpDEREF_AV 32 /* Want ref to AV. */ #define OPpDEREF_HV 64 /* Want ref to HV. */ #define OPpDEREF_SV (32|64) /* Want ref to SV. */ /* OP_ENTERSUB only */ #define OPpENTERSUB_DB 16 /* Debug subroutine. */ #define OPpENTERSUB_HASTARG 32 /* Called from OP tree. */ +#define OPpENTERSUB_NOMOD 64 /* Immune to mod() for :attrlist. */ /* OP_RV2CV only */ #define OPpENTERSUB_AMPER 8 /* Used & form to call. */ #define OPpENTERSUB_NOPAREN 128 /* bare sub call (without parens) */ @@ -155,7 +171,7 @@ Deprecated. Use C instead. #define OPpEARLY_CV 32 /* foo() called before sub foo was parsed */ /* OP_?ELEM only */ #define OPpLVAL_DEFER 16 /* Defer creation of array/hash elem */ - /* OP_RV2?V, OP_GVSV only */ + /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */ #define OPpOUR_INTRO 16 /* Variable was in an our() */ /* OP_RV2[AH]V, OP_PAD[AH]V, OP_[AH]ELEM */ #define OPpMAYBE_LVSUB 8 /* We might be an lvalue to return */ @@ -165,7 +181,12 @@ Deprecated. Use C instead. /* (lower bits may carry MAXARG) */ #define OPpTARGET_MY 16 /* Target is PADMY. */ +/* Private for OP_ENTERITER and OP_ITER */ +#define OPpITER_REVERSED 4 /* for (reverse ...) */ + /* Private for OP_CONST */ +#define OPpCONST_NOVER 2 /* no 6; */ +#define OPpCONST_SHORTCIRCUIT 4 /* eg the constant 5 in (5 || foo) */ #define OPpCONST_STRICT 8 /* bearword subject to strict 'subs' */ #define OPpCONST_ENTERED 16 /* Has been entered as symbol. */ #define OPpCONST_ARYBASE 32 /* Was a $[ translated to constant. */ @@ -187,7 +208,9 @@ Deprecated. Use C instead. /* Private for OP_SORT */ #define OPpSORT_NUMERIC 1 /* Optimized away { $a <=> $b } */ #define OPpSORT_INTEGER 2 /* Ditto while under "use integer" */ -#define OPpSORT_REVERSE 4 /* Descending sort */ +#define OPpSORT_REVERSE 4 /* Reversed sort */ +#define OPpSORT_INPLACE 8 /* sort in-place; eg @a = sort @a */ +#define OPpSORT_DESCEND 16 /* Descending sort */ /* Private for OP_THREADSV */ #define OPpDONE_SVREF 64 /* Been through newSVREF once */ @@ -197,9 +220,24 @@ Deprecated. Use C instead. #define OPpOPEN_OUT_RAW 64 /* binmode(F,":raw") on output fh */ #define OPpOPEN_OUT_CRLF 128 /* binmode(F,":crlf") on output fh */ -/* Private for OP_EXIT */ +/* Private for OP_EXIT, HUSH also for OP_DIE */ +#define OPpHUSH_VMSISH 64 /* hush DCL exit msg vmsish mode*/ #define OPpEXIT_VMSISH 128 /* exit(0) vs. exit(1) vmsish mode*/ +/* Private of OP_FTXXX */ +#define OPpFT_ACCESS 2 /* use filetest 'access' */ +#define OPpFT_STACKED 4 /* stacked filetest, as in "-f -x $f" */ +#define OP_IS_FILETEST_ACCESS(op) \ + (((op)->op_type) == OP_FTRREAD || \ + ((op)->op_type) == OP_FTRWRITE || \ + ((op)->op_type) == OP_FTREXEC || \ + ((op)->op_type) == OP_FTEREAD || \ + ((op)->op_type) == OP_FTEWRITE || \ + ((op)->op_type) == OP_FTEEXEC) + +/* Private for OP_(MAP|GREP)(WHILE|START) */ +#define OPpGREP_LEX 2 /* iterate over lexical $_ */ + struct op { BASEOP }; @@ -231,7 +269,7 @@ struct pmop { BASEOP OP * op_first; OP * op_last; - OP * op_pmreplroot; + OP * op_pmreplroot; /* (type is really union {OP*,GV*,PADOFFSET}) */ OP * op_pmreplstart; PMOP * op_pmnext; /* list of all scanpats */ #ifdef USE_ITHREADS @@ -239,8 +277,8 @@ struct pmop { #else REGEXP * op_pmregexp; /* compiled expression */ #endif - U16 op_pmflags; - U16 op_pmpermflags; + U32 op_pmflags; + U32 op_pmpermflags; U8 op_pmdynflags; #ifdef USE_ITHREADS char * op_pmstashpv; @@ -250,8 +288,11 @@ struct pmop { }; #ifdef USE_ITHREADS -#define PM_GETRE(o) ((REGEXP*)SvIVX(PL_regex_pad[(o)->op_pmoffset])) -#define PM_SETRE(o,r) (sv_setiv(PL_regex_pad[(o)->op_pmoffset], (IV)r)) +#define PM_GETRE(o) (INT2PTR(REGEXP*,SvIVX(PL_regex_pad[(o)->op_pmoffset]))) +#define PM_SETRE(o,r) STMT_START { \ + SV* const sv = PL_regex_pad[(o)->op_pmoffset]; \ + sv_setiv(sv, PTR2IV(r)); \ + } STMT_END #define PM_GETRE_SAFE(o) (PL_regex_pad ? PM_GETRE(o) : (REGEXP*)0) #define PM_SETRE_SAFE(o,r) if (PL_regex_pad) PM_SETRE(o,r) #else @@ -270,7 +311,7 @@ struct pmop { #define PMf_RETAINT 0x0001 /* taint $1 etc. if target tainted */ #define PMf_ONCE 0x0002 /* use pattern only once per reset */ -#define PMf_REVERSED 0x0004 /* Should be matched right->left */ +#define PMf_UNUSED 0x0004 /* free for use */ #define PMf_MAYBE_CONST 0x0008 /* replacement contains variables */ #define PMf_SKIPWHITE 0x0010 /* skip leading whitespace for split */ #define PMf_WHITE 0x0020 /* pattern is \s+ */ @@ -289,17 +330,21 @@ struct pmop { #define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED) #ifdef USE_ITHREADS + # define PmopSTASHPV(o) ((o)->op_pmstashpv) -# define PmopSTASHPV_set(o,pv) ((o)->op_pmstashpv = ((pv) ? savepv(pv) : Nullch)) +# define PmopSTASHPV_set(o,pv) (PmopSTASHPV(o) = savesharedpv(pv)) # define PmopSTASH(o) (PmopSTASHPV(o) \ ? gv_stashpv(PmopSTASHPV(o),GV_ADD) : Nullhv) -# define PmopSTASH_set(o,hv) PmopSTASHPV_set(o, (hv) ? HvNAME(hv) : Nullch) +# define PmopSTASH_set(o,hv) PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : Nullch)) +# define PmopSTASH_free(o) PerlMemShared_free(PmopSTASHPV(o)) + #else # define PmopSTASH(o) ((o)->op_pmstash) # define PmopSTASH_set(o,hv) ((o)->op_pmstash = (hv)) -# define PmopSTASHPV(o) (PmopSTASH(o) ? HvNAME(PmopSTASH(o)) : Nullch) +# define PmopSTASHPV(o) (PmopSTASH(o) ? HvNAME_get(PmopSTASH(o)) : Nullch) /* op_pmstash is not refcounted */ # define PmopSTASHPV_set(o,pv) PmopSTASH_set((o), gv_stashpv(pv,GV_ADD)) +# define PmopSTASH_free(o) #endif struct svop { @@ -372,13 +417,13 @@ struct loop { #ifdef USE_ITHREADS -# define cGVOPx_gv(o) ((GV*)PL_curpad[cPADOPx(o)->op_padix]) +# define cGVOPx_gv(o) ((GV*)PAD_SVl(cPADOPx(o)->op_padix)) # define IS_PADGV(v) (v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v)) # define IS_PADCONST(v) (v && SvREADONLY(v)) # define cSVOPx_sv(v) (cSVOPx(v)->op_sv \ - ? cSVOPx(v)->op_sv : PL_curpad[(v)->op_targ]) + ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ)) # define cSVOPx_svp(v) (cSVOPx(v)->op_sv \ - ? &cSVOPx(v)->op_sv : &PL_curpad[(v)->op_targ]) + ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ)) #else # define cGVOPx_gv(o) ((GV*)cSVOPx(o)->op_sv) # define IS_PADGV(v) FALSE @@ -441,8 +486,13 @@ struct loop { #ifdef USE_ITHREADS # define OP_REFCNT_INIT MUTEX_INIT(&PL_op_mutex) -# define OP_REFCNT_LOCK MUTEX_LOCK(&PL_op_mutex) -# define OP_REFCNT_UNLOCK MUTEX_UNLOCK(&PL_op_mutex) +# ifdef PERL_CORE +# define OP_REFCNT_LOCK MUTEX_LOCK(&PL_op_mutex) +# define OP_REFCNT_UNLOCK MUTEX_UNLOCK(&PL_op_mutex) +# else +# define OP_REFCNT_LOCK op_refcnt_lock() +# define OP_REFCNT_UNLOCK op_refcnt_unlock() +# endif # define OP_REFCNT_TERM MUTEX_DESTROY(&PL_op_mutex) #else # define OP_REFCNT_INIT NOOP @@ -460,26 +510,22 @@ struct loop { #define PERL_LOADMOD_NOIMPORT 0x2 #define PERL_LOADMOD_IMPORT_OPS 0x4 -#ifdef USE_REENTRANT_API - -typedef struct { - struct tm* tmbuff; -} REBUF; - -#define localtime(a) (localtime_r((a),PL_reentrant_buffer->tmbuff) ? PL_reentrant_buffer->tmbuff : NULL) -#define gmtime(a) (gmtime_r((a),PL_reentrant_buffer->tmbuff) ? PL_reentrant_buffer->tmbuff : NULL) - -#if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020 - -/* HP-UX 10.20 returns 0 on success, what it returns on failure is hidden - in the fog somewhere, possibly -1 which means the following should do - the right thing - 20010816 sky */ - -#undef localtime -#undef gmtime -#define localtime(a) ((localtime_r((a),PL_reentrant_buffer->tmbuff) == 0) ? PL_reentrant_buffer->tmbuff : NULL) -#define gmtime(a) ((gmtime_r((a),PL_reentrant_buffer->tmbuff) == 0) ? PL_reentrant_buffer->tmbuff : NULL) -#endif /* HP-UX 10.20 */ +/* used in perly.y */ +#define ref(o, type) doref(o, type, TRUE) +#ifdef USE_REENTRANT_API +#include "reentr.h" #endif +#if defined(PL_OP_SLAB_ALLOC) +#define NewOp(m,var,c,type) \ + (var = (type *) Perl_Slab_Alloc(aTHX_ m,c*sizeof(type))) +#define NewOpSz(m,var,size) \ + (var = (OP *) Perl_Slab_Alloc(aTHX_ m,size)) +#define FreeOp(p) Perl_Slab_Free(aTHX_ p) +#else +#define NewOp(m, var, c, type) Newxz(var, c, type) +#define NewOpSz(m, var, size) \ + (var = (OP*)safemalloc(size), memzero(var, size)) +#define FreeOp(p) Safefree(p) +#endif