Many long standing memory leaks fixed in the BPY api.
authorCampbell Barton <ideasman42@gmail.com>
Fri, 25 May 2007 16:43:25 +0000 (16:43 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 25 May 2007 16:43:25 +0000 (16:43 +0000)
Data from Armature.c and logic.c still leaks.

Mostly todo with PyList_Append adding a refcount and the bpython api not decrefing.

Also added some features needed to fix a bug in mesh_clean.py (ob.pinShape and ob.activeShape)

25 files changed:
source/blender/python/BPY_interface.c
source/blender/python/api2_2x/Armature.c
source/blender/python/api2_2x/Bone.c
source/blender/python/api2_2x/CurNurb.c
source/blender/python/api2_2x/Curve.c
source/blender/python/api2_2x/Draw.c
source/blender/python/api2_2x/Effect.c
source/blender/python/api2_2x/Font.c
source/blender/python/api2_2x/Ipo.c
source/blender/python/api2_2x/Key.c
source/blender/python/api2_2x/Lattice.c
source/blender/python/api2_2x/Mesh.c
source/blender/python/api2_2x/NMesh.c
source/blender/python/api2_2x/Object.c
source/blender/python/api2_2x/Text.c
source/blender/python/api2_2x/Text3d.c
source/blender/python/api2_2x/Types.c
source/blender/python/api2_2x/World.c
source/blender/python/api2_2x/constant.c
source/blender/python/api2_2x/doc/Mesh.py
source/blender/python/api2_2x/doc/Object.py
source/blender/python/api2_2x/gen_utils.c
source/blender/python/api2_2x/logic.c
source/blender/python/api2_2x/sceneTimeLine.c
source/blender/python/api2_2x/windowTheme.c

index be4bc690d97b436218b1dd4793f769c29ccd9c18..cef83c327ab9341448d43ed15e46e00bfcd2daae 100644 (file)
@@ -877,6 +877,7 @@ int BPY_menu_do_python( short menutype, int event )
 
        if( !setup_armature_weakrefs()){
                printf("Oops - weakref dict\n");
+               MEM_freeN( buffer );
                return 0;
        }
 
index 98b64d7554c0249481eb550becb7fc2a223ed941..a4c9221639f9654017f2da63b13768b66eb53923 100644 (file)
@@ -118,17 +118,18 @@ static PyMethodDef BPy_BonesDict_methods[] = {
 //-----------------(internal)
 static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){
        Bone *bone = NULL;
-       PyObject *py_bone = NULL;
+       PyObject *py_bone = NULL, *str;
 
        for (bone = bones->first; bone; bone = bone->next){
                py_bone = PyBone_FromBone(bone);
                if (!py_bone)
                        return -1;
-
-               if(PyDict_SetItem(dictionary, 
-                       PyString_FromString(bone->name), py_bone) == -1){
+               
+               str = PyString_FromString(bone->name);
+               if(PyDict_SetItem(dictionary, str, py_bone) == -1)
                        return -1;
-               }
+               
+               Py_DECREF(str);
                Py_DECREF(py_bone);
                if (bone->childbase.first) 
                        BoneMapping_Init(dictionary, &bone->childbase);
@@ -138,17 +139,18 @@ static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){
 //-----------------(internal)
 static int EditBoneMapping_Init(PyObject *dictionary, ListBase *editbones){
        EditBone *editbone = NULL;
-       PyObject *py_editbone = NULL;
+       PyObject *py_editbone = NULL, *str;
 
        for (editbone = editbones->first; editbone; editbone = editbone->next){
                py_editbone = PyEditBone_FromEditBone(editbone);
                if (!py_editbone)
                        return -1;
-
-               if(PyDict_SetItem(dictionary, 
-                       PyString_FromString(editbone->name), py_editbone) == -1){
+               
+               str = PyString_FromString(editbone->name);
+               if(PyDict_SetItem(dictionary, str, py_editbone) == -1)
                        return -1;
-               }
+               
+               Py_DECREF(str);
                Py_DECREF(py_editbone);
        }
        return 0;
@@ -215,7 +217,7 @@ static void BonesDict_dealloc(BPy_BonesDict * self)
        Py_DECREF(self->bonesMap);
        Py_DECREF(self->editbonesMap);
        BLI_freelistN(&self->editbones); 
-       BonesDict_Type.tp_free(self);
+       PyObject_DEL( self );
        return;
 }
 //------------------------mp_length
@@ -422,10 +424,7 @@ PyTypeObject BonesDict_Type = {
 //-----------------------PyBonesDict_FromPyArmature
 static PyObject *PyBonesDict_FromPyArmature(BPy_Armature *py_armature)
 {
-       BPy_BonesDict *py_BonesDict = NULL;
-
-       //create py object
-       py_BonesDict = (BPy_BonesDict *)BonesDict_Type.tp_alloc(&BonesDict_Type, 0); 
+       BPy_BonesDict *py_BonesDict = (BPy_BonesDict *)PyObject_NEW( BPy_BonesDict, &BonesDict_Type );
        if (!py_BonesDict)
                goto RuntimeError;
 
@@ -1067,9 +1066,9 @@ static void Armature_dealloc(BPy_Armature * self)
 {
        if (self->weaklist != NULL)
         PyObject_ClearWeakRefs((PyObject *) self);
+       
        Py_DECREF(self->Bones);
-       Armature_Type.tp_free(self);
-       return;
+       PyObject_DEL( self );
 }
 //------------------TYPE_OBECT DEFINITION--------------------------
 PyTypeObject Armature_Type = {
@@ -1126,7 +1125,7 @@ PyTypeObject Armature_Type = {
 //----------------Blender.Armature.Get()
 /* This function will return a Py_Armature when a single string is passed
 * or else it will return a {key:value} dictionary when mutliple strings are passed
-* or it will return a {key:value} dictionary of all armatures when nothing is passed*/
+* or it will return a {key:value} dictionary of all armatures when nothing is passed */
 static PyObject *M_Armature_Get(PyObject * self, PyObject * args)
 {
        PyObject *seq = NULL, *item = NULL, *dict = NULL, *py_armature = NULL;
@@ -1291,8 +1290,12 @@ PyObject *Armature_RebuildBones(PyObject *pyarmature)
 {
        return Armature_update((BPy_Armature*)pyarmature);
 }
-//-----------------(internal)
-//Converts a bArmature to a PyArmature
+/*-----------------(internal)
+ * Converts a bArmature to a PyArmature
+ * 
+ * WARNING!!! - MEMORY LEAK HERE, Run in a loop and loose your ram.
+ * cannot find out why but dosnt seam to be the weakref */
+
 PyObject *Armature_CreatePyObject(struct bArmature *armature)
 {
        BPy_Armature *py_armature = NULL;
@@ -1300,15 +1303,16 @@ PyObject *Armature_CreatePyObject(struct bArmature *armature)
        PyObject *armlist = NULL;  /* list of armature weak refs */
        char *list_name = ARM_WEAKREF_LIST_NAME;
 
-       //create armature type
-       py_armature = (BPy_Armature*)Armature_Type.tp_alloc(&Armature_Type, 0); /*new*/
+       /*create armature type*/
+       py_armature = PyObject_NEW( BPy_Armature, &Armature_Type );
+       
        if (!py_armature){
                printf("Oops - can't create py armature\n");
                goto RuntimeError;
        }
 
-       py_armature->weaklist = NULL; //init the weaklist
        py_armature->armature = armature;
+       py_armature->weaklist = NULL; //init the weaklist
        
        //create armature.bones
        py_armature->Bones = (BPy_BonesDict*)PyBonesDict_FromPyArmature(py_armature);
index feb43cc74057b636337a57e4e52f1f48a69911aa..8795bb7d984aaba0b354ca5ee82f612123b97beb 100644 (file)
@@ -88,9 +88,9 @@ static PyObject *EditBone_hasParent(BPy_EditBone *self)
 {
        if (self->editbone){
                if (self->editbone->parent)
-                       return EXPP_incr_ret(Py_True);
+                       Py_RETURN_TRUE;
                else
-                       return EXPP_incr_ret(Py_False);
+                       Py_RETURN_FALSE;
        }else{
                goto AttributeError;
        }
@@ -105,7 +105,7 @@ static PyObject *EditBone_clearParent(BPy_EditBone *self)
        if (self->editbone){
                if (self->editbone->parent)
                        self->editbone->parent = NULL;
-               return EXPP_incr_ret(Py_None);
+               Py_RETURN_NONE;
        }else{
                goto AttributeError;
        }
@@ -406,9 +406,10 @@ static PyObject *EditBone_getOptions(BPy_EditBone *self, void *closure)
                                goto RuntimeError;
        }
 
-       return EXPP_incr_ret(list);
+       return list;
 
 RuntimeError:
+       Py_XDECREF( list );
        return EXPP_objError(PyExc_RuntimeError, "%s%s%s", 
                sEditBoneError, ".options: ", "Internal failure!");
 }
@@ -515,9 +516,9 @@ static PyObject *EditBone_getParent(BPy_EditBone *self, void *closure)
                if (self->editbone->parent)
                        return PyEditBone_FromEditBone(self->editbone->parent);
                else
-                       return EXPP_incr_ret(Py_None);
+                       Py_RETURN_NONE;
        }else{
-               return EXPP_incr_ret(Py_None); //not in the list yet can't have a parent
+               Py_RETURN_NONE; //not in the list yet can't have a parent
        }
 }
 //------------------------EditBone.parent (set)
@@ -878,45 +879,47 @@ static int PyBone_ChildrenAsList(PyObject *list, ListBase *bones){
                py_bone = PyBone_FromBone(bone);
                if (py_bone == NULL)
                        return 0;
-
+               
                if(PyList_Append(list, py_bone) == -1){
-                       goto RuntimeError;
+                       return 0;
                }
+               Py_DECREF(py_bone);
                if (bone->childbase.first) 
-                       PyBone_ChildrenAsList(list, &bone->childbase);
+                       if (!PyBone_ChildrenAsList(list, &bone->childbase))
+                               return 0;
        }
        return 1;
-
-RuntimeError:
-       return EXPP_intError(PyExc_RuntimeError, "%s%s", 
-               sBoneError, "Internal error trying to wrap blender bones!");
 }
 //-------------------------Bone.hasParent()
 static PyObject *Bone_hasParent(BPy_Bone *self)
 {
        if (self->bone->parent)
-               return EXPP_incr_ret(Py_True);
+               Py_RETURN_TRUE;
        else
-               return EXPP_incr_ret(Py_False);
+               Py_RETURN_FALSE;
 }
 //-------------------------Bone.hasChildren()
 static PyObject *Bone_hasChildren(BPy_Bone *self)
 {
        if (self->bone->childbase.first)
-               return EXPP_incr_ret(Py_True);
+               Py_RETURN_TRUE;
        else
-               return EXPP_incr_ret(Py_False);
+               Py_RETURN_FALSE;
 }
 //-------------------------Bone.getAllChildren()
 static PyObject *Bone_getAllChildren(BPy_Bone *self)
 {
        PyObject *list = PyList_New(0);
-
-       if (self->bone->childbase.first)
-               if (!PyBone_ChildrenAsList(list, &self->bone->childbase))
-                       return NULL;
-       return EXPP_incr_ret(list);
+       if (!self->bone->childbase.first) {
+               /* do nothing */
+       } else if (!PyBone_ChildrenAsList(list, &self->bone->childbase)) {
+               Py_XDECREF(list);
+               EXPP_objError(PyExc_RuntimeError, "%s%s", 
+                               sBoneError, "Internal error trying to wrap blender bones!");
+       }
+       return list;
 }
+
 //------------------ATTRIBUTE IMPLEMENTATIONS-----------------------------
 //------------------------Bone.name (get)
 static PyObject *Bone_getName(BPy_Bone *self, void *closure)
@@ -1044,9 +1047,10 @@ static PyObject *Bone_getOptions(BPy_Bone *self, void *closure)
                        EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1)
                        goto RuntimeError;
 
-       return EXPP_incr_ret(list);
-
+       return list;
+       
 RuntimeError:
+       Py_XDECREF(list);
        return EXPP_objError(PyExc_RuntimeError, "%s%s%s", 
                sBoneError, "getOptions(): ", "Internal failure!");
 }
@@ -1062,7 +1066,7 @@ static PyObject *Bone_getParent(BPy_Bone *self, void *closure)
        if (self->bone->parent)
                return PyBone_FromBone(self->bone->parent);
        else
-               return EXPP_incr_ret(Py_None);
+               Py_RETURN_NONE;
 }
 //------------------------Bone.parent (set)
 static int Bone_setParent(BPy_Bone *self, PyObject *value, void *closure)
@@ -1081,15 +1085,17 @@ static PyObject *Bone_getChildren(BPy_Bone *self, void *closure)
                for (bone = self->bone->childbase.first; bone; bone = bone->next){
                        py_bone = PyBone_FromBone(bone);
                        if (py_bone == NULL)
-                               return 0;
-                       if(PyList_Append(list, py_bone) == -1){
                                goto RuntimeError;
-                       }
+                       if (PyList_Append(list, py_bone) == -1)
+                               goto RuntimeError;
+                       Py_DECREF(py_bone);
                }
        }
-       return EXPP_incr_ret(list);
+       return list;
        
 RuntimeError:
+       Py_XDECREF(list);
+       Py_XDECREF(py_bone);
        return EXPP_objError(PyExc_RuntimeError, "%s%s", 
                sBoneError, "Internal error trying to wrap blender bones!");
 }
