1 /* av.h 2 * 3 * Copyright (c) 1991-2001, Larry Wall 4 * 5 * You may distribute under the terms of either the GNU General Public 6 * License or the Artistic License, as specified in the README file. 7 * 8 */ 9 10 struct xpvav { 11 char* xav_array; /* pointer to first array element */ 12 SSize_t xav_fill; /* Index of last element present */ 13 SSize_t xav_max; /* max index for which array has space */ 14 IV xof_off; /* ptr is incremented by offset */ 15 NV xnv_nv; /* numeric value, if any */ 16 MAGIC* xmg_magic; /* magic for scalar array */ 17 HV* xmg_stash; /* class package */ 18 19 SV** xav_alloc; /* pointer to malloced string */ 20 SV* xav_arylen; 21 U8 xav_flags; 22 }; 23 24 25 /* AVf_REAL is set for all AVs whose xav_array contents are refcounted. 26 * Some things like "@_" and the scratchpad list do not set this, to 27 * indicate that they are cheating (for efficiency) by not refcounting 28 * the AV's contents. 29 * 30 * AVf_REIFY is only meaningful on such "fake" AVs (i.e. where AVf_REAL 31 * is not set). It indicates that the fake AV is capable of becoming 32 * real if the array needs to be modified in some way. Functions that 33 * modify fake AVs check both flags to call av_reify() as appropriate. 34 * 35 * Note that the Perl stack and @DB::args have neither flag set. (Thus, 36 * items that go on the stack are never refcounted.) 37 * 38 * These internal details are subject to change any time. AV 39 * manipulations external to perl should not care about any of this. 40 * GSAR 1999-09-10 41 */ 42 #define AVf_REAL 1 /* free old entries */ 43 #define AVf_REIFY 2 /* can become real */ 44 45 /* XXX this is not used anywhere */ 46 #define AVf_REUSED 4 /* got undeffed--don't turn old memory into SVs now */ 47 48 /* 49 =for apidoc AmU||Nullav 50 Null AV pointer. 51 52 =for apidoc Am|int|AvFILL|AV* av 53 Same as C<av_len()>. Deprecated, use C<av_len()> instead. 54 55 =cut 56 */ 57 58 #define Nullav Null(AV*) 59 60 #define AvARRAY(av) ((SV**)((XPVAV*) SvANY(av))->xav_array) 61 #define AvALLOC(av) ((XPVAV*) SvANY(av))->xav_alloc 62 #define AvMAX(av) ((XPVAV*) SvANY(av))->xav_max 63 #define AvFILLp(av) ((XPVAV*) SvANY(av))->xav_fill 64 #define AvARYLEN(av) ((XPVAV*) SvANY(av))->xav_arylen 65 #define AvFLAGS(av) ((XPVAV*) SvANY(av))->xav_flags 66 67 #define AvREAL(av) (AvFLAGS(av) & AVf_REAL) 68 #define AvREAL_on(av) (AvFLAGS(av) |= AVf_REAL) 69 #define AvREAL_off(av) (AvFLAGS(av) &= ~AVf_REAL) 70 #define AvREIFY(av) (AvFLAGS(av) & AVf_REIFY) 71 #define AvREIFY_on(av) (AvFLAGS(av) |= AVf_REIFY) 72 #define AvREIFY_off(av) (AvFLAGS(av) &= ~AVf_REIFY) 73 #define AvREUSED(av) (AvFLAGS(av) & AVf_REUSED) 74 #define AvREUSED_on(av) (AvFLAGS(av) |= AVf_REUSED) 75 #define AvREUSED_off(av) (AvFLAGS(av) &= ~AVf_REUSED) 76 77 #define AvREALISH(av) (AvFLAGS(av) & (AVf_REAL|AVf_REIFY)) 78 79 #define AvFILL(av) ((SvRMAGICAL((SV *) (av))) \ 80 ? mg_size((SV *) av) : AvFILLp(av)) 81 82