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

Re: [libvirt] [PATCH] esx: Fix generator for string return values



2010/8/30 Eric Blake <eblake redhat com>:
> On 08/29/2010 05:00 PM, Matthias Bolte wrote:
>>
>> Distinguish between strings as parameters (const char *)
>> and strings as return values (char **).
>
> Here, you mention char**,
>
>>          if self.type == "String" and \
>>             self.occurrence not in [OCCURRENCE__REQUIRED_LIST,
>>                                     OCCURRENCE__OPTIONAL_LIST]:
>> -            return "const char *"
>> +            if self.is_return_value:
>> +                return "char *"
>
> But here, it is only char*.  Which is it?

That's a bit tricky. In case Parameter.get_type_string() is called
from Parameter.generate_return() then

  string += "%s*%s)%s" % (self.get_type_string(), self.name, end_of_line)

in line 104 adds the second *.

I attached v2 where this is simplified.

Matthias
From d2c9dcd37b0bf7effc165b92919af41ccf725a81 Mon Sep 17 00:00:00 2001
From: Matthias Bolte <matthias bolte googlemail com>
Date: Sun, 29 Aug 2010 19:17:10 +0200
Subject: [PATCH] esx: Fix generator for string return values

Distinguish between strings as parameters (const char *)
and strings as return values (char **).
---
 src/esx/esx_vi_generator.py |   28 ++++++++++++++++++++--------
 src/esx/esx_vi_methods.c    |   22 ++++++++++++----------
 2 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
index 411fd80..4e91c4d 100755
--- a/src/esx/esx_vi_generator.py
+++ b/src/esx/esx_vi_generator.py
@@ -94,11 +94,11 @@ class Parameter:
 
     def generate_return(self, offset = 0, end_of_line = ";"):
         if self.occurrence == OCCURRENCE__IGNORED:
-            raise ValueError("invalid function parameteroccurrence value '%s'" % self.occurrence)
+            raise ValueError("invalid function parameter occurrence value '%s'" % self.occurrence)
         else:
             string = "       "
             string += " " * offset
-            string += "%s*%s)%s" % (self.get_type_string(), self.name, end_of_line)
+            string += "%s%s)%s" % (self.get_type_string(True), self.name, end_of_line)
 
             while len(string) < 59:
                 string += " "
@@ -124,15 +124,25 @@ class Parameter:
             return "    ESX_VI__METHOD__PARAMETER__SERIALIZE(%s, %s)\n" % (self.type, self.name)
 
 
-    def get_type_string(self):
+    def get_type_string(self, as_return_value = False):
+        string = ""
+
         if self.type == "String" and \
            self.occurrence not in [OCCURRENCE__REQUIRED_LIST,
                                    OCCURRENCE__OPTIONAL_LIST]:
-            return "const char *"
+            if as_return_value:
+                string += "char *"
+            else:
+                string += "const char *"
         elif self.is_enum():
-            return "esxVI_%s " % self.type
+            string += "esxVI_%s " % self.type
         else:
-            return "esxVI_%s *" % self.type
+            string += "esxVI_%s *" % self.type
+
+        if as_return_value:
+            string += "*"
+
+        return string
 
 
     def get_occurrence_comment(self):
@@ -225,9 +235,11 @@ class Method:
             source += "),\n"
 
         if self.returns is None:
-            source += "               void, None,\n"
+            source += "               void, /* nothing */, None,\n"
+        elif self.returns.type == "String":
+            source += "               String, Value, %s,\n" % self.returns.get_occurrence_short_enum()
         else:
-            source += "               %s, %s,\n" % (self.returns.type, self.returns.get_occurrence_short_enum())
+            source += "               %s, /* nothing */, %s,\n" % (self.returns.type, self.returns.get_occurrence_short_enum())
 
         source += "{\n"
 
diff --git a/src/esx/esx_vi_methods.c b/src/esx/esx_vi_methods.c
index 56d2e58..cba0424 100644
--- a/src/esx/esx_vi_methods.c
+++ b/src/esx/esx_vi_methods.c
@@ -67,34 +67,34 @@
 
 
 
-#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__None(_type)                       \
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__None(_type, _suffix)              \
     /* nothing */
 
 
 
-#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredItem(_type)               \
-    if (esxVI_##_type##_Deserialize(response->node, output) < 0) {            \
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredItem(_type, _suffix)      \
+    if (esxVI_##_type##_Deserialize##_suffix(response->node, output) < 0) {   \
         goto cleanup;                                                         \
     }
 
 
 
-#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredList(_type)               \
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredList(_type, _suffix)      \
     if (esxVI_##_type##_DeserializeList(response->node, output) < 0) {        \
         goto cleanup;                                                         \
     }
 
 
 
-#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalItem(_type)               \
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalItem(_type, _suffix)      \
     if (response->node != NULL &&                                             \
-        esxVI_##_type##_Deserialize(response->node, output) < 0) {            \
+        esxVI_##_type##_Deserialize##_suffix(response->node, output) < 0) {   \
         goto cleanup;                                                         \
     }
 
 
 
-#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalList(_type)               \
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalList(_type, _suffix)      \
     if (response->node != NULL &&                                             \
         esxVI_##_type##_DeserializeList(response->node, output) < 0) {        \
         goto cleanup;                                                         \
@@ -103,7 +103,8 @@
 
 
 #define ESX_VI__METHOD(_name, _this_from_service, _parameters, _output_type,  \
-                       _occurrence, _validate, _serialize)                    \
+                       _deserialize_suffix, _occurrence, _validate,           \
+                       _serialize)                                            \
     int                                                                       \
     esxVI_##_name _parameters                                                 \
     {                                                                         \
@@ -139,7 +140,8 @@
             goto cleanup;                                                     \
         }                                                                     \
                                                                               \
-        ESX_VI__METHOD__DESERIALIZE_OUTPUT__##_occurrence(_output_type)       \
+        ESX_VI__METHOD__DESERIALIZE_OUTPUT__##_occurrence                     \
+          (_output_type, _deserialize_suffix)                                 \
                                                                               \
         result = 0;                                                           \
                                                                               \
@@ -284,7 +286,7 @@ ESX_VI__METHOD(ValidateMigration, /* special _this */,
                 esxVI_ManagedObjectReference *pool,        /* optional */
                 esxVI_ManagedObjectReference *host,        /* optional */
                 esxVI_Event **output),                     /* optional, list */
-               Event, OptionalList,
+               Event, /* nothing */, OptionalList,
 {
     ESX_VI__METHOD__PARAMETER__REQUIRE(vm)
 },
-- 
1.7.0.4


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