qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH v2 01/12] qapi: Update qapi-code-gen.txt example to


From: Markus Armbruster
Subject: [Qemu-devel] [PATCH v2 01/12] qapi: Update qapi-code-gen.txt example to match current code
Date: Wed, 7 May 2014 09:53:43 +0200

Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
 docs/qapi-code-gen.txt | 146 ++++++++++++++++++++++++++++++-------------------
 1 file changed, 90 insertions(+), 56 deletions(-)

diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt
index d78921f..923565e 100644
--- a/docs/qapi-code-gen.txt
+++ b/docs/qapi-code-gen.txt
@@ -223,11 +223,23 @@ Example:
     address@hidden:~/w/qemu2.git$ python scripts/qapi-types.py \
       --output-dir="qapi-generated" --prefix="example-" < example-schema.json
     address@hidden:~/w/qemu2.git$ cat qapi-generated/example-qapi-types.c
-    /* AUTOMATICALLY GENERATED, DO NOT MODIFY */
+[Uninteresting stuff omitted...]
+
+    void qapi_free_UserDefOneList(UserDefOneList * obj)
+    {
+        QapiDeallocVisitor *md;
+        Visitor *v;
+
+        if (!obj) {
+            return;
+        }
+
+        md = qapi_dealloc_visitor_new();
+        v = qapi_dealloc_get_visitor(md);
+        visit_type_UserDefOneList(v, &obj, NULL, NULL);
+        qapi_dealloc_visitor_cleanup(md);
+    }
 
-    #include "qapi/qapi-dealloc-visitor.h"
-    #include "example-qapi-types.h"
-    #include "example-qapi-visit.h"
 
     void qapi_free_UserDefOne(UserDefOne * obj)
     {
@@ -245,31 +257,37 @@ Example:
     }
 
     address@hidden:~/w/qemu2.git$ cat qapi-generated/example-qapi-types.h
-    /* AUTOMATICALLY GENERATED, DO NOT MODIFY */
-    #ifndef QAPI_GENERATED_EXAMPLE_QAPI_TYPES
-    #define QAPI_GENERATED_EXAMPLE_QAPI_TYPES
+[Uninteresting stuff omitted...]
+
+    #ifndef EXAMPLE_QAPI_TYPES_H
+    #define EXAMPLE_QAPI_TYPES_H
 
-    #include "qapi/qapi-types-core.h"
+[Builtin types omitted...]
 
     typedef struct UserDefOne UserDefOne;
 
     typedef struct UserDefOneList
     {
-        UserDefOne *value;
+        union {
+            UserDefOne *value;
+            uint64_t padding;
+        };
         struct UserDefOneList *next;
     } UserDefOneList;
 
+[Functions on builtin types omitted...]
+
     struct UserDefOne
     {
         int64_t integer;
         char * string;
     };
 
+    void qapi_free_UserDefOneList(UserDefOneList * obj);
     void qapi_free_UserDefOne(UserDefOne * obj);
 
     #endif
 
-
 === scripts/qapi-visit.py ===
 
 Used to generate the visitor functions used to walk through and convert
@@ -293,39 +311,63 @@ Example:
     address@hidden:~/w/qemu2.git$ python scripts/qapi-visit.py \
         --output-dir="qapi-generated" --prefix="example-" < example-schema.json
     address@hidden:~/w/qemu2.git$ cat qapi-generated/example-qapi-visit.c
-    /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+[Uninteresting stuff omitted...]
 
-    #include "example-qapi-visit.h"
+    static void visit_type_UserDefOne_fields(Visitor *m, UserDefOne ** obj, 
Error **errp)
+    {
+        Error *err = NULL;
+        visit_type_int(m, &(*obj)->integer, "integer", &err);
+        visit_type_str(m, &(*obj)->string, "string", &err);
+
+        error_propagate(errp, err);
+    }
 
     void visit_type_UserDefOne(Visitor *m, UserDefOne ** obj, const char 
*name, Error **errp)
     {
-        visit_start_struct(m, (void **)obj, "UserDefOne", name, 
sizeof(UserDefOne), errp);
-        visit_type_int(m, (obj && *obj) ? &(*obj)->integer : NULL, "integer", 
errp);
-        visit_type_str(m, (obj && *obj) ? &(*obj)->string : NULL, "string", 
errp);
-        visit_end_struct(m, errp);
+        if (!error_is_set(errp)) {
+            Error *err = NULL;
+            visit_start_struct(m, (void **)obj, "UserDefOne", name, 
sizeof(UserDefOne), &err);
+            if (!err) {
+                if (*obj) {
+                    visit_type_UserDefOne_fields(m, obj, &err);
+                    error_propagate(errp, err);
+                    err = NULL;
+                }
+                /* Always call end_struct if start_struct succeeded.  */
+                visit_end_struct(m, &err);
+            }
+            error_propagate(errp, err);
+        }
     }
 
     void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const 
