2010/8/30 Eric Blake <eblake@xxxxxxxxxx>: > 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@xxxxxxxxxxxxxx> 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
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list