Revision: 19519
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19519
Author:   campbellbarton
Date:     2009-04-03 16:51:06 +0200 (Fri, 03 Apr 2009)

Log Message:
-----------
Python BGE API
- Initialize python types with PyType_Ready, which adds methods to the type 
dictionary.
- use Pythons get/setattro (uses a python string for the attribute rather then 
char*). Using basic C strings seems nice but internally python converts them to 
python strings and discards them for most functions that accept char arrays.
- Method lookups use the PyTypes dictionary (should be faster then 
Py_FindMethod)
- Renamed __getattr -> py_base_getattro, _getattr -> py_getattro, __repr -> 
py_base_repr, py_delattro, py_getattro_self etc.

>From here is possible to put all the parent classes methods into each python 
>types dictionary to avoid nested lookups (api has 4 levels of lookups in some 
>places), tested this but its not ready yet.

Simple tests for getting a method within a loop show this to be between 0.5 and 
3.2x faster then using Py_FindMethod()

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
    trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp
    trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h
    trunk/blender/source/gameengine/Expressions/ListValue.cpp
    trunk/blender/source/gameengine/Expressions/ListValue.h
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
    trunk/blender/source/gameengine/Expressions/Value.cpp
    trunk/blender/source/gameengine/Expressions/Value.h
    trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_2DFilterActuator.h
    trunk/blender/source/gameengine/GameLogic/SCA_ANDController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ANDController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ActuatorSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_AlwaysSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_DelaySensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_DelaySensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.h
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_NANDController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_NANDController.h
    trunk/blender/source/gameengine/GameLogic/SCA_NORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_NORController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ORController.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyActuator.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PythonController.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_XNORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_XNORController.h
    trunk/blender/source/gameengine/GameLogic/SCA_XORController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_XORController.h
    trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Shader.h
    
trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_CDActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CDActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.h
    trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp.bras
    trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_IpoActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.h
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_NearSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_NearSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolyProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_RadarSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_RaySensor.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.h
    trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_StateActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_StateActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.h
    trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h

Added Paths:
-----------
    trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.h

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp     
2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp     
2009-04-03 14:51:06 UTC (rev 19519)
@@ -965,18 +965,21 @@
 /* ------------------------------------------------------------------------- */
 
 PyTypeObject BL_ActionActuator::Type = {
-       PyObject_HEAD_INIT(&PyType_Type)
+       PyObject_HEAD_INIT(NULL)
                0,
                "BL_ActionActuator",
                sizeof(BL_ActionActuator),
                0,
                PyDestructor,
                0,
-               __getattr,
-               __setattr,
                0,
-               __repr,
-               0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+               0,
+               0,
+               py_base_repr,
+               0,0,0,0,0,0,
+               py_base_getattro,
+               py_base_setattro,
+               0,0,0,0,0,0,0,0,0,
                Methods
 };
 
@@ -1032,17 +1035,20 @@
        { NULL }        //Sentinel
 };
 
