qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC PATCH] qapi: Allow setting default values for optional


From: Fam Zheng
Subject: [Qemu-devel] [RFC PATCH] qapi: Allow setting default values for optional parameters
Date: Wed, 16 Apr 2014 14:04:41 +0800

In command definition, 'default' is now parsed as a dict of default
values. Only optional parameters will have effect in generated code.

'str' and 'int' are supported, both need single quote in the schema. In
generated code, 'str' will be converted to g_strdup'ed pointer, 'int'
will be identically set.

E.g.

    { 'command': 'block-commit',
      'data': { 'device': 'str', '*base': 'str', 'top': 'str',
                '*speed': 'int' },
      'default': {'base': 'earthquake', 'speed': '100' } }

will generate

    int qmp_marshal_input_block_commit(Monitor *mon, const QDict *qdict, 
QObject **ret)
    {
        ...
        bool has_base = true;
        char * base = g_strdup("earthquake");
        ...
        bool has_speed = true;
        int64_t speed = 100;

Signed-off-by: Fam Zheng <address@hidden>
---
 scripts/qapi-commands.py | 24 +++++++++++++++++-------
 scripts/qapi.py          |  8 ++++++++
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 9734ab0..be6eea4 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -83,16 +83,23 @@ Visitor *v;
 
     return ret.rstrip()
 
-def gen_visitor_input_vars_decl(args):
+def gen_visitor_input_vars_decl(args, default):
     ret = ""
     push_indent()
     for argname, argtype, optional, structured in parse_args(args):
         if optional:
             ret += mcgen('''
-bool has_%(argname)s = false;
+bool has_%(argname)s = %(has_val)s;
 ''',
-                         argname=c_var(argname))
-        if c_type(argtype).endswith("*"):
+                         argname=c_var(argname),
+                         has_val="true" if default.get(argname) else "false")
+        if optional and default.get(argname):
+            ret += mcgen('''
+%(argtype)s %(argname)s = %(argval)s;
+''',
+                         argname=c_var(argname), argtype=c_type(argtype),
+                         argval=c_val(argtype, default[argname]))
+        elif c_type(argtype).endswith("*"):
             ret += mcgen('''
 %(argtype)s %(argname)s = NULL;
 ''',
@@ -194,7 +201,7 @@ def gen_marshal_input_decl(name, args, ret_type, 
middle_mode):
 
 
 
-def gen_marshal_input(name, args, ret_type, middle_mode):
+def gen_marshal_input(name, args, ret_type, middle_mode, default):
     hdr = gen_marshal_input_decl(name, args, ret_type, middle_mode)
 
     ret = mcgen('''
@@ -229,7 +236,7 @@ def gen_marshal_input(name, args, ret_type, middle_mode):
 
 ''',
                      
visitor_input_containers_decl=gen_visitor_input_containers_decl(args),
-                     visitor_input_vars_decl=gen_visitor_input_vars_decl(args),
+                     visitor_input_vars_decl=gen_visitor_input_vars_decl(args, 
default),
                      visitor_input_block=gen_visitor_input_block(args, 
"QOBJECT(args)"))
     else:
         ret += mcgen('''
@@ -434,9 +441,12 @@ if dispatch_type == "sync":
 
     for cmd in commands:
         arglist = []
+        default = {}
         ret_type = None
         if cmd.has_key('data'):
             arglist = cmd['data']
+        if cmd.has_key('default'):
+            default = cmd['default']
         if cmd.has_key('returns'):
             ret_type = cmd['returns']
         ret = generate_command_decl(cmd['command'], arglist, ret_type) + "\n"
@@ -448,7 +458,7 @@ if dispatch_type == "sync":
         if middle_mode:
             fdecl.write('%s;\n' % gen_marshal_input_decl(cmd['command'], 
arglist, ret_type, middle_mode))
 
-        ret = gen_marshal_input(cmd['command'], arglist, ret_type, 
middle_mode) + "\n"
+        ret = gen_marshal_input(cmd['command'], arglist, ret_type, 
middle_mode, default) + "\n"
         fdef.write(ret)
 
     fdecl.write("\n#endif\n");
diff --git a/scripts/qapi.py b/scripts/qapi.py
index b474c39..f12866a 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -421,6 +421,14 @@ def find_enum(name):
 def is_enum(name):
     return find_enum(name) != None
 
+def c_val(t, val):
+    if t == 'str':
+        return 'g_strdup("%s")' % val
+    elif t == 'int':
+        return val
+    else:
+        assert False, "Unknown type: %s" % t
+
 def c_type(name):
     if name == 'str':
         return 'char *'
-- 
1.9.2




reply via email to

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