diff options
author | Alexander Wauck <awauck@codeweavers.com> | 2015-03-31 12:44:09 -0500 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2015-04-01 13:39:03 +0200 |
commit | e919337980c45fb4bc907cf40cdd106fb8f32d92 (patch) | |
tree | 066ce443b361eff8533f717c5c0b134187c08321 /python_modules/ptypes.py | |
parent | 77ce36426f26cd3dcf8bb06a0511f365c74003dc (diff) | |
download | spice-protocol-e919337980c45fb4bc907cf40cdd106fb8f32d92.tar.gz spice-protocol-e919337980c45fb4bc907cf40cdd106fb8f32d92.tar.xz spice-protocol-e919337980c45fb4bc907cf40cdd106fb8f32d92.zip |
Make spice_codegen.py work on both Python 2 and 3
This is a new version of my previous patch that does not include six.py.
It's still kind of big, but at least it's all spice-common changes now.
There are also a few other fixes that Christophe brought to my attention.
Note that six now needs to be installed on the system (python-six on
Fedora and Debian, six on PyPI).
This *should* be enough to make spice_codegen.py work on both Python 2
and Python 3. The major changes are as follows:
* cStringIO.StringIO -> io.StringIO
* str vs. unicode updates (io.StringIO doesn't like str)
* integer division
* foo.has_key(bar) -> bar in foo
* import internal_thing -> from . import internal_thing
* removed from __future__ import with_statement
(might break Python 2.5?)
* changed some lambdas to list comprehensions (done by 2to3)
* cast some_dict.keys() to list where needed (e.g. for sorting)
* use normal type names with isinstance instead of types.WhateverType
Signed-off-by: Alexander Wauck <awauck@codeweavers.com>
Diffstat (limited to 'python_modules/ptypes.py')
-rw-r--r-- | python_modules/ptypes.py | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py index 2bfbf0d..d031d09 100644 --- a/python_modules/ptypes.py +++ b/python_modules/ptypes.py @@ -1,4 +1,4 @@ -import codegen +from . import codegen import types _types_by_name = {} @@ -7,7 +7,7 @@ _types = [] default_pointer_size = 4 def type_exists(name): - return _types_by_name.has_key(name) + return name in _types_by_name def lookup_type(name): return _types_by_name[name] @@ -24,7 +24,7 @@ class FixedSize: self.vals[minor] = val def __add__(self, other): - if isinstance(other, types.IntType): + if isinstance(other, int): other = FixedSize(other) new = FixedSize() @@ -125,13 +125,13 @@ class Type: if self.registred or self.name == None: return self.registred = True - if _types_by_name.has_key(self.name): - raise Exception, "Type %s already defined" % self.name + if self.name in _types_by_name: + raise Exception("Type %s already defined" % self.name) _types.append(self) _types_by_name[self.name] = self def has_attr(self, name): - return self.attributes.has_key(name) + return name in self.attributes class TypeRef(Type): def __init__(self, name): @@ -142,8 +142,8 @@ class TypeRef(Type): return "ref to %s" % (self.name) def resolve(self): - if not _types_by_name.has_key(self.name): - raise Exception, "Unknown type %s" % self.name + if self.name not in _types_by_name: + raise Exception("Unknown type %s" % self.name) return _types_by_name[self.name] def register(self): @@ -168,7 +168,7 @@ class IntegerType(Type): return self.name + "_t" def get_fixed_nw_size(self): - return self.bits / 8 + return self.bits // 8 def is_primitive(self): return True @@ -245,14 +245,14 @@ class EnumBaseType(Type): return True def get_fixed_nw_size(self): - return self.bits / 8 + return self.bits // 8 # generates a value-name table suitable for use with the wireshark protocol # dissector def c_describe(self, writer): writer.write("static const value_string %s_vs[] = " % codegen.prefix_underscore_lower(self.name)) writer.begin_block() - values = self.names.keys() + values = list(self.names.keys()) values.sort() for i in values: writer.write("{ ") @@ -281,7 +281,7 @@ class EnumType(EnumBaseType): value = last + 1 last = value - assert not names.has_key(value) + assert value not in names names[value] = name values[name] = value @@ -298,7 +298,7 @@ class EnumType(EnumBaseType): writer.write("typedef enum ") writer.write(self.c_name()) writer.begin_block() - values = self.names.keys() + values = list(self.names.keys()) values.sort() current_default = 0 for i in values: @@ -335,7 +335,7 @@ class FlagsType(EnumBaseType): value = last + 1 last = value - assert not names.has_key(value) + assert value not in names names[value] = name values[name] = value @@ -352,7 +352,7 @@ class FlagsType(EnumBaseType): writer.write("typedef enum ") writer.write(self.c_name()) writer.begin_block() - values = self.names.keys() + values = list(self.names.keys()) values.sort() mask = 0 for i in values: @@ -392,26 +392,26 @@ class ArrayType(Type): return self def is_constant_length(self): - return isinstance(self.size, types.IntType) + return isinstance(self.size, int) def is_remaining_length(self): - return isinstance(self.size, types.StringType) and len(self.size) == 0 + return isinstance(self.size, str) and len(self.size) == 0 def is_identifier_length(self): - return isinstance(self.size, types.StringType) and len(self.size) > 0 + return isinstance(self.size, str) and len(self.size) > 0 def is_image_size_length(self): - if isinstance(self.size, types.IntType) or isinstance(self.size, types.StringType): + if isinstance(self.size, int) or isinstance(self.size, str): return False return self.size[0] == "image_size" def is_bytes_length(self): - if isinstance(self.size, types.IntType) or isinstance(self.size, types.StringType): + if isinstance(self.size, int) or isinstance(self.size, str): return False return self.size[0] == "bytes" def is_cstring_length(self): - if isinstance(self.size, types.IntType) or isinstance(self.size, types.StringType): + if isinstance(self.size, int) or isinstance(self.size, str): return False return self.size[0] == "cstring" @@ -423,7 +423,7 @@ class ArrayType(Type): def get_fixed_nw_size(self): if not self.is_fixed_nw_size(): - raise Exception, "Not a fixed size type" + raise Exception("Not a fixed size type") return self.element_type.get_fixed_nw_size() * self.size @@ -433,13 +433,13 @@ class ArrayType(Type): return 0 if self.is_constant_length(self): return element_count * self.size - raise Exception, "Pointers in dynamic arrays not supported" + raise Exception("Pointers in dynamic arrays not supported") def get_pointer_names(self, marshalled): element_count = self.element_type.get_num_pointers() if element_count == 0: return [] - raise Exception, "Pointer names in arrays not supported" + raise Exception("Pointer names in arrays not supported") def is_extra_size(self): return self.has_attr("ptr_array") @@ -517,7 +517,7 @@ class Containee: return not self.is_switch() and self.member_type.is_primitive() def has_attr(self, name): - return self.attributes.has_key(name) + return name in self.attributes def has_minor_attr(self): return self.has_attr("minor") @@ -599,7 +599,7 @@ class Member(Containee): names = self.member_type.get_pointer_names(marshalled) if self.has_attr("outvar"): prefix = self.attributes["outvar"][0] - names = map(lambda name: prefix + "_" + name, names) + names = [prefix + "_" + name for name in names] return names class SwitchCase: @@ -656,7 +656,7 @@ class Switch(Containee): def resolve(self, container): self.container = container - self.cases = map(lambda c : c.resolve(self), self.cases) + self.cases = [c.resolve(self) for c in self.cases] return self def __repr__(self): @@ -703,7 +703,7 @@ class Switch(Containee): def get_fixed_nw_size(self): if not self.is_fixed_nw_size(): - raise Exception, "Not a fixed size type" + raise Exception("Not a fixed size type") size = 0 for c in self.cases: size = max(size, c.member.get_fixed_nw_size()) @@ -774,7 +774,7 @@ class ContainerType(Type): return size def resolve(self): - self.members = map(lambda m : m.resolve(self), self.members) + self.members = [m.resolve(self) for m in self.members] return self def get_num_pointers(self): @@ -819,7 +819,7 @@ class ContainerType(Type): name = name[:dot] member = None - if self.members_by_name.has_key(name): + if name in self.members_by_name: member = self.members_by_name[name] else: for m in self.members: @@ -831,7 +831,7 @@ class ContainerType(Type): break if member == None: - raise Exception, "No member called %s found" % name + raise Exception("No member called %s found" % name) if rest != None: return member.member_type.lookup_member(rest) @@ -880,7 +880,7 @@ class MessageType(ContainerType): def c_name(self): if self.name == None: - cms = self.reverse_members.keys() + cms = list(self.reverse_members.keys()) if len(cms) != 1: raise "Unknown typename for message" cm = cms[0] @@ -900,7 +900,7 @@ class MessageType(ContainerType): if self.has_attr("ctype"): return self.attributes["ctype"][0] if self.name == None: - cms = self.reverse_members.keys() + cms = list(self.reverse_members.keys()) if len(cms) != 1: raise "Unknown typename for message" cm = cms[0] |