From b024b0b0ceec797d193b0505d1fdd54f95bcaa10 Mon Sep 17 00:00:00 2001 From: Reino Ruusu Date: Wed, 25 Jan 2017 18:51:02 +0200 Subject: [PATCH] Python tweaks - Changed the way context modules are created - Allow Python to produce SCL console output Change-Id: I41e8b876d55db8815959ebc90487c3e481f4604b --- .../jnipython.dll | Bin 33792 -> 35328 bytes .../src/sclpy.c | 143 ++++++++++++++---- .../src/sclpy.h | 3 + .../simantics/pythonlink/PythonContext.java | 11 +- 4 files changed, 125 insertions(+), 32 deletions(-) diff --git a/org.simantics.pythonlink.win32.x86_64/jnipython.dll b/org.simantics.pythonlink.win32.x86_64/jnipython.dll index 7fff774adac1bb1b1d2c5ffbffa6043e44d877e1..1770fb739bc91fd7193ea478c320ecd35812dbe6 100644 GIT binary patch literal 35328 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 G1pXfwTfiCs delta 12815 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 zGZFindClass(env, WRITER_CLASS); + jmethodID writeMethod = (*env)->GetMethodID(env, writerClass, "write", "([CII)V"); + jcharArray chars = (*env)->NewCharArray(env, (jsize)length); + + (*env)->SetCharArrayRegion(env, chars, 0, length, what); + (*env)->CallVoidMethod(env, sclWriter, writeMethod, chars, 0, length); + } + } + + return Py_BuildValue(""); +} + +static PyMethodDef sclWriterMethods[] = { + {"write", writeToSCL, METH_VARARGS, "Write something."}, + {NULL, NULL, 0, NULL} +}; + + JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_createContextImpl(JNIEnv *env, jobject thisObj) { char name[16]; @@ -43,6 +81,15 @@ JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_createContex Py_Initialize(); initCalled = 1; + { + static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "sclwriter", NULL, -1, sclWriterMethods, }; + PyObject *m = PyModule_Create(&moduledef); + + if (m == NULL) throwException(env, PYTHON_EXCEPTION, "Failed to create SCL writer module"); + PySys_SetObject("stdout", m); + PySys_SetObject("stderr", m); + } + hasNumpy = _import_array(); hasNumpy = hasNumpy != -1; } @@ -50,18 +97,35 @@ JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_createContex sprintf(name, "SCL_%d", ++moduleCount); { - PyObject *module = PyModule_New(name); - PyObject *main = PyImport_AddModule("__main__"); + PyObject *module; + PyModuleDef *modDef = malloc(sizeof(PyModuleDef)); + memset(modDef, 0, sizeof(PyModuleDef)); + modDef->m_name = strdup(name); + modDef->m_doc = NULL; + modDef->m_size = -1; - PyDict_Merge(PyModule_GetDict(module), PyModule_GetDict(main), 0); + module = PyModule_Create(modDef); + Py_INCREF(module); + PyState_AddModule(module, modDef); - return (jlong)module; + { + PyObject *builtin = PyImport_AddModule("builtins"); + PyObject *dict = PyModule_GetDict(module); + PyDict_SetItemString(dict, "__builtin__", builtin); + PyDict_SetItemString(dict, "__builtins__", builtin); + + return (jlong)modDef; + } } } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_deleteContextImpl(JNIEnv *env, jobject thisObj, jlong contextID) { - PyObject *module = (PyObject*)contextID; + PyModuleDef *modDef = (PyModuleDef*)contextID; + PyObject *module = PyState_FindModule(modDef); Py_XDECREF(module); + PyState_RemoveModule(modDef); + free((char*)modDef->m_name); + free(modDef); } PyObject *getPythonBool(jboolean value) { @@ -783,7 +847,7 @@ jobject pythonDictionaryAsMap(JNIEnv *env, PyObject *dict) { } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonBooleanVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jboolean value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonBool(value); @@ -792,7 +856,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonBool } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonBooleanArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jbooleanArray value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonBooleanList(env, value); @@ -801,7 +865,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonBool } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonLongVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jlong value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = PyLong_FromLongLong(value); @@ -810,7 +874,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonLong } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonIntegerArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jintArray value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonIntegerList(env, value); @@ -819,7 +883,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonInte } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonLongArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jlongArray value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonLongList(env, value); @@ -828,7 +892,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonLong } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonDoubleVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jdouble value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = PyFloat_FromDouble(value); @@ -837,7 +901,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonDoub } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonFloatArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jfloatArray value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonFloatList(env, value); @@ -846,7 +910,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonFloa } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonDoubleArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jdoubleArray value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonDoubleList(env, value); @@ -855,7 +919,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonDoub } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonStringVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jstring value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonString(env, value); @@ -864,7 +928,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonStri } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonStringArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jobjectArray value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonStringList(env, value); @@ -873,7 +937,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonStri } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonNDArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jobject value) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); if (!hasNumpy) { throwPythonException(env, "Importing numpy failed"); @@ -889,7 +953,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonNDAr } JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonVariantVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jobject value, jobject binding) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonObject(env, value, binding); @@ -898,16 +962,26 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonVari } JNIEXPORT jint JNICALL Java_org_simantics_pythonlink_PythonContext_executePythonStatementImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring statement) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); const char *utfchars = (*env)->GetStringUTFChars(env, statement, NULL); PyErr_Clear(); { + jclass sclReportingWriterClass = (*env)->FindClass(env, SCL_REPORTING_WRITER_CLASS); + jmethodID constructor = (*env)->GetMethodID(env, sclReportingWriterClass, "", "()V"); + jmethodID flushMethod = (*env)->GetMethodID(env, sclReportingWriterClass, "flush", "()V"); + PyObject *globals; globals = PyModule_GetDict(module); + currentEnv = env; + if (sclReportingWriterClass && constructor) + sclWriter = (*env)->NewObject(env, sclReportingWriterClass, constructor); + else + sclWriter = NULL; + { PyObject *result = PyRun_String(utfchars, Py_file_input, globals, globals); @@ -951,13 +1025,20 @@ JNIEXPORT jint JNICALL Java_org_simantics_pythonlink_PythonContext_executePython (*env)->ReleaseStringUTFChars(env, statement, utfchars); + if (sclWriter != NULL) { + (*env)->CallVoidMethod(env, sclWriter, flushMethod); + } + + currentEnv = NULL; + sclWriter = NULL; + return result != NULL ? 0 : 1; } } } JNIEXPORT jstring JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonStringVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -979,7 +1060,7 @@ JNIEXPORT jstring JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonS } JNIEXPORT jobjectArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonStringArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1001,7 +1082,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPy } JNIEXPORT jboolean JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonBooleanVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1020,7 +1101,7 @@ JNIEXPORT jboolean JNICALL Java_org_simantics_pythonlink_PythonContext_getPython } JNIEXPORT jbooleanArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonBooleanArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1042,7 +1123,7 @@ JNIEXPORT jbooleanArray JNICALL Java_org_simantics_pythonlink_PythonContext_getP } JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonLongVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1064,7 +1145,7 @@ JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonLon } JNIEXPORT jintArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonIntegerArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1086,7 +1167,7 @@ JNIEXPORT jintArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPytho } JNIEXPORT jlongArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonLongArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1108,7 +1189,7 @@ JNIEXPORT jlongArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPyth } JNIEXPORT jdouble JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonDoubleVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1130,7 +1211,7 @@ JNIEXPORT jdouble JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonD } JNIEXPORT jdoubleArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonDoubleArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1152,7 +1233,7 @@ JNIEXPORT jdoubleArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPy } JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonNDArrayVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); if (!hasNumpy) { throwPythonException(env, "Importing numpy failed"); @@ -1186,7 +1267,7 @@ JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonN } JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonVariantVariableImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); @@ -1205,7 +1286,7 @@ JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonV } JNIEXPORT jint JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonVariableTypeImpl(JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *dict = PyModule_GetDict(module); PyObject *pythonName = getPythonString(env, variableName); @@ -1243,7 +1324,7 @@ JNIEXPORT jint JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonVari } JNIEXPORT jobjectArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonVariableNamesImpl(JNIEnv *env, jobject thisObj, jlong contextID) { - PyObject *module = (PyObject*)contextID; + PyObject *module = getModule(contextID); PyObject *dict = PyModule_GetDict(module); PyObject *keys = PyDict_Keys(dict); diff --git a/org.simantics.pythonlink.win32.x86_64/src/sclpy.h b/org.simantics.pythonlink.win32.x86_64/src/sclpy.h index 4032d48..15d681d 100644 --- a/org.simantics.pythonlink.win32.x86_64/src/sclpy.h +++ b/org.simantics.pythonlink.win32.x86_64/src/sclpy.h @@ -34,6 +34,9 @@ #define MAP_CLASS "java/util/Map" #define SET_CLASS "java/util/Set" +#define WRITER_CLASS "java/io/Writer" +#define SCL_REPORTING_WRITER_CLASS "org/simantics/scl/runtime/reporting/SCLReportingWriter" + #define PACKAGE_PREFIX "org/simantics/pythonlink/" #define NDARRAY_CLASS (PACKAGE_PREFIX "NDArray") diff --git a/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonContext.java b/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonContext.java index 6c96dd3..2063c0b 100644 --- a/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonContext.java +++ b/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonContext.java @@ -13,6 +13,8 @@ import org.simantics.databoard.Bindings; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.error.BindingException; import org.simantics.databoard.binding.mutable.Variant; +import org.simantics.scl.runtime.SCLContext; +import org.simantics.scl.runtime.reporting.SCLReportingHandler; public class PythonContext implements Closeable { private long contextID; @@ -75,7 +77,14 @@ public class PythonContext implements Closeable { } public void executePythonStatement(String statement) { - execute(() -> executePythonStatementImpl( contextID, statement )); + SCLContext sclContext = SCLContext.getCurrent(); + + execute(() -> { + SCLContext.push(sclContext); + executePythonStatementImpl( contextID, statement ); + SCLContext.pop(); + }); + for (Listener l : listeners) { l.updated(null); } } -- 2.45.2