Salome HOME
MacroNodes and omniORB4 porting and state of nodes when an other node has aborted
[modules/superv.git] / src / GraphExecutor / DataFlowExecutor_PyDynInvoke.cxx
index 9df177be3ba08565dd7f8782f2e39309768ed3ab..2c33cd87edd8040e6b2a1ee33cc2bd6c6fe4218a 100644 (file)
@@ -15,9 +15,13 @@ using namespace std;
 #include <map>
 
 #include "DataFlowExecutor_InNode.hxx"
+#include "DataFlowExecutor_OutNode.hxx"
 
 using namespace CORBA ;
 
+extern GraphExecutor::FiniteStateMachine * theAutomaton ;
+
+//static PyObject * MyPyObjSignal = NULL ;
 static PyObject * MyPyObjRef = NULL ;
 static PyObject * MyPyObjIor = NULL ;
 static PyObject * MyPyRunMethod = NULL ;
@@ -29,101 +33,180 @@ static PyMethodDef MethodPyRunMethod[] = {
 
 bool GraphExecutor::InNode::InitPython() {
   cdebug_in << "InitPython" << endl ;
-
+  
+  Automaton()->PyLock() ;
 //  PyObject * Module = Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod ) ;
-  Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod ) ;
+  if ( !Automaton()->PyInitModule() ) {
+    Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod ) ;
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
+    //_OutNode->SuperVisionContainer()->ActivatePythonExecution( "InitPyRunMethod" , MethodPyRunMethod ) ;
+  }
 //  PyObject * Dictionnary = PyModule_GetDict( Module ) ;
 //  InitPyDynInvokeError = PyErr_NewException( "InitPyDynInvokeError" , NULL , NULL ) ;
 //  PyDict_SetItemString( Dictionnary , InitPyDynInvokeError ) ;
   cdebug << ThreadNo() << "Py_Initialized() " << endl ;
 
-  string aPyFunc ;
-//  aPyFunc = "print 'InitPyRunMethod'\n" ;
-  aPyFunc = "import InitPyRunMethod\n" ;
-//  aPyFunc += "print 'sys'\n" ;
-  aPyFunc += "import sys\n" ;
-//  aPyFunc += "print 'CORBA'\n" ;
-  aPyFunc += "import CORBA\n" ;
-//  aPyFunc += "print 'omniORB'\n" ;
-  aPyFunc += "import omniORB\n" ;
-//  aPyFunc += "print 'PyObjRef'\n" ;
-  aPyFunc += "def PyObjRef( IORObjStr ) :\n" ;
-//  aPyFunc += "    print 'PyObjRef',IORObjStr\n" ;
-  aPyFunc += "    orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ;
-//  aPyFunc += "    print 'PyObjRef orb',orb\n" ;
-  aPyFunc += "    objref = orb.string_to_object( IORObjStr )\n" ;
-//  aPyFunc += "    print 'PyObjRef IORObjStr objref',IORObjStr,objref\n" ;
-  aPyFunc += "    return objref\n" ;
-  aPyFunc += "InitPyRunMethod.RunMethod( PyObjRef )\n" ;
-  if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
-    cdebug << ThreadNo() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
-    return false ;
+#if 0
+//JR : Python documentation says that there is no sense to set a handler of synchronous
+// signals as SIGSEGV and SIGFPE !!!
+  if ( Automaton()->PyFunction( "PyObjSignal" ) == NULL ) {
+    string aPyFunc ;
+    aPyFunc = "import signal\n" ;
+    aPyFunc += "import InitPyRunMethod\n" ;
+    aPyFunc += "import sys\n" ;
+    aPyFunc += "import CORBA\n" ;
+    aPyFunc += "import omniORB\n" ;
+    aPyFunc += "def PySignalHandler( aSignal , aStackFrame ) :\n" ;
+    aPyFunc += "    print 'PySignalHandler(aSignal =',aSignal,',aStackFrame= ',aStackFrame,')'\n" ;
+    aPyFunc += "InitPyRunMethod.RunMethod( PySignalHandler )\n" ;
+    aPyFunc += "PrevHandler = signal.signal( signal.SIGSEGV , PySignalHandler )\n" ;
+    aPyFunc += "print 'PyObjSignal PrevHandler of SIGSEGV :', PrevHandler\n" ;
+    aPyFunc += "print 'PyObjSignal actual handler of SIGSEGV :', signal.getsignal( signal.SIGSEGV  )\n" ;
+//    if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
+    if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
+      cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
+      Automaton()->PyUnLock() ;
+      return false ;
+    }
+    MyPyObjSignal = MyPyRunMethod ;
+    Automaton()->PyFunction( "PyObjSignal" , MyPyObjSignal ) ;
   }
