Serialization: Fix unserialization of object pointers
authorAli Saidi <saidi@eecs.umich.edu>
Tue, 4 Sep 2007 17:12:58 +0000 (13:12 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Tue, 4 Sep 2007 17:12:58 +0000 (13:12 -0400)
--HG--
extra : convert_revision : a5aed880b2fc05841067e8597a58a9484e30b84a

src/python/swig/pyobject.cc

index fad280e1b3f518cbab846105b588fd4389394827..c682b0fd7be266c1a0e474051b08d69c1a0a5db1 100644 (file)
@@ -141,11 +141,6 @@ inifile()
     return inifile;
 }
 
-/**
- * Pointer to the Python function that maps names to SimObjects.
- */
-PyObject *resolveFunc = NULL;
-
 /**
  * Convert a pointer to the Python object that SWIG wraps around a C++
  * SimObject pointer back to the actual C++ pointer.  See main.i.
@@ -155,16 +150,29 @@ extern "C" SimObject *convertSwigSimObjectPtr(PyObject *);
 SimObject *
 resolveSimObject(const string &name)
 {
-    PyObject *pyPtr = PyEval_CallFunction(resolveFunc, "(s)", name.c_str());
-    if (pyPtr == NULL) {
+    PyObject *module = PyImport_ImportModule("m5.SimObject");
+    if (module == NULL)
+        panic("Could not import m5.SimObject");
+
+    PyObject *resolver = PyObject_GetAttrString(module, "resolveSimObject");
+    if (resolver == NULL) {
+        PyErr_Print();
+        panic("resolveSimObject: failed to find resolveSimObject");
+    }
+
+    PyObject *ptr = PyObject_CallFunction(resolver, "(s)", name.c_str());
+    if (ptr == NULL) {
         PyErr_Print();
         panic("resolveSimObject: failure on call to Python for %s", name);
     }
 
-    SimObject *simObj = convertSwigSimObjectPtr(pyPtr);
-    if (simObj == NULL)
+    SimObject *obj = convertSwigSimObjectPtr(ptr);
+    if (obj == NULL)
         panic("resolveSimObject: failure on pointer conversion for %s", name);
 
-    return simObj;
-}
+    Py_DECREF(module);
+    Py_DECREF(resolver);
+    Py_DECREF(ptr);
 
+    return obj;
+}