|
From: <mor...@us...> - 2010-09-08 08:56:50
|
Revision: 3854
http://ecell.svn.sourceforge.net/ecell/?rev=3854&view=rev
Author: moriyoshi
Date: 2010-09-08 08:56:43 +0000 (Wed, 08 Sep 2010)
Log Message:
-----------
* Change Stepper wrapper so any non-predefined property can be assigned to.
* Throw AttributeError instead of RuntimeError when the property access fails.
Modified Paths:
--------------
ecell3/trunk/ecell/pyecell/ecell/_ecs.cpp
Modified: ecell3/trunk/ecell/pyecell/ecell/_ecs.cpp
===================================================================
--- ecell3/trunk/ecell/pyecell/ecell/_ecs.cpp 2010-08-30 11:46:06 UTC (rev 3853)
+++ ecell3/trunk/ecell/pyecell/ecell/_ecs.cpp 2010-09-08 08:56:43 UTC (rev 3854)
@@ -2688,7 +2688,9 @@
return py::object( VariableReferences( self ) );
}
-static Polymorph Entity___getattr__( Entity* self, std::string key )
+template< typename TecsObject_ >
+static Polymorph EcsObject___getattr__( TecsObject_* self, std::string key )
+try
{
if ( key == "__members__" || key == "__methods__" )
{
@@ -2698,26 +2700,39 @@
return self->getProperty( key );
}
+catch ( NoSlot const& anException )
+{
+ PyErr_SetString( PyExc_AttributeError, anException.what() );
+ py::throw_error_already_set();
+ return Polymorph();
+}
-static void Entity___setattr__( py::object aSelf, py::object key, py::object value )
+template< typename TecsObject_ >
+static void EcsObject___setattr__( py::back_reference< TecsObject_* > aSelf, py::object key, py::object value )
+try
{
- py::handle<> aDescr( py::allow_null( PyObject_GetAttr( reinterpret_cast< PyObject* >( aSelf.ptr()->ob_type ), key.ptr() ) ) );
+ py::handle<> aDescr( py::allow_null( PyObject_GetAttr( reinterpret_cast< PyObject* >( aSelf.source().ptr()->ob_type ), key.ptr() ) ) );
if ( !aDescr || !( aDescr->ob_type->tp_flags & Py_TPFLAGS_HAVE_CLASS ) || !aDescr.get()->ob_type->tp_descr_set )
{
PyErr_Clear();
- Entity* self = py::extract< Entity* >( aSelf );
+ EcsObject* self = aSelf.get();
std::string keyStr = py::extract< std::string >( key );
self->setProperty( keyStr, py::extract< Polymorph >( value ) );
}
else
{
- aDescr.get()->ob_type->tp_descr_set( aDescr.get(), aSelf.ptr(), value.ptr() );
+ aDescr.get()->ob_type->tp_descr_set( aDescr.get(), aSelf.source().ptr(), value.ptr() );
if (PyErr_Occurred())
{
py::throw_error_already_set();
}
}
}
+catch ( NoSlot const& anException )
+{
+ PyErr_SetString( PyExc_AttributeError, anException.what() );
+ py::throw_error_already_set();
+}
template< typename T_ >
static PyObject* writeOnly( T_* )
@@ -2926,6 +2941,8 @@
&Stepper::getMinStepInterval,
&Stepper::setMinStepInterval )
.add_property( "RngSeed", &writeOnly<Stepper>, &Stepper::setRngSeed )
+ .def( "__setattr__", &EcsObject___setattr__< Stepper > )
+ .def( "__getattr__", &EcsObject___getattr__< Stepper > )
;
py::class_< Entity, py::bases<>, Entity, boost::noncopyable >
@@ -2937,8 +2954,8 @@
.add_property( "ID", &Entity::getID, &Entity::setID )
.add_property( "FullID", &Entity::getFullID )
.add_property( "Name", &Entity::getName )
- .def( "__setattr__", &Entity___setattr__ )
- .def( "__getattr__", &Entity___getattr__ )
+ .def( "__setattr__", &EcsObject___setattr__< Entity > )
+ .def( "__getattr__", &EcsObject___getattr__< Entity > )
;
py::class_< System, py::bases< Entity >, System, boost::noncopyable>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|