From sfalcon at fhcrc.org  Mon May 15 08:40:01 2006
From: sfalcon at fhcrc.org (Seth Falcon)
Date: Sun, 14 May 2006 23:40:01 -0700
Subject: [Rd] bindingIsLocked returns illogical logical
In-Reply-To: <6phody0ct9e.fsf@gopher3.fhcrc.org> (Martin Morgan's message of
	"Sun, 14 May 2006 12:15:41 -0700")
References: <6phody0ct9e.fsf@gopher3.fhcrc.org>
Message-ID: <m2lkt3n64e.fsf@ziti.local>

Martin Morgan <mtmorgan at fhcrc.org> writes:

> bindingIsLocked applied to a locked binding returns a 'logical' that
> is niether true nor false.

Is this a philosophical question? :-)

Here's what I think is going on:

BINDING_IS_LOCKED does not return 0/1, but the result of a bit op that
will be either 0 or some int where bit 14 is set.

The behavior you describe is consistent with a logical value escaping
to R where the underlying int is some x > 1.

I wonder if ScalarLogical should force 0/1:

Index: include/Rinlinedfuns.h
===================================================================
--- include/Rinlinedfuns.h      (revision 38060)
+++ include/Rinlinedfuns.h      (working copy)
@@ -494,7 +494,7 @@
 INLINE_FUN SEXP ScalarLogical(int x)
 {
     SEXP ans = allocVector(LGLSXP, 1);
-    INTEGER(ans)[0] = x;
+    INTEGER(ans)[0] = (x == 0) ? 0 : 1;
     return ans;
 }

Otherwise, I think do_bndIsLocked needs to make a similar operation
before calling ScalarLogical.  But preventing these all purpose
logicals from escaping would seem to be a good argument for changing
ScalarLogical.

+ seth



[Rd] bindingIsLocked returns illogical logical
Seth Falcon