cogl: Make private members really hard to accidentally use
authorNeil Roberts <neil@linux.intel.com>
Thu, 1 Apr 2010 19:06:30 +0000 (20:06 +0100)
committerNeil Roberts <neil@linux.intel.com>
Mon, 12 Apr 2010 14:38:58 +0000 (15:38 +0100)
CoglColor and CoglMatrix have public declarations with private members
so that we are free to change the implementation but the structures
could still be allocated on the stack in applications. However it's
quite easy not to realise the members are private and then access them
directly. This patch wraps the members in a macro which redefines the
symbol name when including the header outside of the clutter source.

http://bugzilla.openedhand.com/show_bug.cgi?id=2065

clutter/cogl/cogl/cogl-matrix.h
clutter/cogl/cogl/cogl-types.h

index 80b828e..0d6d727 100644 (file)
@@ -28,6 +28,7 @@
 #define __COGL_MATRIX_H
 
 #include <glib.h>
+#include "cogl-types.h"
 
 G_BEGIN_DECLS
 
@@ -100,10 +101,10 @@ struct _CoglMatrix
 
   /* Note: we may want to extend this later with private flags
    * and a cache of the inverse transform matrix. */
-  float   inv[16];
-  unsigned long  type;
-  unsigned long  flags;
-  unsigned long  _padding3;
+  float          COGL_PRIVATE (inv)[16];
+  unsigned long  COGL_PRIVATE (type);
+  unsigned long  COGL_PRIVATE (flags);
+  unsigned long  COGL_PRIVATE (_padding3);
 };
 
 /**
index b45bad4..547ed12 100644 (file)
 
 G_BEGIN_DECLS
 
+/* Some structures are meant to be opaque but they have public
+   definitions because we want the size to be public so they can be
+   allocated on the stack. This macro is used to ensure that users
+   don't accidentally access private members */
+#ifdef CLUTTER_COMPILATION
+#define COGL_PRIVATE(x) x
+#else
+#define COGL_PRIVATE(x) private_member_ ## x
+#endif
+
 /**
  * CoglHandle:
  *
@@ -251,17 +261,17 @@ typedef enum
 struct _CoglColor
 {
   /*< private >*/
-  guint8 red;
-  guint8 green;
-  guint8 blue;
+  guint8 COGL_PRIVATE (red);
+  guint8 COGL_PRIVATE (green);
+  guint8 COGL_PRIVATE (blue);
 
-  guint8 alpha;
+  guint8 COGL_PRIVATE (alpha);
 
   /* padding in case we want to change to floats at
    * some point */
-  guint32 padding0;
-  guint32 padding1;
-  guint32 padding2;
+  guint32 COGL_PRIVATE (padding0);
+  guint32 COGL_PRIVATE (padding1);
+  guint32 COGL_PRIVATE (padding2);
 };
 
 /**