-#define AvFILL(av) ((XPVAV*) SvANY(av))->xav_fill
-#define AvARYLEN(av) ((XPVAV*) SvANY(av))->xav_arylen
-#define AvFLAGS(av) ((XPVAV*) SvANY(av))->xav_flags
+#define AvFILLp(av) ((XPVAV*) SvANY(av))->xav_fill
+#define AvARYLEN(av) (*Perl_av_arylen_p(aTHX_ MUTABLE_AV(av)))
+
+#define AvREAL(av) (SvFLAGS(av) & SVpav_REAL)
+#define AvREAL_on(av) (SvFLAGS(av) |= SVpav_REAL)
+#define AvREAL_off(av) (SvFLAGS(av) &= ~SVpav_REAL)
+#define AvREAL_only(av) (AvREIFY_off(av), SvFLAGS(av) |= SVpav_REAL)
+#define AvREIFY(av) (SvFLAGS(av) & SVpav_REIFY)
+#define AvREIFY_on(av) (SvFLAGS(av) |= SVpav_REIFY)
+#define AvREIFY_off(av) (SvFLAGS(av) &= ~SVpav_REIFY)
+#define AvREIFY_only(av) (AvREAL_off(av), SvFLAGS(av) |= SVpav_REIFY)
+
+
+#define AvREALISH(av) (SvFLAGS(av) & (SVpav_REAL|SVpav_REIFY))
+
+#define AvFILL(av) ((SvRMAGICAL((const SV *) (av))) \
+ ? mg_size(MUTABLE_SV(av)) : AvFILLp(av))
+#define av_tindex(av) av_top_index(av)
+
+/* Note that it doesn't make sense to do this:
+ * SvGETMAGIC(av); IV x = av_tindex_nomg(av);
+ */
+# define av_top_index_skip_len_mg(av) \
+ (__ASSERT_(SvTYPE(av) == SVt_PVAV) AvFILLp(av))
+# define av_tindex_skip_len_mg(av) av_top_index_skip_len_mg(av)