@@ -1309,19 +1315,11 @@ RuntimeError:
 //Converts a struct Bone to a BPy_Bone
 PyObject *PyBone_FromBone(struct Bone *bone)
 {
-       BPy_Bone *py_Bone = NULL;
-
-       py_Bone = (BPy_Bone*)Bone_Type.tp_alloc(&Bone_Type, 0); //*new*
-       if (py_Bone == NULL)
-               goto RuntimeError;
-
+       BPy_Bone *py_Bone = ( BPy_Bone * ) PyObject_NEW( BPy_Bone, &Bone_Type );
+       
        py_Bone->bone = bone;
 
        return (PyObject *) py_Bone;
-
-RuntimeError:
-       return EXPP_objError(PyExc_RuntimeError, "%s%s%s", 
-               sBoneError, "PyBone_FromBone: ", "Internal Error Ocurred");
 }
 //-----------------(internal)
 //Converts a PyBone to a bBone
index b244d24e37f35578c424518012ac8b8c87dbf3ae..9d930fee1cafb961c3f0fc1319f8148f69a1803a 100644 (file)
@@ -947,8 +947,7 @@ PyObject *CurNurb_pointAtIndex( Nurb * nurb, int index )
 
                for( i = 0; i < 4; i++ ) {
                        PyList_SetItem( pyo, i,
-                                       PyFloat_FromDouble( nurb->bp[index].
-                                                           vec[i] ) );
+                                       PyFloat_FromDouble( nurb->bp[index].vec[i] ) );
                }
 
                /* add Tilt only if curve is 3D */
