Skip to content

Commit 1749726

Browse files
needed decrefs
1 parent 1f96bda commit 1749726

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

src/PyListProxyHandler.cc

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)