From 0e7ec33063190bf57f4f00562a2c6b6c768526c8 Mon Sep 17 00:00:00 2001 From: Shlok Date: Tue, 13 Jan 2026 20:32:13 +0000 Subject: [PATCH] [tmva][sofie] Fix Python C-API ref handling in Keras parser --- tmva/sofie_parsers/src/RModelParser_Keras.cxx | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tmva/sofie_parsers/src/RModelParser_Keras.cxx b/tmva/sofie_parsers/src/RModelParser_Keras.cxx index 3f923fb4bece8..cac421cdcf4a3 100644 --- a/tmva/sofie_parsers/src/RModelParser_Keras.cxx +++ b/tmva/sofie_parsers/src/RModelParser_Keras.cxx @@ -43,9 +43,7 @@ void PyRunString(TString code, PyObject *globalNS, PyObject *localNS) const char *PyStringAsString(PyObject *string) { - PyObject *encodedString = PyUnicode_AsUTF8String(string); - const char *cstring = PyBytes_AsString(encodedString); - return cstring; + return PyUnicode_AsUTF8(string); } std::vector GetDataFromTuple(PyObject *tupleObject) @@ -63,7 +61,10 @@ std::vector GetDataFromTuple(PyObject *tupleObject) PyObject *GetValueFromDict(PyObject *dict, const char *key) { - return PyDict_GetItemWithError(dict, PyUnicode_FromString(key)); + PyObject *pyKey = PyUnicode_FromString(key); + PyObject *val = PyDict_GetItemWithError(dict, pyKey); + Py_DECREF(pyKey); + return val; } } // namespace @@ -666,10 +667,18 @@ std::unique_ptr MakeKerasBatchNorm(PyObject* fLayer) std::string fLayerDType = PyStringAsString(GetValueFromDict(fLayer,"layerDType")); std::string fNX = PyStringAsString(PyList_GetItem(fInputs,0)); std::string fNY = PyStringAsString(PyList_GetItem(fOutputs,0)); - std::string fNScale = PyStringAsString(PyObject_GetAttrString(fGamma,"name")); - std::string fNB = PyStringAsString(PyObject_GetAttrString(fBeta,"name")); - std::string fNMean = PyStringAsString(PyObject_GetAttrString(fMoving_Mean,"name")); - std::string fNVar = PyStringAsString(PyObject_GetAttrString(fMoving_Var,"name")); + PyObject *gammaName = PyObject_GetAttrString(fGamma, "name"); + PyObject *betaName = PyObject_GetAttrString(fBeta, "name"); + PyObject *meanName = PyObject_GetAttrString(fMoving_Mean, "name"); + PyObject *varName = PyObject_GetAttrString(fMoving_Var, "name"); + std::string fNScale = PyStringAsString(gammaName); + std::string fNB = PyStringAsString(betaName); + std::string fNMean = PyStringAsString(meanName); + std::string fNVar = PyStringAsString(varName); + Py_DECREF(gammaName); + Py_DECREF(betaName); + Py_DECREF(meanName); + Py_DECREF(varName); float fEpsilon = (float)PyFloat_AsDouble(GetValueFromDict(fAttributes,"epsilon")); float fMomentum = (float)PyFloat_AsDouble(GetValueFromDict(fAttributes,"momentum"));