[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH RFC 0/1] QOM type names and QAPI

From: Markus Armbruster
Subject: Re: [PATCH RFC 0/1] QOM type names and QAPI
Date: Fri, 29 Jan 2021 12:54:52 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux)

Markus Armbruster <armbru@redhat.com> writes:

> QAPI has naming rules.  docs/devel/qapi-code-gen.txt:
>     === Naming rules and reserved names ===
>     All names must begin with a letter, and contain only ASCII letters,
>     digits, hyphen, and underscore.  There are two exceptions: enum values
>     may start with a digit, and names that are downstream extensions (see
>     section Downstream extensions) start with underscore.
>     [More on reserved names, upper vs. lower case, '-' vs. '_'...]
> The generator enforces the rules.
> Naming rules help in at least three ways:
> 1. They help with keeping names in interfaces consistent and
>    predictable.
> 2. They make avoiding collisions with the users' names in the
>    generator simpler.
> 3. They enable quote-less, evolvable syntax.
>    For instance, keyval_parse() syntax consists of names, values, and
>    special characters ',', '=', '.'
>    Since names cannot contain special characters, there is no need for
>    quoting[*].  Simple.
>    Values are unrestricted, but only ',' is special there.  We quote
>    it by doubling.
>    Together, we get exactly the same quoting as in QemuOpts.  This is
>    a feature.
>    If we ever decice to extend key syntax, we have plenty of special
>    characters to choose from.  This is also a feature.
>    Both features rely on naming rules.
> QOM has no naming rules whatsoever.  Actual names aren't nearly as bad
> as they could be.  Still, there are plenty of "funny" names.  This
> will become a problem when we
> * Switch from QemuOpts to keyval_parse()
>   QOM type names must not contain special characters, unless we
>   introduce more quoting.  Which we shouldn't, because the value of
>   special characters in names is negligible compared to the hassle of
>   having to quote them.
> * QAPIfy (the compile-time static parts of) QOM
>   QOM type names become QAPI enum values.  They must conform to QAPI
>   naming rules.
> Adopting QAPI naming rules for QOM type names takes care of both.
> Let's review the existing offenders.
> 1. We have a few type names containing ',', and one containing ' '.
>    The former require QemuOpts / keyval quoting (double the comma),
>    the latter requires shell quoting.  There is no excuse for making
>    our users remember and do such crap.  PATCH 1 eliminates it.
> 2. We have some 550 type names containing '.'.  QAPI's naming rules
>    could be relaxed to accept '.', but keyval_parse()'s can't.

Thinko: keyval_parse() copes.  QOM type names occur as *value*, not as

One more thing on QAPI naming rules.  QAPI names get mapped to (parts
of) C identifiers.  These mappings are not injective.  The basic mapping
is simple: replace characters other than letters and digits by '_'.

This means names distinct QAPI names can clash in C.  Fairly harmless
when the only "other" characters are '-' and '_'.  The more "others" we
permit, the more likely confusing clashes become.  Not a show stopper,
"merely" an issue of ergonomics.

>    Aside: I wish keyval_parse() would use '/' instead of '.', but it's
>    designed to be compatible to the block layer's existing use of
>    dotted keys (shoehorned into QemuOpts).
> 3. We have six type names containing '+'.  Four of them also contain
>    '.'.  Naming rules could be relaxed to accept '+'.  I'm not sure
>    it's worthwhile.
> 4. We have 19 names starting with a digit.  Three of them also contain
>    '.'.  Leading digit is okay as QAPI enum, not okay as
>    keyval_parse() key fragment.  We can either rename these types, or
>    make keyval_parse() a bit less strict.
> Of the type names containing '.' or '+'[**], 293 are CPUs, 107 are
> machines, and 150 are something else.  48 of them can be plugged with
> -device, all s390x or spapr CPUs.
> Can we get rid of '.'?
> I figure we could keep old names as deprecated aliases if we care.
> Perhaps just the ones that can be plugged with -device.
> [*] Paolo's "[PATCH 04/25] keyval: accept escaped commas in implied
> option" provides for comma-quoting.  I'm ignoring it here for brevity.
> I assure you it doesn't weaken my argument.
> [**] They are:
>     603e_v1.1-powerpc-cpu

reply via email to

[Prev in Thread] Current Thread [Next in Thread]