[glib] GObject: allow G_PARAM_CONSTRUCT on any override



commit 4e793c2eefab1a9b5b0c29b530cbe77fb53d7396
Author: Ryan Lortie <desrt desrt ca>
Date:   Tue Dec 20 19:33:02 2011 -0500

    GObject: allow G_PARAM_CONSTRUCT on any override
    
    We were previously preventing implementations of an interface from
    specifying G_PARAM_CONSTRUCT for a property of that interface if the
    interface didn't specify it itself (or was readonly).
    
    This is something that should only interest the implementation, so we
    remove this restriction.
    
    This allows 6 new possible override scenarios:
    
     - writable                 -> writable/construct
     - writable                 -> readwrite/construct
     - readwrite                -> readwrite/construct
     - writable/construct-only  -> writable/construct
     - writable/construct-only  -> readwrite/construct
     - readwrite/construct-only -> readwrite/construct
    
    and we update the testcase to reflect this.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=666616

 gobject/gobject.c     |    5 +----
 gobject/tests/param.c |   32 ++++++++++++++++++--------------
 2 files changed, 19 insertions(+), 18 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index ffbc3bb..b0fe218 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -1407,13 +1407,10 @@ object_interface_check_properties (gpointer func_data,
        * If the interface was not writable to begin with then we don't
        * really have any problems here because "writable at construct
        * type only" is still more permissive than "read only".
-       *
-       * It's questionable if we should have G_PARAM_CONSTRUCT checked
-       * here....
        */
       if (pspecs[n]->flags & G_PARAM_WRITABLE)
         {
-          if (!SUBSET (class_pspec->flags, pspecs[n]->flags, G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
+          if (!SUBSET (class_pspec->flags, pspecs[n]->flags, G_PARAM_CONSTRUCT_ONLY))
             {
               g_critical ("Flags for property '%s' on class '%s' introduce additional restrictions on "
                           "writability compared with the property on interface '%s'\n", pspecs[n]->name,
diff --git a/gobject/tests/param.c b/gobject/tests/param.c
index 0e6b208..912bfa5 100644
--- a/gobject/tests/param.c
+++ b/gobject/tests/param.c
@@ -587,20 +587,24 @@ static gint valid_impl_types[48][4] = {
 /* We also try to change the flags.  We must ensure that all
  * implementations provide all functionality promised by the interface.
  * We must therefore never remove readability or writability (but we can
- * add them).  Construct/construct-only are restrictions that apply to
- * writability, so we can never add them unless writability was never
- * present in the first place, in which case we should be able to add
- * them.
+ * add them).  Construct-only is a restrictions that applies to
+ * writability, so we can never add it unless writability was never
+ * present in the first place, in which case "writable at construct
+ * only" is still better than "not writable".
+ *
+ * The 'construct' flag is of interest only to the implementation.  It
+ * may be changed at any time.
  *
  *   Properties         Valid Access      Reason
  *
  *   *-r                r, rw, rwc, rwC   Must keep readable, but can restrict newly-added writable
- *   *-w                w, rw             Must keep writable unrestricted
- *   *-rw               rw                Must not add any restrictions
- *   *-rwc              rw, rwc           Can remove 'construct' restriction
- *   *-rwC              rw, rwC           Can remove 'construct-only' restriction
- *   *-wc               rwc, rw, w, wc    Can add readability or remove 'construct' restriction
+ *   *-w                w, rw, rwc        Must keep writable unrestricted
+ *   *-rw               rw, rwc           Must not add any restrictions
+ *   *-rwc              rw, rwc           Must not add any restrictions
+ *   *-rwC              rw, rwc, rwC      Can remove 'construct-only' restriction
+ *   *-wc               rwc, rw, w, wc    Can add readability
  *   *-wC               rwC, rw, w, wC    Can add readability or remove 'construct only' restriction
+ *                        rwc, wc
  *
  * We can represent this with a 16-by-16 table.  The rows represent the
  * flags of the property on the interface.  The columns is the flags to
@@ -610,7 +614,7 @@ static gint valid_impl_types[48][4] = {
  *   - 'v': valid
  *   - 'i': invalid because the implementation flags are invalid
  *   - 'f': invalid because of the removal of functionality
- *   - 'r': invalid because of the addition of restrictions
+ *   - 'r': invalid because of the addition of restrictions (ie: construct-only)
  *
  * We also ensure that removal of functionality is reported before
  * addition of restrictions, since this is a more basic problem.
@@ -619,16 +623,16 @@ static gint valid_impl_flags[16][16] = {
                  /* ''   r    w    rw   c    rc   wc   rwc  C    rC   wC   rwC  cC   rcC  wcC  rwcC */
     /* '*-' */    { },
     /* '*-r' */   { 'i', 'v', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'i', 'i' },
-    /* '*-w' */   { 'i', 'f', 'v', 'v', 'i', 'i', 'r', 'r', 'i', 'i', 'r', 'r', 'i', 'i', 'i', 'i' },
-    /* '*-rw' */  { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'r', 'i', 'i', 'f', 'r', 'i', 'i', 'i', 'i' },
+    /* '*-w' */   { 'i', 'f', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'r', 'r', 'i', 'i', 'i', 'i' },
+    /* '*-rw' */  { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'r', 'i', 'i', 'i', 'i' },
     /* '*-c */    { },
     /* '*-rc' */  { },
     /* '*-wc' */  { 'i', 'f', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'r', 'r', 'i', 'i', 'i', 'i' },
     /* '*-rwc' */ { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'r', 'i', 'i', 'i', 'i' },
     /* '*-C */    { },
     /* '*-rC' */  { },
-    /* '*-wC' */  { 'i', 'f', 'v', 'v', 'i', 'i', 'r', 'r', 'i', 'i', 'v', 'v', 'i', 'i', 'i', 'i' },
-    /* '*-rwC' */ { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'r', 'i', 'i', 'f', 'v', 'i', 'i', 'i', 'i' },
+    /* '*-wC' */  { 'i', 'f', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'i', 'i' },
+    /* '*-rwC' */ { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'i', 'i' },
 };
 
 static guint change_this_flag;



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