tmp = AvARRAY(av) - AvALLOC(av);
Move(AvARRAY(av), AvALLOC(av), AvFILLp(av)+1, SV*);
AvMAX(av) += tmp;
- SvPV_set(av, (char*)AvALLOC(av));
+ AvARRAY(av) = AvALLOC(av);
if (AvREAL(av)) {
while (tmp)
ary[--tmp] = &PL_sv_undef;
ary[--tmp] = &PL_sv_undef;
}
- SvPV_set(av, (char*)AvALLOC(av));
+ AvARRAY(av) = AvALLOC(av);
AvMAX(av) = newmax;
}
}
AV *
Perl_newAV(pTHX)
{
- register AV * const av = (AV*)newSV(0);
-
- sv_upgrade((SV *)av, SVt_PVAV);
+ register AV * const av = (AV*)newSV_type(SVt_PVAV);
/* sv_upgrade does AvREAL_only() */
AvALLOC(av) = 0;
- SvPV_set(av, NULL);
+ AvARRAY(av) = NULL;
AvMAX(av) = AvFILLp(av) = -1;
return av;
}
AV *
Perl_av_make(pTHX_ register I32 size, register SV **strp)
{
- register AV * const av = (AV*)newSV(0);
-
- sv_upgrade((SV *) av,SVt_PVAV);
+ register AV * const av = (AV*)newSV_type(SVt_PVAV);
/* sv_upgrade does AvREAL_only() */
if (size) { /* "defined" was returning undef for size==0 anyway. */
register SV** ary;
register I32 i;
Newx(ary,size,SV*);
AvALLOC(av) = ary;
- SvPV_set(av, (char*)ary);
+ AvARRAY(av) = ary;
AvFILLp(av) = AvMAX(av) = size - 1;
for (i = 0; i < size; i++) {
assert (*strp);
extra = AvARRAY(av) - AvALLOC(av);
if (extra) {
AvMAX(av) += extra;
- SvPV_set(av, (char*)AvALLOC(av));
+ AvARRAY(av) = AvALLOC(av);
}
AvFILLp(av) = -1;
}
Safefree(AvALLOC(av));
AvALLOC(av) = NULL;
- SvPV_set(av, NULL);
+ AvARRAY(av) = NULL;
AvMAX(av) = AvFILLp(av) = -1;
}
/*
+
+=for apidoc av_create_and_push
+
+Push an SV onto the end of the array, creating the array if necessary.
+A small internal helper function to remove a commonly duplicated idiom.
+
+=cut
+*/
+
+void
+Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
+{
+ if (!*avp)
+ *avp = newAV();
+ av_push(*avp, val);
+}
+
+/*
=for apidoc av_push
Pushes an SV onto the end of the array. The array will grow automatically
}
/*
+
+=for apidoc av_create_and_unshift_one
+
+Unshifts an SV onto the beginning of the array, creating the array if
+necessary.
+A small internal helper function to remove a commonly duplicated idiom.
+
+=cut
+*/
+
+SV **
+Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
+{
+ if (!*avp)
+ *avp = newAV();
+ av_unshift(*avp, 1);
+ return av_store(*avp, 0, val);
+}
+
+/*
=for apidoc av_unshift
Unshift the given number of C<undef> values onto the beginning of the
AvMAX(av) += i;
AvFILLp(av) += i;
- SvPV_set(av, (char*)(AvARRAY(av) - i));
+ AvARRAY(av) = AvARRAY(av) - i;
}
if (num) {
register SV **ary;
/* Make extra elements into a buffer */
AvMAX(av) -= slide;
AvFILLp(av) -= slide;
- SvPV_set(av, (char*)(AvARRAY(av) + slide));
+ AvARRAY(av) = AvARRAY(av) + slide;
}
}
retval = *AvARRAY(av);
if (AvREAL(av))
*AvARRAY(av) = &PL_sv_undef;
- SvPV_set(av, (char*)(AvARRAY(av) + 1));
+ AvARRAY(av) = AvARRAY(av) + 1;
AvMAX(av)--;
AvFILLp(av)--;
if (SvSMAGICAL(av))