index b107992f77ee77df98fc1b4771e3173638599447..04ed142f4dd7a4df1a63e9e3855f73d780dcb750 100644 (file)
@@ -1396,7 +1396,7 @@ static PyObject *M_Curve_Get( PyObject * self, PyObject * args )
                                                              &Curve_Type );
                        found_cur->curve = curv_iter;
                        PyList_Append( curvlist, ( PyObject * ) found_cur );
-
+                       Py_DECREF(found_cur);
                        curv_iter = curv_iter->id.next;
                }
 
index 331415dc849a175fd4094652e4d44a09b0f59c28..ede780294ef9a58fb3a5b9c1c7d97f8ffda42f83 100644 (file)
@@ -787,9 +787,11 @@ static void exec_but_callback(void *pyobj, void *data)
        }
        case BUT:
                pyvalue = Py_None;
+               Py_INCREF(pyvalue);
                break;
        default:
                pyvalue = Py_None;
+               Py_INCREF(pyvalue);
                printf("Error, no button type matched.");
        }
        
@@ -802,6 +804,7 @@ static void exec_but_callback(void *pyobj, void *data)
        
        result = PyObject_CallObject( callback, arg );
        if (!result) {
+               Py_DECREF(pyvalue);
                PyErr_Print(  );
                error( "Python script error: check console" );
        }
index 560b67c1933620fd68365b6de07cd4ebbbb7498f..156c3bb26a60bce8d428fc21f443edfa1243f736 100644 (file)
@@ -1494,7 +1494,7 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self )
        Effect *eff;
        PartEff *paf;
        Particle *pa=0;
-       PyObject  *list, *strand_list;
+       PyObject  *list, *strand_list, *pyvec;
        float p_time, c_time, vec[3], vec1[3], cfra, m_time, s_time;
        int a;
        short disp=100 ;
@@ -1545,12 +1545,17 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self )
                        for(c_time= pa->time; c_time<m_time; c_time+=paf->staticstep) {
                                where_is_particle(paf, pa, c_time, vec);
                                MTC_Mat4MulVecfl(ob->obmat, vec); /* make worldspace like the others */
-                               if( PyList_Append( strand_list, newVectorObject(vec, 3, Py_NEW)) < 0 ) {
+                               pyvec = newVectorObject(vec, 3, Py_NEW);
+                               if( PyList_Append( strand_list, pyvec) < 0 ) {
                                        Py_DECREF( list );
                                        Py_DECREF( strand_list );
+                                       Py_XDECREF( pyvec );
+                                       
                                        return EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                                        "Couldn't append item to PyList" );
                                }
+                               Py_DECREF( pyvec );
+                               
                        }
                        
                        if( PyList_Append( list, strand_list) < 0 ) {
@@ -1589,12 +1594,14 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self )
                                        }
                                } else { /* not a vector */
                                        where_is_particle(paf, pa, c_time, vec);
-                                       if( PyList_Append( list,
-                                                               newVectorObject(vec, 3, Py_NEW)) < 0 ) {
+                                       pyvec = newVectorObject(vec, 3, Py_NEW);
+                                       if( PyList_Append( list, pyvec) < 0 ) {
                                                Py_DECREF( list );
+                                               Py_XDECREF( pyvec );
                                                return EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                                                "Couldn't append item to PyList" );
                                        }
+                                       Py_DECREF( pyvec );
                                }
                        }
                }
index 667dc6d4e0d12b0e18912d1efda82cc94a5987da..f87e19294ca513bc02461dc6dad3ad215b1410bf 100644 (file)
@@ -374,7 +374,7 @@ static PyObject *Font_repr( BPy_Font * self )
                return PyString_FromFormat( "[Font \"%s\"]",
                                            self->font->id.name+2 );
        else
-               return PyString_FromString( "NULL" );
+               return PyString_FromString( "[Font - no data]" );
 }
 
 /*--------------- compare------------------------------------------*/
index 8ef4babb415a1b7099ccd355b03520f56ff12b39..37098400216943b81dbddedc63eb32596e0cec35 100644 (file)
@@ -197,7 +197,7 @@ static PyGetSetDef BPy_Ipo_getseters[] = {
         (getter)Ipo_getBlocktype, (setter)NULL,
         "Ipo block type",
         NULL},
-       {"rcft",
+       {"rctf",
         (getter)Ipo_getRctf, (setter)Ipo_setRctf,
         "Ipo type",
         NULL},
@@ -830,11 +830,11 @@ static int Ipo_setBlocktype( BPy_Ipo * self, PyObject * args )
 
 static PyObject *Ipo_getRctf( BPy_Ipo * self )
 {
-       PyObject *l = PyList_New( 0 );
-       PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.xmin ) );
-       PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.xmax ) );
-       PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.ymin ) );
-       PyList_Append( l, PyFloat_FromDouble( self->ipo->cur.ymax ) );
+       PyObject *l = PyList_New( 4 );
+       PyList_SET_ITEM( l, 0, PyFloat_FromDouble( self->ipo->cur.xmin ) );
+       PyList_SET_ITEM( l, 1, PyFloat_FromDouble( self->ipo->cur.xmax ) );
+       PyList_SET_ITEM( l, 2, PyFloat_FromDouble( self->ipo->cur.ymin ) );
+       PyList_SET_ITEM( l, 3, PyFloat_FromDouble( self->ipo->cur.ymax ) );
        return l;
 }
 
@@ -1018,12 +1018,14 @@ typeError:
 
 static PyObject *Ipo_getCurves( BPy_Ipo * self )
 {
-       PyObject *attr = PyList_New( 0 );
+       PyObject *attr = PyList_New( 0 ), *pyipo;
        IpoCurve *icu;
 
-       for( icu = self->ipo->curve.first; icu; icu = icu->next )
-               PyList_Append( attr, IpoCurve_CreatePyObject( icu ) );
-
+       for( icu = self->ipo->curve.first; icu; icu = icu->next ) {
+               pyipo = IpoCurve_CreatePyObject( icu );
+               PyList_Append( attr, pyipo );
+               Py_DECREF(pyipo);
+       }
        return attr;
 }
 
@@ -1110,14 +1112,16 @@ static PyObject *Ipo_getCurveNames( BPy_Ipo * self )
                        /* find the ipo in the keylist */
                        for( key = G.main->key.first; key; key = key->id.next ) {
                                if( key->ipo == self->ipo ) {
+                                       PyObject *tmpstr;
                                        KeyBlock *block = key->block.first;
                                        attr = PyList_New( 0 );
-
+                                       
                                        /* add each name to the list */
-                                       for( block = key->block.first; block; block = block->next )
-                                               PyList_Append( attr,
-                                                               PyString_FromString( block->name ) );
-
+                                       for( block = key->block.first; block; block = block->next ) {
+                                               tmpstr = PyString_FromString( block->name );
+                                               PyList_Append( attr, tmpstr);
+                                               Py_DECREF(tmpstr);
+                                       }
                                        return attr;
                                }
                        }
@@ -1674,7 +1678,7 @@ static PyObject *Ipo_getCurveBeztriple( BPy_Ipo * self, PyObject * args )
        struct BezTriple *ptrbt;
        int num = 0, pos, i, j;
        IpoCurve *icu;
