From df9d1773d5d4edf6b31d9d5e3ef90bcdd7e603e0 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sun, 9 Jun 2024 09:10:44 -0700 Subject: [PATCH] Fix leak in to_js of dictionary (#4853) --- docs/project/changelog.md | 3 +++ src/core/python2js.c | 1 + src/tests/test_typeconversions.py | 9 +++++++++ 3 files changed, 13 insertions(+) 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)