This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Synchronise Dumpvalue to CPAN
[perl5.git] / pad.h
diff --git a/pad.h b/pad.h
index 647db33..7e130d8 100644 (file)
--- a/pad.h
+++ b/pad.h
@@ -31,13 +31,19 @@ typedef U64TYPE PADOFFSET;
 #endif
 #define NOT_IN_PAD ((PADOFFSET) -1)
 
+/* a value that PL_cop_seqmax is guaranteed never to be,
+ * flagging that a lexical is being introduced, or has not yet left scope
+ */
+#define PERL_PADSEQ_INTRO  U32_MAX
+
+
 /* B.xs needs these for the benefit of B::Deparse */
 /* Low range end is exclusive (valid from the cop seq after this one) */
 /* High range end is inclusive (valid up to this cop seq) */
 
 #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
 #  define COP_SEQ_RANGE_LOW(sv)                                                \
-       (({ SV *const _sv_cop_seq_range_low = (SV *) (sv);              \
+       (({ const SV *const _sv_cop_seq_range_low = (const SV *) (sv);  \
          assert(SvTYPE(_sv_cop_seq_range_low) == SVt_NV                \
                 || SvTYPE(_sv_cop_seq_range_low) >= SVt_PVNV);         \
          assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVAV);            \
@@ -45,10 +51,10 @@ typedef U64TYPE PADOFFSET;
          assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVCV);            \
          assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVFM);            \
          assert(!isGV_with_GP(_sv_cop_seq_range_low));                 \
-         ((XPVNV*) SvANY(_sv_cop_seq_range_low))->xnv_u.xpad_cop_seq.xlow; \
+         ((XPVNV*) MUTABLE_PTR(SvANY(_sv_cop_seq_range_low)))->xnv_u.xpad_cop_seq.xlow; \
         }))
 #  define COP_SEQ_RANGE_HIGH(sv)                                       \
-       (({ SV *const _sv_cop_seq_range_high = (SV *) (sv);             \
+       (({ const SV *const _sv_cop_seq_range_high = (const SV *) (sv); \
          assert(SvTYPE(_sv_cop_seq_range_high) == SVt_NV               \
                  || SvTYPE(_sv_cop_seq_range_high) >= SVt_PVNV);       \
          assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVAV);           \
@@ -56,10 +62,10 @@ typedef U64TYPE PADOFFSET;
          assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVCV);           \
          assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVFM);           \
          assert(!isGV_with_GP(_sv_cop_seq_range_high));                \
-         ((XPVNV*) SvANY(_sv_cop_seq_range_high))->xnv_u.xpad_cop_seq.xhigh; \
+         ((XPVNV*) MUTABLE_PTR(SvANY(_sv_cop_seq_range_high)))->xnv_u.xpad_cop_seq.xhigh; \
         }))
 #  define PARENT_PAD_INDEX(sv)                                         \
-       (({ SV *const _sv_parent_pad_index = (SV *) (sv);               \
+       (({ const SV *const _sv_parent_pad_index = (const SV *) (sv);   \
          assert(SvTYPE(_sv_parent_pad_index) == SVt_NV                 \
                 || SvTYPE(_sv_parent_pad_index) >= SVt_PVNV);          \
          assert(SvTYPE(_sv_parent_pad_index) != SVt_PVAV);             \
@@ -67,10 +73,10 @@ typedef U64TYPE PADOFFSET;
          assert(SvTYPE(_sv_parent_pad_index) != SVt_PVCV);             \
          assert(SvTYPE(_sv_parent_pad_index) != SVt_PVFM);             \
          assert(!isGV_with_GP(_sv_parent_pad_index));                  \
-         ((XPVNV*) SvANY(_sv_parent_pad_index))->xnv_u.xpad_cop_seq.xlow; \
+         ((XPVNV*) MUTABLE_PTR(SvANY(_sv_parent_pad_index)))->xnv_u.xpad_cop_seq.xlow; \
         }))
 #  define PARENT_FAKELEX_FLAGS(sv)                                     \
-       (({ SV *const _sv_parent_fakelex_flags = (SV *) (sv);           \
+       (({ const SV *const _sv_parent_fakelex_flags = (const SV *) (sv); \
          assert(SvTYPE(_sv_parent_fakelex_flags) == SVt_NV             \
                 || SvTYPE(_sv_parent_fakelex_flags) >= SVt_PVNV);      \
          assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVAV);         \
@@ -78,7 +84,7 @@ typedef U64TYPE PADOFFSET;
          assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVCV);         \
          assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVFM);         \
          assert(!isGV_with_GP(_sv_parent_fakelex_flags));              \
-         ((XPVNV*) SvANY(_sv_parent_fakelex_flags))->xnv_u.xpad_cop_seq.xhigh; \
+         ((XPVNV*) MUTABLE_PTR(SvANY(_sv_parent_fakelex_flags)))->xnv_u.xpad_cop_seq.xhigh; \
         }))
 #else
 #  define COP_SEQ_RANGE_LOW(sv)                \
@@ -112,6 +118,16 @@ typedef enum {
        padtidy_FORMAT          /* or a format */
 } padtidy_type;
 
+#ifdef PERL_CORE
+
+/* flags for pad_add_name. SVf_UTF8 will also be valid in the future.  */
+
+#  define padadd_OUR           0x01    /* our declaration. */
+#  define padadd_STATE         0x02    /* state declaration. */
+#  define padadd_NO_DUP_CHECK  0x04    /* skip warning on dups. */
+
+#endif
+
 /* ASSERT_CURPAD_LEGAL and ASSERT_CURPAD_ACTIVE respectively determine
  * whether PL_comppad and PL_curpad are consistent and whether they have
  * active values */
@@ -210,7 +226,7 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
 
 #define PAD_BASE_SV(padlist, po) \
        (AvARRAY(padlist)[1])   \
-           ? AvARRAY((AV*)(AvARRAY(padlist)[1]))[po] : NULL;
+       ? AvARRAY(MUTABLE_AV((AvARRAY(padlist)[1])))[po] : NULL;
 
 
 #define PAD_SET_CUR_NOSAVE(padlist,nth) \
@@ -239,7 +255,8 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
              PTR2UV(PL_comppad), PTR2UV(PL_curpad)));
 
 #define PAD_RESTORE_LOCAL(opad) \
-       PL_comppad = opad;                                      \
+        assert(!opad || !SvIS_FREED(opad));                                    \
+       PL_comppad = opad;                                              \
        PL_curpad =  PL_comppad ? AvARRAY(PL_comppad) : NULL;   \
        DEBUG_Xv(PerlIO_printf(Perl_debug_log,                  \
              "Pad 0x%"UVxf"[0x%"UVxf"] restore_local\n",       \
@@ -258,7 +275,7 @@ context block structure (can be used as an lvalue).
 */
 
 #define CX_CURPAD_SAVE(block)  (block).oldcomppad = PL_comppad
-#define CX_CURPAD_SV(block,po) (AvARRAY((AV*)((block).oldcomppad))[po])
+#define CX_CURPAD_SV(block,po) (AvARRAY(MUTABLE_AV(((block).oldcomppad)))[po])
 
 
 /*
@@ -292,8 +309,7 @@ ling pad (lvalue) to C<gen>.  Note that C<SvUV_set> is hijacked for this purpose
 
 #define PAD_COMPNAME_SV(po) (*av_fetch(PL_comppad_name, (po), FALSE))
 #define PAD_COMPNAME_FLAGS(po) SvFLAGS(PAD_COMPNAME_SV(po))
-#define PAD_COMPNAME_FLAGS_isOUR(po) \
-  ((PAD_COMPNAME_FLAGS(po) & (SVpad_NAME|SVpad_OUR)) == (SVpad_NAME|SVpad_OUR))
+#define PAD_COMPNAME_FLAGS_isOUR(po) SvPAD_OUR(PAD_COMPNAME_SV(po))
 #define PAD_COMPNAME_PV(po) SvPV_nolen(PAD_COMPNAME_SV(po))
 
 #define PAD_COMPNAME_TYPE(po) pad_compname_type(po)
@@ -337,7 +353,7 @@ Clone the state variables associated with running and compiling pads.
  * sub's CV or padlist. */
 
 #define PAD_CLONE_VARS(proto_perl, param)                              \
-    PL_comppad = (AV *) ptr_table_fetch(PL_ptr_table, proto_perl->Icomppad); \
+    PL_comppad = MUTABLE_AV(ptr_table_fetch(PL_ptr_table, proto_perl->Icomppad)); \
     PL_curpad = PL_comppad ?  AvARRAY(PL_comppad) : NULL;              \
     PL_comppad_name            = av_dup(proto_perl->Icomppad_name, param); \
     PL_comppad_name_fill       = proto_perl->Icomppad_name_fill;       \