- gv = gv_fetchpvn_flags(s, l, GV_ADDMULTI, SVt_PVGV);
+ SvREFCNT_dec(sv);
+ sv = newSVpvn(s, l);
+ }
+
+ switch (t) {
+ case SVt_PVAV:
+ case SVt_PVHV:
+ case SVt_PVCV:
+ case SVt_PVGV:
+ deref = 0;
+ break;
+ }
+ /* When deref is set, val isn't NULL */
+
+ ud->sv = sv;
+ ud->val = val ? newSVsv(deref ? SvRV(val) : val) : NULL;
+ ud->elem = SvREFCNT_inc(elem);
+ ud->type = t;
+}
+
+STATIC void su_localize(pTHX_ void *ud_) {
+#define su_localize(U) su_localize(aTHX_ (U))
+ su_ud_localize *ud = (su_ud_localize *) ud_;
+ SV *sv = ud->sv;
+ SV *val = ud->val;
+ SV *elem = ud->elem;
+ svtype t = ud->type;
+ GV *gv;
+
+ if (SvTYPE(sv) >= SVt_PVGV) {
+ gv = (GV *) sv;
+ } else {
+#ifdef gv_fetchsv
+ gv = gv_fetchsv(sv, GV_ADDMULTI, SVt_PVGV);
+#else
+ STRLEN len;
+ const char *name = SvPV_const(sv, len);
+ gv = gv_fetchpvn_flags(name, len, GV_ADDMULTI, SVt_PVGV);
+#endif