-  MyPyObjRef = MyPyRunMethod ;
-
-  aPyFunc = "import InitPyRunMethod\n" ;
-  aPyFunc += "import sys\n" ;
-  aPyFunc += "import CORBA\n" ;
-  aPyFunc += "import omniORB\n" ;
-  aPyFunc += "def PyObjIor( ObjRef ) :\n" ;
-//  aPyFunc += "    print 'PyObjIor',ObjRef\n" ;
-  aPyFunc += "    orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ;
-//  aPyFunc += "    print 'PyObjIor orb',orb\n" ;
-  aPyFunc += "    objIor = orb.object_to_string( ObjRef )\n" ;
-//  aPyFunc += "    print 'PyObjIor ObjRef objIor',ObjRef,objIor\n" ;
-  aPyFunc += "    return objIor\n" ;
-  aPyFunc += "InitPyRunMethod.RunMethod( PyObjIor )\n" ;
-  if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
-    cdebug << ThreadNo() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
-    return false ;
+  else {
+    MyPyObjSignal = Automaton()->PyFunction( "PyObjSignal" ) ;
+  }
+#endif
+
+// PyObjRef convert an IOR (string) to an Python ObjectReference
+  if ( Automaton()->PyFunction( "PyObjRef" ) == NULL ) {
+    string aPyFunc ;
+    aPyFunc = "import InitPyRunMethod\n" ;
+    aPyFunc += "import sys\n" ;
+    aPyFunc += "import CORBA\n" ;
+    aPyFunc += "import omniORB\n" ;
+    aPyFunc += "def PyObjRef( IORObjStr ) :\n" ;
+    aPyFunc += "    orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ;
+    aPyFunc += "    objref = orb.string_to_object( IORObjStr )\n" ;
+    aPyFunc += "    return objref\n" ;
+    aPyFunc += "InitPyRunMethod.RunMethod( PyObjRef )\n" ;
+    if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
+    //if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
+      cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
+      Automaton()->PyUnLock() ;
+      return false ;
+    }
+    MyPyObjRef = MyPyRunMethod ;
+    Automaton()->PyFunction( "PyObjRef" , MyPyObjRef ) ;
+  }
+  else {
+    MyPyObjRef = Automaton()->PyFunction( "PyObjRef" ) ;
   }
-  MyPyObjIor = MyPyRunMethod ;
+
+// PyObjRef convert an Python ObjectReference to an IOR (string)
+  if ( Automaton()->PyFunction( "PyObjIor" ) == NULL ) {
+    string aPyFunc ;
+    aPyFunc = "import InitPyRunMethod\n" ;
+    aPyFunc += "import sys\n" ;
+    aPyFunc += "import CORBA\n" ;
+    aPyFunc += "import omniORB\n" ;
+    aPyFunc += "def PyObjIor( ObjRef ) :\n" ;
+    aPyFunc += "    orb = CORBA.ORB_init( sys.argv , CORBA.ORB_ID )\n" ;
+    aPyFunc += "    objIor = orb.object_to_string( ObjRef )\n" ;
+    aPyFunc += "    return objIor\n" ;
+    aPyFunc += "InitPyRunMethod.RunMethod( PyObjIor )\n" ;
+    if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL
+    //if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
+      cdebug << ThreadNo() << " " << Name() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
+      Automaton()->PyUnLock() ;
+      return false ;
+    }
+    MyPyObjIor = MyPyRunMethod ;
+    Automaton()->PyFunction( "PyObjIor" , MyPyObjIor ) ;
+  }
+  else {
+    MyPyObjIor = Automaton()->PyFunction( "PyObjIor" ) ;
+  }
+  Automaton()->PyUnLock() ;
 
   cdebug_out << "InitPython" << endl ;
+  
   return true ;
 }
 
