size uint64_t like uint64_t, except StringInputVisitor
accepts size suffixes
bool bool JSON true or false
+ null QNull * JSON null
any QObject * any JSON value
QType QType JSON string matching enum QType values
JSON. If a branch is typed as the 'bool' built-in, the alternate
accepts true and false; if it is typed as any of the various numeric
built-ins, it accepts a JSON number; if it is typed as a 'str'
-built-in or named enum type, it accepts a JSON string; and if it is
-typed as a complex type (struct or union), it accepts a JSON object.
-Two different complex types, for instance, aren't permitted, because
-both are represented as a JSON object.
+built-in or named enum type, it accepts a JSON string; if it is typed
+as the 'null' built-in, it accepts JSON null; and if it is typed as a
+complex type (struct or union), it accepts a JSON object. Two
+different complex types, for instance, aren't permitted, because both
+are represented as a JSON object.
The example alternate declaration above allows using both of the
following example objects:
return obj->type;
}
-typedef struct QNull {
+struct QNull {
QObject base;
-} QNull;
+};
extern QNull qnull_;
typedef struct QEMUTimer QEMUTimer;
typedef struct QEMUTimerListGroup QEMUTimerListGroup;
typedef struct QObject QObject;
+typedef struct QNull QNull;
typedef struct RAMBlock RAMBlock;
typedef struct Range Range;
typedef struct SerialState SerialState;
from ordereddict import OrderedDict
builtin_types = {
+ 'null': 'QTYPE_QNULL',
'str': 'QTYPE_QSTRING',
'int': 'QTYPE_QNUM',
'number': 'QTYPE_QNUM',
def alternate_qtype(self):
json2qtype = {
+ 'null': 'QTYPE_QNULL',
'string': 'QTYPE_QSTRING',
'number': 'QTYPE_QNUM',
'int': 'QTYPE_QNUM',
('uint64', 'int', 'uint64_t'),
('size', 'int', 'uint64_t'),
('bool', 'boolean', 'bool'),
- ('any', 'value', 'QObject' + pointer_suffix)]:
+ ('any', 'value', 'QObject' + pointer_suffix),
+ ('null', 'null', 'QNull' + pointer_suffix)]:
self._def_builtin_type(*t)
self.the_empty_object_type = QAPISchemaObjectType(
'q_empty', None, None, None, [], None)
{ 'struct': 'WrapAlternate',
'data': { 'alt': 'UserDefAlternate' } }
{ 'alternate': 'UserDefAlternate',
- 'data': { 'udfu': 'UserDefFlatUnion', 'e': 'EnumOne', 'i': 'int' } }
+ 'data': { 'udfu': 'UserDefFlatUnion', 'e': 'EnumOne', 'i': 'int',
+ 'n': 'null' } }
{ 'struct': 'UserDefC',
'data': { 'string1': 'str', 'string2': 'str' } }
case udfu: UserDefFlatUnion
case e: EnumOne
case i: int
+ case n: null
object UserDefB
member intb: int optional=False
member a-b: bool optional=True
g_assert_cmpint(tmp->u.e, ==, ENUM_ONE_VALUE1);
qapi_free_UserDefAlternate(tmp);
+ v = visitor_input_test_init(data, "null");
+ visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
+ g_assert_cmpint(tmp->type, ==, QTYPE_QNULL);
+ qapi_free_UserDefAlternate(tmp);
+
v = visitor_input_test_init(data, "{'integer':1, 'string':'str', "
"'enum1':'value1', 'boolean':true}");
visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
qapi_free_UserDefAlternate(tmp);
+ visitor_reset(data);
+ tmp = g_new0(UserDefAlternate, 1);
+ tmp->type = QTYPE_QNULL;
+ tmp->u.n = qnull();
+
+ visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
+ g_assert_cmpint(qobject_type(visitor_get(data)), ==, QTYPE_QNULL);
+
+ qapi_free_UserDefAlternate(tmp);
+
visitor_reset(data);
tmp = g_new0(UserDefAlternate, 1);
tmp->type = QTYPE_QDICT;