diff options
Diffstat (limited to 'cop.h')
-rw-r--r-- | cop.h | 25 |
1 files changed, 20 insertions, 5 deletions
@@ -144,7 +144,6 @@ struct cop { GV * cop_filegv; /* file the following line # is from */ #endif U32 cop_seq; /* parse sequence number */ - I32 cop_arybase; /* array base this line was compiled with */ line_t cop_line; /* line # of this command */ /* Beware. mg.c and warnings.pl assume the type of this is STRLEN *: */ STRLEN * cop_warnings; /* lexical warnings bitmask */ @@ -230,10 +229,26 @@ struct cop { # define OutCopFILE(c) CopFILE(c) #endif -/* CopARYBASE is likely to be removed soon. */ -#define CopARYBASE(c) ((c)->cop_arybase) -#define CopARYBASE_get(c) ((c)->cop_arybase + 0) -#define CopARYBASE_set(c, b) STMT_START { (c)->cop_arybase = (b); } STMT_END +/* If $[ is non-zero, it's stored in cop_hints under the key "$[", and + HINT_ARYBASE is set to indicate this. + Setting it is ineficient due to the need to create 2 mortal SVs, but as + using $[ is highly discouraged, no sane Perl code will be using it. */ +#define CopARYBASE_get(c) \ + ((CopHINTS_get(c) & HINT_ARYBASE) \ + ? SvIV(Perl_refcounted_he_fetch(aTHX_ (c)->cop_hints, 0, "$[", 2, 0, \ + 0)) \ + : 0) +#define CopARYBASE_set(c, b) STMT_START { \ + if (b || ((c)->op_private & HINT_ARYBASE)) { \ + (c)->op_private |= HINT_ARYBASE; \ + if ((c) == &PL_compiling) \ + PL_hints |= HINT_LOCALIZE_HH | HINT_ARYBASE; \ + (c)->cop_hints \ + = Perl_refcounted_he_new(aTHX_ (c)->cop_hints, \ + sv_2mortal(newSVpvs("$[")), \ + sv_2mortal(newSViv(b))); \ + } \ + } STMT_END /* FIXME NATIVE_HINTS if this is changed from op_private (see perl.h) */ #define CopHINTS_get(c) ((c)->op_private + 0) |