summaryrefslogtreecommitdiffstats
path: root/python_modules
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-07-06 22:12:26 +0200
committerAlexander Larsson <alexl@redhat.com>2010-07-07 23:12:42 +0200
commit96bb4d31f417f26284c32a1f56469a2b2dfc3349 (patch)
tree36ac5ed6faefa92c28a3d6779435d0b0b7cae728 /python_modules
parentee26a9a77372b92ee615ae783676cb0ed7172ecd (diff)
downloadspice-96bb4d31f417f26284c32a1f56469a2b2dfc3349.tar.gz
spice-96bb4d31f417f26284c32a1f56469a2b2dfc3349.tar.xz
spice-96bb4d31f417f26284c32a1f56469a2b2dfc3349.zip
marshaller: Make get_nw_offset() handle deep member references
Diffstat (limited to 'python_modules')
-rw-r--r--python_modules/ptypes.py39
1 files changed, 32 insertions, 7 deletions
diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
index 31ae79d7..f02437ab 100644
--- a/python_modules/ptypes.py
+++ b/python_modules/ptypes.py
@@ -92,6 +92,9 @@ class Type:
def is_array(self):
return isinstance(self, ArrayType)
+ def contains_member(self, member):
+ return False
+
def is_struct(self):
return isinstance(self, StructType)
@@ -527,6 +530,9 @@ class Member(Containee):
self.member_type.attributes[i] = self.attributes[i]
return self
+ def contains_member(self, member):
+ return self.member_type.contains_member(member)
+
def is_primitive(self):
return self.member_type.is_primitive()
@@ -694,6 +700,9 @@ class Switch(Containee):
return "sizeof(((%s *)NULL)->%s)" % (self.container.c_type(),
self.name)
+ def contains_member(self, member):
+ return False # TODO: Don't support switch deep member lookup yet
+
def has_pointer(self):
for c in self.cases:
if c.has_pointer():
@@ -739,11 +748,20 @@ class ContainerType(Type):
size = size + i.get_fixed_nw_size()
return size
+ def contains_member(self, member):
+ for m in self.members:
+ if m == member or m.contains_member(member):
+ return True
+ return False
+
def get_fixed_nw_offset(self, member):
size = 0
for i in self.members:
if i == member:
break
+ if i.contains_member(member):
+ size = size + i.member_type.get_fixed_nw_offset(member)
+ break
if i.is_fixed_nw_size():
size = size + i.get_fixed_nw_size()
return size
@@ -773,13 +791,20 @@ class ContainerType(Type):
def get_nw_offset(self, member, prefix = "", postfix = ""):
fixed = self.get_fixed_nw_offset(member)
v = []
- for m in self.members:
- if m == member:
- break
- if m.is_switch() and m.has_switch_member(member):
- break
- if not m.is_fixed_nw_size():
- v.append(prefix + m.name + postfix)
+ container = self
+ while container != None:
+ members = container.members
+ container = None
+ for m in members:
+ if m == member:
+ break
+ if m.contains_member(member):
+ container = m.member_type
+ break
+ if m.is_switch() and m.has_switch_member(member):
+ break
+ if not m.is_fixed_nw_size():
+ v.append(prefix + m.name + postfix)
if len(v) > 0:
return str(fixed) + " + " + (" + ".join(v))
else: