[ovs-dev] [PATCH 2/3] idl: Generalize special case boolean exception.

Ethan Jackson ethan at nicira.com
Wed Feb 8 03:28:53 UTC 2012


Sparse doesn't like taking sizeof boolean values.  The idl had
worked around this limitation with a special case in the case of
optional booleans.  A future patch needs an array with boolean
values which the existing special case did not handle.  This patch
generalizes the special case to handle this situation as well.

Signed-off-by: Ethan Jackson <ethan at nicira.com>
---
 ovsdb/ovsdb-idlc.in |   42 +++++++++++++++++-------------------------
 1 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
index d711541..2811fb6 100755
--- a/ovsdb/ovsdb-idlc.in
+++ b/ovsdb/ovsdb-idlc.in
@@ -27,8 +27,6 @@ def constify(cType, const):
 
 def cMembers(prefix, columnName, column, const):
     type = column.type
-    if is_optional_bool(type):
-        const = True
     if type.n_min == 1 and type.n_max == 1:
         singleton = True
         pointer = ''
@@ -167,10 +165,6 @@ def printEnum(members):
     print "    %s" % members[-1]
     print "};"
 
-def is_optional_bool(type):
-    return (type.key.type == ovs.db.types.BooleanType and not type.value
-            and type.n_min == 0 and type.n_max == 1)
-
 def printCIDLSource(schemaFile):
     schema = parseSchema(schemaFile)
     prefix = schema.idlPrefix
@@ -221,23 +215,7 @@ static void
                 keyVar = "row->%s" % columnName
                 valueVar = None
 
-            if is_optional_bool(type):
-                # Special case for an optional bool.  This is only here because
-                # sparse does not like the "normal" case below ("warning:
-                # expression using sizeof bool").
-                print
-                print "    assert(inited);"
-                print "    if (datum->n >= 1) {"
-                print "        static const bool false_value = false;"
-                print "        static const bool true_value = true;"
-                print
-                print "        row->n_%s = 1;" % columnName
-                print "        %s = datum->keys[0].boolean ? &true_value : &false_value;" % keyVar
-                print "    } else {"
-                print "        row->n_%s = 0;" % columnName
-                print "        %s = NULL;" % keyVar
-                print "    }"
-            elif (type.n_min == 1 and type.n_max == 1) or type.is_optional_pointer():
+            if (type.n_min == 1 and type.n_max == 1) or type.is_optional_pointer():
                 print
                 print "    assert(inited);"
                 print "    if (datum->n >= 1) {"
@@ -289,9 +267,23 @@ static void
                 else:
                     indent = "        "
                 print "%sif (!row->n_%s) {" % (indent, columnName)
-                print "%s    %s = xmalloc(%s * sizeof *%s);" % (indent, keyVar, nMax, keyVar)
+
+
+                # Special case for an optional boolean types.  This is only
+                # here because sparse does not like the "normal" case
+                # ("warning: expression using sizeof bool").
+                sizeMult = ""
+                if type.key.type != ovs.db.types.BooleanType:
+                    sizeMult = " * sizeof *%s" % keyVar
+                print "%s    %s = xmalloc(%s%s);" % (indent, keyVar, nMax,
+                                                     sizeMult)
                 if valueVar:
-                    print "%s    %s = xmalloc(%s * sizeof *%s);" % (indent, valueVar, nMax, valueVar)
+                    # Special case for an optional boolean types (see above).
+                    sizeMult = ""
+                    if type.value.type != ovs.db.types.BooleanType:
+                        sizeMult = " * sizeof *%s" % valueVar
+                    print "%s    %s = xmalloc(%s%s);" % (indent, valueVar,
+                                                         nMax, sizeMult)
                 print "%s}" % indent
                 print "%s%s[row->n_%s] = %s;" % (indent, keyVar, columnName, keySrc)
                 if valueVar:
-- 
1.7.8.3




More information about the dev mailing list