#include <Python.h>
 
 #include "python/swig/pyevent.hh"
+#include "sim/async.hh"
 
 PythonEvent::PythonEvent(PyObject *obj, Tick when, Priority priority)
     : Event(&mainEventQueue, priority), object(obj)
 void
 PythonEvent::process()
 {
-    PyObject *result;
-
-    result = PyObject_CallMethod(object, "process", "");
+    PyObject *args = PyTuple_New(0);
+    PyObject *result = PyObject_Call(object, args, NULL);
+    Py_DECREF(args);
 
     if (result) {
         // Nothing to do just decrement the reference count
     } else {
         // Somethign should be done to signal back to the main interpreter
         // that there's been an exception.
+        async_event = true;
+        async_exception = true;
     }
 }
 
 extern volatile bool async_exit;       ///< Async request to exit simulator.
 extern volatile bool async_io;         ///< Async I/O request (SIGIO).
 extern volatile bool async_alarm;      ///< Async alarm event (SIGALRM).
+extern volatile bool async_exception;   ///< Python exception.
 //@}
 
 #endif // __ASYNC_HH__
 
 volatile bool async_exit = false;
 volatile bool async_io = false;
 volatile bool async_alarm = false;
+volatile bool async_exception = false;
 
 /// Stats signal handler.
 void
                 async_alarm = false;
                 pollQueue.service();
             }
+
+            if (async_exception) {
+                async_exception = false;
+                return NULL;
+            }
         }
     }