Param: Fix proxy traversal to support chained proxies
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 15 Oct 2012 12:07:06 +0000 (08:07 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 15 Oct 2012 12:07:06 +0000 (08:07 -0400)
This patch modifies how proxies are traversed and unproxied to allow
chained proxies. The issue that is solved manifested itself when a
proxy during its evaluation ended up being hitting another proxy, and
the second one got evaluated using the object that was originally used
for the first proxy.

For a more tangible example, see the following patch on making the
default clock being inherited from the parent. In this patch, the CPU
clock is a proxy Parent.clock, which is overridden in the system to be
an actual value. This all works fine, but the AlphaLinuxSystem has a
boot_cpu_frequency parameter that is Self.cpu[0].clock.frequency. When
the latter is evaluated, it all happens relative to the current object
of the proxy, i.e. the system. Thus the cpu.clock is evaluated as
Parent.clock, but using the system rather than the cpu as the object
to enquire.

src/python/m5/proxy.py

index 8c1a46909cb6dc9141a71896bd0de02b5f474625..4582b8f091c6e48a523edf34e48a8136c374604a 100644 (file)
@@ -151,6 +151,10 @@ 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
         except:
             return None, False
         while isproxy(val):