-PyObject* BL_ActionActuator::_getattr(const char *attr) {
-       if (!strcmp(attr, "action"))
+PyObject* BL_ActionActuator::py_getattro(PyObject *attr) {
+       char *attr_str= PyString_AsString(attr);
+       if (!strcmp(attr_str, "action"))
                return PyString_FromString(m_action->id.name+2);
-       PyObject* object = _getattr_self(Attributes, this, attr);
+
+       PyObject* object = py_getattro_self(Attributes, this, attr);
        if (object != NULL)
                return object;
-       _getattr_up(SCA_IActuator);
+       py_getattro_up(SCA_IActuator);
 }
 
-int BL_ActionActuator::_setattr(const char *attr, PyObject* value) {
-       if (!strcmp(attr, "action"))
+int BL_ActionActuator::py_setattro(PyObject *attr, PyObject* value) {
+       char *attr_str= PyString_AsString(attr);
+       if (!strcmp(attr_str, "action"))
        {
                if (!PyString_Check(value))
                {
@@ -1072,8 +1078,8 @@
                m_action = action;
                return 0;
        }
-       int ret = _setattr_self(Attributes, this, attr, value);
+       int ret = py_setattro_self(Attributes, this, attr, value);
        if (ret >= 0)
                return ret;
-       return SCA_IActuator::_setattr(attr, value);
+       return SCA_IActuator::py_setattro(attr, value);
 }
\ No newline at end of file

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.h       
2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.h       
2009-04-03 14:51:06 UTC (rev 19519)
@@ -110,8 +110,8 @@
 
        KX_PYMETHOD_DOC(BL_ActionActuator,setChannel);
 
-       virtual PyObject* _getattr(const char *attr);
-       virtual int _setattr(const char *attr, PyObject* value);
+       virtual PyObject* py_getattro(PyObject* attr);
+       virtual int py_setattro(PyObject* attr, PyObject* value);
 
        /* attribute check */
        static int CheckFrame(void *self, const PyAttributeDef*)

Modified: trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp        
2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.cpp        
2009-04-03 14:51:06 UTC (rev 19519)
@@ -420,18 +420,21 @@
 /* Integration hooks ------------------------------------------------------- */
 
 PyTypeObject BL_ShapeActionActuator::Type = {
-       PyObject_HEAD_INIT(&PyType_Type)
+       PyObject_HEAD_INIT(NULL)
                0,
                "BL_ShapeActionActuator",
                sizeof(BL_ShapeActionActuator),
                0,
                PyDestructor,
                0,
-               __getattr,
-               __setattr,
-               0, //&MyPyCompare,
-               __repr,
-               0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+               0,
+               0,
+               0,
+               py_base_repr,
+               0,0,0,0,0,0,
+               py_base_getattro,
+               py_base_setattro,
+               0,0,0,0,0,0,0,0,0,
                Methods
 };
 
@@ -481,17 +484,19 @@
 };
 
 
-PyObject* BL_ShapeActionActuator::_getattr(const char *attr) {
-       if (!strcmp(attr, "action"))
+PyObject* BL_ShapeActionActuator::py_getattro(PyObject* attr) {
+       char *attr_str= PyString_AsString(attr);
+       if (!strcmp(attr_str, "action"))
                return PyString_FromString(m_action->id.name+2);
-       PyObject* object = _getattr_self(Attributes, this, attr);
+       PyObject* object = py_getattro_self(Attributes, this, attr);
        if (object != NULL)
                return object;
-       _getattr_up(SCA_IActuator);
+       py_getattro_up(SCA_IActuator);
 }
 
-int BL_ShapeActionActuator::_setattr(const char *attr, PyObject* value) {
-       if (!strcmp(attr, "action"))
+int BL_ShapeActionActuator::py_setattro(PyObject *attr, PyObject* value) {
+       char *attr_str= PyString_AsString(attr);
+       if (!strcmp(attr_str, "action"))
        {
                if (!PyString_Check(value))
                {
@@ -521,10 +526,10 @@
                m_action = action;
                return 0;
        }
-       int ret = _setattr_self(Attributes, this, attr, value);
+       int ret = py_setattro_self(Attributes, this, attr, value);
        if (ret >= 0)
                return ret;
-       return SCA_IActuator::_setattr(attr, value);
+       return SCA_IActuator::py_setattro(attr, value);
 }
 
 /*     setStart                                                              */

Modified: trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h  
2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Converter/BL_ShapeActionActuator.h  
2009-04-03 14:51:06 UTC (rev 19519)
@@ -103,8 +103,8 @@
        KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetType);
        KX_PYMETHOD_DOC(BL_ShapeActionActuator,SetType);
 
-       virtual PyObject* _getattr(const char *attr);
-       virtual int _setattr(const char *attr, PyObject* value);
+       virtual PyObject* py_getattro(PyObject* attr);
+       virtual int py_setattro(PyObject* attr, PyObject* value);
 
        static int CheckBlendTime(void *self, const PyAttributeDef*)
        {

Modified: trunk/blender/source/gameengine/Expressions/ListValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.cpp   2009-04-03 
14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Expressions/ListValue.cpp   2009-04-03 
14:51:06 UTC (rev 19519)
@@ -193,7 +193,7 @@
 
 
 PyTypeObject CListValue::Type = {
-       PyObject_HEAD_INIT(&PyType_Type)
+       PyObject_HEAD_INIT(NULL)
        0,                              /*ob_size*/
        "CListValue",                   /*tp_name*/
        sizeof(CListValue),             /*tp_basicsize*/
@@ -201,16 +201,19 @@
        /* methods */
        PyDestructor,                   /*tp_dealloc*/
        0,                              /*tp_print*/
-       __getattr,                      /*tp_getattr*/
-       __setattr,                      /*tp_setattr*/
+       0,                      /*tp_getattr*/
+       0,                      /*tp_setattr*/
        0,                              /*tp_compare*/
-       __repr,                         /*tp_repr*/
+       py_base_repr,                           /*tp_repr*/
        0,                              /*tp_as_number*/
        &listvalue_as_sequence, /*tp_as_sequence*/
        &instance_as_mapping,           /*tp_as_mapping*/
        0,                              /*tp_hash*/
        0,                              /*tp_call */
-       0,0,0,0,0,0,0,0,0,0,0,0,
+       0,
+       py_base_getattro,
+       py_base_setattro,
+       0,0,0,0,0,0,0,0,0,
        Methods
 };
 
@@ -238,8 +241,8 @@
        { NULL }        //Sentinel
 };
 
-PyObject* CListValue::_getattr(const char *attr) {
-       _getattr_up(CValue);
+PyObject* CListValue::py_getattro(PyObject* attr) {
+       py_getattro_up(CValue);
 }
 
 

Modified: trunk/blender/source/gameengine/Expressions/ListValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.h     2009-04-03 
14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Expressions/ListValue.h     2009-04-03 
14:51:06 UTC (rev 19519)
@@ -59,7 +59,7 @@
 
        bool CheckEqual(CValue* first,CValue* second);
 
-       virtual PyObject* _getattr(const char *attr);
+       virtual PyObject* py_getattro(PyObject* attr);
 
        KX_PYMETHOD_O(CListValue,append);
        KX_PYMETHOD_NOARGS(CListValue,reverse);

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp        
2009-04-03 14:50:54 UTC (rev 19518)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp        
2009-04-03 14:51:06 UTC (rev 19519)
@@ -55,19 +55,22 @@
 ------------------------------*/
 
 PyTypeObject PyObjectPlus::Type = {
-       PyObject_HEAD_INIT(&PyType_Type)
+       PyObject_HEAD_INIT(NULL)
        0,                              /*ob_size*/
        "PyObjectPlus",                 /*tp_name*/
        sizeof(PyObjectPlus),           /*tp_basicsize*/
        0,                              /*tp_itemsize*/
        /* methods */
-       PyDestructor,                   /*tp_dealloc*/
-       0,                              /*tp_print*/
-       __getattr,                      /*tp_getattr*/
-       __setattr,                      /*tp_setattr*/
-       0,                              /*tp_compare*/
-       __repr,
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+       PyDestructor,
+       0,
+       0,
+       0,
+       0,
+       py_base_repr,
+       0,0,0,0,0,0,
+       py_base_getattro,
+       py_base_setattro,
+       0,0,0,0,0,0,0,0,0,
        Methods
 };
 
@@ -103,37 +106,41 @@
 /*------------------------------
  * PyObjectPlus attributes     -- attributes
 ------------------------------*/
-PyObject *PyObjectPlus::_getattr(const char *attr)
+PyObject *PyObjectPlus::py_getattro(PyObject* attr)
 {
-       if (!strcmp(attr, "__doc__") && GetType()->tp_doc)
-               return PyString_FromString(GetType()->tp_doc);
-
+       PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
+       if (descr == NULL) {
+               PyErr_SetString(PyExc_AttributeError, "attribute not found");
+               return NULL;
+       } else {
+               return PyCFunction_New(((PyMethodDescrObject 
*)descr)->d_method, (PyObject *)this); \
+       }
   //if (streq(attr, "type"))
   //  return Py_BuildValue("s", (*(GetParents()))->tp_name);
-
-  return Py_FindMethod(Methods, this, attr);
 }
 
-int PyObjectPlus::_delattr(const char *attr)
+int PyObjectPlus::py_delattro(PyObject* attr)
 {
        PyErr_SetString(PyExc_AttributeError, "attribute cant be deleted");
        return 1;
 }
 
-int PyObjectPlus::_setattr(const char *attr, PyObject *value)
+int PyObjectPlus::py_setattro(PyObject *attr, PyObject* value)
 {
-       //return PyObject::_setattr(attr,value);
+       //return PyObject::py_setattro(attr,value);
        //cerr << "Unknown attribute" << endl;
        PyErr_SetString(PyExc_AttributeError, "attribute cant be set");
        return 1;
 }
 
-PyObject *PyObjectPlus::_getattr_self(const PyAttributeDef attrlist[], void 
*self, const char *attr)
+PyObject *PyObjectPlus::py_getattro_self(const PyAttributeDef attrlist[], void 
*self, PyObject *attr)
 {
+       char *attr_str= PyString_AsString(attr);
+
        const PyAttributeDef *attrdef;
        for (attrdef=attrlist; attrdef->m_name != NULL; attrdef++)
        {
-               if (!strcmp(attr, attrdef->m_name))
+               if (!strcmp(attr_str, attrdef->m_name))
                {
                        if (attrdef->m_type == KX_PYATTRIBUTE_TYPE_DUMMY)
                        {
@@ -242,16 +249,17 @@
        return NULL;
 }
 
-int PyObjectPlus::_setattr_self(const PyAttributeDef attrlist[], void *self, 
const char *attr, PyObject *value)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to