aboutsummaryrefslogtreecommitdiff
path: root/scripts/qapi/types.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/qapi/types.py')
-rw-r--r--scripts/qapi/types.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 831294fe42..c39d054d2c 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -16,7 +16,11 @@ This work is licensed under the terms of the GNU GPL, version 2.
from typing import List, Optional
from .common import c_enum_const, c_name, mcgen
-from .gen import QAPISchemaModularCVisitor, ifcontext
+from .gen import (
+ QAPISchemaModularCVisitor,
+ gen_special_features,
+ ifcontext,
+)
from .schema import (
QAPISchema,
QAPISchemaEnumMember,
@@ -38,6 +42,8 @@ objects_seen = set()
def gen_enum_lookup(name: str,
members: List[QAPISchemaEnumMember],
prefix: Optional[str] = None) -> str:
+ max_index = c_enum_const(name, '_MAX', prefix)
+ feats = ''
ret = mcgen('''
const QEnumLookup %(c_name)s_lookup = {
@@ -53,12 +59,27 @@ const QEnumLookup %(c_name)s_lookup = {
index=index, name=memb.name)
ret += memb.ifcond.gen_endif()
+ special_features = gen_special_features(memb.features)
+ if special_features != '0':
+ feats += mcgen('''
+ [%(index)s] = %(special_features)s,
+''',
+ index=index, special_features=special_features)
+
+ if feats:
+ ret += mcgen('''
+ },
+ .special_features = (const unsigned char[%(max_index)s]) {
+''',
+ max_index=max_index)
+ ret += feats
+
ret += mcgen('''
},
.size = %(max_index)s
};
''',
- max_index=c_enum_const(name, '_MAX', prefix))
+ max_index=max_index)
return ret
@@ -121,7 +142,7 @@ def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
ret = ''
for memb in members:
ret += memb.ifcond.gen_if()
- if memb.optional:
+ if memb.need_has():
ret += mcgen('''
bool has_%(c_name)s;
''',