-PyObject * GraphExecutor::InNode::InitPyDynInvoke(
-                                  char * PyFuncName ,
-                                  const SUPERV::ListOfStrings * aPythonFunction ) {
+void GraphExecutor::InNode::RemovePyDynInvoke( char * PyFuncName ) {
+//  Automaton()->PyLock() ; // Already done ...
+  if ( Automaton()->ErasePyFunction( PyFuncName ) ) {
+    cdebug << "InNode::RemovePyDynInvoke( " << PyFuncName << " ) success" << endl ;
+  }
+  else {
+    cdebug << "InNode::RemovePyDynInvoke( " << PyFuncName << " ) ERROR failed" << endl ;
+  }
+//  Automaton()->PyUnLock() ;
+}
+
+PyObject * GraphExecutor::InNode::InitPyDynInvoke( char * PyFuncName ,
+                                                   const SUPERV::ListOfStrings * aPythonFunction ,
+                                                   bool & Err ) {
   bool RetVal = true ;
+  Err = false ;
   string aPyFunc ;
+  PyObject * thePyRunMethod = NULL ;
 
-  cdebug_in << "InitPyDynInvoke '" << PyFuncName << "' length "
-            << (*aPythonFunction).length() << endl ;
+  cdebug_in << "InitPyDynInvoke '" << PyFuncName << "' length " << (*aPythonFunction).length() << endl ;
 
-  if ( (*aPythonFunction).length() ) {
-    unsigned int i ;
-    aPyFunc += "import InitPyRunMethod\n" ;
-    for ( i = 0 ; i < (*aPythonFunction).length() ; i++ ) {
-      aPyFunc += (*aPythonFunction)[ i ] ;
-      aPyFunc += "\n" ;
-    }
-    aPyFunc += "InitPyRunMethod.RunMethod( " ;
-    aPyFunc += PyFuncName ;
-    aPyFunc += " )\n" ;
-    cdebug << "InitPyDynInvoke PyRun_SimpleString " << endl << aPyFunc << endl ;
-    if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
-      cdebug << ThreadNo() << " PyRun_SimpleString ERROR " << endl << aPyFunc << endl ;
-      RetVal = false ;
-    }
-    else {
-      PyFuncRunned( true ) ;
-//      _MyPyRunMethod = MyPyRunMethod ; // To mutex
-      cdebug << ThreadNo() << "PyRun_SimpleString( " << (*aPythonFunction)[ 0 ]
-             << " )" << endl ;
+  if ( strlen( PyFuncName ) ) {
+    Automaton()->PyLock() ;
+    thePyRunMethod = Automaton()->PyFunction( PyFuncName ) ;
+    if ( (*aPythonFunction).length() ) {
+      if ( thePyRunMethod == NULL ) {
+       unsigned int i ;
+        aPyFunc += "import InitPyRunMethod\n" ;
+        for ( i = 0 ; i < (*aPythonFunction).length() ; i++ ) {
+          aPyFunc += (*aPythonFunction)[ i ] ;
+          aPyFunc += "\n" ;
+        }
+        aPyFunc += "InitPyRunMethod.RunMethod( " ;
+        aPyFunc += PyFuncName ;
+        aPyFunc += " )\n" ;
+        /*cdebug *///cout<< "InitPyDynInvoke PyRun_SimpleString " << endl << aPyFunc << endl ;
+//        if ( PyRun_SimpleString( (char *) aPyFunc.c_str() ) ) {
+        if ( PyRunSimpleString( (char *) aPyFunc.c_str() ) ) {
+          cdebug << ThreadNo() << " " << Name() << " PyRunSimpleString ERROR " << endl << aPyFunc << endl ;
+         PyFuncRunned( false ) ;
+          RetVal = false ;
+          Err = true ;
+        }
+        else {
+         PyFuncRunned( true ) ;
+          thePyRunMethod = MyPyRunMethod ;
+         
+          Automaton()->PyFunction( PyFuncName , thePyRunMethod ) ;
+          cdebug << ThreadNo() << "PyRunSimpleString( " << (*aPythonFunction)[ 0 ] << " ) " << endl ;
+        }
+      }
+      if ( RetVal ) {
+        Automaton()->PyUnLock() ;
+        cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod " << thePyRunMethod << " "
+                   << thePyRunMethod->ob_refcnt << endl ;
+        return thePyRunMethod ;
+      }
     }
-    cdebug_out << "InitPyDynInvoke" << endl ;
-    if ( RetVal ) {
-      return MyPyRunMethod ;
+    else if ( thePyRunMethod ) {
+      Automaton()->PyUnLock() ;
+      cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod " << thePyRunMethod << " "
+                 << thePyRunMethod->ob_refcnt << endl ;
+      return thePyRunMethod ;
     }
+    Automaton()->PyUnLock() ;
   }
 
+  cdebug_out << "InitPyDynInvoke '" << PyFuncName << "' thePyRunMethod Null Err " << Err << endl ;
+  
   return NULL ;
 }
 
 extern "C" PyObject * PyRunMethod( PyObject * dummy , PyObject * Args ) {
-//  cout << "PyRunMethod -->" << endl ;
   PyObject * Result = NULL ;
   PyObject * Temp = NULL ;
   if ( PyArg_ParseTuple( Args , "O:set_callback" , & Temp ) ) {
@@ -139,24 +222,39 @@ extern "C" PyObject * PyRunMethod( PyObject * dummy , PyObject * Args ) {
     Py_INCREF( Py_None ) ;
     Result = Py_None ;
   }
-//  cout << "<-- PyRunMethod" << endl ;
   return Result ;
 }
 
+#define PyDynInvokeTrace 1
 bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod ,
                                         const char *method , 
-                                        ServicesAnyData * inParams , int nInParams ,
-                                        ServicesAnyData * outParams , int nOutParams ) {
+                                        ServicesAnyData * InParametersList , int nInParams ,
+                                        ServicesAnyData * OutParametersList , int nOutParams ) {
   int i ;
 
   bool RetVal = true ;
 
-  int n_in  = nInParams ;
-  int n_out = nOutParams ;
   const char * sname;
 
-  cdebug_in << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke " << method << " " << n_in
-            << " InArgs " << n_out << " OutArgs" << endl ;
+#if PyDynInvokeTrace
+  cdebug_in << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+            << " method " << method
+            << " InParametersList " << InParametersList
+            << " OutParametersList " << OutParametersList 
+            << " " << nInParams << " InArgs " << nOutParams
+            << " OutArgs MyPyRunMethod " ;
+#endif
+  if ( MyPyRunMethod ) {
+#if PyDynInvokeTrace
+    cdebug << MyPyRunMethod << " " << MyPyRunMethod->ob_refcnt << endl ;
+#endif
+  }
+  else {
+#if PyDynInvokeTrace
+    cdebug << " NULL" << endl ;
+#endif
+    return false ;
+  }
 
   CORBA::Any data ;
 
@@ -169,338 +267,592 @@ bool GraphExecutor::InNode::PyDynInvoke( PyObject * MyPyRunMethod ,
   PyObject * ResultIor = NULL ;
 
   CORBA::Object_ptr ObjRef ;
+
   char * IORObjRef ;
 
-  ArgsList = PyTuple_New( n_in ) ;
-
-  for ( i = 0 ; i < n_in ; i++ ) {
-    data = inParams[i].Value ;
-    sname = inParams[i].Name.c_str() ;
-    switch ( data.type()->kind() ) {
-    case CORBA::tk_string : {
-      char * t ;
-      data >>= t ;
-      ArgValue = Py_BuildValue( "s" , t ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << t << " (string) "
-             << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_boolean : {
-      bool b ;
-      data >>= (CORBA::Any::to_boolean ) b ;
-      ArgValue = Py_BuildValue( "b" , b ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << b
-             << " (boolean) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_char : {
-      unsigned char c ;
-      data >>= (CORBA::Any::to_char ) c ;
-      ArgValue = Py_BuildValue( "c" , c ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << c
-             << " (char) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_short : {
-      short s ;
-      data >>= s ;
-      ArgValue = Py_BuildValue( "h" , s ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << s
-             << " (short) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_long : {
-      long l ;
-      data >>= l ;
-      ArgValue = Py_BuildValue( "l" , l ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
-             << " (long) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_float : {
-      float f ;
-      data >>= f ;
-      ArgValue = Py_BuildValue( "f" , f ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << f
-             << " (float) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_double : {
-      double d ;
-      data >>= d ;
-      ArgValue = Py_BuildValue( "d" , d ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << d
-             << " (double) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-      break ;
-    }
-    case CORBA::tk_objref : {
-      MyPyObjRefList = PyTuple_New( 1 ) ;
-      PyObject * ObjValue ;
-      data >>= ObjRef ;
-      IORObjRef = ObjectToString( ObjRef ) ;
-      ObjValue = Py_BuildValue( "s" , IORObjRef ) ;
-      PyTuple_SetItem( MyPyObjRefList , 0 , ObjValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " " << " Value " << IORObjRef << " (objref) "
-             << MyPyObjRef->ob_refcnt << "/" << MyPyObjRefList->ob_refcnt << endl ;
-      ResultObj = PyEval_CallObject( MyPyObjRef , MyPyObjRefList ) ;
-      cdebug << "ObjValue->ob_refcnt" << ObjValue->ob_refcnt << endl ;
-      ArgValue = Py_BuildValue( "O" , ResultObj ) ;
-      PyTuple_SetItem( ArgsList , i , ArgValue ) ;
-      cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value  (objref) ArgsList->ob_refcnt"
-             << ArgsList->ob_refcnt << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
-      cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ;
-      Py_DECREF( MyPyObjRefList ) ;
-      if ( CORBA::is_nil( ObjRef ) ) {
-        ResultObj = NULL ;
+  if ( !PyCallable_Check( MyPyRunMethod ) ) {
+    Result = NULL ;
+    RetVal = false ;
+  }
+  else {
+    ArgsList = PyTuple_New( nInParams ) ;
+
+    for ( i = 0 ; i < nInParams ; i++ ) {
+      data = InParametersList[i].Value ;
+      sname = InParametersList[i].Name.c_str() ;
+      switch ( data.type()->kind() ) {
+      case CORBA::tk_string : {
+        char * t ;
+        data >>= t ;
+        PyObject * ArgValue = Py_BuildValue( "s" , t ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << t << " (string) "
+               << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_boolean : {
+        bool b ;
+        data >>= (CORBA::Any::to_boolean ) b ;
+        PyObject * ArgValue = Py_BuildValue( "b" , b ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << b
+               << " (boolean) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_char : {
+        unsigned char c ;
+        data >>= (CORBA::Any::to_char ) c ;
+        PyObject * ArgValue = Py_BuildValue( "c" , c ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << c
+               << " (char) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_short : {
+        short s ;
+        data >>= s ;
+        PyObject * ArgValue = Py_BuildValue( "h" , s ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << s
+               << " (short) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_long : {
+        long l ;
+        data >>= l ;
+        PyObject * ArgValue = Py_BuildValue( "l" , l ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
+               << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
+#endif
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << l
+               << " (long) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_float : {
+        float f ;
+        data >>= f ;
+        PyObject * ArgValue = Py_BuildValue( "f" , f ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << f
+               << " (float) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_double : {
+        double d ;
+        data >>= d ;
+        PyObject * ArgValue = Py_BuildValue( "d" , d ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value " << d
+               << " (double) ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
+               << ArgValue->ob_refcnt << endl ;
+#endif
+        break ;
+      }
+      case CORBA::tk_objref : {
+        MyPyObjRefList = PyTuple_New( 1 ) ;
+        PyObject * ObjValue ;
+        data >>= ObjRef ;
+        IORObjRef = ObjectToString( ObjRef ) ;
+        ObjValue = Py_BuildValue( "s" , IORObjRef ) ;
+        PyTuple_SetItem( MyPyObjRefList , 0 , ObjValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " " << " Value " << IORObjRef << " (objref) "
+               << MyPyObjRef->ob_refcnt << "/" << MyPyObjRefList->ob_refcnt << endl ;
+#endif
+//        ResultObj = PyEval_CallObject( MyPyObjRef , MyPyObjRefList ) ;
+        ResultObj = PyEvalCallObject( "PyObjRef" , MyPyObjRef , MyPyObjRefList ) ;
+#if PyDynInvokeTrace
+        cdebug << "ObjValue->ob_refcnt" << ObjValue->ob_refcnt << endl ;
+#endif
+        ArgValue = Py_BuildValue( "O" , ResultObj ) ;
+        PyTuple_SetItem( ArgsList , i , ArgValue ) ;
+#if PyDynInvokeTrace
+        cdebug << "ArgIn" << i << " : " << sname << " " << method << " Value  (objref) ArgsList->ob_refcnt"
+               << ArgsList->ob_refcnt << " ArgValue->ob_refcnt" << ArgValue->ob_refcnt << endl ;
+        cdebug << "MyPyObjRefList->ob_refcnt " << MyPyObjRefList->ob_refcnt-1 << endl ;
+#endif
+        Py_DECREF( MyPyObjRefList ) ;
+        if ( CORBA::is_nil( ObjRef ) ) {
+          ResultObj = NULL ;
+        }
+        else {
+#if PyDynInvokeTrace
+          cdebug << "ResultObj->ob_refcnt " << ResultObj->ob_refcnt-1 << endl ;
+#endif
+          Py_DECREF( ResultObj ) ;
+        }
+        break ;
+      }
+      default : {
+        cdebug << "ArgIn" << i << " : " << sname << " Value " << "(other ERROR)" << endl ;
       }
-      else {
-        cdebug << "ResultObj->ob_refcnt " << ResultObj->ob_refcnt-1 << endl ;
-        Py_DECREF( ResultObj ) ;
       }
-      break ;
-    }
-    default : {
-      cdebug << "ArgIn" << i << " : " << sname << " Value " << "(other ERROR)" << endl ;
-    }
     }
-  }
 
-  if (!PyCallable_Check( MyPyRunMethod )) {
-    RetVal = false;
-    return RetVal;
-  }
-  else {
-    Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
+//    Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
+    Result = PyEvalCallObject( method , MyPyRunMethod , ArgsList ) ;
+
+#if PyDynInvokeTrace
     cdebug << "ArgsList->ob_refcnt" << ArgsList->ob_refcnt << endl ;
-    
+#endif
+
     if ( Result == NULL ) {
-      cdebug_out << "GraphExecutor::InNode::PyDynInvoke " << method << " Error Result == NULL" << endl ;
+      cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " " << method << " Error Result == NULL"
+                 << endl ;
       RetVal = false ;
     }
     else {
-      for ( i = 0 ; i < n_out ; i++ ) {
-       data = outParams[i].Value ;
-       sname = outParams[i].Name.c_str() ;
-       switch ( data.type()->kind() ) {
-       case CORBA::tk_string : {
-         char * t = "" ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( !PyString_Check( ArgValue ) ) {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (string)" << endl ;
-         }
-         else {
-           t = PyString_AsString( ArgValue ) ;
-         }
-         data <<= t ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << t << " (string)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-           << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_boolean : {
-         bool b = false ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( !PyInt_Check( ArgValue ) ) {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (boolean)" << endl ;
-         }
-         else {
-           b = PyInt_AsLong( ArgValue ) ;
-         }
-         data <<= (CORBA::Any::from_boolean ) b ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << b << " (boolean)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-           << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_char : {
-         unsigned char c = 0 ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( !PyInt_Check( ArgValue ) ) {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (char)" << endl ;
-         }
-         else {
-           c = PyInt_AsLong( ArgValue ) ;
-         }
-         data <<= (CORBA::Any::from_char ) c ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << c << " (char)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-           << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_short : {
-         short s = 0 ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( !PyInt_Check( ArgValue ) ) {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (short)" << endl ;
-         }
-         else {
-           s = PyInt_AsLong( ArgValue ) ;
-         }
-         data <<= s ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << s << " (short)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-           << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_long : {
-         long l = 0 ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( PyLong_Check( ArgValue ) ) {
-           l = PyLong_AsLong( ArgValue ) ;
-         }
-         else if ( PyInt_Check( ArgValue ) ) {
-           l = PyInt_AsLong( ArgValue ) ;
-         }
-         else {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (CORBA::tk_long)" << endl ;
-         }
-         data <<= l ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << l << " (long)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-             << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_float : {
-         float f = 0 ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( !PyFloat_Check( ArgValue ) ) {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (float)" << endl ;
-         }
-         else {
-           f = PyFloat_AsDouble( ArgValue ) ;
-         }
-         data <<= f ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << f << " (float)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-           << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_double : {
-         double d = 0 ;
-         if ( PyTuple_Check( Result ) ) {
-           ArgValue = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ArgValue = Result ;
-         }
-         if ( !PyFloat_Check( ArgValue ) ) {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (double)" << endl ;
-         }
-         else {
-           d = PyFloat_AsDouble( ArgValue ) ;
-         }
-         data <<= d ;
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << d << " (double)"
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ArgValue->ob_refcnt"
-           << ArgValue->ob_refcnt << endl ;
-         break ;
-       }
-       case CORBA::tk_objref : {
-         PyObject * ObjIor ;
-         MyPyObjIorList = PyTuple_New( 1 ) ;
-         if ( PyTuple_Check( Result ) ) {
-           ObjIor = PyTuple_GetItem( Result , i ) ;
-         }
-         else {
-           ObjIor = Result ;
-         }
-         cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(object reference) "
-           << " ArgsList->ob_refcnt" << ArgsList->ob_refcnt << " ObjIor->ob_refcnt"
-           << ObjIor->ob_refcnt << endl ;
-         Py_INCREF( ObjIor ) ;
-//        PyObject_Print( ObjIor , stdout , 0 ) ;
-         PyTuple_SetItem( MyPyObjIorList , 0 , ObjIor ) ;
-         ResultIor = PyEval_CallObject( MyPyObjIor , MyPyObjIorList ) ;
-         cdebug << "ObjIor->ob_refcnt " << ObjIor->ob_refcnt-1 << endl ;
-         Py_DECREF( ObjIor ) ;
-         cdebug << "MyPyObjIorList->ob_refcnt " << MyPyObjIorList->ob_refcnt-1 << endl ;
-         Py_DECREF( MyPyObjIorList ) ;
-         cdebug << "MyPyObjIor->ob_refcnt " << MyPyObjIor->ob_refcnt << endl ;
-         if ( ResultIor ) {
-           char * IOR = NULL ;
-           IOR = PyString_AsString( ResultIor ) ;
-           ObjRef = StringToObject( IOR ) ;
-           data <<= ObjRef ;
-           IORObjRef = ObjectToString( ObjRef ) ;
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << IORObjRef << " (objref) "
-             << endl ;
-           if ( CORBA::is_nil( ObjRef ) ) {
-             ResultIor = NULL ;
+      for ( i = 0 ; i < nOutParams ; i++ ) {
+        data = OutParametersList[i].Value ;
+        sname = OutParametersList[i].Name.c_str() ;
+        switch ( data.type()->kind() ) {
+        case CORBA::tk_string : {
+          char * t = "" ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+          if ( !PyString_Check( ArgValue ) ) {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (string)" << endl ;
+            RetVal = false ;
+         }
+          else {
+            t = PyString_AsString( ArgValue ) ;
+         }
+          data <<= t ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << t << " (string)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_boolean : {
+          bool b = false ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+          if ( !PyInt_Check( ArgValue ) ) {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (boolean)" << endl ;
+            RetVal = false ;
+         }
+          else {
+            b = PyInt_AsLong( ArgValue ) ;
+         }
+          data <<= (CORBA::Any::from_boolean ) b ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << b << " (boolean)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_char : {
+          unsigned char c = 0 ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+//JR 04.04.2005 Debug          if ( !PyInt_Check( ArgValue ) ) {
+//Difficult to understand that behavior ... Python char type is a string of length 1 !
+//                                          or type is int ...
+          if ( !PyString_Check( ArgValue ) && !PyInt_Check( ArgValue ) ) {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (char)" << endl ;
+            RetVal = false ;
+         }
+          else {
+            c = PyInt_AsLong( ArgValue ) ;
+         }
+          data <<= (CORBA::Any::from_char ) c ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << c << " (char)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_short : {
+          short s = 0 ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+          if ( !PyInt_Check( ArgValue ) ) {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (short)" << endl ;
+            RetVal = false ;
+         }
+          else {
+            s = PyInt_AsLong( ArgValue ) ;
+         }
+          data <<= s ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << s << " (short)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_long : {
+          long l = 0 ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+          if ( PyLong_Check( ArgValue ) ) {
+            l = PyLong_AsLong( ArgValue ) ;
+         }
+          else if ( PyInt_Check( ArgValue ) ) {
+            l = PyInt_AsLong( ArgValue ) ;
+         }
+          else {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (CORBA::tk_long)" << endl ;
+            RetVal = false ;
+         }
+          data <<= l ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << l << " (long)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_float : {
+          float f = 0 ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+          if ( !PyFloat_Check( ArgValue ) ) {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (float)" << endl ;
+            RetVal = false ;
+         }
+          else {
+            f = PyFloat_AsDouble( ArgValue ) ;
+         }
+          data <<= f ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << f << " (float)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_double : {
+          double d = 0 ;
+          PyObject * ArgValue ;
+          if ( PyTuple_Check( Result ) ) {
+            ArgValue = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ArgValue = Result ;
+         }
+          if ( !PyFloat_Check( ArgValue ) ) {
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " ERROR (double)" << endl ;
+            RetVal = false ;
+         }
+          else {
+            d = PyFloat_AsDouble( ArgValue ) ;
+         }
+          data <<= d ;
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << d << " (double)"
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ArgValue->ob_refcnt"
+                 << ArgValue->ob_refcnt << endl ;
+#endif
+          break ;
+        }
+        case CORBA::tk_objref : {
+          PyObject * ObjIor ;
+          MyPyObjIorList = PyTuple_New( 1 ) ;
+          if ( PyTuple_Check( Result ) ) {
+            ObjIor = PyTuple_GetItem( Result , i ) ;
+         }
+          else {
+            ObjIor = Result ;
+         }
+#if PyDynInvokeTrace
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(object reference) "
+                 << " Result->ob_refcnt" << Result->ob_refcnt << " ObjIor->ob_refcnt"
+                 << ObjIor->ob_refcnt << endl ;
+#endif
+          Py_INCREF( ObjIor ) ;
+//          PyObject_Print( ObjIor , stdout , 0 ) ;
+          PyTuple_SetItem( MyPyObjIorList , 0 , ObjIor ) ;
+//          ResultIor = PyEval_CallObject( MyPyObjIor , MyPyObjIorList ) ;
+          ResultIor = PyEvalCallObject( "PyObjIor" , MyPyObjIor , MyPyObjIorList ) ;
+#if PyDynInvokeTrace
+          cdebug << "ObjIor->ob_refcnt " << ObjIor->ob_refcnt-1 << endl ;
+#endif
+          Py_DECREF( ObjIor ) ;
+#if PyDynInvokeTrace
+          cdebug << "MyPyObjIorList->ob_refcnt " << MyPyObjIorList->ob_refcnt-1 << endl ;
+#endif
+          Py_DECREF( MyPyObjIorList ) ;
+#if PyDynInvokeTrace
+          cdebug << "MyPyObjIor->ob_refcnt " << MyPyObjIor->ob_refcnt << endl ;
+#endif
+          if ( ResultIor ) {
+            char * IOR = NULL ;
+            IOR = PyString_AsString( ResultIor ) ;
+            ObjRef = StringToObject( IOR ) ;
+//JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
+//                               object references ... (It's Ok with OMNIOrb3)
+//                               IOR and ObjRef and IORObjRef are Ok
+//                               BUT data contains a nil reference !!!
+#if !omniORB_4_0_5
+            data <<= ObjRef ;
+#else
+            SUPERV::SuperG_var mySuperVisionComponent ;
+            mySuperVisionComponent = theAutomaton->SuperVisionComponent() ;
+            if ( CORBA::is_nil( mySuperVisionComponent ) ) {
+              Engines::Container_var myContainer ;
+              Engines::Component_var myObjComponent ;
+              _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
+                                                 "SUPERV" ,
+                                                 myContainer , myObjComponent ) ;
+              mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
+              theAutomaton->SuperVisionComponent( mySuperVisionComponent ) ;
+            }
+//JR 24.08.2005 BUG OMNIORB4 ? : That does not run also ==> Comments
+//            CORBA::Object_ptr ObjRef1 ;
+//            ObjRef1 = mySuperVisionComponent->ToObject( ObjRef ) ;
+//            data <<= ObjRef1 ;
+//JR 24.08.2005 BUG OMNIORB4 ? : BUT THAT RUNS WITH THE "IDENTITY METHOD ToObject of SUPERV.idl :
+//                               Object ToObject( in Object anObject ) ;
+//CODE of that method !!! :
+//CORBA::Object_ptr SuperV_Impl::ToObject( CORBA::Object_ptr anObjectRef ) {
+//  beginService( "SuperV_Impl::ToObject" );
+//  CORBA::Object_ptr anObject ;
+//  anObject = CORBA::Object::_duplicate( anObjectRef ) ;
+//  endService( "SuperV_Impl::ToObject" );
+//  return anObject ;
+//}
+//BUT THAT RUNS ONLY IF WE USE Dynamic invocation of CORBA (DynInvoke)
+            ServicesAnyData anInParametersList ;
+            anInParametersList.Name = "anObjRef" ;
+            anInParametersList.Value <<= ObjRef ;
+            DynInvoke( mySuperVisionComponent , "ToObject" ,
+                       &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
+            data = OutParametersList[i].Value ;
+#endif
+            IORObjRef = ObjectToString( ObjRef ) ;
+#if PyDynInvokeTrace
+            cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value IORPy "
+                   << IOR << " IORObjRef " << IORObjRef << " (objref) " << endl ;
+#endif
+            if ( CORBA::is_nil( ObjRef ) ) {
+#if PyDynInvokeTrace
+              cdebug << "ObjRef ERROR(nil reference) ResultIor->ob_refcnt "
+                     << ResultIor->ob_refcnt-1 << endl ;
+#endif
+              ResultIor = NULL ;
+            }
+            else {
+#if PyDynInvokeTrace
+              cdebug << "ObjRef NOT(nil reference)ResultIor->ob_refcnt "
+                     << ResultIor->ob_refcnt-1 << endl ;
+#endif
+              Py_DECREF( ResultIor ) ;
            }
-           else {
-             cdebug << "ResultIor->ob_refcnt " << ResultIor->ob_refcnt-1 << endl ;
-             Py_DECREF( ResultIor ) ;
-           }
-         }
-         else {
-           cdebug_out << "GraphExecutor::InNode::PyDynInvoke Error ResultIor == NULL"
-             << method << " " << endl ;
-           RetVal = false ;
          }
-         break ;
-       }
-         default : {
-           cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(other ERROR)" << endl ;
-         }
-       }
-       outParams[i].Value = data ;
+          else {
+            cdebug_out << "GraphExecutor::InNode::PyDynInvoke Error ResultIor == NULL Node "
+                       << Name() << " method " << method << " " << endl ;
+            RetVal = false ;
+         }
+          break ;
+        }
+        default : {
+          cdebug << "ArgOut" << i << " : " << sname << " " << method << " Value " << "(other ERROR)" << endl ;
+            RetVal = false ;
+        }
+        }
+//JR 05.08.2005 BUG OMNIORB4 ? : that line does run with SALOME_3 (OMNIOrb4) for
+//                               object references ...
+        OutParametersList[i].Value = data ;
+//        if ( data.type()->kind() == CORBA::tk_objref ) {
+//          IORObjRef = ObjectToString( ObjRef ) ;
+//#if PyDynInvokeTrace
+//          cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+//                 << "ArgOut" << i << " : " << sname << " " << method << " ObjRef "
+//                 << IORObjRef << " (objref) " << endl ;
+//          Engines::Component_var theObjComponent ;
+//          theObjComponent = Engines::Component::_narrow( ObjRef ) ;
+//          DynInvoke( theObjComponent , "ping" , NULL , 0 , NULL , 0 ) ;
+//#endif
+//          Engines::Container_var myContainer ;
+//          Engines::Component_var myObjComponent ;
+//          _OutNode->Graph()->StartComponent( ThreadNo() , "SuperVisionContainer" ,
+//                                             "SUPERV" ,
+//                                              myContainer , myObjComponent ) ;
+//          SUPERV::SuperG_var mySuperVisionComponent ;
+//          mySuperVisionComponent = SUPERV::SuperG::_narrow( myObjComponent ) ;
+//          CORBA::Object_ptr ObjRef1 ;
+//          ObjRef1 = mySuperVisionComponent->ToObject( IORObjRef ) ;
+//#if PyDynInvokeTrace
+//          IORObjRef = ObjectToString( ObjRef1 ) ;
+//          cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+//                 << "ArgOut" << i << " : " << sname << " " << method << " ToObject "
+//                 << IORObjRef << " (objref) " << endl ;
+//#endif
+
+//          ServicesAnyData anInParametersList ;
+//          anInParametersList.Name = "anIORObjRef" ;
+//          anInParametersList.Value <<= IORObjRef ;
+//          DynInvoke( mySuperVisionComponent , "ToObject" ,
+//                     &anInParametersList , 1 , &OutParametersList[i] , 1 ) ;
+//#if PyDynInvokeTrace
+//          OutParametersList[i].Value >>= ObjRef1 ;
+//          IORObjRef = ObjectToString( ObjRef1 ) ;
+//          cdebug << ThreadNo() << "GraphExecutor::InNode::PyDynInvoke Node " << Name()
+//                 << "ArgOut" << i << " : " << sname << " " << method
+//                 << " DynInvoke(ToObject) " << IORObjRef << " (objref) " << endl ;
+//#endif
+//        }
       }
-      
-      cdebug << "Result->ob_refcnt" << Result->ob_refcnt-1 << endl ;
+
+#if PyDynInvokeTrace
+      cdebug << "InNode::PyDynInvoke Result->ob_refcnt " << Result->ob_refcnt-1 << endl ;
+#endif
       Py_DECREF( Result ) ;
     }
-    
-    cdebug << "GraphExecutor::InNode::PyDynInvoke ArgsList->ob_refcnt"
-      << ArgsList->ob_refcnt-1 << endl ;
+
+#if PyDynInvokeTrace
+    cdebug << "InNode::PyDynInvoke ArgsList->ob_refcnt " << ArgsList->ob_refcnt-1 << endl ;
+#endif
     Py_DECREF( ArgsList ) ;
-    
-    cdebug_out << "GraphExecutor::InNode::PyDynInvoke " << method << endl ;
-    
-    return RetVal ;
   }
 
+#if 0
+  {
+    int i ;
+    for ( i = 0 ; i < nInParams ; i++ ) { // Without Gates
+      cdebug << "InParametersList[" << i << "] : "
+             << InParametersList[i].Name << " "
+             << AnyValue( InParametersList[i].Value ) << endl ;
+    }
+    for ( i = 0 ; i < nOutParams ; i++ ) { // Without Gates
+      cdebug << "OutParametersList[" << i << "] : "
+             << OutParametersList[i].Name << " "
+             << AnyValue( OutParametersList[i].Value ) << endl ;
+    }
+  }
+#endif
+
+#if PyDynInvokeTrace
+  cdebug_out << "GraphExecutor::InNode::PyDynInvoke Node " << Name() << " method " << method << " " << RetVal
+             << endl ;
+#endif
+
+  return RetVal ;
+
+}
+
+bool GraphExecutor::InNode::PyRunSimpleString( char* thePyString )
+{
+  const bool ErrorValue = true;
+  bool aRet;
+  try {
+#if PyDynInvokeTrace
+    MESSAGE( pthread_self() << "Python method beginning : " << thePyString );
+    cdebug_in << pthread_self() << "Python method beginning : " << thePyString << endl ;
+#endif
+    aRet = PyRun_SimpleString( thePyString );
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
+    //aRet = _OutNode->SuperVisionContainer()->ActivatePythonExecution( thePyString ) ;
+#if PyDynInvokeTrace
+    MESSAGE( pthread_self() << "Python method finished." );
+    cdebug_out << pthread_self() << "Python method finished." << endl ;
+#endif
+  } catch( ... ) {
+    MESSAGE( pthread_self() << "ERROR: Exception caught running Python method." );
+    cdebug_out << pthread_self() << "ERROR: Exception caught running Python method."
+               << endl ;
+    MESSAGE( "       Python was reinitialized.  Previous Python definitions are lost" );
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
+    Py_Finalize();
+    Py_Initialize();
+    Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod );
+    _OutNode->PyInitialized( false );
+    aRet = ErrorValue;
+  }
+  return aRet;
+}
+
+PyObject * GraphExecutor::InNode::PyEvalCallObject( const char *method ,
+                                                    PyObject * MyPyRunMethod ,
+                                                    PyObject * ArgsList ) {
+//  cdebug_in << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
+  PyObject * Result = NULL ;
+  try {
+//    MESSAGE( pthread_self() << "PyEval_CallObject " << Name() << " method beginning : " << method );
+//    cdebug << pthread_self() << "PyEval_CallObject " << Name() << " method beginning : " << method << endl ;
+    Result = PyEval_CallObject( MyPyRunMethod , ArgsList ) ;
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
+    //Result = _OutNode->SuperVisionContainer()->ActivatePythonExecution( MyPyRunMethod , ArgsList ) ;
+//    MESSAGE( pthread_self() << "PyEval_CallObject method finished. Result " << Result );
+//    cdebug << pthread_self() << "PyEval_CallObject method finished. Result " << Result << endl ;
+//    cdebug_out << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
+  } catch( ... ) {
+    MESSAGE( pthread_self() << "ERROR: Exception caught PyEval_CallObject " << Name()
+             << " Python method " << method << ". Result "  << Result );
+    cdebug << pthread_self() << "ERROR: Exception caught PyEval_CallObject " << Name()
+           << " Python method " << method << ". Result " << Result << endl ;
+    MESSAGE( "       Python was reinitialized.  Previous Python definitions are lost Py_IsInitialized " << Py_IsInitialized() );
+//JR ===> fatal error in python : no current thread
+    // asv : 20.01.05 : changes involved with switching to old (HEAD) KERNEL    
+    Py_Finalize();
+    Py_Initialize();
+    Automaton()->PyInitModule( false ) ;
+    Py_InitModule( "InitPyRunMethod" , MethodPyRunMethod );
+    _OutNode->PyInitialized( false );
+
+    if ( Result == NULL ) {
+      Kill() ; // Reset of _ThreadId
+    }
+//    cdebug << "Executor::InNode::PyEvalCallObject ERROR catched " << Name()
+//           << " Py_IsInitialized " << Py_IsInitialized() << endl ;
+  }
+//  cdebug_out << "Executor::InNode::PyEvalCallObject " << Name() << endl ;
+  return Result ;
 }