The next patch will add support for passing a qapi union type as the 'data' of a command. But to do that, the user function for implementing the command, as called by the generated marshal command, must take the corresponding C struct as a single boxed pointer, rather than a breakdown into one parameter per member. Even without a union, being able to use a C struct rather than a list of parameters can make it much easier to handle coding with QAPI. This patch adds the internal plumbing of a 'boxed' flag associated with each command and event. In several cases, this means adding indentation, with one new dead branch and the remaining branch being the original code more deeply nested; this was done so that the new implementation in the next patch is easier to review without also being mixed with indentation changes. For this patch, no behavior or generated output changes, other than the testsuite outputting the value of the new flag (always False for now). Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <1468468228-27827-9-git-send-email-eblake@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Identifier box renamed to boxed in two places] Signed-off-by: Markus Armbruster <armbru@redhat.com>
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
#
|
|
# QAPI parser test harness
|
|
#
|
|
# Copyright (c) 2013 Red Hat Inc.
|
|
#
|
|
# Authors:
|
|
# Markus Armbruster <armbru@redhat.com>
|
|
#
|
|
# This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
# See the COPYING file in the top-level directory.
|
|
#
|
|
|
|
from qapi import *
|
|
from pprint import pprint
|
|
import os
|
|
import sys
|
|
|
|
|
|
class QAPISchemaTestVisitor(QAPISchemaVisitor):
|
|
def visit_enum_type(self, name, info, values, prefix):
|
|
print 'enum %s %s' % (name, values)
|
|
if prefix:
|
|
print ' prefix %s' % prefix
|
|
|
|
def visit_object_type(self, name, info, base, members, variants):
|
|
print 'object %s' % name
|
|
if base:
|
|
print ' base %s' % base.name
|
|
for m in members:
|
|
print ' member %s: %s optional=%s' % \
|
|
(m.name, m.type.name, m.optional)
|
|
self._print_variants(variants)
|
|
|
|
def visit_alternate_type(self, name, info, variants):
|
|
print 'alternate %s' % name
|
|
self._print_variants(variants)
|
|
|
|
def visit_command(self, name, info, arg_type, ret_type,
|
|
gen, success_response, boxed):
|
|
print 'command %s %s -> %s' % \
|
|
(name, arg_type and arg_type.name, ret_type and ret_type.name)
|
|
print ' gen=%s success_response=%s boxed=%s' % \
|
|
(gen, success_response, boxed)
|
|
|
|
def visit_event(self, name, info, arg_type, boxed):
|
|
print 'event %s %s' % (name, arg_type and arg_type.name)
|
|
print ' boxed=%s' % boxed
|
|
|
|
@staticmethod
|
|
def _print_variants(variants):
|
|
if variants:
|
|
print ' tag %s' % variants.tag_member.name
|
|
for v in variants.variants:
|
|
print ' case %s: %s' % (v.name, v.type.name)
|
|
|
|
schema = QAPISchema(sys.argv[1])
|
|
schema.visit(QAPISchemaTestVisitor())
|