+#if MGf_COPY
+STATIC int vmg_svt_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, int namelen) {
+ return vmg_cb_call2(SV2MGWIZ(mg->mg_ptr)->cb_copy, sv, mg->mg_obj, nsv);
+}
+#endif /* MGf_COPY */
+
+#if MGf_DUP
+STATIC int vmg_svt_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *p) {
+ return 0;
+}
+#endif /* MGf_DUP */
+
+#if MGf_LOCAL
+STATIC int vmg_svt_local(pTHX_ SV *nsv, MAGIC *mg) {
+ return vmg_cb_call(SV2MGWIZ(mg->mg_ptr)->cb_local, nsv, mg->mg_obj);
+}
+#endif /* MGf_LOCAL */
+
+STATIC I32 vmg_uf_val(pTHX_ IV idx, SV *sv) {
+ MAGIC *mg;
+ SV *key;
+ for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
+ if (mg->mg_type == PERL_MAGIC_uvar) { key = mg->mg_obj; break; }
+ }
+ if (!key) { return 0; }
+ for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
+ MGWIZ *w;
+ if ((mg->mg_type != PERL_MAGIC_ext) ||
+ (mg->mg_private < SIG_MIN) || (mg->mg_private > SIG_MAX)) { continue; }
+ w = SV2MGWIZ(mg->mg_ptr);
+ if (!w->uvar) { continue; }
+ switch (idx & (HV_FETCH_ISSTORE|HV_FETCH_ISEXISTS|HV_FETCH_LVALUE|HV_DELETE)){
+ case 0:
+ if (w->cb_fetch) { return vmg_cb_call2(w->cb_fetch, sv, mg->mg_obj, key); }
+ break;
+ case HV_FETCH_ISSTORE:
+ case HV_FETCH_LVALUE:
+ case (HV_FETCH_ISSTORE|HV_FETCH_LVALUE):
+ if (w->cb_store) { return vmg_cb_call2(w->cb_store, sv, mg->mg_obj, key); }
+ break;
+ case HV_FETCH_ISEXISTS:
+ if (w->cb_exists) { return vmg_cb_call2(w->cb_exists, sv, mg->mg_obj, key);}
+ break;
+ case HV_DELETE:
+ if (w->cb_delete) { return vmg_cb_call2(w->cb_delete, sv, mg->mg_obj, key);}
+ break;
+ }
+ }
+ return 0;
+}
+