- w->cb_get = (SvROK(cb_get)) ? newRV_inc(SvRV(cb_get)) : NULL;
- w->cb_set = (SvROK(cb_set)) ? newRV_inc(SvRV(cb_set)) : NULL;
- w->cb_len = (SvROK(cb_len)) ? newRV_inc(SvRV(cb_len)) : NULL;
- w->cb_clear = (SvROK(cb_clear)) ? newRV_inc(SvRV(cb_clear)) : NULL;
- w->cb_free = (SvROK(cb_free)) ? newRV_inc(SvRV(cb_free)) : NULL;
- w->cb_data = (SvROK(cb_data)) ? newRV_inc(SvRV(cb_data)) : NULL;
+
+ cb = ST(1); w->cb_data = SvROK(cb) ? newRV_inc(SvRV(cb)) : NULL;
+ VMG_SET_CB(get, t, w, ST(2));
+ VMG_SET_CB(set, t, w, ST(3));
+ VMG_SET_CB(len, t, w, ST(4));
+ VMG_SET_CB(clear, t, w, ST(5));
+ VMG_SET_CB(free, t, w, ST(6));
+#if MGf_COPY
+ VMG_SET_CB(copy, t, w, ST(7));
+#endif /* MGf_COPY */
+#if MGf_DUP
+ VMG_SET_CB(dup, t, w, ST(8));
+#endif /* MGf_DUP */
+#if MGf_LOCAL
+ VMG_SET_CB(local, t, w, ST(9));
+#endif /* MGf_LOCAL */