I notice this code in hv.c: keysv = sv_2mortal(newSVsv(keysv)); I wonder why it's not written: kevsv = sv_mortalcopy(keysv); That would be this: SV * Perl_sv_mortalcopy(pTHX_ SV *oldstr) { register SV *sv; new_SV(sv); sv_setsv(sv,oldstr); EXTEND_MORTAL(1); PL_tmps_stack[++PL_tmps_ix] = sv; SvTEMP_on(sv); return sv; } Instead of this: SV * Perl_newSVsv(pTHX_ register SV *old) { register SV *sv; if (!old) return Nullsv; if (SvTYPE(old) == SVTYPEMASK) { if (ckWARN_d(WARN_INTERNAL)) Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string"); return Nullsv; } new_SV(sv); if (SvTEMP(old)) { SvTEMP_off(old); sv_setsv(sv,old); SvTEMP_on(old); } else sv_setsv(sv,old); return sv; } + SV * Perl_sv_2mortal(pTHX_ register SV *sv) { if (!sv) return sv; if (SvREADONLY(sv) && SvIMMORTAL(sv)) return sv; EXTEND_MORTAL(1); PL_tmps_stack[++PL_tmps_ix] = sv; SvTEMP_on(sv); return sv; } What's the necessity of all the games turning temp off and on again for the code as used by hv.c? Nicholas ClarkThread Next