summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/python/m5/SimObject.py6
-rw-r--r--src/python/m5/proxy.py22
2 files changed, 23 insertions, 5 deletions
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index 30c968380..3784c716e 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -861,7 +861,11 @@ class SimObject(object):
found_obj = None
for child in self._children.itervalues():
- if isinstance(child, ptype):
+ visited = False
+ if hasattr(child, '_visited'):
+ visited = getattr(child, '_visited')
+
+ if isinstance(child, ptype) and not visited:
if found_obj != None and child != found_obj:
raise AttributeError, \
'parent.any matched more than one: %s %s' % \
diff --git a/src/python/m5/proxy.py b/src/python/m5/proxy.py
index 4582b8f09..a99d3715c 100644
--- a/src/python/m5/proxy.py
+++ b/src/python/m5/proxy.py
@@ -82,12 +82,19 @@ class BaseProxy(object):
result, done = self.find(obj)
if self._search_up:
+ # Search up the tree but mark ourself
+ # as visited to avoid a self-reference
+ self._visited = True
+ obj._visited = True
while not done:
obj = obj._parent
if not obj:
break
result, done = self.find(obj)
+ self._visited = False
+ base._visited = False
+
if not done:
raise AttributeError, \
"Can't resolve proxy '%s' of type '%s' from '%s'" % \
@@ -151,10 +158,17 @@ class AttrProxy(BaseProxy):
def find(self, obj):
try:
val = getattr(obj, self._attr)
- # for any additional unproxying to be done, pass the
- # current, rather than the original object so that proxy
- # has the right context
- obj = val
+ visited = False
+ if hasattr(val, '_visited'):
+ visited = getattr(val, '_visited')
+
+ if not visited:
+ # for any additional unproxying to be done, pass the
+ # current, rather than the original object so that proxy
+ # has the right context
+ obj = val
+ else:
+ return None, False
except:
return None, False
while isproxy(val):