- HV *hv = GvHV(gv);
- I32 preeminent = su_hv_preeminent(hv, elem);
- HE *he = hv_fetch_ent(hv, elem, 1, 0);
- SV **svp = he ? &HeVAL(he) : NULL;
- if (!svp || *svp == &PL_sv_undef) croak("Modification of non-creatable hash value attempted, subscript \"%s\"", SvPV_nolen_const(*svp));
- su_save_helem(hv, elem, svp, preeminent);
- gv = (GV *) *svp;
- if (val) { /* local $x{$key} = $val; */
- goto maybe_deref;
- } else { /* local $x{$key}; delete $x{$key}; */
- hv_delete_ent(hv, elem, G_DISCARD, HeHASH(he));
- goto done;
- }