@@ -106,7 +106,8 @@ static PyObject *delete(PyObject *self, PyObject *args) {
106
106
static PyObject * frne (PyObject * self , PyObject * args ) {
107
107
108
108
Robot * robot ;
109
- PyObject * rO , * qO , * qdO , * qddO , * gravO , * fextO ;
109
+ PyObject * rO , * qO , * qdO , * qddO , * gravO , * fextO , * temp ;
110
+ // PyObject *python_float;
110
111
double * q , * qd , * qdd , * fext ;
111
112
// Vect *grav;
112
113
int nq = 1 ; //, nqd = njoints, nqdd = njoints;
@@ -127,7 +128,6 @@ static PyObject *frne(PyObject *self, PyObject *args) {
127
128
qd = (double * )PyMem_RawCalloc (njoints , sizeof (double ));
128
129
qdd = (double * )PyMem_RawCalloc (njoints , sizeof (double ));
129
130
fext = (double * )PyMem_RawCalloc (6 , sizeof (double ));
130
- // grav = (Vect *)PyMem_RawMalloc(sizeof(Vect));
131
131
132
132
// Create iterators for arrays
133
133
PyObject * iq = PyObject_GetIter (qO );
@@ -137,27 +137,45 @@ static PyObject *frne(PyObject *self, PyObject *args) {
137
137
PyObject * ifext = PyObject_GetIter (fextO );
138
138
139
139
// Create the gravity vector
140
- robot -> gravity -> x = PyFloat_AsDouble (PyIter_Next (igrav ));
141
- robot -> gravity -> y = PyFloat_AsDouble (PyIter_Next (igrav ));
142
- robot -> gravity -> z = PyFloat_AsDouble (PyIter_Next (igrav ));
140
+ temp = PyIter_Next (igrav );
141
+ robot -> gravity -> x = PyFloat_AsDouble (temp );
142
+ Py_DECREF (temp );
143
+
144
+ temp = PyIter_Next (igrav );
145
+ robot -> gravity -> y = PyFloat_AsDouble (temp );
146
+ Py_DECREF (temp );
147
+
148
+ temp = PyIter_Next (igrav );
149
+ robot -> gravity -> z = PyFloat_AsDouble (temp );
150
+ Py_DECREF (temp );
151
+
143
152
144
153
// Create the joint arrays
145
154
for (int i = 0 ; i < njoints ; i ++ ) {
146
- q [i ] = PyFloat_AsDouble (PyIter_Next (iq ));
147
- qd [i ] = PyFloat_AsDouble (PyIter_Next (iqd ));
148
- qdd [i ] = PyFloat_AsDouble (PyIter_Next (iqdd ));
155
+ temp = PyIter_Next (iq );
156
+ q [i ] = PyFloat_AsDouble (temp );
157
+ Py_DECREF (temp );
158
+
159
+ temp = PyIter_Next (iqd );
160
+ qd [i ] = PyFloat_AsDouble (temp );
161
+ Py_DECREF (temp );
162
+
163
+ temp = PyIter_Next (iqdd );
164
+ qdd [i ] = PyFloat_AsDouble (temp );
165
+ Py_DECREF (temp );
149
166
}
150
167
151
168
// Create the fext array
152
169
for (int i = 0 ; i < 6 ; i ++ ) {
153
- fext [i ] = PyFloat_AsDouble (PyIter_Next (ifext ));
170
+ temp = PyIter_Next (ifext );
171
+ fext [i ] = PyFloat_AsDouble (temp );
172
+ Py_DECREF (temp );
154
173
}
155
174
156
175
// Create a matrix for the return argument */
157
176
double * tau ;
158
177
tau = (double * )PyMem_RawCalloc (njoints , sizeof (double ));
159
178
160
-
161
179
#define MEL (x ,R ,C ) (x[(R)+(C)*nq])
162
180
163
181
// // For each point in the input trajectory
@@ -185,14 +203,19 @@ static PyObject *frne(PyObject *self, PyObject *args) {
185
203
PyMem_RawFree (q );
186
204
PyMem_RawFree (qd );
187
205
PyMem_RawFree (qdd );
188
- // PyMem_RawFree(grav);
189
206
PyMem_RawFree (fext );
190
207
208
+ Py_DECREF (iq );
209
+ Py_DECREF (iqd );
210
+ Py_DECREF (iqdd );
211
+ Py_DECREF (igrav );
212
+ Py_DECREF (ifext );
213
+
191
214
PyObject * ret = PyList_New (njoints );
192
215
for (int i = 0 ; i < njoints ; ++ i ) {
193
- PyObject * python_float = Py_BuildValue ("d" , tau [i ]);
194
- PyList_SetItem (ret , i , python_float );
216
+ PyList_SetItem (ret , i , Py_BuildValue ("d" , tau [i ]));
195
217
}
218
+
196
219
PyMem_RawFree (tau );
197
220
198
221
return ret ;
0 commit comments