2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
18 #include "java/lang/Object.h"
19 #include "java/lang/Class.h"
20 #include "java/lang/String.h"
21 #include "java/lang/Throwable.h"
22 #include "java/lang/Boolean.h"
23 #include "java/lang/Byte.h"
24 #include "java/lang/Character.h"
25 #include "java/lang/Double.h"
26 #include "java/lang/Float.h"
27 #include "java/lang/Integer.h"
28 #include "java/lang/Long.h"
29 #include "java/lang/Short.h"
30 #include "java/util/Iterator.h"
32 #include "functions.h"
35 using namespace java::lang;
36 using namespace java::util;
38 PyObject *PyExc_JavaError = PyExc_ValueError;
39 PyObject *PyExc_InvalidArgsError = PyExc_ValueError;
41 PyObject *_set_exception_types(PyObject *self, PyObject *args)
43 if (!PyArg_ParseTuple(args, "OO",
44 &PyExc_JavaError, &PyExc_InvalidArgsError))
50 PyObject *_set_function_self(PyObject *self, PyObject *args)
52 PyObject *object, *module;
54 if (!PyArg_ParseTuple(args, "OO", &object, &module))
57 if (!PyCFunction_Check(object))
59 PyErr_SetObject(PyExc_TypeError, object);
63 PyCFunctionObject *cfn = (PyCFunctionObject *) object;
66 Py_XDECREF(cfn->m_self);
72 PyObject *findClass(PyObject *self, PyObject *args)
76 if (!PyArg_ParseTuple(args, "s", &className))
80 jclass cls = env->findClass(className);
83 return t_Class::wrap_Object(Class(cls));
89 return PyErr_SetJavaError();
98 static boxfn get_boxfn(PyTypeObject *type)
100 static PyObject *boxfn_ = PyString_FromString("boxfn_");
101 PyObject *cobj = PyObject_GetAttr((PyObject *) type, boxfn_);
107 fn = (boxfn) PyCObject_AsVoidPtr(cobj);
113 static int is_instance_of(PyObject *arg, PyTypeObject *type)
115 static PyObject *class_ = PyString_FromString("class_");
116 PyObject *clsObj = PyObject_GetAttr((PyObject *) type, class_);
122 result = env->get_vm_env()->
123 IsInstanceOf(((t_Object *) arg)->object.this$,
124 (jclass) ((t_Object *) clsObj)->object.this$);
131 #if defined(_MSC_VER) || defined(__SUNPRO_CC)
132 int __parseArgs(PyObject *args, char *types, ...)
134 int count = ((PyTupleObject *)(args))->ob_size;
137 va_start(list, types);
138 va_start(check, types);
140 return _parseArgs(((PyTupleObject *)(args))->ob_item, count, types,
144 int __parseArg(PyObject *arg, char *types, ...)
148 va_start(list, types);
149 va_start(check, types);
151 return _parseArgs(&arg, 1, types, list, check);
154 int _parseArgs(PyObject **args, unsigned int count, char *types,
155 va_list list, va_list check)
157 unsigned int typeCount = strlen(types);
159 if (count > typeCount)
163 int _parseArgs(PyObject **args, unsigned int count, char *types, ...)
165 unsigned int typeCount = strlen(types);
168 if (count > typeCount)
171 va_start(list, types);
172 va_start(check, types);
177 PyErr_SetString(PyExc_RuntimeError, "initVM() must be called first");
181 JNIEnv *vm_env = env->get_vm_env();
185 PyErr_SetString(PyExc_RuntimeError, "attachCurrentThread() must be called first");
189 unsigned int pos = 0;
192 for (unsigned int a = 0; a < count; a++, pos++) {
193 PyObject *arg = args[a];
195 switch (types[pos]) {
205 case 'j': /* Java object, with class$ */
206 case 'k': /* Java object, with initializeClass */
207 case 'K': /* Java object, with initializeClass and params */
211 switch (types[pos]) {
213 cls = (jclass) va_arg(list, Class *)->this$;
218 getclassfn initializeClass = va_arg(list, getclassfn);
219 cls = (*initializeClass)();
225 PyErr_SetJavaError();
237 /* ensure that class Class is initialized (which may not be the
238 * case because of earlier recursion avoidance (JObject(cls)).
241 Class::initializeClass();
245 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayObject)))
248 if (PySequence_Check(arg) &&
249 !PyString_Check(arg) && !PyUnicode_Check(arg))
251 if (PySequence_Length(arg) > 0)
253 PyObject *obj = PySequence_GetItem(arg, 0);
258 else if (PyObject_TypeCheck(obj, &PY_TYPE(Object)) &&
259 vm_env->IsInstanceOf(((t_Object *) obj)->object.this$, cls))
261 else if (PyObject_TypeCheck(obj, &PY_TYPE(FinalizerProxy)))
263 PyObject *o = ((t_fp *) obj)->object;
265 if (PyObject_TypeCheck(o, &PY_TYPE(Object)) &&
266 vm_env->IsInstanceOf(((t_Object *) o)->object.this$, cls))
278 else if (PyObject_TypeCheck(arg, &PY_TYPE(Object)) &&
279 vm_env->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
281 else if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
283 arg = ((t_fp *) arg)->object;
284 if (PyObject_TypeCheck(arg, &PY_TYPE(Object)) &&
285 vm_env->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
292 case 'Z': /* boolean, strict */
299 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayBool)))
302 if (PySequence_Check(arg))
304 if (PySequence_Length(arg) > 0)
306 PyObject *obj = PySequence_GetItem(arg, 0);
307 int ok = obj == Py_True || obj == Py_False;
317 else if (arg == Py_True || arg == Py_False)
329 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayByte)))
332 else if (PyString_Check(arg) && (PyString_Size(arg) == 1))
334 else if (PyInt_CheckExact(arg))
346 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayChar)))
349 else if (PyUnicode_Check(arg) && PyUnicode_GET_SIZE(arg) == 1)
361 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayInt)))
364 if (PySequence_Check(arg))
366 if (PySequence_Length(arg) > 0)
368 PyObject *obj = PySequence_GetItem(arg, 0);
369 int ok = PyInt_CheckExact(obj);
379 else if (PyInt_CheckExact(arg))
385 case 'S': /* short */
392 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayShort)))
395 if (PySequence_Check(arg))
397 if (PySequence_Length(arg) > 0)
399 PyObject *obj = PySequence_GetItem(arg, 0);
400 int ok = PyInt_CheckExact(obj);
410 else if (PyInt_CheckExact(arg))
416 case 'D': /* double */
423 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayDouble)))
426 if (PySequence_Check(arg))
428 if (PySequence_Length(arg) > 0)
430 PyObject *obj = PySequence_GetItem(arg, 0);
431 int ok = PyFloat_CheckExact(obj);
441 else if (PyFloat_CheckExact(arg))
447 case 'F': /* float */
454 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayFloat)))
457 if (PySequence_Check(arg))
459 if (PySequence_Length(arg) > 0)
461 PyObject *obj = PySequence_GetItem(arg, 0);
462 int ok = PyFloat_CheckExact(obj);
472 else if (PyFloat_CheckExact(arg))
478 case 'J': /* long long */
485 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayLong)))
488 if (PySequence_Check(arg))
490 if (PySequence_Length(arg) > 0)
492 PyObject *obj = PySequence_GetItem(arg, 0);
493 int ok = PyLong_CheckExact(obj);
503 else if (PyLong_CheckExact(arg))
509 case 's': /* string */
516 if (PyObject_TypeCheck(arg, PY_TYPE(JArrayString)))
519 if (PySequence_Check(arg) &&
520 !PyString_Check(arg) && !PyUnicode_Check(arg))
522 if (PySequence_Length(arg) > 0)
524 PyObject *obj = PySequence_GetItem(arg, 0);
527 PyString_Check(obj) || PyUnicode_Check(obj));
537 else if (arg == Py_None ||
538 PyString_Check(arg) || PyUnicode_Check(arg))
544 case 'o': /* java.lang.Object */
547 case 'O': /* java.lang.Object with type param */
549 PyTypeObject *type = va_arg(list, PyTypeObject *);
553 boxfn fn = get_boxfn(type);
555 if (fn == NULL || fn(type, arg, NULL) < 0)
561 case 'T': /* tuple of python types with wrapfn_ */
563 static PyObject *wrapfn_ = PyString_FromString("wrapfn_");
564 int len = va_arg(list, int);
566 if (PyTuple_Check(arg))
568 if (PyTuple_GET_SIZE(arg) != len)
571 for (int i = 0; i < len; i++) {
572 PyObject *type = PyTuple_GET_ITEM(arg, i);
574 if (!(type == Py_None ||
575 (PyType_Check(type) &&
576 PyObject_HasAttr(type, wrapfn_))))
588 if (types[pos] != '[')
595 if (pos != typeCount)
600 for (unsigned int a = 0; a < count; a++, pos++) {
601 PyObject *arg = args[a];
603 switch (types[pos]) {
613 case 'j': /* Java object except String and Object */
614 case 'k': /* Java object, with initializeClass */
615 case 'K': /* Java object, with initializeClass and params */
619 switch (types[pos]) {
621 cls = (jclass) va_arg(check, Class *)->this$;
625 getclassfn initializeClass = va_arg(check, getclassfn);
626 cls = (*initializeClass)();
632 JArray<jobject> *array = va_arg(list, JArray<jobject> *);
634 #ifdef _java_generics
635 if (types[pos] == 'K')
637 PyTypeObject ***tp = va_arg(list, PyTypeObject ***);
639 va_arg(list, getparametersfn);
644 *array = JArray<jobject>((jobject) NULL);
645 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayObject)))
646 *array = ((t_JArray<jobject> *) arg)->array;
648 *array = JArray<jobject>(cls, arg);
650 if (PyErr_Occurred())
655 Object *obj = va_arg(list, Object *);
657 if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
658 arg = ((t_fp *) arg)->object;
660 #ifdef _java_generics
661 if (types[pos] == 'K')
663 PyTypeObject ***tp = va_arg(list, PyTypeObject ***);
664 PyTypeObject **(*parameters_)(void *) =
665 va_arg(list, getparametersfn);
670 *tp = (*parameters_)(arg);
674 *obj = arg == Py_None
676 : ((t_Object *) arg)->object;
681 case 'Z': /* boolean, strict */
685 JArray<jboolean> *array = va_arg(list, JArray<jboolean> *);
688 *array = JArray<jboolean>((jobject) NULL);
689 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayBool)))
690 *array = ((t_JArray<jboolean> *) arg)->array;
692 *array = JArray<jboolean>(arg);
694 if (PyErr_Occurred())
699 jboolean *b = va_arg(list, jboolean *);
709 JArray<jbyte> *array = va_arg(list, JArray<jbyte> *);
712 *array = JArray<jbyte>((jobject) NULL);
713 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayByte)))
714 *array = ((t_JArray<jbyte> *) arg)->array;
716 *array = JArray<jbyte>(arg);
718 if (PyErr_Occurred())
721 else if (PyString_Check(arg))
723 jbyte *a = va_arg(list, jbyte *);
724 *a = (jbyte) PyString_AS_STRING(arg)[0];
728 jbyte *a = va_arg(list, jbyte *);
729 *a = (jbyte) PyInt_AsLong(arg);
738 JArray<jchar> *array = va_arg(list, JArray<jchar> *);
741 *array = JArray<jchar>((jobject) NULL);
742 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayChar)))
743 *array = ((t_JArray<jchar> *) arg)->array;
745 *array = JArray<jchar>(arg);
747 if (PyErr_Occurred())
752 jchar *c = va_arg(list, jchar *);
753 *c = (jchar) PyUnicode_AS_UNICODE(arg)[0];
762 JArray<jint> *array = va_arg(list, JArray<jint> *);
765 *array = JArray<jint>((jobject) NULL);
766 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayInt)))
767 *array = ((t_JArray<jint> *) arg)->array;
769 *array = JArray<jint>(arg);
771 if (PyErr_Occurred())
776 jint *n = va_arg(list, jint *);
777 *n = (jint) PyInt_AsLong(arg);
782 case 'S': /* short */
786 JArray<jshort> *array = va_arg(list, JArray<jshort> *);
789 *array = JArray<jshort>((jobject) NULL);
790 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayShort)))
791 *array = ((t_JArray<jshort> *) arg)->array;
793 *array = JArray<jshort>(arg);
795 if (PyErr_Occurred())
800 jshort *n = va_arg(list, jshort *);
801 *n = (jshort) PyInt_AsLong(arg);
806 case 'D': /* double */
810 JArray<jdouble> *array = va_arg(list, JArray<jdouble> *);
813 *array = JArray<jdouble>((jobject) NULL);
814 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayDouble)))
815 *array = ((t_JArray<jdouble> *) arg)->array;
817 *array = JArray<jdouble>(arg);
819 if (PyErr_Occurred())
824 jdouble *d = va_arg(list, jdouble *);
825 *d = (jdouble) PyFloat_AsDouble(arg);
830 case 'F': /* float */
834 JArray<jfloat> *array = va_arg(list, JArray<jfloat> *);
837 *array = JArray<jfloat>((jobject) NULL);
838 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayFloat)))
839 *array = ((t_JArray<jfloat> *) arg)->array;
841 *array = JArray<jfloat>(arg);
843 if (PyErr_Occurred())
848 jfloat *d = va_arg(list, jfloat *);
849 *d = (jfloat) (float) PyFloat_AsDouble(arg);
854 case 'J': /* long long */
858 JArray<jlong> *array = va_arg(list, JArray<jlong> *);
861 *array = JArray<jlong>((jobject) NULL);
862 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayLong)))
863 *array = ((t_JArray<jlong> *) arg)->array;
865 *array = JArray<jlong>(arg);
867 if (PyErr_Occurred())
872 jlong *l = va_arg(list, jlong *);
873 *l = (jlong) PyLong_AsLongLong(arg);
878 case 's': /* string */
882 JArray<jstring> *array = va_arg(list, JArray<jstring> *);
885 *array = JArray<jstring>((jobject) NULL);
886 else if (PyObject_TypeCheck(arg, PY_TYPE(JArrayString)))
887 *array = ((t_JArray<jstring> *) arg)->array;
889 *array = JArray<jstring>(arg);
891 if (PyErr_Occurred())
896 String *str = va_arg(list, String *);
903 if (PyErr_Occurred())
910 case 'o': /* java.lang.Object */
911 case 'O': /* java.lang.Object with type param */
915 JArray<Object> *array = va_arg(list, JArray<Object> *);
918 *array = JArray<Object>((jobject) NULL);
920 *array = JArray<Object>(arg);
922 if (PyErr_Occurred())
927 Object *obj = va_arg(list, Object *);
929 if (types[pos] == 'O')
931 PyTypeObject *type = va_arg(check, PyTypeObject *);
935 boxfn fn = get_boxfn(type);
937 if (fn == NULL || fn(type, arg, obj) < 0)
944 if (boxObject(NULL, arg, obj) < 0)
950 case 'T': /* tuple of python types with wrapfn_ */
952 int len = va_arg(check, int);
953 PyTypeObject **types = va_arg(list, PyTypeObject **);
955 for (int i = 0; i < len; i++) {
956 PyObject *type = PyTuple_GET_ITEM(arg, i);
961 types[i] = (PyTypeObject *) type;
970 if (types[pos] != '[')
974 if (pos == typeCount)
981 String p2j(PyObject *object)
983 return String(env->fromPyString(object));
986 PyObject *j2p(const String& js)
988 return env->fromJString((jstring) js.this$, 0);
991 PyObject *PyErr_SetArgsError(char *name, PyObject *args)
993 if (!PyErr_Occurred())
995 PyObject *err = Py_BuildValue("(sO)", name, args);
997 PyErr_SetObject(PyExc_InvalidArgsError, err);
1004 PyObject *PyErr_SetArgsError(PyObject *self, char *name, PyObject *args)
1006 if (!PyErr_Occurred())
1008 PyObject *type = (PyObject *) self->ob_type;
1009 PyObject *err = Py_BuildValue("(OsO)", type, name, args);
1011 PyErr_SetObject(PyExc_InvalidArgsError, err);
1018 PyObject *PyErr_SetArgsError(PyTypeObject *type, char *name, PyObject *args)
1020 if (!PyErr_Occurred())
1022 PyObject *err = Py_BuildValue("(OsO)", type, name, args);
1024 PyErr_SetObject(PyExc_InvalidArgsError, err);
1031 PyObject *PyErr_SetJavaError()
1033 JNIEnv *vm_env = env->get_vm_env();
1034 jthrowable throwable = vm_env->ExceptionOccurred();
1037 vm_env->ExceptionClear();
1038 err = t_Throwable::wrap_Object(Throwable(throwable));
1040 PyErr_SetObject(PyExc_JavaError, err);
1046 void throwPythonError(void)
1048 PyObject *exc = PyErr_Occurred();
1050 if (exc && PyErr_GivenExceptionMatches(exc, PyExc_JavaError))
1052 PyObject *value, *traceback;
1054 PyErr_Fetch(&exc, &value, &traceback);
1057 PyObject *je = PyObject_CallMethod(value, "getJavaException", "");
1060 PyErr_Restore(exc, value, traceback);
1065 Py_XDECREF(traceback);
1068 if (exc && PyObject_TypeCheck(exc, &PY_TYPE(Throwable)))
1070 jobject jobj = ((t_Throwable *) exc)->object.this$;
1072 env->get_vm_env()->Throw((jthrowable) jobj);
1082 Py_XDECREF(traceback);
1085 else if (exc && PyErr_GivenExceptionMatches(exc, PyExc_StopIteration))
1093 PyObject *name = PyObject_GetAttrString(exc, "__name__");
1095 env->get_vm_env()->ThrowNew(env->getPythonExceptionClass(),
1096 PyString_AS_STRING(name));
1100 env->get_vm_env()->ThrowNew(env->getPythonExceptionClass(),
1104 void throwTypeError(const char *name, PyObject *object)
1106 PyObject *tuple = Py_BuildValue("(ssO)", "while calling", name, object);
1108 PyErr_SetObject(PyExc_TypeError, tuple);
1111 env->get_vm_env()->ThrowNew(env->getPythonExceptionClass(), "type error");
1114 int abstract_init(PyObject *self, PyObject *args, PyObject *kwds)
1117 Py_BuildValue("(sO)", "instantiating java class", self->ob_type);
1119 PyErr_SetObject(PyExc_NotImplementedError, err);
1125 PyObject *callSuper(PyTypeObject *type, const char *name, PyObject *args,
1128 PyObject *super = (PyObject *) type->tp_base;
1130 PyObject_GetAttrString(super, (char *) name); // python 2.4 cast
1136 if (cardinality > 1)
1137 value = PyObject_Call(method, args, NULL);
1140 #if PY_VERSION_HEX < 0x02040000
1141 PyObject *tuple = Py_BuildValue("(O)", args);
1143 PyObject *tuple = PyTuple_Pack(1, args);
1145 value = PyObject_Call(method, tuple, NULL);
1154 PyObject *callSuper(PyTypeObject *type, PyObject *self,
1155 const char *name, PyObject *args, int cardinality)
1157 #if PY_VERSION_HEX < 0x02040000
1158 PyObject *tuple = Py_BuildValue("(OO)", type, self);
1160 PyObject *tuple = PyTuple_Pack(2, type, self);
1162 PyObject *super = PyObject_Call((PyObject *) &PySuper_Type, tuple, NULL);
1163 PyObject *method, *value;
1169 method = PyObject_GetAttrString(super, (char *) name); // python 2.4 cast
1174 if (cardinality > 1)
1175 value = PyObject_Call(method, args, NULL);
1178 #if PY_VERSION_HEX < 0x02040000
1179 tuple = Py_BuildValue("(O)", args);
1181 tuple = PyTuple_Pack(1, args);
1183 value = PyObject_Call(method, tuple, NULL);
1192 PyObject *castCheck(PyObject *obj, getclassfn initializeClass,
1195 if (PyObject_TypeCheck(obj, &PY_TYPE(FinalizerProxy)))
1196 obj = ((t_fp *) obj)->object;
1198 if (!PyObject_TypeCheck(obj, &PY_TYPE(Object)))
1201 PyErr_SetObject(PyExc_TypeError, obj);
1205 jobject jobj = ((t_Object *) obj)->object.this$;
1207 if (jobj && !env->isInstanceOf(jobj, initializeClass))
1210 PyErr_SetObject(PyExc_TypeError, obj);
1218 PyObject *get_extension_iterator(PyObject *self)
1220 return PyObject_CallMethod(self, "iterator", "");
1223 PyObject *get_extension_next(PyObject *self)
1225 return PyObject_CallMethod(self, "next", "");
1228 PyObject *get_extension_nextElement(PyObject *self)
1230 return PyObject_CallMethod(self, "nextElement", "");
1233 jobjectArray fromPySequence(jclass cls, PyObject *sequence)
1235 if (sequence == Py_None)
1238 if (!PySequence_Check(sequence))
1240 PyErr_SetObject(PyExc_TypeError, sequence);
1244 int length = PySequence_Length(sequence);
1248 array = env->newObjectArray(cls, length);
1254 PyErr_SetJavaError();
1261 JNIEnv *vm_env = env->get_vm_env();
1263 for (int i = 0; i < length; i++) {
1264 PyObject *obj = PySequence_GetItem(sequence, i);
1270 else if (obj == Py_None)
1272 else if (PyString_Check(obj) || PyUnicode_Check(obj))
1274 jobj = env->fromPyString(obj);
1277 else if (PyObject_TypeCheck(obj, &PY_TYPE(JObject)))
1278 jobj = ((t_JObject *) obj)->object.this$;
1279 else if (PyObject_TypeCheck(obj, &PY_TYPE(FinalizerProxy)))
1280 jobj = ((t_JObject *) ((t_fp *) obj)->object)->object.this$;
1281 else /* todo: add auto-boxing of primitive types */
1283 PyErr_SetObject(PyExc_TypeError, obj);
1291 env->setObjectArrayElement(array, i, jobj);
1293 vm_env->DeleteLocalRef(jobj);
1297 PyErr_SetJavaError();
1308 void installType(PyTypeObject *type, PyObject *module, char *name,
1311 if (PyType_Ready(type) == 0)
1316 type->ob_type = &PY_TYPE(FinalizerClass);
1317 Py_INCREF(&PY_TYPE(FinalizerClass));
1319 PyModule_AddObject(module, name, (PyObject *) type);
1323 PyObject *wrapType(PyTypeObject *type, const jobject& obj)
1325 static PyObject *wrapfn_ = PyString_FromString("wrapfn_");
1326 PyObject *cobj = PyObject_GetAttr((PyObject *) type, wrapfn_);
1327 PyObject *(*wrapfn)(const jobject&);
1332 wrapfn = (PyObject *(*)(const jobject &)) PyCObject_AsVoidPtr(cobj);
1338 PyObject *unboxBoolean(const jobject& obj)
1342 if (!env->isInstanceOf(obj, java::lang::Boolean::initializeClass))
1344 PyErr_SetObject(PyExc_TypeError,
1345 (PyObject *) &java::lang::PY_TYPE(Boolean));
1349 if (env->booleanValue(obj))
1358 PyObject *unboxByte(const jobject &obj)
1362 if (!env->isInstanceOf(obj, java::lang::Byte::initializeClass))
1364 PyErr_SetObject(PyExc_TypeError,
1365 (PyObject *) &java::lang::PY_TYPE(Byte));
1369 return PyInt_FromLong((long) env->byteValue(obj));
1375 PyObject *unboxCharacter(const jobject &obj)
1379 if (!env->isInstanceOf(obj, java::lang::Character::initializeClass))
1381 PyErr_SetObject(PyExc_TypeError,
1382 (PyObject *) &java::lang::PY_TYPE(Character));
1386 jchar c = env->charValue(obj);
1387 return PyUnicode_FromUnicode((Py_UNICODE *) &c, 1);
1393 PyObject *unboxDouble(const jobject &obj)
1397 if (!env->isInstanceOf(obj, java::lang::Double::initializeClass))
1399 PyErr_SetObject(PyExc_TypeError,
1400 (PyObject *) &java::lang::PY_TYPE(Double));
1404 return PyFloat_FromDouble((double) env->doubleValue(obj));
1410 PyObject *unboxFloat(const jobject &obj)
1414 if (!env->isInstanceOf(obj, java::lang::Float::initializeClass))
1416 PyErr_SetObject(PyExc_TypeError,
1417 (PyObject *) &java::lang::PY_TYPE(Float));
1421 return PyFloat_FromDouble((double) env->floatValue(obj));
1427 PyObject *unboxInteger(const jobject &obj)
1431 if (!env->isInstanceOf(obj, java::lang::Integer::initializeClass))
1433 PyErr_SetObject(PyExc_TypeError,
1434 (PyObject *) &java::lang::PY_TYPE(Integer));
1438 return PyInt_FromLong((long) env->intValue(obj));
1444 PyObject *unboxLong(const jobject &obj)
1448 if (!env->isInstanceOf(obj, java::lang::Long::initializeClass))
1450 PyErr_SetObject(PyExc_TypeError,
1451 (PyObject *) &java::lang::PY_TYPE(Long));
1455 return PyLong_FromLongLong((PY_LONG_LONG) env->longValue(obj));
1461 PyObject *unboxShort(const jobject &obj)
1465 if (!env->isInstanceOf(obj, java::lang::Short::initializeClass))
1467 PyErr_SetObject(PyExc_TypeError,
1468 (PyObject *) &java::lang::PY_TYPE(Short));
1472 return PyInt_FromLong((long) env->shortValue(obj));
1478 PyObject *unboxString(const jobject &obj)
1482 if (!env->isInstanceOf(obj, java::lang::String::initializeClass))
1484 PyErr_SetObject(PyExc_TypeError,
1485 (PyObject *) &java::lang::PY_TYPE(String));
1489 return env->fromJString((jstring) obj, 0);
1495 static int boxJObject(PyTypeObject *type, PyObject *arg,
1496 java::lang::Object *obj)
1501 *obj = Object(NULL);
1503 else if (PyObject_TypeCheck(arg, &PY_TYPE(Object)))
1505 if (type != NULL && !is_instance_of(arg, type))
1509 *obj = ((t_Object *) arg)->object;
1511 else if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
1513 arg = ((t_fp *) arg)->object;
1514 if (PyObject_TypeCheck(arg, &PY_TYPE(Object)))
1516 if (type != NULL && !is_instance_of(arg, type))
1520 *obj = ((t_Object *) arg)->object;
1531 int boxBoolean(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1533 int result = boxJObject(type, arg, obj);
1541 *obj = *Boolean::TRUE;
1543 else if (arg == Py_False)
1546 *obj = *Boolean::FALSE;
1554 int boxByte(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1556 int result = boxJObject(type, arg, obj);
1561 if (PyInt_Check(arg))
1563 int n = PyInt_AS_LONG(arg);
1564 jbyte b = (jbyte) n;
1574 else if (PyLong_Check(arg))
1576 PY_LONG_LONG ln = PyLong_AsLongLong(arg);
1577 jbyte b = (jbyte) ln;
1587 else if (PyFloat_Check(arg))
1589 double d = PyFloat_AS_DOUBLE(arg);
1590 jbyte b = (jbyte) d;
1606 int boxCharacter(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1608 int result = boxJObject(type, arg, obj);
1613 if (PyString_Check(arg))
1618 if (PyString_AsStringAndSize(arg, &c, &len) < 0 || len != 1)
1622 *obj = Character((jchar) c[0]);
1624 else if (PyUnicode_Check(arg))
1626 Py_ssize_t len = PyUnicode_GetSize(arg);
1632 *obj = Character((jchar) PyUnicode_AsUnicode(arg)[0]);
1640 int boxCharSequence(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1642 int result = boxJObject(type, arg, obj);
1647 if (PyString_Check(arg) || PyUnicode_Check(arg))
1652 if (PyErr_Occurred())
1662 int boxDouble(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1664 int result = boxJObject(type, arg, obj);
1669 if (PyInt_Check(arg))
1672 *obj = Double((jdouble) PyInt_AS_LONG(arg));
1674 else if (PyLong_Check(arg))
1677 *obj = Double((jdouble) PyLong_AsLongLong(arg));
1679 else if (PyFloat_Check(arg))
1682 *obj = Double(PyFloat_AS_DOUBLE(arg));
1690 int boxFloat(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1692 int result = boxJObject(type, arg, obj);
1697 if (PyInt_Check(arg))
1700 *obj = Float((jfloat) PyInt_AS_LONG(arg));
1702 else if (PyLong_Check(arg))
1704 PY_LONG_LONG ln = PyLong_AsLongLong(arg);
1705 float f = (float) ln;
1707 if ((PY_LONG_LONG) f == ln)
1715 else if (PyFloat_Check(arg))
1717 double d = PyFloat_AS_DOUBLE(arg);
1718 float f = (float) d;
1720 if ((double) f == d)
1734 int boxInteger(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1736 int result = boxJObject(type, arg, obj);
1741 if (PyInt_Check(arg))
1744 *obj = Integer((jint) PyInt_AS_LONG(arg));
1746 else if (PyLong_Check(arg))
1748 PY_LONG_LONG ln = PyLong_AsLongLong(arg);
1759 else if (PyFloat_Check(arg))
1761 double d = PyFloat_AS_DOUBLE(arg);
1764 if ((double) n == d)
1778 int boxLong(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1780 int result = boxJObject(type, arg, obj);
1785 if (PyInt_Check(arg))
1788 *obj = Long((jlong) PyInt_AS_LONG(arg));
1790 else if (PyLong_Check(arg))
1793 *obj = Long((jlong) PyLong_AsLongLong(arg));
1795 else if (PyFloat_Check(arg))
1797 double d = PyFloat_AS_DOUBLE(arg);
1798 PY_LONG_LONG n = (PY_LONG_LONG) d;
1800 if ((double) n == d)
1803 *obj = Long((jlong) n);
1814 int boxNumber(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1816 int result = boxJObject(type, arg, obj);
1821 if (PyInt_Check(arg))
1824 *obj = Integer((jint) PyInt_AS_LONG(arg));
1826 else if (PyLong_Check(arg))
1829 *obj = Long((jlong) PyLong_AsLongLong(arg));
1831 else if (PyFloat_Check(arg))
1834 *obj = Double((jdouble) PyFloat_AS_DOUBLE(arg));
1842 int boxShort(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1844 int result = boxJObject(type, arg, obj);
1849 if (PyInt_Check(arg))
1851 int n = (int) PyInt_AS_LONG(arg);
1852 short sn = (short) n;
1857 *obj = Short((jshort) sn);
1862 else if (PyLong_Check(arg))
1864 PY_LONG_LONG ln = PyLong_AsLongLong(arg);
1865 short sn = (short) ln;
1870 *obj = Short((jshort) sn);
1875 else if (PyFloat_Check(arg))
1877 double d = PyFloat_AS_DOUBLE(arg);
1878 short sn = (short) (int) d;
1880 if ((double) sn == d)
1883 *obj = Short((jshort) sn);
1894 int boxString(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1896 int result = boxJObject(type, arg, obj);
1901 if (PyString_Check(arg) || PyUnicode_Check(arg))
1906 if (PyErr_Occurred())
1916 int boxObject(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
1918 int result = boxJObject(type, arg, obj);
1925 if (PyString_Check(arg) || PyUnicode_Check(arg))
1928 if (PyErr_Occurred())
1931 else if (arg == Py_True)
1932 *obj = *Boolean::TRUE;
1933 else if (arg == Py_False)
1934 *obj = *Boolean::FALSE;
1935 else if (PyInt_Check(arg))
1937 long ln = PyInt_AS_LONG(arg);
1941 *obj = Long((jlong) ln);
1943 *obj = Integer((jint) n);
1945 else if (PyLong_Check(arg))
1946 *obj = Long((jlong) PyLong_AsLongLong(arg));
1947 else if (PyFloat_Check(arg))
1948 *obj = Double((jdouble) PyFloat_AS_DOUBLE(arg));
1952 else if (!(PyString_Check(arg) || PyUnicode_Check(arg) ||
1953 arg == Py_True || arg == Py_False ||
1954 PyInt_Check(arg) || PyLong_Check(arg) ||
1955 PyFloat_Check(arg)))
1962 #ifdef _java_generics
1963 PyObject *typeParameters(PyTypeObject *types[], size_t size)
1965 size_t count = size / sizeof(PyTypeObject *);
1966 PyObject *tuple = PyTuple_New(count);
1968 for (size_t i = 0; i < count; i++) {
1969 PyObject *type = (PyObject *) types[i];
1974 PyTuple_SET_ITEM(tuple, i, type);