@@ -64,9 +64,13 @@ def gen_call(name: str,
elif arg_type:
assert not arg_type.variants
for memb in arg_type.members:
+ if memb.ifcond.is_present():
+ argstr += '\n' + memb.ifcond.gen_if()
if memb.need_has():
argstr += 'arg.has_%s, ' % c_name(memb.name)
argstr += 'arg.%s, ' % c_name(memb.name)
+ if memb.ifcond.is_present():
+ argstr += '\n' + memb.ifcond.gen_endif()
lhs = ''
if ret_type:
@@ -111,22 +111,31 @@ def build_params(arg_type: Optional[QAPISchemaObjectType],
boxed: bool,
extra: Optional[str] = None) -> str:
ret = ''
- sep = ''
if boxed:
assert arg_type
ret += '%s arg' % arg_type.c_param_type()
- sep = ', '
+ if extra:
+ ret += ', '
elif arg_type:
assert not arg_type.variants
+ n = 0
for memb in arg_type.members:
- ret += sep
- sep = ', '
+ n += 1
+ if memb.ifcond.is_present():
+ ret += '\n' + memb.ifcond.gen_if()
if memb.need_has():
ret += 'bool has_%s, ' % c_name(memb.name)
ret += '%s %s' % (memb.type.c_param_type(),
c_name(memb.name))
+ if extra or n != len(arg_type.members):
+ ret += ', '
+ else:
+ # FIXME: optional last argument may break compilation
+ assert not memb.ifcond.is_present()
+ if memb.ifcond.is_present():
+ ret += '\n' + memb.ifcond.gen_endif()
if extra:
- ret += sep + extra
+ ret += extra
return ret if ret else 'void'
@@ -74,11 +74,13 @@ def gen_visit_object_members(name: str,
sep = ''
for memb in members:
if memb.optional and not memb.need_has():
+ ret += memb.ifcond.gen_if()
ret += mcgen('''
bool has_%(c_name)s = !!obj->%(c_name)s;
''',
c_name=c_name(memb.name))
sep = '\n'
+ ret += memb.ifcond.gen_endif()
ret += sep
if base:
@@ -258,7 +258,8 @@
{ 'event': 'TEST_IF_EVENT',
'data': { 'foo': 'TestIfStruct',
- 'bar': { 'type': ['TestIfEnum'], 'if': 'TEST_IF_EVT_BAR' } },
+ 'bar': { 'type': ['TestIfEnum'], 'if': 'TEST_IF_EVT_BAR' },
+ 'baz': 'int' },
'if': { 'all': ['TEST_IF_EVT', 'TEST_IF_STRUCT'] } }
{ 'event': 'TEST_IF_EVENT2', 'data': {},