[gtk+] cssselector: Turn into a union



commit 272a0083a38b826ee69703a77a10b32650d67a6a
Author: Benjamin Otte <otte redhat com>
Date:   Sat Dec 6 14:01:02 2014 +0100

    cssselector: Turn into a union
    
    Instead of just keeping a gpointer data, make GtkCssSelector a union
    that has actual proper members.

 gtk/gtkcssselector.c        |  332 ++++++++++++++++++++-----------------------
 gtk/gtkcssselectorprivate.h |    2 +-
 2 files changed, 155 insertions(+), 179 deletions(-)
---
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index 5cb2934..a06f5e2 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -63,12 +63,45 @@ struct _GtkCssSelectorClass {
   guint         must_keep_order :1; /* Due to region weirdness these must be kept before a DESCENDANT, so 
don't reorder */
 };
 
-struct _GtkCssSelector
-{
-  const GtkCssSelectorClass *class;       /* type of check this selector does */
-  gconstpointer              data;        /* data for matching:
-                                             - interned string for CLASS, NAME and ID
-                                             - GUINT_TO_POINTER() for PSEUDOCLASS_REGION/STATE */
+typedef struct {
+  GType type;
+  const char *name;
+} TypeReference;
+
+typedef enum {
+  POSITION_FORWARD,
+  POSITION_BACKWARD,
+  POSITION_ONLY,
+  POSITION_SORTED
+} PositionType;
+#define POSITION_TYPE_BITS 2
+#define POSITION_NUMBER_BITS ((sizeof (gpointer) * 8 - POSITION_TYPE_BITS) / 2)
+
+union _GtkCssSelector
+{
+  const GtkCssSelectorClass     *class;         /* type of check this selector does */
+  struct {
+    const GtkCssSelectorClass   *class;
+    const char                  *name;          /* interned */
+  }                              id, region;
+  struct {
+    const GtkCssSelectorClass   *class;
+    GQuark                       style_class;
+  }                              style_class;
+  struct {
+    const GtkCssSelectorClass   *class;
+    const TypeReference         *reference;
+  }                              name;
+  struct {
+    const GtkCssSelectorClass   *class;
+    GtkStateFlags                state;
+  }                              state;
+  struct {
+    const GtkCssSelectorClass   *class;
+    PositionType                 type :POSITION_TYPE_BITS;
+    gssize                       a :POSITION_NUMBER_BITS;
+    gssize                       b :POSITION_NUMBER_BITS;
+  }                              position;
 };
 
 #define GTK_CSS_SELECTOR_TREE_EMPTY_OFFSET G_MAXINT32
@@ -907,11 +940,6 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_NONE = {
 
 /* NAME */
 
-typedef struct {
-  GType type;
-  const char *name;
-} TypeReference;
-
 static GHashTable *type_refs_ht = NULL;
 static guint type_refs_last_serial = 0;
 
@@ -970,28 +998,28 @@ static void
 print_name (const GtkCssSelector *selector,
             GString              *string)
 {
-  g_string_append (string, ((TypeReference *)selector->data)->name);
+  g_string_append (string, selector->name.reference->name);
 }
 
 static gboolean
 match_name (const GtkCssSelector *selector,
             const GtkCssMatcher  *matcher)
 {
-  return _gtk_css_matcher_has_type (matcher, ((TypeReference *)selector->data)->type);
+  return _gtk_css_matcher_has_type (matcher, selector->name.reference->type);
 }
 
 static guint
 hash_name (const GtkCssSelector *a)
 {
-  return g_str_hash (((TypeReference *)a->data)->name);
+  return g_str_hash (a->name.reference->name);
 }
 
 static int
 comp_name (const GtkCssSelector *a,
            const GtkCssSelector *b)
 {
-  return strcmp (((TypeReference *)a->data)->name,
-                ((TypeReference *)b->data)->name);
+  return strcmp (a->name.reference->name,
+                b->name.reference->name);
 }
 
 DEFINE_SIMPLE_SELECTOR(name, NAME, print_name, match_name, hash_name, comp_name, FALSE, FALSE, TRUE)
@@ -1002,7 +1030,7 @@ static void
 gtk_css_selector_region_print (const GtkCssSelector *selector,
                                GString              *string)
 {
-  g_string_append (string, selector->data);
+  g_string_append (string, selector->region.name);
 }
 
 static gboolean
@@ -1011,7 +1039,7 @@ gtk_css_selector_region_match (const GtkCssSelector *selector,
 {
   const GtkCssSelector *previous;
 
-  if (!_gtk_css_matcher_has_region (matcher, selector->data, 0))
+  if (!_gtk_css_matcher_has_region (matcher, selector->region.name, 0))
     return FALSE;
 
   previous = gtk_css_selector_previous (selector);
@@ -1029,7 +1057,7 @@ gtk_css_selector_region_tree_match (const GtkCssSelectorTree *tree,
 {
   const GtkCssSelectorTree *prev;
 
-  if (!_gtk_css_matcher_has_region (matcher, tree->selector.data, 0))
+  if (!_gtk_css_matcher_has_region (matcher, tree->selector.region.name, 0))
     return;
 
   gtk_css_selector_tree_found_match (tree, res);
@@ -1052,7 +1080,7 @@ gtk_css_selector_region_tree_get_change (const GtkCssSelectorTree *tree,
   const GtkCssSelectorTree *prev;
   GtkCssChange change, previous_change;
 
-  if (!_gtk_css_matcher_has_region (matcher, tree->selector.data, 0))
+  if (!_gtk_css_matcher_has_region (matcher, tree->selector.region.name, 0))
     return 0;
 
   change = 0;
@@ -1096,14 +1124,14 @@ gtk_css_selector_region_get_change (const GtkCssSelector *selector, GtkCssChange
 static guint
 gtk_css_selector_region_hash_one (const GtkCssSelector *a)
 {
-  return g_str_hash (a->data);
+  return g_str_hash (a->region.name);
 }
 
 static int
 gtk_css_selector_region_compare_one (const GtkCssSelector *a,
                                     const GtkCssSelector *b)
 {
-  return strcmp (a->data, b->data);
+  return strcmp (a->region.name, b->region.name);
 }
 
 static const GtkCssSelectorClass GTK_CSS_SELECTOR_REGION = {
@@ -1125,28 +1153,28 @@ print_class (const GtkCssSelector *selector,
              GString              *string)
 {
   g_string_append_c (string, '.');
-  g_string_append (string, g_quark_to_string (GPOINTER_TO_UINT (selector->data)));
+  g_string_append (string, g_quark_to_string (selector->style_class.style_class));
 }
 
 static gboolean
 match_class (const GtkCssSelector *selector,
              const GtkCssMatcher  *matcher)
 {
-  return _gtk_css_matcher_has_class (matcher, GPOINTER_TO_UINT (selector->data));
+  return _gtk_css_matcher_has_class (matcher, selector->style_class.style_class);
 }
 
 static guint
 hash_class (const GtkCssSelector *a)
 {
-  return g_str_hash (g_quark_to_string (GPOINTER_TO_UINT (a->data)));
+  return g_str_hash (g_quark_to_string (a->style_class.style_class));
 }
 
 static int
 comp_class (const GtkCssSelector *a,
             const GtkCssSelector *b)
 {
-  return strcmp (g_quark_to_string (GPOINTER_TO_UINT (a->data)),
-                g_quark_to_string (GPOINTER_TO_UINT (b->data)));
+  return strcmp (g_quark_to_string (a->style_class.style_class),
+                g_quark_to_string (b->style_class.style_class));
 }
 
 DEFINE_SIMPLE_SELECTOR(class, CLASS, print_class, match_class, hash_class, comp_class, FALSE, TRUE, FALSE)
@@ -1158,27 +1186,27 @@ print_id (const GtkCssSelector *selector,
           GString              *string)
 {
   g_string_append_c (string, '#');
-  g_string_append (string, selector->data);
+  g_string_append (string, selector->id.name);
 }
 
 static gboolean
 match_id (const GtkCssSelector *selector,
           const GtkCssMatcher  *matcher)
 {
-  return _gtk_css_matcher_has_id (matcher, selector->data);
+  return _gtk_css_matcher_has_id (matcher, selector->id.name);
 }
 
 static guint
 hash_id (const GtkCssSelector *a)
 {
-  return g_str_hash (a->data);
+  return g_str_hash (a->id.name);
 }
 
 static int
 comp_id (const GtkCssSelector *a,
         const GtkCssSelector *b)
 {
-  return strcmp (a->data, b->data);
+  return strcmp (a->id.name, b->id.name);
 }
 
 DEFINE_SIMPLE_SELECTOR(id, ID, print_id, match_id, hash_id, comp_id, TRUE, FALSE, FALSE)
@@ -1203,14 +1231,13 @@ print_pseudoclass_state (const GtkCssSelector *selector,
     "visited",
     "checked"
   };
-  guint i, state;
+  guint i;
 
-  state = GPOINTER_TO_UINT (selector->data);
   g_string_append_c (string, ':');
 
   for (i = 0; i < G_N_ELEMENTS (state_names); i++)
     {
-      if (state == (1 << i))
+      if (selector->state.state == (1 << i))
         {
           g_string_append (string, state_names[i]);
           return;
@@ -1224,15 +1251,13 @@ static gboolean
 match_pseudoclass_state (const GtkCssSelector *selector,
                          const GtkCssMatcher  *matcher)
 {
-  GtkStateFlags state = GPOINTER_TO_UINT (selector->data);
-
-  return (_gtk_css_matcher_get_state (matcher) & state) == state;
+  return (_gtk_css_matcher_get_state (matcher) & selector->state.state) == selector->state.state;
 }
 
 static guint
-hash_pseudoclass_state (const GtkCssSelector *a)
+hash_pseudoclass_state (const GtkCssSelector *selector)
 {
-  return GPOINTER_TO_UINT (a->data);
+  return selector->state.state;
 }
 
 
@@ -1240,7 +1265,7 @@ static int
 comp_pseudoclass_state (const GtkCssSelector *a,
                        const GtkCssSelector *b)
 {
-  return GPOINTER_TO_UINT (a->data) - GPOINTER_TO_UINT (b->data);
+  return a->state.state - b->state.state;
 }
 
 #define GTK_CSS_CHANGE_PSEUDOCLASS_STATE GTK_CSS_CHANGE_STATE
@@ -1251,126 +1276,66 @@ DEFINE_SIMPLE_SELECTOR(pseudoclass_state, PSEUDOCLASS_STATE, print_pseudoclass_s
 
 /* PSEUDOCLASS FOR POSITION */
 
-typedef enum {
-  POSITION_FORWARD,
-  POSITION_BACKWARD,
-  POSITION_ONLY,
-  POSITION_SORTED
-} PositionType;
-#define POSITION_TYPE_BITS 2
-#define POSITION_NUMBER_BITS ((sizeof (gpointer) * 8 - POSITION_TYPE_BITS) / 2)
-
-static gconstpointer
-encode_position (PositionType type,
-                 int          a,
-                 int          b)
-{
-  union {
-    gconstpointer p;
-    struct {
-      gssize type :POSITION_TYPE_BITS;
-      gssize a :POSITION_NUMBER_BITS;
-      gssize b :POSITION_NUMBER_BITS;
-    } data;
-  } result;
-  G_STATIC_ASSERT (sizeof (gconstpointer) == sizeof (result));
-
-  g_assert (type < (1 << POSITION_TYPE_BITS));
-
-  result.data.type = type;
-  result.data.a = a;
-  result.data.b = b;
-
-  return result.p;
-}
-
-static void
-decode_position (const GtkCssSelector *selector,
-                 PositionType         *type,
-                 int                  *a,
-                 int                  *b)
-{
-  union {
-    gconstpointer p;
-    struct {
-      gssize type :POSITION_TYPE_BITS;
-      gssize a :POSITION_NUMBER_BITS;
-      gssize b :POSITION_NUMBER_BITS;
-    } data;
-  } result;
-  G_STATIC_ASSERT (sizeof (gconstpointer) == sizeof (result));
-
-  result.p = selector->data;
-
-  *type = result.data.type & ((1 << POSITION_TYPE_BITS) - 1);
-  *a = result.data.a;
-  *b = result.data.b;
-}
-
 static void
 gtk_css_selector_pseudoclass_position_print (const GtkCssSelector *selector,
                                              GString              *string)
 {
-  PositionType type;
-  int a, b;
-
-  decode_position (selector, &type, &a, &b);
-  switch (type)
+  switch (selector->position.type)
     {
     case POSITION_FORWARD:
-      if (a == 0)
+      if (selector->position.a == 0)
         {
-          if (b == 1)
+          if (selector->position.b == 1)
             g_string_append (string, ":first-child");
           else
-            g_string_append_printf (string, ":nth-child(%d)", b);
+            g_string_append_printf (string, ":nth-child(%d)", selector->position.b);
         }
-      else if (a == 2 && b == 0)
+      else if (selector->position.a == 2 && selector->position.b == 0)
         g_string_append (string, ":nth-child(even)");
-      else if (a == 2 && b == 1)
+      else if (selector->position.a == 2 && selector->position.b == 1)
         g_string_append (string, ":nth-child(odd)");
       else
         {
           g_string_append (string, ":nth-child(");
-          if (a == 1)
+          if (selector->position.a == 1)
             g_string_append (string, "n");
-          else if (a == -1)
+          else if (selector->position.a == -1)
             g_string_append (string, "-n");
           else
-            g_string_append_printf (string, "%dn", a);
-          if (b > 0)
-            g_string_append_printf (string, "+%d)", b);
-          else if (b < 0)
-            g_string_append_printf (string, "%d)", b);
+            g_string_append_printf (string, "%dn", selector->position.a);
+          if (selector->position.b > 0)
+            g_string_append_printf (string, "+%d)", selector->position.b);
+          else if (selector->position.b < 0)
+            g_string_append_printf (string, "%d)", selector->position.b);
           else
             g_string_append (string, ")");
         }
       break;
     case POSITION_BACKWARD:
-      if (a == 0)
+      if (selector->position.a == 0)
         {
-          if (b == 1)
+          if (selector->position.b == 1)
             g_string_append (string, ":last-child");
           else
-            g_string_append_printf (string, ":nth-last-child(%d)", b);
+            g_string_append_printf (string, ":nth-last-child(%d)", selector->position.b);
         }
-      else if (a == 2 && b == 0)
+      else if (selector->position.a == 2 && selector->position.b == 0)
         g_string_append (string, ":nth-last-child(even)");
-      else if (a == 2 && b == 1)
+      else if (selector->position.a == 2 && selector->position.b == 1)
         g_string_append (string, ":nth-last-child(odd)");
       else
         {
           g_string_append (string, ":nth-last-child(");
-          if (a == 1)
+          if (selector->position.a == 1)
             g_string_append (string, "n");
-          else if (a == -1)
+          else if (selector->position.a == -1)
             g_string_append (string, "-n");
           else
-            g_string_append_printf (string, "%dn", a);
-          if (b > 0)
-            g_string_append_printf (string, "+%d)", b);
-          else if (b < 0)
-            g_string_append_printf (string, "%d)", b);
+            g_string_append_printf (string, "%dn", selector->position.a);
+          if (selector->position.b > 0)
+            g_string_append_printf (string, "+%d)", selector->position.b);
+          else if (selector->position.b < 0)
+            g_string_append_printf (string, "%d)", selector->position.b);
           else
             g_string_append (string, ")");
         }
@@ -1390,24 +1355,20 @@ gtk_css_selector_pseudoclass_position_print (const GtkCssSelector *selector,
 static gboolean
 get_selector_flags_for_position_region_match (const GtkCssSelector *selector, GtkRegionFlags *selector_flags)
 {
-  PositionType type;
-  int a, b;
-
-  decode_position (selector, &type, &a, &b);
-  switch (type)
+  switch (selector->position.type)
     {
     case POSITION_FORWARD:
-      if (a == 0 && b == 1)
+      if (selector->position.a == 0 && selector->position.b == 1)
         *selector_flags = GTK_REGION_FIRST;
-      else if (a == 2 && b == 0)
+      else if (selector->position.a == 2 && selector->position.b == 0)
         *selector_flags = GTK_REGION_EVEN;
-      else if (a == 2 && b == 1)
+      else if (selector->position.a == 2 && selector->position.b == 1)
         *selector_flags = GTK_REGION_ODD;
       else
         return FALSE;
       break;
     case POSITION_BACKWARD:
-      if (a == 0 && b == 1)
+      if (selector->position.a == 0 && selector->position.b == 1)
         *selector_flags = GTK_REGION_LAST;
       else
         return FALSE;
@@ -1438,7 +1399,7 @@ gtk_css_selector_pseudoclass_position_match_for_region (const GtkCssSelector *se
 
   selector = gtk_css_selector_previous (selector);
 
-  if (!_gtk_css_matcher_has_region (matcher, selector->data, selector_flags))
+  if (!_gtk_css_matcher_has_region (matcher, selector->region.name, selector_flags))
     return FALSE;
 
   previous = gtk_css_selector_previous (selector);
@@ -1453,18 +1414,14 @@ static gboolean
 get_position_match (const GtkCssSelector *selector,
                    const GtkCssMatcher  *matcher)
 {
-  PositionType type;
-  int a, b;
-
-  decode_position (selector, &type, &a, &b);
-  switch (type)
+  switch (selector->position.type)
     {
     case POSITION_FORWARD:
-      if (!_gtk_css_matcher_has_position (matcher, TRUE, a, b))
+      if (!_gtk_css_matcher_has_position (matcher, TRUE, selector->position.a, selector->position.b))
         return FALSE;
       break;
     case POSITION_BACKWARD:
-      if (!_gtk_css_matcher_has_position (matcher, FALSE, a, b))
+      if (!_gtk_css_matcher_has_position (matcher, FALSE, selector->position.a, selector->position.b))
         return FALSE;
       break;
     case POSITION_ONLY:
@@ -1510,7 +1467,7 @@ gtk_css_selector_pseudoclass_position_tree_match_for_region (const GtkCssSelecto
   if (!get_selector_flags_for_position_region_match (&tree->selector, &selector_flags))
       return;
 
-  if (!_gtk_css_matcher_has_region (matcher, prev->selector.data, selector_flags))
+  if (!_gtk_css_matcher_has_region (matcher, prev->selector.region.name, selector_flags))
     return;
 
   gtk_css_selector_tree_found_match (prev, res);
@@ -1564,7 +1521,7 @@ gtk_css_selector_pseudoclass_position_tree_get_change_for_region (const GtkCssSe
   if (!get_selector_flags_for_position_region_match (&tree->selector, &selector_flags))
       return 0;
 
-  if (!_gtk_css_matcher_has_region (matcher, prev->selector.data, selector_flags))
+  if (!_gtk_css_matcher_has_region (matcher, prev->selector.region.name, selector_flags))
     return 0;
 
   change = 0;
@@ -1632,14 +1589,24 @@ gtk_css_selector_pseudoclass_position_get_change (const GtkCssSelector *selector
 static guint
 gtk_css_selector_pseudoclass_position_hash_one (const GtkCssSelector *a)
 {
-  return GPOINTER_TO_UINT (a->data);
+  return (((a->position.type << POSITION_NUMBER_BITS) | a->position.a) << POSITION_NUMBER_BITS) | 
a->position.b;
 }
 
 static int
 gtk_css_selector_pseudoclass_position_compare_one (const GtkCssSelector *a,
                                                   const GtkCssSelector *b)
 {
-  return GPOINTER_TO_UINT (a->data) - GPOINTER_TO_UINT (b->data);
+  int diff;
+  
+  diff = a->position.type - b->position.type;
+  if (diff)
+    return diff;
+
+  diff = a->position.a - b->position.a;
+  if (diff)
+    return diff;
+
+  return a->position.b - b->position.b;
 }
 
 static const GtkCssSelectorClass GTK_CSS_SELECTOR_PSEUDOCLASS_POSITION = {
@@ -1672,8 +1639,7 @@ gtk_css_selector_size (const GtkCssSelector *selector)
 
 static GtkCssSelector *
 gtk_css_selector_new (const GtkCssSelectorClass *class,
-                      GtkCssSelector            *selector,
-                      gconstpointer              data)
+                      GtkCssSelector            *selector)
 {
   guint size;
 
@@ -1684,8 +1650,8 @@ gtk_css_selector_new (const GtkCssSelectorClass *class,
   else
     memmove (selector + 1, selector, sizeof (GtkCssSelector) * size + sizeof (gpointer));
 
+  memset (selector, 0, sizeof (GtkCssSelector));
   selector->class = class;
-  selector->data = data;
 
   return selector;
 }
@@ -1709,8 +1675,8 @@ parse_selector_class (GtkCssParser   *parser,
 
   selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_CLASS
                                           : &GTK_CSS_SELECTOR_CLASS,
-                                   selector,
-                                   GUINT_TO_POINTER (g_quark_from_string (name)));
+                                   selector);
+  selector->style_class.style_class = g_quark_from_string (name);
 
   g_free (name);
 
@@ -1736,8 +1702,8 @@ parse_selector_id (GtkCssParser   *parser,
 
   selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_ID
                                           : &GTK_CSS_SELECTOR_ID,
-                                   selector,
-                                   g_intern_string (name));
+                                   selector);
+  selector->id.name = g_intern_string (name);
 
   g_free (name);
 
@@ -1865,8 +1831,10 @@ parse_selector_pseudo_class_nth_child (GtkCssParser   *parser,
     }
 
   selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_PSEUDOCLASS_POSITION,
-                                   selector,
-                                   encode_position (type, a, b));
+                                   selector);
+  selector->position.type = type;
+  selector->position.a = a;
+  selector->position.b = b;
 
   return selector;
 }
@@ -1914,10 +1882,12 @@ parse_selector_pseudo_class (GtkCssParser   *parser,
       if (_gtk_css_parser_try (parser, pseudo_classes[i].name, FALSE))
         {
           if (pseudo_classes[i].state_flag)
-            selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_STATE
-                                                    : &GTK_CSS_SELECTOR_PSEUDOCLASS_STATE,
-                                             selector,
-                                             GUINT_TO_POINTER (pseudo_classes[i].state_flag));
+            {
+              selector = gtk_css_selector_new (negate ? &GTK_CSS_SELECTOR_NOT_PSEUDOCLASS_STATE
+                                                      : &GTK_CSS_SELECTOR_PSEUDOCLASS_STATE,
+                                               selector);
+              selector->state.state = pseudo_classes[i].state_flag;
+            }
           else if (negate)
             {
               _gtk_css_parser_error (parser, "position pseudoclases not yet supported for :not()");
@@ -1926,11 +1896,13 @@ parse_selector_pseudo_class (GtkCssParser   *parser,
               return NULL;
             }
           else
-            selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_PSEUDOCLASS_POSITION,
-                                             selector,
-                                             encode_position (pseudo_classes[i].position_type,
-                                                              pseudo_classes[i].position_a,
-                                                              pseudo_classes[i].position_b));
+            {
+              selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_PSEUDOCLASS_POSITION,
+                                               selector);
+              selector->position.type = pseudo_classes[i].position_type;
+              selector->position.a = pseudo_classes[i].position_a;
+              selector->position.b = pseudo_classes[i].position_b;
+            }
           return selector;
         }
     }
@@ -1951,12 +1923,12 @@ parse_selector_negation (GtkCssParser   *parser,
   if (name)
     {
       selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NOT_NAME,
-                                       selector,
-                                       get_type_reference (name));
+                                       selector);
+      selector->name.reference = get_type_reference (name);
       g_free (name);
     }
   else if (_gtk_css_parser_try (parser, "*", FALSE))
-    selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NONE, selector, NULL);
+    selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NONE, selector);
   else if (_gtk_css_parser_try (parser, "#", FALSE))
     selector = parse_selector_id (parser, selector, TRUE);
   else if (_gtk_css_parser_try (parser, ".", FALSE))
@@ -1995,19 +1967,23 @@ parse_simple_selector (GtkCssParser   *parser,
   if (name)
     {
       if (_gtk_style_context_check_region_name (name))
-       selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_REGION,
-                                        selector,
-                                        g_intern_string (name));
+        {
+          selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_REGION,
+                                           selector);
+          selector->region.name = g_intern_string (name);
+        }
       else
-       selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NAME,
-                                        selector,
-                                        get_type_reference (name));
+        {
+          selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_NAME,
+                                           selector);
+         selector->name.reference = get_type_reference (name);
+        }
       g_free (name);
       parsed_something = TRUE;
     }
   else if (_gtk_css_parser_try (parser, "*", FALSE))
     {
-      selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_ANY, selector, NULL);
+      selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_ANY, selector);
       parsed_something = TRUE;
     }
 
@@ -2050,13 +2026,13 @@ _gtk_css_selector_parse (GtkCssParser *parser)
          !_gtk_css_parser_begins_with (parser, '{'))
     {
       if (_gtk_css_parser_try (parser, "+", TRUE))
-        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_ADJACENT, selector, NULL);
+        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_ADJACENT, selector);
       else if (_gtk_css_parser_try (parser, "~", TRUE))
-        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_SIBLING, selector, NULL);
+        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_SIBLING, selector);
       else if (_gtk_css_parser_try (parser, ">", TRUE))
-        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_CHILD, selector, NULL);
+        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_CHILD, selector);
       else
-        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_DESCENDANT, selector, NULL);
+        selector = gtk_css_selector_new (&GTK_CSS_SELECTOR_DESCENDANT, selector);
     }
 
   return selector;
diff --git a/gtk/gtkcssselectorprivate.h b/gtk/gtkcssselectorprivate.h
index 17e3618..af95b54 100644
--- a/gtk/gtkcssselectorprivate.h
+++ b/gtk/gtkcssselectorprivate.h
@@ -23,7 +23,7 @@
 
 G_BEGIN_DECLS
 
-typedef struct _GtkCssSelector GtkCssSelector;
+typedef union _GtkCssSelector GtkCssSelector;
 typedef struct _GtkCssSelectorTree GtkCssSelectorTree;
 typedef struct _GtkCssSelectorTreeBuilder GtkCssSelectorTreeBuilder;
 


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