SV** seq_ptr = AvARRAY(seq) + 1;
while(seq_items--) {
SV* const seqitem = *seq_ptr++;
- HE* const he = hv_fetch_ent(tails, seqitem, 0, 0);
- if(!he) {
- if(!hv_store_ent(tails, seqitem, newSViv(1), 0)) {
- croak("failed to store value in hash");
- }
- }
- else {
+ /* LVALUE fetch will create a new undefined SV if necessary
+ */
+ HE* const he = hv_fetch_ent(tails, seqitem, 1, 0);
+ if(he) {
SV* const val = HeVAL(he);
+ /* This will increment undef to 1, which is what we
+ want for a newly created entry. */
sv_inc(val);
+ } else {
+ croak("failed to store value in hash");
}
}
}
}
/* we found a real sub here */
- sv = sv_2mortal(newSV(0));
+ sv = sv_newmortal();
gv_efullname3(sv, cvgv, NULL);
if (SvTYPE(candidate) == SVt_PVGV && (cand_cv = GvCV(candidate)) && !GvCVGEN(candidate)) {
SvREFCNT_dec(linear_av);
SvREFCNT_inc((SV*)cand_cv);
- if (!hv_store_ent(nmcache, newSVsv(cachekey), (SV*)cand_cv, 0)) {
+ if (!hv_store_ent(nmcache, cachekey, (SV*)cand_cv, 0)) {
croak("failed to store value in hash");
}
XPUSHs(sv_2mortal(newRV_inc((SV*)cand_cv)));
}
SvREFCNT_dec(linear_av);
- if (!hv_store_ent(nmcache, newSVsv(cachekey), &PL_sv_undef, 0)) {
+ if (!hv_store_ent(nmcache, cachekey, &PL_sv_undef, 0)) {
croak("failed to store value in hash");
}
if(throw_nomethod)