PATCH: var watchers with no variable

[email protected] (Zefram) Sun, 28 Nov 2004 23:32:34 +0000
Newsgroups perl.loop
Message-ID <[email protected]>
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