// Author: Wim Lavrijsen, May 2004
// Bindings
#include "PyROOT.h"
#include "ObjectHolder.h"
#include "Utility.h"
#include "TPyReturn.h"
// ROOT
#include "TClass.h"
#include "TObject.h"
#include "TInterpreter.h"
// Standard
#include <stdexcept>
//______________________________________________________________________________
// Python expression eval result
// =============================
//
// Transport class for bringing objects from python (dynamically typed) to CINT
// (statically typed). Upon cast to another value, either implicitly (builtin
// types) or explicitly (pointers to ROOT objects), the TPyReturn object goes
// out of existence. For this reason, it can not be copied and it should not
// be held by reference.
//- data ---------------------------------------------------------------------
ClassImp(TPyReturn)
//- private helpers ----------------------------------------------------------
void TPyReturn::autoDestruct() const {
// Private harakiri method.
if ( gInterpreter != 0 )
gInterpreter->DeleteGlobal( (void*) this );
delete this;
}
//- constructors/destructor --------------------------------------------------
TPyReturn::TPyReturn() : m_class( 0 ) {
// Construct a TPyReturn object from Py_None.
Py_INCREF( Py_None );
m_object = Py_None;
}
TPyReturn::TPyReturn( PyObject* obj, TClass* cls ) :
m_object( obj ), m_class( cls ) {
// Construct a TPyReturn from a python object. If the python object holds on to
// a ROOT object, the TClass should be given. Reference counting for the python
// object is in effect.
}
TPyReturn::TPyReturn( const TPyReturn& s ) : TObject( s ) {
// Private copy constructor; throws if called.
throw std::runtime_error( "TPyReturn objects may not be copied!" );
}
TPyReturn& TPyReturn::operator=( const TPyReturn& ) {
// Private assignment operator; throws if called.
throw std::runtime_error( "TPyReturn objects may not be assigned to!" );
return *this;
}
TPyReturn::~TPyReturn() {
// Destructor. Reference counting for the held python object is in effect.
Py_XDECREF( m_object );
}
//- public members -----------------------------------------------------------
TClass* TPyReturn::IsA() const {
// Return the held object TClass (not the TPyReturn TClass).
return m_class;
}
TPyReturn::operator const char*() const {
const char* s = PyString_AsString( m_object );
autoDestruct();
if ( PyErr_Occurred() ) {
PyErr_Print();
return "";
}
return s;
}
TPyReturn::operator long() const {
long l = PyLong_AsLong( m_object );
autoDestruct();
if ( PyErr_Occurred() )
PyErr_Print();
return l;
}
TPyReturn::operator int() const {
return (int) operator long();
}
TPyReturn::operator double() const {
double d = PyFloat_AsDouble( m_object );
autoDestruct();
if ( PyErr_Occurred() )
PyErr_Print();
return d;
}
TPyReturn::operator float() const {
return (float) operator double();
}
TPyReturn::operator TObject*() const {
return (TObject*) this;
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.