-       PyObject *l = PyList_New( 0 );
+       PyObject *l = PyList_New( 0 ), *pyfloat;
 
        if( !PyArg_ParseTuple( args, "ii", &num, &pos ) )
                return ( EXPP_ReturnPyObjError
@@ -1698,11 +1702,13 @@ static PyObject *Ipo_getCurveBeztriple( BPy_Ipo * self, PyObject * args )
                return EXPP_ReturnPyObjError( PyExc_TypeError,
                                              "No bez triple" );
 
-       for( i = 0; i < 3; i++ )
-               for( j = 0; j < 3; j++ )
-                       PyList_Append( l,
-                                      PyFloat_FromDouble( ptrbt->
-                                                          vec[i][j] ) );
+       for( i = 0; i < 3; i++ ) {
+               for( j = 0; j < 3; j++ ) {
+                       pyfloat = PyFloat_FromDouble( ptrbt->vec[i][j] );
+                       PyList_Append( l, pyfloat );
+                       Py_DECREF(pyfloat);
+               }
+       }
        return l;
 }
 
@@ -1823,8 +1829,7 @@ static PyObject *Ipo_getCurvecurval( BPy_Ipo * self, PyObject * args )
 
        if( icu )
                return PyFloat_FromDouble( icu->curval );
-       Py_INCREF( Py_None );
-       return Py_None;
+       Py_RETURN_NONE;
 }
 
 /*
index d1231daba5f1b135cba45de2bfae791ff3780297..460bab347a0998079bd47d388030f823d4d25c78 100644 (file)
@@ -64,6 +64,7 @@
 
 static int Key_compare( BPy_Key * a, BPy_Key * b );
 static PyObject *Key_repr( BPy_Key * self );
+static void Key_dealloc( BPy_Key * self );
 
 static PyObject *Key_getBlocks( BPy_Key * self );
 static PyObject *Key_getType( BPy_Key * self );
@@ -106,6 +107,10 @@ static int KeyBlock_setVgroup( BPy_KeyBlock *, PyObject * args  );
 static int KeyBlock_setSlidermin( BPy_KeyBlock *, PyObject * args  );
 static int KeyBlock_setSlidermax( BPy_KeyBlock *, PyObject * args  );
 
+static void KeyBlock_dealloc( BPy_KeyBlock * self );
+static int KeyBlock_compare( BPy_KeyBlock * a, BPy_KeyBlock * b );
+static PyObject *KeyBlock_repr( BPy_KeyBlock * self );
+
 static struct PyMethodDef KeyBlock_methods[] = {
        { "getData", (PyCFunction) KeyBlock_getData, METH_NOARGS,
                "Get keyblock data" },
@@ -136,7 +141,7 @@ PyTypeObject Key_Type = {
        sizeof( BPy_Key ),                              /*tp_basicsize */
        0,                                                              /*tp_itemsize */
        /* methods */
-       NULL,                                                   /*tp_dealloc */
+       ( destructor ) Key_dealloc,/* destructor tp_dealloc; */
        ( printfunc ) 0,                                /*tp_print */
        ( getattrfunc ) 0,      /*tp_getattr */
        ( setattrfunc ) 0,                              /*tp_setattr */
@@ -213,12 +218,12 @@ PyTypeObject KeyBlock_Type = {
        sizeof( BPy_KeyBlock ), /*tp_basicsize */
        0,                      /*tp_itemsize */
        /* methods */
-       NULL,                           /*tp_dealloc */
-       NULL,                           /*tp_print */
-       NULL,                           /*tp_getattr */
-       NULL,                           /*tp_setattr */
-       NULL,                           /*tp_compare*/
-       NULL,                           /* tp_repr */
+       ( destructor ) KeyBlock_dealloc,/* destructor tp_dealloc; */
+       ( printfunc ) 0,                                /*tp_print */
+       ( getattrfunc ) 0,      /*tp_getattr */
+       ( setattrfunc ) 0,                              /*tp_setattr */
+       ( cmpfunc) KeyBlock_compare,            /*tp_compare*/
+       ( reprfunc ) KeyBlock_repr,                     /* tp_repr */
        /* Method suites for standard classes */
 
        NULL,                       /* PyNumberMethods *tp_as_number; */
@@ -303,6 +308,10 @@ PyObject *Key_CreatePyObject( Key * k )
        return ( PyObject * ) key;
 }
 
+static void Key_dealloc( BPy_Key * self )
+{
+       PyObject_DEL( self );
+}
 
 static int Key_compare( BPy_Key * a, BPy_Key * b )
 {
@@ -378,14 +387,12 @@ static PyObject *Key_getBlocks( BPy_Key * self )
 {
        Key *key = self->key;
        KeyBlock *kb;
-       PyObject *keyblock_object;
-       PyObject *l = PyList_New( 0 );
-
-       for (kb = key->block.first; kb; kb = kb->next) {
-               keyblock_object =  KeyBlock_CreatePyObject( kb, key );
-               PyList_Append( l, keyblock_object );
-       }
+       int i=0;
+       PyObject *l = PyList_New( BLI_countlist( &(key->block)) );
 
+       for (kb = key->block.first; kb; kb = kb->next, i++)
+               PyList_SET_ITEM( l, i, KeyBlock_CreatePyObject( kb, key ) );
+       
        return l;
 }
 
@@ -398,17 +405,11 @@ static PyObject *Key_getValue( BPy_Key * self )
 
 /* ------------ Key Block Functions -------------- */
 
-static PyObject *new_KeyBlock( KeyBlock * oldkeyBlock, Key *parentKey)
+static PyObject *new_KeyBlock( KeyBlock * keyblock, Key *key)
 {
        BPy_KeyBlock *kb = PyObject_NEW( BPy_KeyBlock, &KeyBlock_Type );
-
-       kb->key = parentKey;
-
-       if( !oldkeyBlock ) {
-               kb->keyblock = 0;
-       } else {
-               kb->keyblock = oldkeyBlock;
-       }
+       kb->key = key;
+       kb->keyblock = keyblock; /* keyblock maye be NULL, thats ok */
        return ( PyObject * ) kb;
 }
 
@@ -478,6 +479,22 @@ static int KeyBlock_setSlidermax( BPy_KeyBlock * self, PyObject * args  ){
                                                                10.0f );
 }
 
+static void KeyBlock_dealloc( BPy_KeyBlock * self )
+{
+       PyObject_DEL( self );
+}
+
+static int KeyBlock_compare( BPy_KeyBlock * a, BPy_KeyBlock * b )
+{
+       return ( a->keyblock == b->keyblock ) ? 0 : -1;
+}
+
+static PyObject *KeyBlock_repr( BPy_KeyBlock * self )
+{
+       return PyString_FromFormat( "[KeyBlock \"%s\"]", self->keyblock->name );
+}
+
+
 static Curve *find_curve( Key *key )
 {
        Curve *cu;
index 7b2ed57bf75b3545e2cfed2a04ee88d679e08d9e..5c8df29d5d03559a4dc5c0418d6f0c3b1cf1bfca 100644 (file)
@@ -166,11 +166,11 @@ static PyObject *M_Lattice_New( PyObject * self, PyObject * args )
                                              "expected string and int arguments (or nothing)" );
 
        bl_Lattice = add_lattice( "Lattice" );
-       bl_Lattice->id.us = 0;
 
-       if( bl_Lattice )
+       if( bl_Lattice ) {
+               bl_Lattice->id.us = 0;
                py_Lattice = Lattice_CreatePyObject( bl_Lattice );
-       else
+       else
                return EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                              "couldn't create Lattice Object in Blender" );
        if( !py_Lattice )
