Browse Source
This replaces use of the constants from the QapiSpecialFeatures enum, with constants from the auto-generate QapiFeatures enum in qapi-features.h The 'deprecated' and 'unstable' features still have a little bit of special handling, being force defined to be the 1st + 2nd features in the enum, regardless of whether they're used in the schema. This retains compatibility with common code that references the features via the QapiSpecialFeatures constants. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-ID: <20250205123550.2754387-5-berrange@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [Imports tidied up with isort] Signed-off-by: Markus Armbruster <armbru@redhat.com>pull/281/head
committed by
Markus Armbruster
13 changed files with 110 additions and 7 deletions
@ -0,0 +1,48 @@ |
|||
""" |
|||
QAPI features generator |
|||
|
|||
Copyright 2024 Red Hat |
|||
|
|||
This work is licensed under the terms of the GNU GPL, version 2. |
|||
# See the COPYING file in the top-level directory. |
|||
""" |
|||
|
|||
from typing import ValuesView |
|||
|
|||
from .common import c_enum_const, c_name |
|||
from .gen import QAPISchemaMonolithicCVisitor |
|||
from .schema import QAPISchema, QAPISchemaFeature |
|||
|
|||
|
|||
class QAPISchemaGenFeatureVisitor(QAPISchemaMonolithicCVisitor): |
|||
|
|||
def __init__(self, prefix: str): |
|||
super().__init__( |
|||
prefix, 'qapi-features', |
|||
' * Schema-defined QAPI features', |
|||
__doc__) |
|||
|
|||
self.features: ValuesView[QAPISchemaFeature] |
|||
|
|||
def visit_begin(self, schema: QAPISchema) -> None: |
|||
self.features = schema.features() |
|||
self._genh.add("#include \"qapi/util.h\"\n\n") |
|||
|
|||
def visit_end(self) -> None: |
|||
self._genh.add("typedef enum {\n") |
|||
for f in self.features: |
|||
self._genh.add(f" {c_enum_const('qapi_feature', f.name)}") |
|||
if f.name in QAPISchemaFeature.SPECIAL_NAMES: |
|||
self._genh.add(f" = {c_enum_const('qapi', f.name)},\n") |
|||
else: |
|||
self._genh.add(",\n") |
|||
|
|||
self._genh.add("} " + c_name('QapiFeature') + ";\n") |
|||
|
|||
|
|||
def gen_features(schema: QAPISchema, |
|||
output_dir: str, |
|||
prefix: str) -> None: |
|||
vis = QAPISchemaGenFeatureVisitor(prefix) |
|||
schema.visit(vis) |
|||
vis.write(output_dir) |
|||
@ -0,0 +1,2 @@ |
|||
features-too-many.json: In command 'go-fish': |
|||
features-too-many.json:2: Maximum of 64 schema features is permitted |
|||
@ -0,0 +1,13 @@ |
|||
# Max 64 features, with 2 specials, so 63rd custom is invalid |
|||
{ 'command': 'go-fish', |
|||
'features': [ |
|||
'f00', 'f01', 'f02', 'f03', 'f04', 'f05', 'f06', 'f07', |
|||
'f08', 'f09', 'f0a', 'f0b', 'f0c', 'f0d', 'f0e', 'f0f', |
|||
'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', |
|||
'f18', 'f19', 'f1a', 'f1b', 'f1c', 'f1d', 'f1e', 'f1f', |
|||
'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f26', 'f27', |
|||
'f28', 'f29', 'f2a', 'f2b', 'f2c', 'f2d', 'f2e', 'f2f', |
|||
'f30', 'f31', 'f32', 'f33', 'f34', 'f35', 'f36', 'f37', |
|||
'f38', 'f39', 'f3a', 'f3b', 'f3c', 'f3d', 'f3e' |
|||
] |
|||
} |
|||
Loading…
Reference in new issue