In Perl_feature_is_enabled() use cBOOL to convert the pointer to a "bool".
authorNicholas Clark <nick@ccl4.org>
Mon, 16 Jan 2012 15:21:21 +0000 (16:21 +0100)
committerNicholas Clark <nick@ccl4.org>
Mon, 16 Jan 2012 15:21:21 +0000 (16:21 +0100)
On some platforms which don't have a (real) bool type, bool is actually a
char, and hence (sadly) it's correct for the compiler to truncate when
assigning to it, instead of what the programmer thought was going to happen
(testing zero or not). In Perl_feature_is_enabled(), the expression is a
pointer, so if it converts to an integer with the bottom 8 bits zero, then
on these platforms it would truncate to "false". Not what was expected.

toke.c

diff --git a/toke.c b/toke.c
index 6766c05..fa4c9c9 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -614,11 +614,8 @@ Perl_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
        return FALSE;
     memcpy(&he_name[8], name, namelen);
 
-    return
-       cop_hints_fetch_pvn(
-           PL_curcop, he_name, 8 + namelen, 0,
-           REFCOUNTED_HE_EXISTS
-       );
+    return cBOOL(cop_hints_fetch_pvn(PL_curcop, he_name, 8 + namelen, 0,
+                                    REFCOUNTED_HE_EXISTS));
 }
 
 /*