diff --git a/src/main/c/jni/org_jpy_PyLib.c b/src/main/c/jni/org_jpy_PyLib.c index 83e697f..71a63e8 100644 --- a/src/main/c/jni/org_jpy_PyLib.c +++ b/src/main/c/jni/org_jpy_PyLib.c @@ -521,6 +521,7 @@ PyObject *getMainGlobals() { } pyGlobals = PyModule_GetDict(pyMainModule); // borrowed ref + JPy_INCREF(pyGlobals); return pyGlobals; } @@ -532,7 +533,7 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getMainGlobals JPy_BEGIN_GIL_STATE - globals = getMainGlobals(); // borrowed ref + globals = getMainGlobals(); // new ref if (globals == NULL) { goto error; } @@ -543,6 +544,7 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getMainGlobals } error: + JPy_XDECREF(globals); JPy_END_GIL_STATE return objectRef; @@ -555,10 +557,12 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentGlobals JPy_BEGIN_GIL_STATE -#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 12 - globals = PyEval_GetFrameGlobals(); // new ref -#else +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION <= 12 globals = PyEval_GetGlobals(); // borrowed ref + JPy_INCREF(globals); +#else + // See https://peps.python.org/pep-0667 for the change in Python 3.13 + globals = PyEval_GetFrameGlobals(); // new ref #endif if (globals == NULL) { @@ -571,11 +575,9 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentGlobals } error: -#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 12 JPy_XDECREF(globals); -#endif - JPy_END_GIL_STATE + return objectRef; } @@ -586,10 +588,12 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentLocals JPy_BEGIN_GIL_STATE -#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 12 - locals = PyEval_GetFrameLocals(); // new ref +#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION <= 12 + locals = PyEval_GetLocals(); // borrowed ref + JPy_INCREF(locals); #else - locals = PyEval_GetLocals(); // borrowed ref + // See https://peps.python.org/pep-0667 for the change in Python 3.13 + locals = PyEval_GetFrameLocals(); // new ref #endif if (locals == NULL) { @@ -602,11 +606,9 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentLocals } error: -#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 12 JPy_XDECREF(locals); -#endif - JPy_END_GIL_STATE + return objectRef; } @@ -919,7 +921,8 @@ jlong executeInternal(JNIEnv* jenv, jclass jLibClass, jint jStart, jobject jGlob if (jGlobals == NULL) { JPy_DIAG_PRINT(JPy_DIAG_F_EXEC, "Java_org_jpy_PyLib_executeInternal: using main globals\n"); - pyGlobals = getMainGlobals(); + pyGlobals = getMainGlobals(); // new ref + decGlobals = JNI_TRUE; if (pyGlobals == NULL) { PyLib_HandlePythonException(jenv); goto error;