assert(itmp > newmax);
newmax = itmp - 1;
assert(newmax >= AvMAX(av));
- New(2,ary, newmax+1, SV*);
+ Newx(ary, newmax+1, SV*);
Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
if (AvMAX(av) > 64)
offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
else {
newmax = key < 3 ? 3 : key;
MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
- New(2,AvALLOC(av), newmax+1, SV*);
+ Newx(AvALLOC(av), newmax+1, SV*);
ary = AvALLOC(av) + 1;
tmp = newmax;
AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
av = (AV*)NEWSV(3,0);
sv_upgrade((SV *)av, SVt_PVAV);
- AvREAL_on(av);
+ /* sv_upgrade does AvREAL_only() */
AvALLOC(av) = 0;
SvPV_set(av, (char*)0);
AvMAX(av) = AvFILLp(av) = -1;
av = (AV*)NEWSV(8,0);
sv_upgrade((SV *) av,SVt_PVAV);
- AvFLAGS(av) = AVf_REAL;
- if (size) { /* `defined' was returning undef for size==0 anyway. */
+ /* sv_upgrade does AvREAL_only() */
+ if (size) { /* "defined" was returning undef for size==0 anyway. */
register SV** ary;
register I32 i;
- New(4,ary,size,SV*);
+ Newx(ary,size,SV*);
AvALLOC(av) = ary;
SvPV_set(av, (char*)ary);
AvFILLp(av) = size - 1;
av = (AV*)NEWSV(9,0);
sv_upgrade((SV *)av, SVt_PVAV);
- New(4,ary,size+1,SV*);
+ Newx(ary,size+1,SV*);
AvALLOC(av) = ary;
Copy(strp,ary,size,SV*);
- AvFLAGS(av) = AVf_REIFY;
+ AvREIFY_only(av);
SvPV_set(av, (char*)ary);
AvFILLp(av) = size - 1;
AvMAX(av) = size - 1;
#endif
if (!av)
return;
- /*SUPPRESS 560*/
if (SvREADONLY(av))
Perl_croak(aTHX_ PL_no_modify);
void
Perl_av_undef(pTHX_ register AV *av)
{
- register I32 key;
-
if (!av)
return;
- /*SUPPRESS 560*/
/* Give any tie a chance to cleanup first */
if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
av_fill(av, -1); /* mg_clear() ? */
if (AvREAL(av)) {
- key = AvFILLp(av) + 1;
+ register I32 key = AvFILLp(av) + 1;
while (key)
SvREFCNT_dec(AvARRAY(av)[--key]);
}
AvALLOC(av) = 0;
SvPV_set(av, (char*)0);
AvMAX(av) = AvFILLp(av) = -1;
- if (AvARYLEN(av)) {
- SvREFCNT_dec(AvARYLEN(av));
- AvARYLEN(av) = 0;
- }
+ /* It's in magic - it must already be gone. */
+ assert (!AvARYLEN(av));
}
/*
{
dVAR;
register I32 i;
- register SV **ary;
MAGIC* mg;
- I32 slide;
if (!av)
return;
SvPV_set(av, (char*)(AvARRAY(av) - i));
}
if (num) {
+ register SV **ary;
+ I32 slide;
i = AvFILLp(av);
/* Create extra elements */
slide = i > 0 ? i : 0;
return FALSE;
}
+SV **
+Perl_av_arylen_p(pTHX_ AV *av) {
+ dVAR;
+ MAGIC *mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
+
+ if (!mg) {
+ mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
+ 0, 0);
+
+ if (!mg) {
+ Perl_die(aTHX_ "panic: av_arylen_p");
+ }
+ /* sv_magicext won't set this for us because we pass in a NULL obj */
+ mg->mg_flags |= MGf_REFCOUNTED;
+ }
+ return &(mg->mg_obj);
+}
+
/*
* Local variables:
* c-indentation-style: bsd