} a_op_info;
#define PTABLE_NAME ptable_map
-#define PTABLE_VAL_FREE(V) PerlMemShared_free(V)
+#define PTABLE_VAL_FREE(V) XSH_SHARED_FREE((V), 1, a_op_info)
#define PTABLE_VAL_NEED_CONTEXT 0
#define PTABLE_NEED_DELETE 1
#define PTABLE_NEED_WALK 0
a_op_info *oi;
if (!(oi = ptable_fetch(a_op_map, o))) {
- oi = PerlMemShared_malloc(sizeof *oi);
+ XSH_SHARED_ALLOC(oi, 1, a_op_info);
ptable_map_store(a_op_map, o, oi);
}
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);