|
@@ -23,7 +23,6 @@
|
|
|
from .common import c_name, mcgen
|
|
|
from .gen import (
|
|
|
QAPIGenC,
|
|
|
- QAPIGenCCode,
|
|
|
QAPISchemaModularCVisitor,
|
|
|
build_params,
|
|
|
ifcontext,
|
|
@@ -237,28 +236,11 @@ def gen_register_command(name: str,
|
|
|
return ret
|
|
|
|
|
|
|
|
|
-def gen_registry(registry: str, prefix: str) -> str:
|
|
|
- ret = mcgen('''
|
|
|
-
|
|
|
-void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
|
|
|
-{
|
|
|
- QTAILQ_INIT(cmds);
|
|
|
-
|
|
|
-''',
|
|
|
- c_prefix=c_name(prefix, protect=False))
|
|
|
- ret += registry
|
|
|
- ret += mcgen('''
|
|
|
-}
|
|
|
-''')
|
|
|
- return ret
|
|
|
-
|
|
|
-
|
|
|
class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
|
|
def __init__(self, prefix: str):
|
|
|
super().__init__(
|
|
|
prefix, 'qapi-commands',
|
|
|
' * Schema-defined QAPI/QMP commands', None, __doc__)
|
|
|
- self._regy = QAPIGenCCode(None)
|
|
|
self._visited_ret_types: Dict[QAPIGenC, Set[QAPISchemaType]] = {}
|
|
|
|
|
|
def _begin_user_module(self, name: str) -> None:
|
|
@@ -285,7 +267,7 @@ def _begin_user_module(self, name: str) -> None:
|
|
|
''',
|
|
|
types=types))
|
|
|
|
|
|
- def visit_end(self) -> None:
|
|
|
+ def visit_begin(self, schema: QAPISchema) -> None:
|
|
|
self._add_module('./init', ' * QAPI Commands initialization')
|
|
|
self._genh.add(mcgen('''
|
|
|
#include "qapi/qmp/dispatch.h"
|
|
@@ -293,13 +275,24 @@ def visit_end(self) -> None:
|
|
|
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
|
|
|
''',
|
|
|
c_prefix=c_name(self._prefix, protect=False)))
|
|
|
- self._genc.preamble_add(mcgen('''
|
|
|
+ self._genc.add(mcgen('''
|
|
|
#include "qemu/osdep.h"
|
|
|
#include "%(prefix)sqapi-commands.h"
|
|
|
#include "%(prefix)sqapi-init-commands.h"
|
|
|
+
|
|
|
+void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
|
|
|
+{
|
|
|
+ QTAILQ_INIT(cmds);
|
|
|
+
|
|
|
''',
|
|
|
- prefix=self._prefix))
|
|
|
- self._genc.add(gen_registry(self._regy.get_content(), self._prefix))
|
|
|
+ prefix=self._prefix,
|
|
|
+ c_prefix=c_name(self._prefix, protect=False)))
|
|
|
+
|
|
|
+ def visit_end(self) -> None:
|
|
|
+ with self._temp_module('./init'):
|
|
|
+ self._genc.add(mcgen('''
|
|
|
+}
|
|
|
+'''))
|
|
|
|
|
|
def visit_command(self,
|
|
|
name: str,
|
|
@@ -324,15 +317,17 @@ def visit_command(self,
|
|
|
if ret_type and ret_type not in self._visited_ret_types[self._genc]:
|
|
|
self._visited_ret_types[self._genc].add(ret_type)
|
|
|
with ifcontext(ret_type.ifcond,
|
|
|
- self._genh, self._genc, self._regy):
|
|
|
+ self._genh, self._genc):
|
|
|
self._genc.add(gen_marshal_output(ret_type))
|
|
|
- with ifcontext(ifcond, self._genh, self._genc, self._regy):
|
|
|
+ with ifcontext(ifcond, self._genh, self._genc):
|
|
|
self._genh.add(gen_command_decl(name, arg_type, boxed, ret_type))
|
|
|
self._genh.add(gen_marshal_decl(name))
|
|
|
self._genc.add(gen_marshal(name, arg_type, boxed, ret_type))
|
|
|
- self._regy.add(gen_register_command(name, success_response,
|
|
|
- allow_oob, allow_preconfig,
|
|
|
- coroutine))
|
|
|
+ with self._temp_module('./init'):
|
|
|
+ with ifcontext(ifcond, self._genh, self._genc):
|
|
|
+ self._genc.add(gen_register_command(name, success_response,
|
|
|
+ allow_oob, allow_preconfig,
|
|
|
+ coroutine))
|
|
|
|
|
|
|
|
|
def gen_commands(schema: QAPISchema,
|