summaryrefslogtreecommitdiff
path: root/handy.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2010-04-15 10:20:50 +0100
committerDavid Mitchell <davem@iabyn.com>2010-04-15 10:32:59 +0100
commitf2338a2e8347fc967ab6b9af21d948258b88e341 (patch)
treeac9b735cf41f4c61d74904471fdbdd84297fdeeb /handy.h
parentdb63319f533e643ef6aac622fcae9a2f7ceabb0d (diff)
downloadperl-f2338a2e8347fc967ab6b9af21d948258b88e341.tar.gz
use cBOOL for bool casts
bool b = (bool)some_int doesn't necessarily do what you think. In some builds, bool is defined as char, and that cast's behaviour is thus undefined. So this line in mg.c: const bool was_temp = (bool)SvTEMP(sv); was actually setting was_temp to false even when the SVs_TEMP flag was set. Fix this by replacing all the (bool) casts with a new cBOOL() cast macro that (hopefully) does the right thing.
Diffstat (limited to 'handy.h')
-rw-r--r--handy.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/handy.h b/handy.h
index 81bf1e270d..ebe523fbec 100644
--- a/handy.h
+++ b/handy.h
@@ -110,6 +110,12 @@ Null SV pointer. (No longer available when C<PERL_CORE> is defined.)
# define HAS_BOOL 1
#endif
+/* a simple (bool) cast may not do the right thing: if bool is defined
+ * as char for example, then the cast from int is implementation-defined
+ */
+
+#define cBOOL(cbool) ((bool)!!(cbool))
+
/* Try to figure out __func__ or __FUNCTION__ equivalent, if any.
* XXX Should really be a Configure probe, with HAS__FUNCTION__
* and FUNCTION__ as results.