Skip to content
Prev 20629 / 63424 Next

bindingIsLocked returns illogical logical

Martin Morgan <mtmorgan at fhcrc.org> writes:
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