--- python_modules/demarshal.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py index 209eafc..743b0d8 100644 --- a/python_modules/demarshal.py +++ b/python_modules/demarshal.py @@ -40,20 +40,34 @@ def write_parser_helpers(writer): writer = writer.function_helper() + for sign in ["", "u"]: + type = "%sint8" % sign + writer.macro("read_%s" % type, "ptr", "(*((%s_t *)(ptr)))" % type) + writer.macro("write_%s" % type, "ptr, val", "(*((%s_t *)(ptr))) = val" % type) writer.writeln("#ifdef WORDS_BIGENDIAN") - for size in [8, 16, 32, 64]: + for size in [16, 32, 64]: for sign in ["", "u"]: utype = "uint%d" % (size) type = "%sint%d" % (sign, size) swap = "SPICE_BYTESWAP%d" % size - if size == 8: - writer.macro("read_%s" % type, "ptr", "(*((%s_t *)(ptr)))" % type) - writer.macro("write_%s" % type, "ptr, val", "*(%s_t *)(ptr) = val" % (type)) - else: - writer.macro("read_%s" % type, "ptr", "((%s_t)%s(*((%s_t *)(ptr))))" % (type, swap, utype)) - writer.macro("write_%s" % type, "ptr, val", "*(%s_t *)(ptr) = %s((%s_t)val)" % (utype, swap, utype)) + writer.macro("read_%s" % type, "ptr", "((%s_t)%s(*((%s_t *)(ptr))))" % (type, swap, utype)) + writer.macro("write_%s" % type, "ptr, val", "*(%s_t *)(ptr) = %s((%s_t)val)" % (utype, swap, utype)) + writer.writeln("#elif __GNUC__ > 3") + struct = "pkg_struct" + writer.begin_block("typedef union __attribute__ ((__packed__))") + for size in [16, 32, 64]: + for sign in ["", "u"]: + type = "%sint%d" % (sign, size) + writer.variable_def("%s_t" % type, type) + writer.unindent() + writer.writeln("} %s;" % struct) + for size in [16, 32, 64]: + for sign in ["", "u"]: + type = "%sint%d" % (sign, size) + writer.macro("read_%s" % type, "ptr", "(((%s *)(ptr))->%s)" % (struct, type)) + writer.macro("write_%s" % type, "ptr, val", "((%s *)(ptr))->%s = val" % (struct, type)) writer.writeln("#else") - for size in [8, 16, 32, 64]: + for size in [16, 32, 64]: for sign in ["", "u"]: type = "%sint%d" % (sign, size) writer.macro("read_%s" % type, "ptr", "(*((%s_t *)(ptr)))" % type) -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel