@@ -564,27 +564,39 @@ static bool array_concat(JSContext *cx, unsigned argc, JS::Value *vp) {
564564 Py_ssize_t itemLength = JSArrayProxyMethodDefinitions::JSArrayProxy_length ((JSArrayProxy *)item);
565565 for (Py_ssize_t flatIndex = 0 ; flatIndex < itemLength; flatIndex++) {
566566 if (!JS_GetElement (cx, *(((JSArrayProxy *)item)->jsArray ), flatIndex, &elementVal)) {
567+ Py_XDECREF (item);
567568 return false ;
568569 }
569- if (PyList_Append (result, pyTypeFactory (cx, elementVal)) < 0 ) {
570+ PyObject *value = pyTypeFactory (cx, elementVal);
571+ if (PyList_Append (result, value) < 0 ) {
572+ Py_XDECREF (item);
573+ Py_XDECREF (value);
570574 return false ;
571575 }
576+ Py_XDECREF (value);
572577 }
573578 }
574579 else if (PyObject_TypeCheck (item, &PyList_Type)) {
575580 // flatten the array only at depth 1
576581 Py_ssize_t itemLength = PyList_GET_SIZE (item);
577582 for (Py_ssize_t flatIndex = 0 ; flatIndex < itemLength; flatIndex++) {
578583 if (PyList_Append (result, PyList_GetItem (item, flatIndex)) < 0 ) {
584+ Py_XDECREF (item);
579585 return false ;
580586 }
581587 }
582588 }
583589 else {
584- if (PyList_Append (result, pyTypeFactory (cx, elementVal)) < 0 ) {
590+ PyObject *value = pyTypeFactory (cx, elementVal);
591+ if (PyList_Append (result, value) < 0 ) {
592+ Py_XDECREF (item);
593+ Py_XDECREF (value);
585594 return false ;
586595 }
596+ Py_XDECREF (value);
587597 }
598+
599+ Py_XDECREF (item);
588600 }
589601
590602 args.rval ().set (jsTypeFactory (cx, result));
@@ -639,13 +651,16 @@ static bool array_lastIndexOf(JSContext *cx, unsigned argc, JS::Value *vp) {
639651 int cmp = PyObject_RichCompareBool (item, element, Py_EQ);
640652 Py_DECREF (item);
641653 if (cmp < 0 ) {
654+ Py_XDECREF (element);
642655 return false ;
643656 }
644657 else if (cmp == 1 ) {
658+ Py_XDECREF (element);
645659 args.rval ().setInt32 (index);
646660 return true ;
647661 }
648662 }
663+ Py_XDECREF (element);
649664
650665 args.rval ().setInt32 (-1 );
651666 return true ;
@@ -1247,7 +1262,6 @@ static uint32_t FlattenIntoArray(JSContext *cx,
12471262 JS::RootedValue elementVal (cx);
12481263
12491264 for (uint32_t sourceIndex = 0 ; sourceIndex < sourceLen; sourceIndex++) {
1250-
12511265 if (PyObject_TypeCheck (source, &JSArrayProxyType)) {
12521266 JS_GetElement (cx, *(((JSArrayProxy *)source)->jsArray ), sourceIndex, &elementVal);
12531267 }
@@ -1294,6 +1308,8 @@ static uint32_t FlattenIntoArray(JSContext *cx,
12941308
12951309 targetIndex++;
12961310 }
1311+
1312+ Py_XDECREF (element);
12971313 }
12981314
12991315 return targetIndex;
@@ -1391,6 +1407,8 @@ static uint32_t FlattenIntoArrayWithCallBack(JSContext *cx,
13911407 targetIndex++;
13921408 }
13931409 }
1410+
1411+ Py_XDECREF (element);
13941412 }
13951413
13961414 return targetIndex;
0 commit comments