+PyObject *getPythonBooleanObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, BOOLEANBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue_", "(L" OBJECT_CLASS ";)Z");\r
+\r
+ jboolean bvalue = (*env)->CallBooleanMethod(env, binding, getValueMethod, object);\r
+ return getPythonBool(bvalue);\r
+}\r
+\r
+PyObject *getPythonByteObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, BYTEBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue_", "(L" OBJECT_CLASS ";)B");\r
+\r
+ jbyte v = (*env)->CallByteMethod(env, binding, getValueMethod, object);\r
+ return PyLong_FromLong(v);\r
+}\r
+\r
+PyObject *getPythonIntegerObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, INTEGERBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue_", "(L" OBJECT_CLASS ";)I");\r
+\r
+ jint v = (*env)->CallIntMethod(env, binding, getValueMethod, object);\r
+ return PyLong_FromLong(v);\r
+}\r
+\r
+PyObject *getPythonLongObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, LONGBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue_", "(L" OBJECT_CLASS ";)J");\r
+\r
+ jlong v = (*env)->CallLongMethod(env, binding, getValueMethod, object);\r
+ return PyLong_FromLongLong(v);\r
+}\r
+\r
+PyObject *getPythonFloatObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, FLOATBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue_", "(L" OBJECT_CLASS ";)F");\r
+\r
+ jfloat v = (*env)->CallFloatMethod(env, binding, getValueMethod, object);\r
+ return PyFloat_FromDouble(v);\r
+}\r
+\r
+PyObject *getPythonDoubleObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, DOUBLEBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue_", "(L" OBJECT_CLASS ";)D");\r
+\r
+ jdouble v = (*env)->CallDoubleMethod(env, binding, getValueMethod, object);\r
+ return PyFloat_FromDouble(v);\r
+}\r
+\r
+PyObject *getPythonStringObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, STRINGBINDING_CLASS);\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue", "(L" OBJECT_CLASS ";)L" STRING_CLASS ";");\r
+\r
+ jobject string = (*env)->CallObjectMethod(env, binding, getValueMethod, object);\r
+ jsize len = (*env)->GetStringLength(env, string);\r
+ const jchar *chars = (*env)->GetStringChars(env, string, NULL);\r
+\r
+ PyObject *value = PyUnicode_DecodeUTF16((char*)chars, 2*len, NULL, NULL);\r
+\r
+ (*env)->ReleaseStringChars(env, string, chars);\r
+ return value;\r
+}\r
+\r
+PyObject *getPythonRecordObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, RECORDBINDING_CLASS);\r
+ jmethodID typeMethod = (*env)->GetMethodID(env, bindingClass, "type", "()L" RECORDTYPE_CLASS ";");\r
+ jmethodID getComponent = (*env)->GetMethodID(env, bindingClass, "getComponent", "(L" OBJECT_CLASS ";I)L" OBJECT_CLASS ";");\r
+ jmethodID getComponentBinding = (*env)->GetMethodID(env, bindingClass, "getComponentBinding", "(I)L" BINDING_CLASS ";");\r
+\r
+ jclass recordType = (*env)->FindClass(env, RECORDTYPE_CLASS);\r
+ jmethodID getTypeComponent = (*env)->GetMethodID(env, recordType, "getComponent", "(I)L" COMPONENT_CLASS ";");\r
+ jmethodID getComponentCount = (*env)->GetMethodID(env, recordType, "getComponentCount", "()I");\r
+\r
+ jclass componentClass = (*env)->FindClass(env, COMPONENT_CLASS);\r
+ jfieldID nameField = (*env)->GetFieldID(env, componentClass, "name", "L" STRING_CLASS ";");\r
+\r
+ jobject type = (*env)->CallObjectMethod(env, binding, typeMethod);\r
+ jint n = (*env)->CallIntMethod(env, type, getComponentCount);\r
+ jint i;\r
+\r
+ PyObject *result = PyDict_New();\r
+ for (i = 0; i < n; i++) {\r
+ jobject recordTypeComponent = (*env)->CallObjectMethod(env, type, getComponent, i);\r
+ jstring fieldName = (jstring)(*env)->GetObjectField(env, recordTypeComponent, nameField);\r
+ jobject componentObject = (*env)->CallObjectMethod(env, binding, getComponent, object, i);\r
+ jobject componentBinding = (*env)->CallObjectMethod(env, binding, getComponentBinding, i);\r
+\r
+ PyObject *item = getPythonObject(env, componentObject, componentBinding);\r
+ PyDict_SetItem(result, getPythonString(env, fieldName), item);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+PyObject *getPythonArrayObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, ARRAYBINDING_CLASS);\r
+ jmethodID componentBindingMethod = (*env)->GetMethodID(env, bindingClass, "getComponentBinding", "()L" BINDING_CLASS ";");\r
+ jmethodID sizeMethod = (*env)->GetMethodID(env, bindingClass, "size", "(L" OBJECT_CLASS ";)I");\r
+ jmethodID getMethod = (*env)->GetMethodID(env, bindingClass, "get", "(L" OBJECT_CLASS ";I)L" OBJECT_CLASS ";");\r
+\r
+ jobject componentBinding = (*env)->CallObjectMethod(env, binding, componentBindingMethod);\r
+\r
+ jint size = (*env)->CallIntMethod(env, binding, sizeMethod, object);\r
+\r
+ PyObject *result = PyList_New(size);\r
+\r
+ jint i;\r
+ for (i = 0; i < size; i++) {\r
+ jobject item = (*env)->CallObjectMethod(env, binding, getMethod, object, i);\r
+ if (item != NULL)\r
+ PyList_SetItem(result, i, getPythonObject(env, item, componentBinding));\r
+ else\r
+ PyList_SetItem(result, i, Py_None);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+PyObject *getPythonMapObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass objectClass = (*env)->FindClass(env, OBJECT_CLASS);\r
+ jclass bindingClass = (*env)->FindClass(env, MAPBINDING_CLASS);\r
+ jmethodID getKeyBindingMethod = (*env)->GetMethodID(env, bindingClass, "getKeyBinding", "()L" BINDING_CLASS ";");\r
+ jmethodID getValueBindingMethod = (*env)->GetMethodID(env, bindingClass, "getValueBinding", "()L" BINDING_CLASS ";");\r
+ jmethodID sizeMethod = (*env)->GetMethodID(env, bindingClass, "size", "(L" OBJECT_CLASS ";)I");\r
+ jmethodID getAllMethod = (*env)->GetMethodID(env, bindingClass, "getAll", "(L" OBJECT_CLASS ";[L" OBJECT_CLASS ";[L" OBJECT_CLASS ";)V");\r
+\r
+ jobject keyBinding = (*env)->CallObjectMethod(env, binding, getKeyBindingMethod);\r
+ jobject valueBinding = (*env)->CallObjectMethod(env, binding, getValueBindingMethod);\r
+\r
+ jint size = (*env)->CallIntMethod(env, binding, sizeMethod, object);\r
+ jobjectArray keys = (*env)->NewObjectArray(env, size, objectClass, NULL);\r
+ jobjectArray values = (*env)->NewObjectArray(env, size, objectClass, NULL);\r
+\r
+ PyObject *result = PyDict_New();\r
+ jint i;\r
+\r
+ (*env)->CallVoidMethod(env, binding, getAllMethod, object, keys, values);\r
+\r
+ for (i = 0; i < size; i++) {\r
+ jobject key = (*env)->GetObjectArrayElement(env, keys, i);\r
+ jobject item = (*env)->GetObjectArrayElement(env, values, i);\r
+ PyDict_SetItem(result, getPythonObject(env, key, keyBinding), getPythonObject(env, item, valueBinding));\r
+ }\r
+\r
+ (*env)->DeleteLocalRef(env, keys);\r
+ (*env)->DeleteLocalRef(env, values);\r
+\r
+ return result;\r
+}\r
+\r
+PyObject *getPythonOptionalObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, OPTIONALBINDING_CLASS);\r
+ jmethodID hasValueMethod = (*env)->GetMethodID(env, bindingClass, "hasValue", "(L" OBJECT_CLASS ";)Z");\r
+\r
+ jboolean hasValue = (*env)->CallBooleanMethod(env, binding, hasValueMethod, object);\r
+\r
+ if (hasValue) {\r
+ jmethodID componentBindingMethod = (*env)->GetMethodID(env, bindingClass, "getComponentBinding", "()L" BINDING_CLASS ";");\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "hasValue", "(L" OBJECT_CLASS ";)L" OBJECT_CLASS ";");\r
+\r
+ jobject componentBinding = (*env)->CallObjectMethod(env, binding, componentBindingMethod);\r
+ jobject value = (*env)->CallObjectMethod(env, binding, getValueMethod, object);\r
+\r
+ return getPythonObject(env, value, componentBinding);\r
+ }\r
+ else {\r
+ return Py_None;\r
+ }\r
+}\r
+\r
+PyObject *getPythonUnionObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, UNIONBINDING_CLASS);\r
+ jmethodID typeMethod = (*env)->GetMethodID(env, bindingClass, "type", "()L" RECORDTYPE_CLASS ";");\r
+ jmethodID getTagMethod = (*env)->GetMethodID(env, bindingClass, "getTag", "(L" OBJECT_CLASS ";)I");\r
+ jmethodID getValueMethod = (*env)->GetMethodID(env, bindingClass, "getValue", "(L" OBJECT_CLASS ";)L" OBJECT_CLASS ";");\r
+ jmethodID getComponentBinding = (*env)->GetMethodID(env, bindingClass, "getComponentBinding", "(I)L" BINDING_CLASS ";");\r
+\r
+ jclass unionType = (*env)->FindClass(env, UNIONTYPE_CLASS);\r
+ jmethodID getTypeComponent = (*env)->GetMethodID(env, unionType, "getComponent", "(I)L" COMPONENT_CLASS ";");\r
+\r
+ jclass componentClass = (*env)->FindClass(env, COMPONENT_CLASS);\r
+ jfieldID nameField = (*env)->GetFieldID(env, componentClass, "name", "L" STRING_CLASS ";");\r
+\r
+ jint tag = (*env)->CallIntMethod(env, binding, getTagMethod, object);\r
+ jobject value = (*env)->CallObjectMethod(env, binding, getValueMethod, object);\r
+\r
+ jobject type = (*env)->CallObjectMethod(env, binding, typeMethod);\r
+ jobject typeComponent = (*env)->CallObjectMethod(env, type, getTypeComponent, tag);\r
+ jstring compName = (*env)->GetObjectField(env, typeComponent, nameField);\r
+\r
+ jobject componentBinding = (*env)->CallObjectMethod(env, binding, getComponentBinding, tag);\r
+\r
+ PyObject *result = PyTuple_New(2);\r
+ PyTuple_SetItem(result, 0, getPythonString(env, compName));\r
+ PyTuple_SetItem(result, 1, getPythonObject(env, value, componentBinding));\r
+\r
+ return result;\r
+}\r
+\r
+PyObject *getPythonVariantObject(JNIEnv *env, jobject object, jobject binding) {\r
+ jclass bindingClass = (*env)->FindClass(env, VARIANTBINDING_CLASS);\r
+ jmethodID getContentMethod = (*env)->GetMethodID(env, bindingClass, "getContent", "(L" OBJECT_CLASS ";)L" OBJECT_CLASS ";");\r
+ jmethodID getContentBindingMethod = (*env)->GetMethodID(env, bindingClass, "getContentBinding", "(L" OBJECT_CLASS ";)L" BINDING_CLASS ";");\r
+\r
+ jobject content = (*env)->CallObjectMethod(env, binding, getContentMethod, object);\r
+ jobject contentBinding = (*env)->CallObjectMethod(env, binding, getContentBindingMethod, object);\r
+\r
+ return getPythonObject(env, content, contentBinding);\r
+}\r
+\r
+PyObject *getPythonObject(JNIEnv *env, jobject value, jobject binding) {\r
+ jclass booleanBinding = (*env)->FindClass(env, BOOLEANBINDING_CLASS);\r
+ jclass byteBinding = (*env)->FindClass(env, BYTEBINDING_CLASS);\r
+ jclass integerBinding = (*env)->FindClass(env, INTEGERBINDING_CLASS);\r
+ jclass longBinding = (*env)->FindClass(env, LONGBINDING_CLASS);\r
+ jclass floatBinding = (*env)->FindClass(env, FLOATBINDING_CLASS);\r
+ jclass doubleBinding = (*env)->FindClass(env, DOUBLEBINDING_CLASS);\r
+ jclass stringBinding = (*env)->FindClass(env, STRINGBINDING_CLASS);\r
+ jclass recordBinding = (*env)->FindClass(env, RECORDBINDING_CLASS);\r
+ jclass arrayBinding = (*env)->FindClass(env, ARRAYBINDING_CLASS);\r
+ jclass mapBinding = (*env)->FindClass(env, MAPBINDING_CLASS);\r
+ jclass optionalBinding = (*env)->FindClass(env, OPTIONALBINDING_CLASS);\r
+ jclass untionBinding = (*env)->FindClass(env, UNIONBINDING_CLASS);\r
+ jclass variantBinding = (*env)->FindClass(env, VARIANTBINDING_CLASS);\r
+\r
+ if ((*env)->IsInstanceOf(env, binding, booleanBinding)) {\r
+ return getPythonBooleanObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, byteBinding)) {\r
+ return getPythonByteObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, integerBinding)) {\r
+ return getPythonIntegerObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, longBinding)) {\r
+ return getPythonLongObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, floatBinding)) {\r
+ return getPythonFloatObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, doubleBinding)) {\r
+ return getPythonDoubleObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, stringBinding)) {\r
+ return getPythonStringObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, recordBinding)) {\r
+ return getPythonRecordObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, arrayBinding)) {\r
+ return getPythonArrayObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, mapBinding)) {\r
+ return getPythonMapObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, optionalBinding)) {\r
+ return getPythonOptionalObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, untionBinding)) {\r
+ return getPythonUnionObject(env, value, binding);\r
+ }\r
+ else if ((*env)->IsInstanceOf(env, binding, variantBinding)) {\r
+ return getPythonVariantObject(env, value, binding);\r
+ }\r
+ else {\r
+ return Py_None;\r
+ }\r
+}\r
+\r