index 85feedf86ba5425e141aa6b1a4713c5a958242d4..212298e3dcec547a620658982fc2c23177bf531f 100644 (file)
@@ -4972,15 +4972,15 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
 
                                tmpface->flag = ME_FACE_SEL;
 
-                               if( return_list )
-                                       PyList_Append( return_list, 
-                                                       PyInt_FromLong( mesh->totface ) );
-
+                               if( return_list ) {
+                                       tmp = PyInt_FromLong( mesh->totface );
+                                       PyList_Append( return_list, tmp );
+                                       Py_DECREF(tmp);
+                               }
                                mesh->totface++;
                                ++tmpface;
                                --good_faces;
                        } else if( return_list ) {
-                               Py_INCREF( Py_None );
                                PyList_Append( return_list, Py_None );
                                --good_faces;
                        }
@@ -5385,9 +5385,44 @@ static PyObject *Mesh_vertexShade( BPy_Mesh * self )
  * force display list update
  */
 
-static PyObject *Mesh_Update( BPy_Mesh * self )
+static PyObject *Mesh_Update( BPy_Mesh * self, PyObject *args, PyObject *kwd )
 {
-       mesh_update( self->mesh );
+
+       char *blockname= NULL;
+       static char *kwlist[] = {"key", NULL};
+       
+       if( !PyArg_ParseTupleAndKeywords(args, kwd, "|s", kwlist, &blockname) )
+       return EXPP_ReturnPyObjError( PyExc_TypeError,
+                       "Expected nothing or the name of a shapeKey");
+       
+       if (blockname) {
+               Mesh *me = self->mesh;
+               MVert *mv = me->mvert;  
+               Key *key= me->key;
+               KeyBlock *kb;
+               float (*co)[3];
+               int i;
+               
+               if (!key)
+                       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                               "Cannot update the key for this mesh, it has no shape keys");
+               
+               for (kb = key->block.first; kb; kb=kb->next)
+                       if (strcmp(blockname, kb->name))
+                               break;
+               
+               if (!kb)
+                       return EXPP_ReturnPyObjError( PyExc_ValueError,
+                               "This requested key to update does not exist");
+               
+               printf("KEYBLOCKNAME %s\n", kb->name);
+               
+               for(i=0, co= kb->data; i<me->totvert; i++, mv++, co++)
+                       VECCOPY(*co, mv->co);
+       } else {
+               /* Normal operation */
+               mesh_update( self->mesh );
+       }
        Py_RETURN_NONE;
 }
 
@@ -5893,7 +5928,6 @@ static PyObject *Mesh_addVertGroup( PyObject * self, PyObject * args )
 {
        char *groupStr;
        struct Object *object;
-       PyObject *tempStr;
 
        if( !PyArg_ParseTuple( args, "s", &groupStr ) )
                return EXPP_ReturnPyObjError( PyExc_TypeError,
@@ -5905,10 +5939,7 @@ static PyObject *Mesh_addVertGroup( PyObject * self, PyObject * args )
 
        object = ( ( BPy_Mesh * ) self )->object;
 
-       /*get clamped name*/
-       tempStr = PyString_FromStringAndSize( groupStr, 32 );
-       groupStr = PyString_AsString( tempStr );
-
+       /* add_defgroup_name clamps the name to 32, make sure that dosnt change  */
        add_defgroup_name( object, groupStr );
 
        EXPP_allqueue( REDRAWBUTSALL, 1 );
@@ -6502,7 +6533,7 @@ static PyObject *Mesh_getLayerNames_internal( BPy_Mesh * self, int type )
 {
        CustomData *data;
        CustomDataLayer *layer;
-       PyObject *list = PyList_New( 0 );
+       PyObject *str, *list = PyList_New( 0 );
        Mesh *mesh = self->mesh;
        int i;
        data = &mesh->fdata;
@@ -6511,7 +6542,9 @@ static PyObject *Mesh_getLayerNames_internal( BPy_Mesh * self, int type )
        for(i=0; i<data->totlayer; i++) {
                layer = &data->layers[i];
                if(layer->type == type) {
-                       PyList_Append( list, PyString_FromString(layer->name) );
+                       str = PyString_FromString(layer->name);
+                       PyList_Append( list, str );
+                       Py_DECREF(str);
                }
        }
        return list;
@@ -6990,7 +7023,7 @@ static struct PyMethodDef BPy_Mesh_methods[] = {
                "find indices of an multiple edges in the mesh"},
        {"getFromObject", (PyCFunction)Mesh_getFromObject, METH_VARARGS,
                "Get a mesh by name"},
-       {"update", (PyCFunction)Mesh_Update, METH_NOARGS,
+       {"update", (PyCFunction)Mesh_Update, METH_VARARGS | METH_KEYWORDS,
                "Update display lists after changes to mesh"},
        {"transform", (PyCFunction)Mesh_transform, METH_VARARGS | METH_KEYWORDS,
                "Applies a transformation matrix to mesh's vertices"},
index ffc7428951015a810a127e773903688af9848c9a..0eb90d348ceff76d6c411641afefb362c647ac23 100644 (file)
@@ -1275,10 +1275,10 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args )
        BPy_NMesh *nm = ( BPy_NMesh * ) self;
        Mesh *me = nm->mesh;
        int flag = 0;
-
+       
        MTFace *tf;
        int i;
-       PyObject *l = PyList_New( 0 );
+       PyObject *l = PyList_New( 0 ), *pyval;
 
        if( me == NULL )
                return NULL;
@@ -1292,15 +1292,16 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args )
 
        if( flag ) {
                for( i = 0; i < me->totface; i++ ) {
-                       if( tf[i].flag & TF_SELECT )
-                               PyList_Append( l, PyInt_FromLong( i ) );
+                       if( tf[i].flag & TF_SELECT ) {
+                               pyval = PyInt_FromLong( i );
+                               PyList_Append( l, pyval );
+                               Py_DECREF(pyval);
+                       }
                }
        } else {
                for( i = 0; i < me->totface; i++ ) {
                        if( tf[i].flag & TF_SELECT )
-                               PyList_Append( l,
-                                              PyList_GetItem( nm->faces,
-                                                              i ) );
+                               PyList_Append( l, PyList_GetItem( nm->faces, i ) );
                }
        }
        return l;
@@ -2434,11 +2435,13 @@ static PyObject *M_NMesh_GetRaw( PyObject * self, PyObject * args )
 
 static PyObject *M_NMesh_GetNames(PyObject *self)
 {
-       PyObject *names = PyList_New(0);
+       PyObject *names = PyList_New(0), *tmpstr;
        Mesh *me = G.main->mesh.first;
 
        while (me) {
-               PyList_Append(names, PyString_FromString(me->id.name+2));
+               tmpstr = PyString_FromString(me->id.name+2);
+               PyList_Append(names, tmpstr);
+               Py_DECREF(tmpstr);
                me = me->id.next;
        }
 
@@ -4095,7 +4098,7 @@ static PyObject *NMesh_renameVertGroup( PyObject * self, PyObject * args )
 static PyObject *NMesh_getVertGroupNames( PyObject * self )
 {
        bDeformGroup *defGroup;
-       PyObject *list;
+       PyObject *list, *tmpstr;
 
        if( !( ( BPy_NMesh * ) self )->object )
                return EXPP_ReturnPyObjError( PyExc_RuntimeError,
@@ -4103,11 +4106,15 @@ static PyObject *NMesh_getVertGroupNames( PyObject * self )
 
        list = PyList_New( 0 );
        for( defGroup = ( ( ( BPy_NMesh * ) self )->object )->defbase.first;
-            defGroup; defGroup = defGroup->next ) {
-               if( PyList_Append
-                   ( list, PyString_FromString( defGroup->name ) ) < 0 )
-                       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                                     "Couldn't add item to list" );
+                               defGroup; defGroup = defGroup->next ) {
+               
+               tmpstr = PyString_FromString( defGroup->name );
+               if( PyList_Append( list,  tmpstr) < 0 ) {
+                       Py_XDECREF(list);
+                       Py_XDECREF(tmpstr);
+                       return EXPP_ReturnPyObjError( PyExc_RuntimeError, "Couldn't add item to list" );
+               }
+               Py_XDECREF(tmpstr);
        }
 
        return list;
index b30ce00239d424790ac6b2388d0a64ae77360e4d..c8d42dfa8420ff5516e417cc0572e28e88f365ff 100644 (file)
@@ -44,6 +44,7 @@ struct rctf;
 #include "DNA_view3d_types.h"
 #include "DNA_object_force.h"
 #include "DNA_userdef_types.h"
+#include "DNA_key_types.h" /* for pinShape and activeShape */
 
 #include "BKE_action.h"
 #include "BKE_anim.h" /* used for dupli-objects */
@@ -68,6 +69,7 @@ struct rctf;
 #include "BKE_modifier.h"
 #include "BKE_idprop.h"
 #include "BKE_object.h"
+#include "BKE_key.h" /* for setting the activeShape */
 
 #include "BSE_editipo.h"
 #include "BSE_edit.h"
@@ -174,6 +176,7 @@ enum obj_consts {
        EXPP_OBJ_ATTR_PARENT_TYPE,
        EXPP_OBJ_ATTR_PASSINDEX,
        EXPP_OBJ_ATTR_ACT_MATERIAL,
+       EXPP_OBJ_ATTR_ACT_SHAPE,
        
        EXPP_OBJ_ATTR_PI_SURFACEDAMP,   /* these need to stay together */
        EXPP_OBJ_ATTR_PI_RANDOMDAMP,    /* and in order */
@@ -331,7 +334,6 @@ struct PyMethodDef M_Object_methods[] = {
 static int setupSB(Object* ob); /*Make sure Softbody Pointer is initialized */
 static int setupPI(Object* ob);
 
-static PyObject *Object_GetProperties(BPy_Object * self);
 static PyObject *Object_buildParts( BPy_Object * self );
 static PyObject *Object_clearIpo( BPy_Object * self );
 static PyObject *Object_clrParent( BPy_Object * self, PyObject * args );
@@ -756,8 +758,6 @@ works only if self and the object specified are of the same type."},
         "([s1<,s2,s3...>]) - Delete specified scriptlinks from this object."},
        {"insertShapeKey", ( PyCFunction ) Object_insertShapeKey, METH_NOARGS,
         "() - Insert a Shape Key in the current object"},
-       {"getProperties", ( PyCFunction ) Object_GetProperties, METH_NOARGS,
-        "() return a reference to the ID properties associated with this object."},
        {"__copy__", ( PyCFunction ) Object_copy, METH_NOARGS,
         "() - Return a copy of this object."},
        {"copy", ( PyCFunction ) Object_copy, METH_NOARGS,
@@ -1021,12 +1021,6 @@ static PyObject *M_Object_Duplicate( PyObject * self_unused,
 /* Python BPy_Object methods:                                  */
 /*****************************************************************************/
 
-static PyObject *Object_GetProperties(BPy_Object * self)
-{
-       return BPy_Wrap_IDProperty( (ID*)self->object, IDP_GetProperties((ID*)self->object, 1), NULL );
-       
-}
-
 static PyObject *Object_buildParts( BPy_Object * self )
 {
        build_particle_system( self->object );
@@ -2733,14 +2727,16 @@ static PyObject *Object_shareFrom( BPy_Object * self, PyObject * args )
 
 static PyObject *Object_getAllProperties( BPy_Object * self )
 {
-       PyObject *prop_list;
+       PyObject *prop_list, *pyval;
        bProperty *prop = NULL;
 
        prop_list = PyList_New( 0 );
 
        prop = self->object->prop.first;
        while( prop ) {
-               PyList_Append( prop_list, Property_CreatePyObject( prop ) );
+               pyval = Property_CreatePyObject( prop );
+               PyList_Append( prop_list, pyval );
+               Py_DECREF(pyval);
                prop = prop->next;
        }
        return prop_list;
@@ -3019,7 +3015,7 @@ static int Object_setDupliGroup( BPy_Object * self, PyObject * value )
 
 static PyObject *Object_getEffects( BPy_Object * self )
 {
-       PyObject *effect_list;
+       PyObject *effect_list, *pyval;
        Effect *eff;
 
        effect_list = PyList_New( 0 );
@@ -3030,7 +3026,9 @@ static PyObject *Object_getEffects( BPy_Object * self )
        eff = self->object->effect.first;
 
        while( eff ) {
-               PyList_Append( effect_list, EffectCreatePyObject( eff, self->object ) );
+               pyval = EffectCreatePyObject( eff, self->object );
+               PyList_Append( effect_list, pyval );
+               Py_DECREF(pyval);
                eff = eff->next;
        }
        return effect_list;
@@ -3571,6 +3569,9 @@ static PyObject *getIntAttr( BPy_Object *self, void *type )
        case EXPP_OBJ_ATTR_ACT_MATERIAL:
                param = object->actcol;
                break;
+       case EXPP_OBJ_ATTR_ACT_SHAPE:
+               param = object->shapenr;
+               break;          
        default:
                return EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                "undefined type in getIntAttr" );
@@ -3632,6 +3633,20 @@ static int setIntAttrClamp( BPy_Object *self, PyObject *value, void *type )
                size = 'b';                     /* in case max is later made > 128 */
                param = (void *)&object->actcol;
                break;
+       case EXPP_OBJ_ATTR_ACT_SHAPE:
+       {
+               Key *key= ob_get_key(object);
+               KeyBlock *kb;
+               min = 1;
+               max = 0;
+               if (key) {
+                       max= 1;
+                       for (kb = key->block.first; kb; kb=kb->next, max++);
+               }
+               size = 'h';                     /* in case max is later made > 128 */
+               param = (void *)&object->shapenr;
+               break;
+       }
        default:
                return EXPP_ReturnIntError( PyExc_RuntimeError,
                                "undefined type in setIntAttrClamp");
@@ -4144,6 +4159,26 @@ static int setFloat3Attr( BPy_Object *self, PyObject *value, void *type )
 /* BPy_Object methods and attribute handlers                                 */
 /*****************************************************************************/
 
+static PyObject *Object_getShapeFlag( BPy_Object *self, void *type )
+{
+       if (self->object->shapeflag & (int)type)
+               Py_RETURN_TRUE;
+       else
+               Py_RETURN_FALSE;
+}
+
+static int Object_setShapeFlag( BPy_Object *self, PyObject *value,
+               void *type )
+{
+       if (PyObject_IsTrue(value) )
+               self->object->shapeflag |= (int)type;
+       else
+               self->object->shapeflag &= ~(int)type;
+       
+       self->object->recalc |= OB_RECALC_OB;
+       return 0;
+}
+
 static PyObject *Object_getRestricted( BPy_Object *self, void *type )
 {
        if (self->object->restrictflag & (int)type)
@@ -5013,8 +5048,16 @@ static PyGetSetDef BPy_Object_getseters[] = {
         "Toggle object restrictions",
         (void *)OB_RESTRICT_RENDER},
 
-       {"properties", (getter)Object_GetProperties, (setter)NULL,
-       "Get the ID properties associated with this object"},
+       {"pinShape",
+        (getter)Object_getShapeFlag, (setter)Object_setShapeFlag, 
+        "Set the state for pinning this object",
+        (void *)OB_SHAPE_LOCK},
+       {"activeShape",
+        (getter)getIntAttr, (setter)setIntAttrClamp, 
+        "set the index for the active shape key",
+        (void *)EXPP_OBJ_ATTR_ACT_SHAPE},
+        
+        
        {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
 };
 
index 8741cab1a7f970f156fa67529ec53f5138a4e1fd..ea1f5aeb8f133ca58fa3e5d7f0a0327cd916d634 100644 (file)
@@ -452,6 +452,7 @@ static PyObject *Text_asLines( BPy_Text * self )
        while( line ) {
                ob = Py_BuildValue( "s", line->line );
                PyList_Append( list, ob );
+               Py_DECREF(ob);
                line = line->next;
        }
 
index df152217524a4a32afb0397c22ed8d783ceb4c94..287eec4a7b128f365ba22bb7f8f62610e1b612d8 100644 (file)
@@ -544,7 +544,7 @@ PyObject *M_Text3d_Get( PyObject * self, PyObject * args )
                                                              &Text3d_Type );
                        found_text3d->curve = curv_iter;
                        PyList_Append( curvlist, ( PyObject * ) found_text3d );
-
+                       Py_DECREF(found_text3d);
                        curv_iter = curv_iter->id.next;
                }
                return ( curvlist );
index d37881bf25b72f3f2105994477d38a1ef764017c..bff227e440aac7fb41c4bbd5d95515ba6894866f 100644 (file)
@@ -121,7 +121,7 @@ void types_InitAll( void )
        Text_Type.ob_type = &PyType_Type;
        Text3d_Type.ob_type = &PyType_Type;
        Texture_Type.ob_type = &PyType_Type;
-       TimeLine_Type.ob_type = &PyType_Type;
+       //TimeLine_Type.ob_type = &PyType_Type;
        World_Type.ob_type = &PyType_Type;
        buffer_Type.ob_type = &PyType_Type;
        constant_Type.ob_type = &PyType_Type;
index c321fccb044f302015bfdbf316c0a30a05ff0608..ec73caa962be36b05332ff565fd0465bfa4b2980 100644 (file)
@@ -439,7 +439,8 @@ static PyObject *M_World_Get( PyObject * self, PyObject * args )
                                                              &World_Type );
                        found_world->world = world_iter;
                        PyList_Append( worldlist, ( PyObject * ) found_world );
-
+                       Py_DECREF(found_world);
+                       
                        world_iter = world_iter->id.next;
                }
                return ( worldlist );
@@ -673,13 +674,13 @@ static PyObject *World_oldsetMistype( BPy_World * self, PyObject * args )
 
 static PyObject *World_getHor( BPy_World * self )
 {
-       PyObject *attr = PyList_New( 0 );
+       PyObject *attr = PyList_New( 3 );
        if( !attr )
                return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                                "couldn't create list" ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->horr ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->horg ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->horb ) );
+       PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->horr ) );
+       PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->horg ) );
+       PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->horb ) );
        return attr;
 }
 
@@ -705,13 +706,13 @@ static PyObject *World_oldsetHor( BPy_World * self, PyObject * args )
 
 static PyObject *World_getZen( BPy_World * self )
 {
-       PyObject *attr = PyList_New( 0 );
+       PyObject *attr = PyList_New( 3 );
        if( !attr )
                return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                                "couldn't create list" ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->zenr ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->zeng ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->zenb ) );
+       PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->zenr ) );
+       PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->zeng ) );
+       PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->zenb ) );
        return attr;
 }
 
@@ -738,13 +739,13 @@ static PyObject *World_oldsetZen( BPy_World * self, PyObject * args )
 
 static PyObject *World_getAmb( BPy_World * self )
 {
-       PyObject *attr = PyList_New( 0 );
+       PyObject *attr = PyList_New( 3 );
        if( !attr )
                return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
                                                "couldn't create list" ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->ambr ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->ambg ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->ambb ) );
+       PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->ambr ) );
+       PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->ambg ) );
+       PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->ambb ) );
        return attr;
 }
 
@@ -770,17 +771,17 @@ static PyObject *World_oldsetAmb( BPy_World * self, PyObject * args )
 
 static PyObject *World_getStar( BPy_World * self )
 {
-       PyObject *attr = PyList_New( 0 );
+       PyObject *attr = PyList_New( 7 );
        if( !attr )
                return ( EXPP_ReturnPyObjError
                         ( PyExc_RuntimeError, "couldn't create list" ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->starr ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->starg ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->starb ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->starsize ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->starmindist ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->stardist ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->starcolnoise ) );
+       PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->starr ) );
+       PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->starg ) );
+       PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->starb ) );
+       PyList_SET_ITEM( attr, 3, PyFloat_FromDouble( self->world->starsize ) );
+       PyList_SET_ITEM( attr, 4, PyFloat_FromDouble( self->world->starmindist ) );
+       PyList_SET_ITEM( attr, 5, PyFloat_FromDouble( self->world->stardist ) );
+       PyList_SET_ITEM( attr, 6, PyFloat_FromDouble( self->world->starcolnoise ) );
        return attr;
 }
 
@@ -815,18 +816,17 @@ static PyObject *World_oldsetStar( BPy_World * self, PyObject * args )
 
 static PyObject *World_getMist( BPy_World * self )
 {
-       PyObject *attr = PyList_New( 0 );
+       PyObject *attr = PyList_New( 4 );
        if( !attr )
                return ( EXPP_ReturnPyObjError
                         ( PyExc_RuntimeError, "couldn't create list" ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->misi ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->miststa ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->mistdist ) );
-       PyList_Append( attr, PyFloat_FromDouble( self->world->misthi ) );
+       PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->misi ) );
+       PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->miststa ) );
+       PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->mistdist ) );
+       PyList_SET_ITEM( attr, 3, PyFloat_FromDouble( self->world->misthi ) );
        return attr;
 }
 
