PERL_ARGS_ASSERT_DO_ODDBALL;
if (*relem) {
- SV *tmpstr;
- const HE *didstore;
-
if (ckWARN(WARN_MISC)) {
const char *err;
if (relem == firstrelem &&
Perl_warner(aTHX_ packWARN(WARN_MISC), "%s", err);
}
- tmpstr = newSV(0);
- didstore = hv_store_ent(hash,*relem,tmpstr,0);
- if (SvMAGICAL(hash)) {
- if (SvSMAGICAL(tmpstr))
- mg_set(tmpstr);
- if (!didstore)
- sv_2mortal(tmpstr);
- }
- TAINT_NOT;
}
}
while (relem < lastrelem) { /* gobble up all the rest */
HE *didstore;
+ ODD:
sv = *relem ? *relem : &PL_sv_no;
relem++;
tmpstr = sv_newmortal();
}
if (relem == lastrelem) {
do_oddball(hash, relem, firsthashrelem);
- relem++;
+ /* we have lelem to reuse, it's not needed anymore */
+ *(relem+1) = NULL;
+ goto ODD;
}
LEAVE;
}
* obliterates the earlier key. So refresh all values. */
lastrelem -= duplicates;
relem = firsthashrelem;
- while (relem < lastrelem) {
+ while (relem <= lastrelem) {
HE *he;
sv = *relem++;
he = hv_fetch_ent(hash, sv, 0, 0);
*relem++ = (he ? HeVAL(he) : &PL_sv_undef);
}
}
- SP = lastrelem;
+ SP = ((lastrelem - firsthashrelem)&1)? lastrelem : lastrelem+1;
}
else
SP = firstrelem + (lastlelem - firstlelem);