[Spice-devel] [RFC 3/4] handle @ifdef on messages and channels
Christophe Fergeau
cfergeau at redhat.com
Fri Jun 24 07:34:04 PDT 2011
---
python_modules/demarshal.py | 22 ++++++++++++++++++----
python_modules/marshal.py | 28 +++++++++++++++++++++++++---
2 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index 9d3b1e4..5a5a744 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -1015,6 +1015,8 @@ def write_msg_parser(writer, message):
or not message.members[0].is_array())
writer.newline()
+ if message.has_attr("ifdef"):
+ writer.ifdef(message.attributes["ifdef"][0])
parent_scope = writer.function(function_name,
"uint8_t *",
"uint8_t *message_start, uint8_t *message_end, int minor, size_t *size, message_destructor_t *free_message", True)
@@ -1084,6 +1086,9 @@ def write_msg_parser(writer, message):
writer.statement("return NULL")
writer.end_block()
+ if message.has_attr("ifdef"):
+ writer.endif(message.attributes["ifdef"][0])
+
return function_name
def write_channel_parser(writer, channel, server):
@@ -1112,6 +1117,8 @@ def write_channel_parser(writer, channel, server):
else:
function_name = "parse_%s_msgc" % channel.name
writer.newline()
+ if channel.has_attr("ifdef"):
+ writer.ifdef(channel.attributes["ifdef"][0])
scope = writer.function(function_name,
"static uint8_t *",
"uint8_t *message_start, uint8_t *message_end, uint16_t message_type, int minor, size_t *size_out, message_destructor_t *free_message")
@@ -1141,6 +1148,8 @@ def write_channel_parser(writer, channel, server):
writer.statement("return NULL")
writer.end_block()
+ if channel.has_attr("ifdef"):
+ writer.endif(channel.attributes["ifdef"][0])
return function_name
@@ -1157,13 +1166,16 @@ def write_get_channel_parser(writer, channel_parsers, max_channel, is_server):
writer.write("static struct {spice_parse_channel_func_t func; unsigned int max_messages; } channels[%d] = " % (max_channel+1))
writer.begin_block()
+ channel = None
for i in range(0, max_channel + 1):
- writer.write("{ ")
if channel_parsers.has_key(i):
+ channel = channel_parsers[i][0]
+ if channel.has_attr("ifdef"):
+ writer.ifdef(channel.attributes["ifdef"][0])
+ writer.write("{ ")
writer.write(channel_parsers[i][1])
writer.write(", ")
- channel = channel_parsers[i][0]
max_msg = 0
if is_server:
messages = channel.server_messages
@@ -1172,13 +1184,15 @@ def write_get_channel_parser(writer, channel_parsers, max_channel, is_server):
for m in messages:
max_msg = max(max_msg, m.value)
writer.write(max_msg)
+ writer.write("}")
else:
- writer.write("NULL, 0")
- writer.write("}")
+ writer.write("{ NULL, 0 }")
if i != max_channel:
writer.write(",")
writer.newline()
+ if channel and channel.has_attr("ifdef"):
+ writer.endif(channel.attributes["ifdef"][0])
writer.end_block(semicolon = True)
with writer.if_block("channel < %d" % (max_channel + 1)):
diff --git a/python_modules/marshal.py b/python_modules/marshal.py
index 5b4dfdd..d93f983 100644
--- a/python_modules/marshal.py
+++ b/python_modules/marshal.py
@@ -333,6 +333,8 @@ def write_container_marshaller(writer, container, src):
write_member_marshaller(writer, container, m, src, scope)
def write_message_marshaller(writer, message, is_server, private):
+ if message.has_attr("ifdef"):
+ writer.ifdef(message.attributes["ifdef"][0])
writer.out_prefix = ""
function_name = "spice_marshall_" + message.c_name()
if writer.is_generated("marshaller", function_name):
@@ -364,6 +366,8 @@ def write_message_marshaller(writer, message, is_server, private):
write_container_marshaller(writer, message, src)
writer.end_block()
+ if message.has_attr("ifdef"):
+ writer.endif(message.attributes["ifdef"][0])
writer.newline()
return function_name
@@ -371,16 +375,30 @@ def write_protocol_marshaller(writer, proto, is_server, private_marshallers):
functions = {}
for c in proto.channels:
channel = c.channel_type
+ if channel.has_attr("ifdef"):
+ writer.ifdef(channel.attributes["ifdef"][0])
if is_server:
for m in channel.client_messages:
message = m.message_type
f = write_message_marshaller(writer, message, is_server, private_marshallers)
- functions[f] = True
+ if channel.has_attr("ifdef") and not functions.has_key(f):
+ functions[f] = channel.attributes["ifdef"][0]
+ elif message.has_attr("ifdef") and not functions.has_key(f):
+ functions[f] = message.attributes["ifdef"][0]
+ else:
+ functions[f] = True
else:
for m in channel.server_messages:
message = m.message_type
- f= write_message_marshaller(writer, message, is_server, private_marshallers)
- functions[f] = True
+ f = write_message_marshaller(writer, message, is_server, private_marshallers)
+ if channel.has_attr("ifdef") and not functions.has_key(f):
+ functions[f] = channel.attributes["ifdef"][0]
+ elif message.has_attr("ifdef") and not functions.has_key(f):
+ functions[f] = message.attributes["ifdef"][0]
+ else:
+ functions[f] = True
+ if channel.has_attr("ifdef"):
+ writer.endif(channel.attributes["ifdef"][0])
if private_marshallers:
scope = writer.function("spice_message_marshallers_get" + writer.public_prefix,
@@ -391,7 +409,11 @@ def write_protocol_marshaller(writer, proto, is_server, private_marshallers):
member = f[len("spice_marshall_"):]
if not member.startswith("msg"):
member = "msg_" + member
+ if functions[f] != True:
+ writer.ifdef(functions[f])
writer.assign("marshallers.%s" % member, f)
+ if functions[f] != True:
+ writer.endif(functions[f])
writer.newline()
writer.statement("return &marshallers")
--
1.7.5.4
More information about the Spice-devel
mailing list