X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/ede1273d4e7ecb92df498e88937c3198127171a4..1d40d392b48cbc36778fbf815dc5349f0b471377:/op.h diff --git a/op.h b/op.h index adf5d1f..e263a9c 100644 --- a/op.h +++ b/op.h @@ -45,6 +45,8 @@ # define MADPROP_IN_BASEOP #endif +typedef PERL_BITFIELD16 Optype; + #ifdef BASEOP_DEFINITION #define BASEOP BASEOP_DEFINITION #else @@ -54,22 +56,29 @@ OP* (CPERLscope(*op_ppaddr))(pTHX); \ MADPROP_IN_BASEOP \ PADOFFSET op_targ; \ - unsigned op_type:9; \ - unsigned op_opt:1; \ - unsigned op_latefree:1; \ - unsigned op_latefreed:1; \ - unsigned op_attached:1; \ - unsigned op_spare:3; \ + PERL_BITFIELD16 op_type:9; \ + PERL_BITFIELD16 op_opt:1; \ + PERL_BITFIELD16 op_latefree:1; \ + PERL_BITFIELD16 op_latefreed:1; \ + PERL_BITFIELD16 op_attached:1; \ + PERL_BITFIELD16 op_spare:3; \ U8 op_flags; \ U8 op_private; #endif +/* If op_type:9 is changed to :10, also change PUSHEVAL in cop.h. + Also, if the type of op_type is ever changed (e.g. to PERL_BITFIELD32) + then all the other bit-fields before/after it should change their + types too to let VC pack them into the same 4 byte integer.*/ + #define OP_GIMME(op,dfl) \ (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID ? G_VOID : \ ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \ ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST ? G_ARRAY : \ dfl) +#define OP_GIMME_REVERSE(flags) ((flags) & G_WANT) + /* =head1 "Gimme" Values @@ -103,8 +112,6 @@ Deprecated. Use C instead. #define OPf_STACKED 64 /* Some arg is arriving on the stack. */ #define OPf_SPECIAL 128 /* Do something weird for this op: */ /* On local LVAL, don't init local value. */ - /* On OP_CONST, value is the hints hash for - eval, so return a copy from pp_const() */ /* On OP_SORT, subroutine is inlined. */ /* On OP_NOT, inversion was implicit. */ /* On OP_LEAVE, don't restore curpm. */ @@ -184,7 +191,7 @@ Deprecated. Use C instead. #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 */ + /* OP_ENTERSUB and OP_RV2CV only */ #define OPpENTERSUB_AMPER 8 /* Used & form to call. */ #define OPpENTERSUB_NOPAREN 128 /* bare sub call (without parens) */ #define OPpENTERSUB_INARGS 4 /* Lval used as arg to a sub. */ @@ -259,13 +266,6 @@ Deprecated. Use C instead. /* Private for 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 $_ */ @@ -329,33 +329,24 @@ struct pmop { }; #ifdef USE_ITHREADS -#define PM_GETRE(o) (INT2PTR(REGEXP*,SvIVX(PL_regex_pad[(o)->op_pmoffset]))) +#define PM_GETRE(o) (SvTYPE(PL_regex_pad[(o)->op_pmoffset]) == SVt_REGEXP \ + ? (REGEXP*)(PL_regex_pad[(o)->op_pmoffset]) : NULL) /* The assignment is just to enforce type safety (or at least get a warning). */ +/* With first class regexps not via a reference one needs to assign + &PL_sv_undef under ithreads. (This would probably work unthreaded, but NULL + is cheaper. I guess we could allow NULL, but the check above would get + more complex, and we'd have an AV with (SV*)NULL in it, which feels bad */ +/* BEWARE - something that calls this macro passes (r) which has a side + effect. */ #define PM_SETRE(o,r) STMT_START { \ - const REGEXP *const slosh = (r); \ - PM_SETRE_OFFSET((o), PTR2IV(slosh)); \ - } STMT_END -/* Actually you can assign any IV, not just an offset. And really should it be - UV? */ -#define PM_SETRE_OFFSET(o,iv) \ - STMT_START { \ - SV* const sv = PL_regex_pad[(o)->op_pmoffset]; \ - sv_setiv(sv, (iv)); \ + const REGEXP *const _pm_setre = (r); \ + assert(_pm_setre); \ + PL_regex_pad[(o)->op_pmoffset] = (SV*)_pm_setre; \ } STMT_END - -# ifndef PERL_CORE -/* No longer used anywhere in the core. Migrate to Devel::PPPort? */ -#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) -# endif #else #define PM_GETRE(o) ((o)->op_pmregexp) #define PM_SETRE(o,r) ((o)->op_pmregexp = (r)) -# ifndef PERL_CORE -#define PM_GETRE_SAFE PM_GETRE -#define PM_SETRE_SAFE PM_SETRE -# endif #endif @@ -522,7 +513,9 @@ struct loop { #define cSVOPo_sv cSVOPx_sv(o) #define kSVOP_sv cSVOPx_sv(kid) -#define Nullop ((OP*)NULL) +#ifndef PERL_CORE +# define Nullop ((OP*)NULL) +#endif /* Lowest byte-and-a-bit of PL_opargs */ #define OA_MARK 1