ninia / jep

Embed Python in Java

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`Py_DECREF` seems to be missing in `Java_jep_python_PyObject_setAttr`

CHanzyLazer opened this issue · comments

Describe the bug
Py_DECREF seems to be missing in Java_jep_python_PyObject_setAttr, witch will cause memory leak when using setAttr of PyObject.

To Reproduce

try (SharedInterpreter inter = new SharedInterpreter()) {
    inter.exec("class Simple:\n" +
               "    def __init__(self, id):\n" +
               "        self.member = None\n"+
               "        self.id = id\n" +
               "    def __del__(self):\n" +
               "        print('obj' + str(self.id) + ' del')"
    );
    PyCallable simple = inter.getValue("Simple", PyCallable.class);
    PyObject obj1 = simple.callAs(PyObject.class, 1);
    PyObject obj2 = simple.callAs(PyObject.class, 2);
    obj1.setAttr("member", obj2);
}

Output:

obj1 del

So only obj1 was deleted, while obj2 leaked.

Expected behavior

Output:

obj1 del
obj2 del

Both obj1 and obj2 should be deleted.

Thank you very much! I have created a PR with a fix, #539, please review it if you can. I plan to include the fix in the 4.2.1 release of Jep.