diff --git a/docs/project/changelog.md b/docs/project/changelog.md index f59b6dba9..3b081569c 100644 --- a/docs/project/changelog.md +++ b/docs/project/changelog.md @@ -16,6 +16,9 @@ myst: ## Unreleased +- {{ Fix }} Don't leak the values in a dictionary when applying `to_js` to it. + {pr}`4853` + ### Packages - Upgraded `scikit-learn` to 1.5 {pr}`4823` diff --git a/src/core/python2js.c b/src/core/python2js.c index 1e4ccd9d8..57599a188 100644 --- a/src/core/python2js.c +++ b/src/core/python2js.c @@ -275,6 +275,7 @@ _python2js_dict(ConversionContext* context, PyObject* x) FAIL_IF_MINUS_ONE( context->dict_add_keyvalue(context, jsdict, jskey, jsval)); } + Py_CLEAR(item); } FAIL_IF_ERR_OCCURRED(); if (context->dict_postprocess) { diff --git a/src/tests/test_typeconversions.py b/src/tests/test_typeconversions.py index 80221fc41..dd0be3e96 100644 --- a/src/tests/test_typeconversions.py +++ b/src/tests/test_typeconversions.py @@ -2200,3 +2200,12 @@ def test_bind_construct(selenium): A = A.bind_sig(A_sig) A() + + +@run_in_pyodide +def test_to_js_no_leak(selenium): + from js import Object + from pyodide.ffi import to_js + + d = {"key": Object()} + to_js(d)