[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 08/49] qapi: add #if/#endif helpers
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v3 08/49] qapi: add #if/#endif helpers |
Date: |
Wed, 21 Mar 2018 12:51:30 +0100 |
Add helpers to wrap generated code with #if/#endif lines.
Add QAPIGenCSnippet class to write C snippet code, make QAPIGenC
inherit from it, for full C files with copyright headers etc.
Add a 'with' statement context manager that will be used to wrap
generator visitor methods. The manager will check if code was
generated before adding #if/#endif lines on QAPIGenCSnippet
objects. Used in the following patches.
Signed-off-by: Marc-André Lureau <address@hidden>
---
scripts/qapi/common.py | 82 +++++++++++++++++++++++++++++++++++++++---
1 file changed, 78 insertions(+), 4 deletions(-)
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 47efe79758..60c1d0a783 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -12,6 +12,7 @@
# See the COPYING file in the top-level directory.
from __future__ import print_function
+from contextlib import contextmanager
import errno
import os
import re
@@ -1964,6 +1965,40 @@ def guardend(name):
name=guardname(name))
+def gen_if(ifcond):
+ ret = ''
+ for ifc in ifcond:
+ ret += mcgen('''
+#if %(cond)s
+''', cond=ifc)
+ return ret
+
+
+def gen_endif(ifcond):
+ ret = ''
+ for ifc in reversed(ifcond):
+ ret += mcgen('''
+#endif /* %(cond)s */
+''', cond=ifc)
+ return ret
+
+
+def wrap_ifcond(ifcond, before, after):
+ if ifcond is None or before == after:
+ return after
+
+ assert after.startswith(before)
+ out = before
+ added = after[len(before):]
+ if added[0] == '\n':
+ out += '\n'
+ added = added[1:]
+ out += gen_if(ifcond)
+ out += added
+ out += gen_endif(ifcond)
+ return out
+
+
def gen_enum_lookup(name, values, prefix=None):
ret = mcgen('''
@@ -2054,6 +2089,7 @@ class QAPIGen(object):
def __init__(self):
self._preamble = ''
self._body = ''
+ self._ifcond = None
def preamble_add(self, text):
self._preamble += text
@@ -2061,6 +2097,23 @@ class QAPIGen(object):
def add(self, text):
self._body += text
+ def start_if(self, ifcond):
+ self._ifcond = ifcond
+ self._start_if_body = self._body
+ self._start_if_preamble = self._preamble
+
+ def _wrap_ifcond(self):
+ pass
+
+ def end_if(self):
+ self._wrap_ifcond()
+ self._ifcond = None
+
+ def get_content(self, fname=None):
+ assert self._ifcond is None
+ return (self._top(fname) + self._preamble + self._body
+ + self._bottom(fname))
+
def _top(self, fname):
return ''
@@ -2078,8 +2131,7 @@ class QAPIGen(object):
raise
fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666)
f = os.fdopen(fd, 'r+')
- text = (self._top(fname) + self._preamble + self._body
- + self._bottom(fname))
+ text = self.get_content(fname)
oldtext = f.read(len(text) + 1)
if text != oldtext:
f.seek(0)
@@ -2088,10 +2140,32 @@ class QAPIGen(object):
f.close()
-class QAPIGenC(QAPIGen):
address@hidden
+def ifcontext(ifcond, *args):
+ saved = []
+ for arg in args:
+ arg.start_if(ifcond)
+ yield
+ for arg in args:
+ arg.end_if()
- def __init__(self, blurb, pydoc):
+
+class QAPIGenCSnippet(QAPIGen):
+
+ def __init__(self):
QAPIGen.__init__(self)
+
+ def _wrap_ifcond(self):
+ self._body = wrap_ifcond(self._ifcond,
+ self._start_if_body, self._body)
+ self._preamble = wrap_ifcond(self._ifcond,
+ self._start_if_preamble, self._preamble)
+
+
+class QAPIGenC(QAPIGenCSnippet):
+
+ def __init__(self, blurb, pydoc):
+ QAPIGenCSnippet.__init__(self)
self._blurb = blurb
self._copyright = '\n * '.join(re.findall(r'^Copyright .*', pydoc,
re.MULTILINE))
--
2.16.2.521.g9aa15f885a
- [Qemu-devel] [PATCH v3 00/49] qapi: add #if pre-processor conditions to generated code, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 01/49] qapi/visit: remove useless prefix argument, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 02/49] qapi/events: generate event enum in main module, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 03/49] qapi: add 'if' to top-level expressions, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 04/49] qapi: pass 'if' condition into QAPISchemaEntity objects, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 05/49] qapi: leave the ifcond attribute undefined until check(), Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 06/49] qapi: add 'ifcond' to visitor methods, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 07/49] qapi: mcgen() shouldn't indent # lines, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 08/49] qapi: add #if/#endif helpers,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v3 10/49] qapi-introspect: add preprocessor conditions to generated QLit, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 09/49] qapi-introspect: modify to_qlit() to append ', ' on level > 0, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 11/49] qapi/commands: add #if conditions to commands, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 12/49] qapi/events: add #if conditions to events, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 13/49] qapi-types: refactor variants handling, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 14/49] qapi-types: add #if conditions to types & visitors, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 15/49] qapi: do not define enumeration value explicitely, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 16/49] qapi: rename QAPISchemaEnumType.values to .members, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 17/49] qapi: change enum visitor to take QAPISchemaMember, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 18/49] tests: modify visit_enum_type() in test-qapi to print members, Marc-André Lureau, 2018/03/21