char *name, Error **errp)
     {
         GenericList *i, **prev = (GenericList **)obj;
-
-        visit_start_list(m, name, errp);
-
-        for (; (i = visit_next_list(m, prev, errp)) != NULL; prev = &i) {
-            UserDefOneList *native_i = (UserDefOneList *)i;
-            visit_type_UserDefOne(m, &native_i->value, NULL, errp);
+        Error *err = NULL;
+
+        if (!error_is_set(errp)) {
+            visit_start_list(m, name, &err);
+            if (!err) {
+                for (; (i = visit_next_list(m, prev, &err)) != NULL; prev = 
&i) {
+                    UserDefOneList *native_i = (UserDefOneList *)i;
+                    visit_type_UserDefOne(m, &native_i->value, NULL, &err);
+                }
+                error_propagate(errp, err);
+                err = NULL;
+
+                /* Always call end_list if start_list succeeded.  */
+                visit_end_list(m, &err);
+            }
+            error_propagate(errp, err);
         }
-
-        visit_end_list(m, errp);
     }
     address@hidden:~/w/qemu2.git$ cat qapi-generated/example-qapi-visit.h
-    /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+[Uninteresting stuff omitted...]
 
-    #ifndef QAPI_GENERATED_EXAMPLE_QAPI_VISIT
-    #define QAPI_GENERATED_EXAMPLE_QAPI_VISIT
+    #ifndef EXAMPLE_QAPI_VISIT_H
+    #define EXAMPLE_QAPI_VISIT_H
 
-    #include "qapi/qapi-visit-core.h"
-    #include "example-qapi-types.h"
+[Visitors for builtin types omitted...]
 
     void visit_type_UserDefOne(Visitor *m, UserDefOne ** obj, const char 
*name, Error **errp);
     void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const 
char *name, Error **errp);
@@ -333,9 +375,6 @@ Example:
     #endif
     address@hidden:~/w/qemu2.git$
 
-(The actual structure of the visit_type_* functions is a bit more complex
-in order to propagate errors correctly and avoid leaking memory).
-
 === scripts/qapi-commands.py ===
 
 Used to generate the marshaling/dispatch functions for the commands defined
@@ -356,18 +395,8 @@ $(prefix)qmp-commands.h: Function prototypes for the QMP 
commands
 Example:
 
     address@hidden:~/w/qemu2.git$ cat qapi-generated/example-qmp-marshal.c
-    /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
-
-    #include "qemu-objects.h"
-    #include "qapi/qmp-core.h"
-    #include "qapi/qapi-visit-core.h"
-    #include "qapi/qmp-output-visitor.h"
-    #include "qapi/qmp-input-visitor.h"
-    #include "qapi/qapi-dealloc-visitor.h"
-    #include "example-qapi-types.h"
-    #include "example-qapi-visit.h"
+[Uninteresting stuff omitted...]
 
-    #include "example-qmp-commands.h"
     static void qmp_marshal_output_my_command(UserDefOne * ret_in, QObject 
**ret_out, Error **errp)
     {
         QapiDeallocVisitor *md = qapi_dealloc_visitor_new();
@@ -376,15 +405,16 @@ Example:
 
         v = qmp_output_get_visitor(mo);
         visit_type_UserDefOne(v, &ret_in, "unused", errp);
+        if (!error_is_set(errp)) {
+            *ret_out = qmp_output_get_qobject(mo);
+        }
+        qmp_output_visitor_cleanup(mo);
         v = qapi_dealloc_get_visitor(md);
-        visit_type_UserDefOne(v, &ret_in, "unused", errp);
+        visit_type_UserDefOne(v, &ret_in, "unused", NULL);
         qapi_dealloc_visitor_cleanup(md);
-
-
-        *ret_out = qmp_output_get_qobject(mo);
     }
 
-    static void qmp_marshal_input_my_command(QmpState *qmp__sess, QDict *args, 
QObject **ret, Error **errp)
+    static void qmp_marshal_input_my_command(QDict *args, QObject **ret, Error 
**errp)
     {
         UserDefOne * retval = NULL;
         QmpInputVisitor *mi;
@@ -392,38 +422,42 @@ Example:
         Visitor *v;
         UserDefOne * arg1 = NULL;
 
-        mi = qmp_input_visitor_new(QOBJECT(args));
+        mi = qmp_input_visitor_new_strict(QOBJECT(args));
         v = qmp_input_get_visitor(mi);
         visit_type_UserDefOne(v, &arg1, "arg1", errp);
+        qmp_input_visitor_cleanup(mi);
 
         if (error_is_set(errp)) {
             goto out;
         }
         retval = qmp_my_command(arg1, errp);
-        qmp_marshal_output_my_command(retval, ret, errp);
+        if (!error_is_set(errp)) {
+            qmp_marshal_output_my_command(retval, ret, errp);
+        }
 
     out:
         md = qapi_dealloc_visitor_new();
         v = qapi_dealloc_get_visitor(md);
-        visit_type_UserDefOne(v, &arg1, "arg1", errp);
+        visit_type_UserDefOne(v, &arg1, "arg1", NULL);
         qapi_dealloc_visitor_cleanup(md);
         return;
     }
 
     static void qmp_init_marshal(void)
     {
-        qmp_register_command("my-command", qmp_marshal_input_my_command);
+        qmp_register_command("my-command", qmp_marshal_input_my_command, 
QCO_NO_OPTIONS);
     }
 
     qapi_init(qmp_init_marshal);
     address@hidden:~/w/qemu2.git$ cat qapi-generated/example-qmp-commands.h
-    /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+[Uninteresting stuff omitted...]
 
-    #ifndef QAPI_GENERATED_EXAMPLE_QMP_COMMANDS
-    #define QAPI_GENERATED_EXAMPLE_QMP_COMMANDS
+    #ifndef EXAMPLE_QMP_COMMANDS_H
+    #define EXAMPLE_QMP_COMMANDS_H
 
     #include "example-qapi-types.h"
-    #include "error.h"
+    #include "qapi/qmp/qdict.h"
+    #include "qapi/error.h"
 
     UserDefOne * qmp_my_command(UserDefOne * arg1, Error **errp);
 
-- 
1.8.1.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]