Re: [PATCH v2 10/16] scripts/qapi: add QAPISchemaType.is_predefined

Paolo Bonzini <[email protected]> Wed, 25 Feb 2026 09:01:15 +0100
Newsgroups org.nongnu.qemu-rust,org.nongnu.qemu-devel
Message-ID <[email protected]>
On 2/25/26 08:33, Markus Armbruster wrote:
> Paolo Bonzini <[email protected]> writes:
> 
>> It is impossible to call is_implicit on an enum type from the visitor, because
>> the QAPISchemaEnumType has already been exploded into its costituent fields.
> 
> constituent
> 
> Passing selected attributes instead of the entire object to its visitor
> method limits what the visitor can do.  This is both good and bad.
> We've run into "bad" a couple of times.  It's never been bad enough to
> change the interface, though.
> 
> Thoughts?

I think that applies here, is_predefined() is a reasonable addition.

>> The Rust backend is also not modular (yet?) so it is not possible to filter
>> out the builtin module;
> 
> Really?
> 
> The visitors are all based on QAPISchemaVisitor.  Protocol:
> 
>      .visit_begin()
>      for all modules:
>          .visit_module()
>          for all entities:
>              if .visit_needed():
>                  .visit_FOO()
>      .visit_end()
> 
> QAPISchemaModularCVisitor implements .visit_module() to generate code
> per module.  Its .write() skips builtin modules unless opt_builtins.

... because its .write() already builds multiple QAPIGen{C,H,Trace}, one 
per module.  Here instead there is just one QAPIGenRs.

Using multiple QAPIGenRs instances, one per module, would be hackish. 
I'd rather just go modular instead of that.  I can take a look, since 
this series will be (early) 11.1 material anyway.

Paolo

> QAPISchemaMonolithicCVisitor is oblivious of modules: it doesn't
> implement .visit_module(), and writes out everything.  This is fine,
> because we use it only to generate qapi-features.[ch] and
> qapi-introspect.[ch].  Generating the former has no need for recognizing
> the built-ins because there are no built-in features.  Generating the
> latter has no need because it treats built-in stuff exactly like
> user-defined stuff.
> 
> QAPISchemaRsVisitor [PATCH 12] also doesn't implement .visit_module().
> It uses QAPISchema.is_predefined(), defined in this patch, to skip
> built-in.  Could it rely on .visit_module() instead?
> 
>>                          add a way to query for implicit type names without
>> having the object itself.
>>
>> Signed-off-by: Paolo Bonzini <[email protected]>
>> ---
>>   scripts/qapi/schema.py | 11 +++++++++++
>>   1 file changed, 11 insertions(+)
>>
>> diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
>> index 848a7401251..15f5d97418f 100644
>> --- a/scripts/qapi/schema.py
>> +++ b/scripts/qapi/schema.py
>> @@ -1243,6 +1243,17 @@ def _def_builtin_type(
>>           # schema.
>>           self._make_array_type(name, None)
>>   
>> +    def is_predefined(self, name: str) -> bool:
>> +        # See QAPISchema._def_predefineds()
>> +        entity = self._entity_dict[name]
>> +        if isinstance(entity, QAPISchemaBuiltinType):
>> +            return True
>> +        if entity is self.the_empty_object_type:
>> +            return True
>> +        if name == 'QType':
>> +            return True
>> +        return False
>> +
>>       def _def_predefineds(self) -> None:
>>           for t in [('str',    'string',  'char' + POINTER_SUFFIX),
>>                     ('number', 'number',  'double'),
> 
> 
>