-
 static int World_setMist( BPy_World * self, PyObject * value )
 {
        if( !PyList_Check( value ) )
index 2f74007f617e56dbd71e5e85b21ab5f774239370..3a64de610f1d3d25d945f231a68ad166ea65cbf1 100644 (file)
@@ -144,11 +144,13 @@ static PyObject *constant_getAttro(BPy_constant * self, PyObject *value)
 static PyObject *constant_repr(BPy_constant * self)
 {
        char str[4096];
-       PyObject *key, *value;
+       PyObject *key, *value, *tempstr;
        int pos = 0;
 
        BLI_strncpy(str,"[Constant: ",4096);
-       value = PyDict_GetItem( self->dict, PyString_FromString("name") );
+       tempstr = PyString_FromString("name");
+       value = PyDict_GetItem( self->dict, tempstr );
+       Py_DECREF(tempstr);
        if(value) {
                strcat(str, PyString_AsString(value));
        } else {
index ae4c4370e3fb21c46d8c22d6b6d8eb5608887615..2b858ab7748ba3b05f76a66e0b62f16638ae571a 100644 (file)
@@ -885,12 +885,20 @@ class Mesh:
                @param object: The Blender Object linked to the mesh.
                """
 
-       def update():
+       def update(key=None):
                """
                Update display lists after changes to mesh.  B{Note}: with changes taking
                place for using a directed acyclic graph (DAG) for scene and object
                updating, this method may be only temporary and may be removed in future
                releases.
+               @type key: string
+               @param key: Use this optional argument to write the current vertex
+               locations to the a shape key. the name must match an existing shape key for this mesh
+               See L{Mesh.Mesh.key} and L{Key.Key.blocks} to get a list of the named shape keys, setting the active keys is
+               done from the object with L{Object.Object.pinShape}, L{Object.Object.activeShape}.
+               
+               
+               
                @warn: Since Blender 2.42 this function has changed; now it won't recalculate
                vertex normals (seen when faces are smooth). See L{Mesh.calcNormals()}.
                """
index a837fd058c153c03700aac27fc9fbf5bc6ac7403..34c06c5a4d8c0445655a410147f01f7d8f9a3a50 100644 (file)
@@ -465,6 +465,17 @@ class Object:
 
                Value is clamped to [1,len(ob.materials)]. - [0,0] when there is no materials applied to the object.
        @type activeMaterial: int
+       @ivar activeShape: The active shape key index for this object.
+
+               The active index is used to select the material to edit in the material buttons,
+               new data created will also use the active material.
+
+               Value is clamped to [1,len(ob.data.key.blocks)]. - [0,0] when there are no keys.
+
+       @type activeShape: int
+       
+       @ivar pinShape: If True, only the activeShape will be displayed.
+       @type pinShape: bool
        @ivar drawSize: The size to display the Empty.
        Value clamped to [0.01,10.0].
        @type drawSize: float
index 4cebcfcb0564faa5860ca5b900fec25c57c84948..93ceeda13f13d80c1bb59ba19d8239a486c83de5 100644 (file)
@@ -386,7 +386,7 @@ void EXPP_allqueue(unsigned short event, short val)
 PyObject *EXPP_getScriptLinks( ScriptLink * slink, PyObject * args,
                               int is_scene )
 {
-       PyObject *list = NULL;
+       PyObject *list = NULL, *tmpstr;
        char *eventname = NULL;
        int i, event = 0;
 
@@ -414,15 +414,18 @@ PyObject *EXPP_getScriptLinks( ScriptLink * slink, PyObject * args,
                event = SCRIPT_ONLOAD;
        else if( is_scene && !strcmp( eventname, "OnSave" ) )
                event = SCRIPT_ONSAVE;
-       else
+       else {
+               Py_XDECREF(list);
                return EXPP_ReturnPyObjError( PyExc_AttributeError,
                                              "invalid event name" );
-
+       }
+       
        for( i = 0; i < slink->totscript; i++ ) {
-               if( ( slink->flag[i] == event ) && slink->scripts[i] )
-                       PyList_Append( list,
-                                      PyString_FromString( slink->scripts[i]->
-                                                           name + 2 ) );
+               if( ( slink->flag[i] == event ) && slink->scripts[i] ) {
+                       tmpstr =PyString_FromString( slink->scripts[i]->name + 2 ); 
+                       PyList_Append( list, tmpstr );
+                       Py_DECREF(tmpstr);
+               }
        }
 
        return list;
index a6bac521152cfc5f2200a0c8810f774561358e13..f7e8e27c2f5b45561fbc185a28ceca24fc733aa5 100644 (file)
@@ -152,7 +152,8 @@ int updateProperyData( BPy_Property * self )
 static int checkValidData_ptr( BPy_Property * self )
 {
        int length;
-       //test pointer to see if data was removed (oops)
+       /* test pointer to see if data was removed (oops) */
+       /* WARNING!!! - MEMORY LEAK HERE, why not free this??? */
        length = MEM_allocN_len( self->property );
        if( length != sizeof( bProperty ) ) {   //data was freed
                self->property = NULL;
@@ -312,11 +313,9 @@ static int Property_compare( BPy_Property * a, BPy_Property * b )
                                                               property->
                                                               data ) ) );
                        } else if( py_propB->property->type == PROP_STRING ) {
-                               retval = PyObject_Compare( py_propA->data,
-                                                          PyString_FromString
-                                                          ( py_propB->
-                                                            property->
-                                                            poin ) );
+                               PyObject *tmpstr = PyString_FromString( py_propB->property->poin );
+                               retval = PyObject_Compare( py_propA->data, tmpstr );
+                               Py_DECREF(tmpstr);
                        }
                } else
                        retval = -1;
index 0a68c63752c9bb3bd94a2f904771767a23c78818..ab74115574ea2c7b90a2b390b91e28f7e721e609 100644 (file)
@@ -170,7 +170,7 @@ static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) {
 
        PyObject *marker_dict= NULL;
        TimeMarker *marker_it= NULL;
-       PyObject *tmarker= NULL, *pyo= NULL;
+       PyObject *tmarker= NULL, *pyo= NULL, *tmpstr;
 
        if (!PyArg_ParseTuple (args, "|O", &tmarker))
                return EXPP_ReturnPyObjError (PyExc_AttributeError,
@@ -196,13 +196,16 @@ static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) {
                        for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next){
                                if (marker_it->frame==frm) {
                                        pyo= PyDict_GetItem ((PyObject*)marker_dict, PyInt_FromLong ((long int)marker_it->frame));
+                                       tmpstr = PyString_FromString(marker_it->name);
                                        if (pyo) {
-                                               PyList_Append (pyo, PyString_FromString (marker_it->name));
-                                               Py_INCREF (pyo);
+                                               PyList_Append (pyo, tmpstr);
+                                               Py_INCREF(pyo);
                                        }else{
-                                               pyo = PyList_New (0);
-                                               PyList_Append (pyo, PyString_FromString (marker_it->name));
+                                               pyo = PyList_New(0);
+                                               PyList_Append (pyo, tmpstr);
                                        }
+                                       Py_DECREF(tmpstr);
+                                       
                                        PyDict_SetItem (marker_dict, PyInt_FromLong ((long int)marker_it->frame), pyo); 
                                        if (pyo) { 
                                                Py_DECREF (pyo); 
@@ -216,13 +219,16 @@ static PyObject *TimeLine_getFramesMarked (BPy_TimeLine *self, PyObject *args) {
                marker_dict= PyDict_New ();
                for (marker_it= self->marker_list->first; marker_it; marker_it= marker_it->next) {
                        pyo=PyDict_GetItem ((PyObject*)marker_dict, PyInt_FromLong ((long int)marker_it->frame));
+                       tmpstr = PyString_FromString(marker_it->name);
                        if (pyo) {
-                               PyList_Append (pyo, PyString_FromString (marker_it->name));
+                               PyList_Append (pyo, tmpstr);
                                Py_INCREF (pyo);
                        }else{ 
                                pyo= PyList_New (0);
-                               PyList_Append (pyo, PyString_FromString (marker_it->name));
+                               PyList_Append (pyo, tmpstr);
                        }
+                       Py_DECREF(tmpstr);
+                       
                        PyDict_SetItem (marker_dict, PyInt_FromLong ((long int)marker_it->frame), pyo); 
                        if (pyo) { 
                                Py_DECREF (pyo); 
index 237cf1d0daed0762ebb446a8dae0d15790a77566..813507e5188f37387897d25d17f3035562615eb6 100644 (file)
@@ -685,8 +685,7 @@ static PyObject *Theme_get( BPy_Theme * self, PyObject * args )
 
                while( type < EXPP_THEME_NUMBEROFTHEMES ) {
                        PyList_SET_ITEM( ret, type,
-                                        PyString_FromString( themes_map[type].
-                                                             sval ) );
+                                        PyString_FromString( themes_map[type].sval ) );
                        type++;
                }