#if VMG_UVAR
-STATIC OP *vmg_pp_resetuvar(pTHX) {
- SvRMAGICAL_on(cSVOP_sv);
+STATIC OP *vmg_pp_reset_rmg(pTHX) {
+ SVOP *o = cSVOPx(PL_op);
+
+ SvRMAGICAL_on(o->op_sv);
+ o->op_sv = NULL;
+
return NORMAL;
}
* mistaken for a tied hash by the rest of hv_common. It will be reset by
* the op_ppaddr of a new fake op injected between the current and the next
* one. */
- OP *nop = PL_op->op_next;
- if (!nop || nop->op_ppaddr != vmg_pp_resetuvar) {
- SVOP *svop;
+ OP *nop = PL_op->op_next;
+ SVOP *svop = NULL;
+
+ if (nop && nop->op_ppaddr == vmg_pp_reset_rmg) {
+ svop = (SVOP *) nop;
+ } else {
NewOp(1101, svop, 1, SVOP);
- svop->op_type = OP_STUB;
- svop->op_ppaddr = vmg_pp_resetuvar;
- svop->op_next = nop;
- svop->op_flags = 0;
- svop->op_sv = sv;
- PL_op->op_next = (OP *) svop;
+ svop->op_type = OP_STUB;
+ svop->op_ppaddr = vmg_pp_reset_rmg;
+ svop->op_next = nop;
+ svop->op_flags = 0;
+ svop->op_private = 0;
+
+ PL_op->op_next = (OP *) svop;
}
+
+ svop->op_sv = sv;
+
SvRMAGICAL_off(sv);
}