config: Fix handling of parents for simobject vectors
authorGeoffrey Blake <geoffrey.blake@arm.com>
Thu, 31 Oct 2013 18:41:13 +0000 (13:41 -0500)
committerGeoffrey Blake <geoffrey.blake@arm.com>
Thu, 31 Oct 2013 18:41:13 +0000 (13:41 -0500)
SimObjectVector objects did not provide the same interface to
the _parent attribute through get_parent() like a normal
SimObject.  It also handled assigning a _parent incorrectly
if objects in a SimObjectVector were changed post-creation,
leading to errors later when the simulator tried to execute.
This patch fixes these two omissions.

src/python/m5/SimObject.py
src/python/m5/params.py

index 8aa7260e76b9bdc3453b1c62e7c2d3e37b742c53..14499759ca82520820d3b5a71a82c81d1ae38ed5 100644 (file)
@@ -784,6 +784,11 @@ class SimObject(object):
         self._parent = parent
         self._name = name
 
+    # Return parent object of this SimObject, not implemented by SimObjectVector
+    # because the elements in a SimObjectVector may not share the same parent
+    def get_parent(self):
+        return self._parent
+
     # Also implemented by SimObjectVector
     def get_name(self):
         return self._name
index 981bb0d37a9486a647546f705c833dea1f9af495..ff645bb37603a8d3cc7b2f62619b49a3b5e682de 100644 (file)
@@ -247,6 +247,19 @@ class SimObjectVector(VectorParamValue):
             a.append(v.get_config_as_dict())
         return a
 
+    # If we are replacing an item in the vector, make sure to set the
+    # parent reference of the new SimObject to be the same as the parent
+    # of the SimObject being replaced. Useful to have if we created
+    # a SimObjectVector of temporary objects that will be modified later in
+    # configuration scripts.
+    def __setitem__(self, key, value):
+        val = self[key]
+        if value.has_parent():
+            warn("SimObject %s already has a parent" % value.get_name() +\
+                 " that is being overwritten by a SimObjectVector")
+        value.set_parent(val.get_parent(), val._name)
+        super(SimObjectVector, self).__setitem__(key, value)
+
 class VectorParamDesc(ParamDesc):
     # Convert assigned value to appropriate type.  If the RHS is not a
     # list or tuple, it generates a single-element list.