[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 19/54] qapi: add #if/#endif helpers
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v2 19/54] qapi: add #if/#endif helpers |
Date: |
Tue, 22 Aug 2017 15:22:20 +0200 |
Add helpers to generate #if/#endif and wrap visitor methods generating
code. Used in the following patches.
Signed-off-by: Marc-André Lureau <address@hidden>
---
scripts/qapi.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 86845a28f9..52099332f1 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -1892,6 +1892,57 @@ def guardend(name):
name=guardname(name))
+def gen_if(ifcond):
+ if not ifcond:
+ return ''
+ if isinstance(ifcond, str):
+ ifcond = [ifcond]
+ # Not using mcgen() because we don't want indent or \n stipped
+ ret = '\n'
+ for ifc in ifcond:
+ ret += '#if %s\n' % ifc
+ ret += '\n'
+ return ret
+
+
+def gen_endif(ifcond):
+ if not ifcond:
+ return ''
+ if isinstance(ifcond, str):
+ ifcond = [ifcond]
+ # Not using mcgen() because we don't want indent or \n stipped
+ ret = '\n'
+ for ifc in reversed(ifcond):
+ ret += '#endif /* %s */\n' % ifc
+ ret += '\n'
+ return ret
+
+
+# Wrap a method to add #if / #endif to generated code, only if some
+# code was generated.
+# self must have 'if_members' listing the attributes to wrap.
+# The last argument of the wrapped function must be the 'ifcond'.
+def ifcond_decorator(func):
+
+ def func_wrapper(self, *args, **kwargs):
+ ifcond = args[-1]
+ save = {}
+ for mem in self.if_members:
+ save[mem] = getattr(self, mem)
+ func(self, *args, **kwargs)
+ for mem, val in save.items():
+ newval = getattr(self, mem)
+ if newval != val:
+ assert newval.startswith(val)
+ newval = newval[len(val):]
+ val += gen_if(ifcond)
+ val += newval
+ val += gen_endif(ifcond)
+ setattr(self, mem, val)
+
+ return func_wrapper
+
+
def gen_enum_lookup(name, values, prefix=None):
ret = mcgen('''
--
2.14.1.146.gd35faa819
- [Qemu-devel] [PATCH v2 04/54] qlit: add qobject_form_qlit(), (continued)
- [Qemu-devel] [PATCH v2 04/54] qlit: add qobject_form_qlit(), Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 38/54] qapi: add tests for invalid alternate, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 42/54] qapi2texi: add 'If:' condition to enum values, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 11/54] quorum: use qapi_enum_parse() in quorum_open, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 05/54] qapi: generate a literal qobject for introspection, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 31/54] tests: add some enum members tests, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 16/54] qapi: add a test for invalid 'if', Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 35/54] qapi: add 'if' on union variants, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 19/54] qapi: add #if/#endif helpers,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v2 50/54] qapi: make rtc-reset-reinjection depend on TARGET_I386, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 17/54] qapi: add 'if' condition on entity objects, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 33/54] qapi: add some struct member tests, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 45/54] qapi: add conditions to VNC type/commands/events on the schema, Marc-André Lureau, 2017/08/22
- [Qemu-devel] [PATCH v2 51/54] qapi: make s390 commands depend on TARGET_S390X, Marc-André Lureau, 2017/08/22