[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] GNU Guile branch, master, updated. v2.1.0-2-g25f4a88

From: Andy Wingo
Subject: [Guile-commits] GNU Guile branch, master, updated. v2.1.0-2-g25f4a88
Date: Thu, 15 Sep 2011 19:53:01 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Guile".

The branch, master has been updated
       via  25f4a88032f51cecdf8b0147c8a2d0a4574972fa (commit)
       via  75917d62434b103a89fc65bde66a1a3e97b598a1 (commit)
      from  8b66aa8f5496a515ca133d6d2c37a06f6ec1720d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 25f4a88032f51cecdf8b0147c8a2d0a4574972fa
Author: Andy Wingo <address@hidden>
Date:   Thu Sep 15 12:28:17 2011 -0700

    Revert "SCM is a union"
    This reverts commit 8787d7a17029a8add20bb8e652ec744bc5d4e6c4.

commit 75917d62434b103a89fc65bde66a1a3e97b598a1
Author: Andy Wingo <address@hidden>
Date:   Thu Sep 15 12:28:03 2011 -0700

    Revert "SCM is either a union or scm_t_bits"
    This reverts commit 80125469ef95f6d8d46a26619fb2f85151f32719.


Summary of changes:
 libguile/__scm.h |   25 ++++++++++++++++++++++++
 libguile/tags.h  |   56 ++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 63 insertions(+), 18 deletions(-)

diff --git a/libguile/__scm.h b/libguile/__scm.h
index 3a8b07a..ee73855 100644
--- a/libguile/__scm.h
+++ b/libguile/__scm.h
@@ -273,6 +273,31 @@
+/* The macro SCM_DEBUG_TYPING_STRICTNESS indicates what level of type checking
+ * shall be performed with respect to the use of the SCM datatype.  The macro
+ * may be defined to one of the values 0, 1 and 2.
+ *
+ * A value of 0 means that there will be no compile time type checking, since
+ * the SCM datatype will be declared as an integral type.  This setting should
+ * only be used on systems, where casting from integral types to pointers may
+ * lead to loss of bit information.
+ *
+ * A value of 1 means that there will an intermediate level of compile time
+ * type checking, since the SCM datatype will be declared as a pointer to an
+ * undefined struct.  This setting is the default, since it does not cost
+ * anything in terms of performance or code size.
+ *
+ * A value of 2 provides a maximum level of compile time type checking since
+ * the SCM datatype will be declared as a struct.  This setting should be used
+ * for _compile time_ type checking only, since the compiled result is likely
+ * to be quite inefficient.  The right way to make use of this option is to do
+ * a 'make clean; make CFLAGS=-DSCM_DEBUG_TYPING_STRICTNESS=2', fix your
+ * errors, and then do 'make clean; make'.
+ */
 /* {Feature Options}
diff --git a/libguile/tags.h b/libguile/tags.h
index c03f43d..c90838e 100644
--- a/libguile/tags.h
+++ b/libguile/tags.h
@@ -61,6 +61,7 @@
 /* For dealing with the bit level representation of scheme objects we define
  * scm_t_bits:
 typedef scm_t_intptr  scm_t_signed_bits;
 typedef scm_t_uintptr scm_t_bits;
@@ -69,28 +70,47 @@ typedef scm_t_uintptr scm_t_bits;
-/* But as external interface, we pack the bits in a union.  This makes
- * the compiler treat SCM values as a disjoint type, allowing the
- * detection of many common errors.
+/* But as external interface, we define SCM, which may, according to the
+ * desired level of type checking, be defined in several ways:
-union SCM
-  scm_t_bits n;
+typedef union SCM { struct { scm_t_bits n; } n; } SCM;
+#   define SCM_UNPACK(x) ((x).n.n)
+#   define SCM_PACK(x) ((SCM) { { (scm_t_bits) (x) } })
+/* This is the default, which provides an intermediate level of compile time
+ * type checking while still resulting in very efficient code.
+ */
+    typedef struct scm_unused_struct { char scm_unused_field; } *SCM;
+  The 0?: constructions makes sure that the code is never executed,
+  and that there is no performance hit.  However, the alternative is
+  compiled, and does generate a warning when used with the wrong
+  pointer type.
+  The Tru64 and ia64-hp-hpux11.23 compilers fail on `case (0?0=0:x)'
+  statements, so for them type-checking is disabled.  */
+#if defined __DECC || defined __HP_cc
+#   define SCM_UNPACK(x) ((scm_t_bits) (x))
+#   define SCM_UNPACK(x) ((scm_t_bits) (0? (*(SCM*)0=(x)): x))
-/* With GCC at least, wrapping the bits in a union provides no
- * performance penalty.
+  There is no typechecking on SCM_PACK, since all kinds of types
+  (unsigned long, void*) go in SCM_PACK
-typedef union SCM SCM;
-#define SCM_UNPACK(x) ((x).n)
-#define SCM_PACK(x) ((SCM) { (scm_t_bits) (x) })
+#   define SCM_PACK(x) ((SCM) (x))
-/* But we do provide an escape valve for less capable compilers.
+/* This should be used as a fall back solution for machines on which casting
+ * to a pointer may lead to loss of bit information, e. g. in the three least
+ * significant bits.
-typedef scm_t_bits SCM;
-#define SCM_UNPACK(x) (x)
-#define SCM_PACK(x) ((SCM) (x))
+    typedef scm_t_bits SCM;
+#   define SCM_UNPACK(x) (x)
+#   define SCM_PACK(x) ((SCM) (x))

GNU Guile

reply via email to

[Prev in Thread] Current Thread [Next in Thread]