A var watcher can currently be created with no variable to watch, provided
of course that it is parked. However, once a variable has been set,
the watcher cannot be returned to the no-variable state. The variable
to watch can be changed, but the watcher rejects any attempt to set the
reference to undef. I think this is a bug: other watchers generally
allow themselves to be put into an unconfigured, unrunnable state.
The patch below allows the variable reference of a var watcher to be set
to undef. I've tested this: in the undef state it refuses to be started;
it stops if put into the undef state; and it still rejects defined values
other than references to watchable scalars.
--- c/var.c 2003-02-18 16:25:28.000000000 +0000
+++ c/var.c 2004-11-28 23:23:39.000000000 +0000
@@ -150,10 +150,12 @@
if (nval) {
SV *old = vp->variable;
int active = WaPOLLING(ev);
- if (!SvROK(nval))
- croak("Expecting a reference");
- if (SvTYPE(SvRV(nval)) > SVt_PVMG)
- croak("Var watchers can only watch plain vanilla scalars");
+ if (SvOK(nval)) {
+ if (!SvROK(nval))
+ croak("Expecting a reference");
+ if (SvTYPE(SvRV(nval)) > SVt_PVMG)
+ croak("Var watchers can only watch plain vanilla scalars");
+ }
if (active) pe_watcher_off(ev);
vp->variable = SvREFCNT_inc(nval);
if (active) pe_watcher_on(ev, 0);
-zefram