Skip to content

Commit

Permalink
fix: Make org.jpy.PyLib.getCurrentLocals/Globals work for Python 3.13 (
Browse files Browse the repository at this point in the history
…#164)

* Made getCurrentLocals/Globals work in py3.13

* Make getting globals/locals thread safe

* Add JPy_XINCREF and use it
  • Loading branch information
jmao-denver authored Sep 23, 2024
1 parent 429c7b0 commit 222d048
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
22 changes: 20 additions & 2 deletions src/main/c/jni/org_jpy_PyLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,7 @@ PyObject *getMainGlobals() {
}

pyGlobals = PyModule_GetDict(pyMainModule); // borrowed ref
JPy_INCREF(pyGlobals);

return pyGlobals;
}
Expand All @@ -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;
}
Expand All @@ -543,6 +544,7 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getMainGlobals
}

error:
JPy_XDECREF(globals);
JPy_END_GIL_STATE

return objectRef;
Expand All @@ -555,7 +557,13 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentGlobals

JPy_BEGIN_GIL_STATE

#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION <= 12
globals = PyEval_GetGlobals(); // borrowed ref
JPy_XINCREF(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) {
goto error;
Expand All @@ -567,6 +575,7 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentGlobals
}

error:
JPy_XDECREF(globals);
JPy_END_GIL_STATE

return objectRef;
Expand All @@ -579,7 +588,14 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentLocals

JPy_BEGIN_GIL_STATE

#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION <= 12
locals = PyEval_GetLocals(); // borrowed ref
JPy_XINCREF(locals);
#else
// See https://peps.python.org/pep-0667 for the change in Python 3.13
locals = PyEval_GetFrameLocals(); // new ref
#endif

if (locals == NULL) {
goto error;
}
Expand All @@ -590,6 +606,7 @@ JNIEXPORT jobject JNICALL Java_org_jpy_PyLib_getCurrentLocals
}

error:
JPy_XDECREF(locals);
JPy_END_GIL_STATE

return objectRef;
Expand Down Expand Up @@ -904,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;
Expand Down
1 change: 1 addition & 0 deletions src/main/c/jpy_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ extern "C" {
#if 1
#define JPy_DECREF(x) Py_DECREF(x)
#define JPy_INCREF(x) Py_INCREF(x)
#define JPy_XINCREF(x) Py_XINCREF(x)
#define JPy_XDECREF(x) Py_XDECREF(x)
#else
#include "jpy_diag.h"
Expand Down

0 comments on commit 222d048

Please sign in to comment.