return;
}
-static void a_map_update_flags_topdown(const OP *root, UV flags) {
+static void a_map_update_flags_topdown(const OP *root, UV mask, UV flags) {
a_op_info *oi;
const OP *o = root;
XSH_LOCK(&a_op_map_mutex);
- flags &= ~A_HINT_ROOT;
+ mask |= A_HINT_ROOT;
+ flags &= ~mask;
do {
if ((oi = ptable_fetch(a_op_map, o)))
- oi->flags = (oi->flags & (A_HINT_ROOT|A_HINT_SECOND)) | flags;
+ oi->flags = (oi->flags & mask) | flags;
if (!(o->op_flags & OPf_KIDS))
break;
o = a_map_descend(o);
return;
}
-#define a_map_cancel(R) a_map_update_flags_topdown((R), 0)
-
static void a_map_update_flags_bottomup(const OP *o, UV flags, UV rflags) {
a_op_info *oi;
}
}
#endif
- a_map_update_flags_topdown(o, hint | A_HINT_DEREF);
+ a_map_update_flags_topdown(o, A_HINT_SECOND, hint | A_HINT_DEREF);
a_map_store_root(o, o->op_ppaddr, hint);
o->op_ppaddr = new_pp;
} else {
- a_map_cancel(o);
+ a_map_update_flags_topdown(o, 0, 0);
}
} else
a_map_delete(o);