X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/7d55f6220f027190d816af438b0283662ab1736e..324aa91a3e6fd44523a86df7c5575563c5adf45c:/av.c diff --git a/av.c b/av.c index dfd25df..9e94805 100644 --- a/av.c +++ b/av.c @@ -1,6 +1,6 @@ /* av.c * - * Copyright (c) 1991-1994, Larry Wall + * Copyright (c) 1991-1997, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -33,6 +33,9 @@ AV* av; if (sv != &sv_undef) (void)SvREFCNT_inc(sv); } + key = AvARRAY(av) - AvALLOC(av); + while (key) + AvALLOC(av)[--key] = &sv_undef; AvREAL_on(av); } @@ -153,12 +156,19 @@ I32 lval; return av_store(av,key,sv); } if (AvARRAY(av)[key] == &sv_undef) { + emptyness: if (lval) { sv = NEWSV(6,0); return av_store(av,key,sv); } return 0; } + else if (AvREIFY(av) + && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */ + || SvTYPE(AvARRAY(av)[key]) == SVTYPEMASK)) { + AvARRAY(av)[key] = &sv_undef; /* 1/2 reify */ + goto emptyness; + } return &AvARRAY(av)[key]; } @@ -172,10 +182,13 @@ SV *val; if (!av) return 0; + if (!val) + val = &sv_undef; if (SvRMAGICAL(av)) { if (mg_find((SV*)av,'P')) { - mg_copy((SV*)av, val, 0, key); + if (val != &sv_undef) + mg_copy((SV*)av, val, 0, key); return 0; } } @@ -185,14 +198,12 @@ SV *val; if (key < 0) return 0; } - if (!val) - val = &sv_undef; - + if (SvREADONLY(av) && key >= AvFILL(av)) + croak(no_modify); + if (!AvREAL(av) && AvREIFY(av)) + av_reify(av); if (key > AvMAX(av)) av_extend(av,key); - if (AvREIFY(av)) - av_reify(av); - ary = AvARRAY(av); if (AvFILL(av) < key) { if (!AvREAL(av)) { @@ -327,10 +338,6 @@ register AV *av; while (key) SvREFCNT_dec(AvARRAY(av)[--key]); } - if (key = AvARRAY(av) - AvALLOC(av)) { - AvMAX(av) += key; - SvPVX(av) = (char*)AvALLOC(av); - } Safefree(AvALLOC(av)); AvALLOC(av) = 0; SvPVX(av) = 0; @@ -359,6 +366,8 @@ register AV *av; if (!av || AvFILL(av) < 0) return &sv_undef; + if (SvREADONLY(av)) + croak(no_modify); retval = AvARRAY(av)[AvFILL(av)]; AvARRAY(av)[AvFILL(av)--] = &sv_undef; if (SvSMAGICAL(av)) @@ -376,12 +385,10 @@ register I32 num; if (!av || num <= 0) return; - if (!AvREAL(av)) { - if (AvREIFY(av)) - av_reify(av); - else - croak("Can't unshift"); - } + if (SvREADONLY(av)) + croak(no_modify); + if (!AvREAL(av) && AvREIFY(av)) + av_reify(av); i = AvARRAY(av) - AvALLOC(av); if (i) { if (i > num) @@ -419,6 +426,8 @@ register AV *av; if (!av || AvFILL(av) < 0) return &sv_undef; + if (SvREADONLY(av)) + croak(no_modify); retval = *AvARRAY(av); if (AvREAL(av)) *AvARRAY(av) = &sv_undef;