<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 25, 2021 at 1:26 AM Markus Armbruster <<a href="mailto:armbru@redhat.com">armbru@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The code to check enumeration value policy can see special feature<br>
flag 'deprecated' in QEnumLookup member flags[value]. I want to make<br>
feature flag 'unstable' visible there as well, so I can add policy for<br>
it.<br>
<br>
Instead of extending flags[], replace it by @special_features (a<br>
bitset of QapiSpecialFeature), because that's how special features get<br>
passed around elsewhere.<br>
<br>
Signed-off-by: Markus Armbruster <<a href="mailto:armbru@redhat.com" target="_blank">armbru@redhat.com</a>><br>
---<br>
include/qapi/util.h | 5 +----<br>
qapi/qapi-visit-core.c | 3 ++-<br>
scripts/qapi/types.py | 22 ++++++++++++----------<br>
3 files changed, 15 insertions(+), 15 deletions(-)<br>
<br>
diff --git a/include/qapi/util.h b/include/qapi/util.h<br>
index 7a8d5c7d72..0cc98db9f9 100644<br>
--- a/include/qapi/util.h<br>
+++ b/include/qapi/util.h<br>
@@ -15,12 +15,9 @@ typedef enum {<br>
QAPI_DEPRECATED,<br>
} QapiSpecialFeature;<br>
<br>
-/* QEnumLookup flags */<br>
-#define QAPI_ENUM_DEPRECATED 1<br>
-<br>
typedef struct QEnumLookup {<br>
const char *const *array;<br>
- const unsigned char *const flags;<br>
+ const unsigned char *const special_features;<br>
const int size;<br>
} QEnumLookup;<br>
<br>
diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c<br>
index b4a81f1757..5572d90efb 100644<br>
--- a/qapi/qapi-visit-core.c<br>
+++ b/qapi/qapi-visit-core.c<br>
@@ -407,7 +407,8 @@ static bool input_type_enum(Visitor *v, const char *name, int *obj,<br>
return false;<br>
}<br>
<br>
- if (lookup->flags && (lookup->flags[value] & QAPI_ENUM_DEPRECATED)) {<br>
+ if (lookup->special_features<br>
+ && (lookup->special_features[value] & QAPI_DEPRECATED)) {<br>
switch (v->compat_policy.deprecated_input) {<br>
case COMPAT_POLICY_INPUT_ACCEPT:<br>
break;<br>
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py<br>
index ab2441adc9..3013329c24 100644<br>
--- a/scripts/qapi/types.py<br>
+++ b/scripts/qapi/types.py<br>
@@ -16,7 +16,7 @@<br>
from typing import List, Optional<br>
<br>
from .common import c_enum_const, c_name, mcgen<br>
-from .gen import QAPISchemaModularCVisitor, ifcontext<br>
+from .gen import QAPISchemaModularCVisitor, gen_special_features, ifcontext<br>
from .schema import (<br>
QAPISchema,<br>
QAPISchemaEnumMember,<br>
@@ -39,7 +39,7 @@ def gen_enum_lookup(name: str,<br>
members: List[QAPISchemaEnumMember],<br>
prefix: Optional[str] = None) -> str:<br>
max_index = c_enum_const(name, '_MAX', prefix)<br>
- flags = ''<br>
+ feats = ''<br>
ret = mcgen('''<br>
<br>
const QEnumLookup %(c_name)s_lookup = {<br>
@@ -54,19 +54,21 @@ def gen_enum_lookup(name: str,<br>
''',<br>
index=index, name=<a href="http://memb.name" rel="noreferrer" target="_blank">memb.name</a>)<br>
ret += memb.ifcond.gen_endif()<br>
- if 'deprecated' in (<a href="http://f.name" rel="noreferrer" target="_blank">f.name</a> for f in memb.features):<br>
- flags += mcgen('''<br>
- [%(index)s] = QAPI_ENUM_DEPRECATED,<br>
-''',<br>
- index=index)<br>
<br>
- if flags:<br>
+ special_features = gen_special_features(memb.features)<br>
+ if special_features != '0':<br></blockquote><div><br></div><div>Though, I have to admit the common reoccurrence of this pattern suggests to me that gen_special_features really ought to be returning something false-y in these cases. Something about testing for the empty case with something that represents, but isn't empty, gives me a brief pause.</div><div><br></div><div>Not willing to wage war over it.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+ feats += mcgen('''<br>
+ [%(index)s] = %(special_features)s,<br>
+''',<br>
+ index=index, special_features=special_features)<br>
+<br>
+ if feats:<br>
ret += mcgen('''<br>
},<br>
- .flags = (const unsigned char[%(max_index)s]) {<br>
+ .special_features = (const unsigned char[%(max_index)s]) {<br>
''',<br>
max_index=max_index)<br>
- ret += flags<br>
+ ret += feats<br>
<br>
ret += mcgen('''<br>
},<br>
-- <br>
2.31.1<br>
<br></blockquote><div><br></div><div>Python bits: Acked-by: John Snow <<a href="mailto:jsnow@redhat.com">jsnow@redhat.com</a>></div><div> <br></div></div></div>