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.
19 #include "structmember.h"
22 #include "functions.h"
23 #include "java/lang/Class.h"
25 using namespace java::lang;
28 template<typename T> class _t_JArray : public t_JArray<T> {
30 static PyObject *format;
34 static PyObject *get(U *self, Py_ssize_t n)
36 return self->array.get(n);
40 static PyObject *toSequence(U *self)
42 return self->array.toSequence();
46 static PyObject *toSequence(U *self, Py_ssize_t lo, Py_ssize_t hi)
48 return self->array.toSequence(lo, hi);
51 template<typename U> class _t_iterator {
57 static void dealloc(_t_iterator *self)
59 Py_XDECREF(self->obj);
60 self->ob_type->tp_free((PyObject *) self);
63 static PyObject *iternext(_t_iterator *self)
65 if (self->position < (Py_ssize_t) self->obj->array.length)
66 return get<U>(self->obj, self->position++);
68 PyErr_SetNone(PyExc_StopIteration);
72 static PyTypeObject *JArrayIterator;
75 template<typename T, typename U>
76 static int init(U *self, PyObject *args, PyObject *kwds)
80 if (!PyArg_ParseTuple(args, "O", &obj))
83 if (PySequence_Check(obj))
85 self->array = JArray<T>(obj);
89 else if (PyGen_Check(obj))
92 PyObject_CallFunctionObjArgs((PyObject *) &PyTuple_Type, obj, NULL);
97 self->array = JArray<T>(tuple);
102 else if (PyInt_Check(obj))
104 int n = PyInt_AsLong(obj);
108 PyErr_SetObject(PyExc_ValueError, obj);
112 self->array = JArray<T>(n);
116 PyErr_SetObject(PyExc_TypeError, obj);
123 template<typename T, typename U>
124 static void dealloc(U *self)
126 self->array = JArray<T>((jobject) NULL);
127 self->ob_type->tp_free((PyObject *) self);
131 static PyObject *_format(U *self, PyObject *(*fn)(PyObject *))
133 if (self->array.this$)
135 PyObject *list = toSequence<U>(self);
139 PyObject *result = (*fn)(list);
144 PyObject *args = PyTuple_New(1);
146 PyTuple_SET_ITEM(args, 0, result);
147 result = PyString_Format(U::format, args);
157 return PyString_FromString("<null>");
161 static PyObject *repr(U *self)
163 return _format(self, (PyObject *(*)(PyObject *)) PyObject_Repr);
167 static PyObject *str(U *self)
169 return _format(self, (PyObject *(*)(PyObject *)) PyObject_Str);
173 static int _compare(U *self, PyObject *value, int i0, int i1, int op, int *cmp)
175 PyObject *v0 = get<U>(self, i0);
176 PyObject *v1 = PySequence_Fast_GET_ITEM(value, i1); /* borrowed */
187 *cmp = PyObject_RichCompareBool(v0, v1, op);
197 static PyObject *richcompare(U *self, PyObject *value, int op)
199 PyObject *result = NULL;
202 if (!PySequence_Check(value))
204 Py_INCREF(Py_NotImplemented);
205 return Py_NotImplemented;
208 value = PySequence_Fast(value, "not a sequence");
212 s0 = PySequence_Fast_GET_SIZE(value);
213 s1 = self->array.length;
224 case Py_EQ: result = Py_False; break;
225 case Py_NE: result = Py_True; break;
233 for (i0 = 0, i1 = 0; i0 < s0 && i1 < s1 && cmp; i0++, i1++) {
234 if (_compare(self, value, i0, i1, Py_EQ, &cmp) < 0)
244 case Py_LT: cmp = s0 < s1; break;
245 case Py_LE: cmp = s0 <= s1; break;
246 case Py_EQ: cmp = s0 == s1; break;
247 case Py_NE: cmp = s0 != s1; break;
248 case Py_GT: cmp = s0 > s1; break;
249 case Py_GE: cmp = s0 >= s1; break;
253 result = cmp ? Py_True : Py_False;
255 else if (op == Py_EQ)
257 else if (op == Py_NE)
259 else if (_compare(self, value, i0, i1, op, &cmp) < 0)
265 result = cmp ? Py_True : Py_False;
274 static PyObject *iter(U *self)
277 PyObject_New(_t_iterator<U>, _t_iterator<U>::JArrayIterator);
282 it->obj = self; Py_INCREF((PyObject *) self);
285 return (PyObject *) it;
289 static Py_ssize_t seq_length(U *self)
291 if (self->array.this$)
292 return self->array.length;
298 static PyObject *seq_get(U *self, Py_ssize_t n)
300 return get<U>(self, n);
304 static int seq_contains(U *self, PyObject *value)
310 static PyObject *seq_concat(U *self, PyObject *arg)
312 PyObject *list = toSequence<U>(self);
315 PyList_Type.tp_as_sequence->sq_inplace_concat(list, arg) < 0)
325 static PyObject *seq_repeat(U *self, Py_ssize_t n)
327 PyObject *list = toSequence<U>(self);
330 PyList_Type.tp_as_sequence->sq_inplace_repeat(list, n) < 0)
340 static PyObject *seq_getslice(U *self, Py_ssize_t lo, Py_ssize_t hi)
342 return toSequence<U>(self, lo, hi);
346 static int seq_set(U *self, Py_ssize_t n, PyObject *value)
348 return self->array.set(n, value);
352 static int seq_setslice(U *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *values)
354 Py_ssize_t length = self->array.length;
358 PyErr_SetString(PyExc_ValueError, "array size cannot change");
362 if (lo < 0) lo = length + lo;
364 else if (lo > length) lo = length;
365 if (hi < 0) hi = length + hi;
367 else if (hi > length) hi = length;
368 if (lo > hi) lo = hi;
370 PyObject *sequence = PySequence_Fast(values, "not a sequence");
374 Py_ssize_t size = PySequence_Fast_GET_SIZE(sequence);
380 PyErr_SetString(PyExc_ValueError, "array size cannot change");
384 for (Py_ssize_t i = lo; i < hi; i++) {
385 PyObject *value = PySequence_Fast_GET_ITEM(sequence, i - lo);
390 if (self->array.set(i, value) < 0)
403 static jclass initializeClass(void)
405 return env->get_vm_env()->GetObjectClass(JArray<T>((Py_ssize_t) 0).this$);
409 static PyObject *cast_(PyTypeObject *type, PyObject *args, PyObject *kwds)
411 PyObject *arg, *clsObj;
413 if (!PyArg_ParseTuple(args, "O", &arg))
416 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
418 PyErr_SetObject(PyExc_TypeError, arg);
422 Class argCls = ((t_Object *) arg)->object.getClass();
424 if (!argCls.isArray())
426 PyErr_SetObject(PyExc_TypeError, arg);
430 clsObj = PyObject_GetAttrString((PyObject *) type, "class_");
434 Class arrayCls = ((t_Class *) clsObj)->object;
436 if (!arrayCls.isAssignableFrom(argCls))
438 PyErr_SetObject(PyExc_TypeError, arg);
442 return JArray<T>(((t_JObject *) arg)->object.this$).wrap();
446 static PyObject *instance_(PyTypeObject *type, PyObject *args, PyObject *kwds)
448 PyObject *arg, *clsObj;
450 if (!PyArg_ParseTuple(args, "O", &arg))
453 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
456 Class argCls = ((t_Object *) arg)->object.getClass();
458 if (!argCls.isArray())
461 clsObj = PyObject_GetAttrString((PyObject *) type, "class_");
465 Class arrayCls = ((t_Class *) clsObj)->object;
467 if (!arrayCls.isAssignableFrom(argCls))
474 static PyObject *assignable_(PyTypeObject *type, PyObject *args, PyObject *kwds)
476 return instance_<T>(type, args, kwds);
479 template< typename T, typename U = _t_JArray<T> > class jarray_type {
481 PySequenceMethods seq_methods;
482 PyTypeObject type_object;
484 class iterator_type {
486 PyTypeObject type_object;
488 void install(char *name, PyObject *module)
490 type_object.tp_name = name;
492 if (PyType_Ready(&type_object) == 0)
494 Py_INCREF((PyObject *) &type_object);
495 PyModule_AddObject(module, name, (PyObject *) &type_object);
498 _t_iterator<U>::JArrayIterator = &type_object;
503 memset(&type_object, 0, sizeof(type_object));
505 type_object.ob_refcnt = 1;
506 type_object.ob_type = NULL;
507 type_object.tp_basicsize = sizeof(_t_iterator<U>);
508 type_object.tp_dealloc = (destructor) _t_iterator<U>::dealloc;
509 type_object.tp_flags = Py_TPFLAGS_DEFAULT;
510 type_object.tp_doc = "JArrayIterator<T> wrapper type";
511 type_object.tp_iter = (getiterfunc) PyObject_SelfIter;
512 type_object.tp_iternext = (iternextfunc) _t_iterator<U>::iternext;
516 iterator_type iterator_type_object;
518 void install(char *name, char *type_name, char *iterator_name,
521 type_object.tp_name = name;
523 if (PyType_Ready(&type_object) == 0)
525 Py_INCREF((PyObject *) &type_object);
526 PyDict_SetItemString(type_object.tp_dict, "class_",
527 make_descriptor(initializeClass<T>));
529 PyModule_AddObject(module, name, (PyObject *) &type_object);
532 U::format = PyString_FromFormat("JArray<%s>%%s", type_name);
533 iterator_type_object.install(iterator_name, module);
536 static PyObject *_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
538 U *self = (U *) type->tp_alloc(type, 0);
541 self->array = JArray<T>((jobject) NULL);
543 return (PyObject *) self;
548 memset(&seq_methods, 0, sizeof(seq_methods));
549 memset(&type_object, 0, sizeof(type_object));
551 static PyMethodDef methods[] = {
553 (PyCFunction) (PyObject *(*)(PyTypeObject *,
554 PyObject *, PyObject *))
556 METH_VARARGS | METH_CLASS, NULL },
558 (PyCFunction) (PyObject *(*)(PyTypeObject *,
559 PyObject *, PyObject *))
561 METH_VARARGS | METH_CLASS, NULL },
563 (PyCFunction) (PyObject *(*)(PyTypeObject *,
564 PyObject *, PyObject *))
566 METH_VARARGS | METH_CLASS, NULL },
567 { NULL, NULL, 0, NULL }
570 seq_methods.sq_length =
571 (lenfunc) (Py_ssize_t (*)(U *)) seq_length<U>;
572 seq_methods.sq_concat =
573 (binaryfunc) (PyObject *(*)(U *, PyObject *)) seq_concat<U>;
574 seq_methods.sq_repeat =
575 (ssizeargfunc) (PyObject *(*)(U *, Py_ssize_t)) seq_repeat<U>;
576 seq_methods.sq_item =
577 (ssizeargfunc) (PyObject *(*)(U *, Py_ssize_t)) seq_get<U>;
578 seq_methods.sq_slice =
579 (ssizessizeargfunc) (PyObject *(*)(U *, Py_ssize_t, Py_ssize_t))
581 seq_methods.sq_ass_item =
582 (ssizeobjargproc) (int (*)(U *, Py_ssize_t, PyObject *)) seq_set<U>;
583 seq_methods.sq_ass_slice =
584 (ssizessizeobjargproc) (int (*)(U *, Py_ssize_t, Py_ssize_t,
585 PyObject *)) seq_setslice<U>;
586 seq_methods.sq_contains =
587 (objobjproc) (int (*)(U *, PyObject *)) seq_contains<U>;
588 seq_methods.sq_inplace_concat = NULL;
589 seq_methods.sq_inplace_repeat = NULL;
591 type_object.ob_refcnt = 1;
592 type_object.tp_basicsize = sizeof(U);
593 type_object.tp_dealloc = (destructor) (void (*)(U *)) dealloc<T,U>;
594 type_object.tp_repr = (reprfunc) (PyObject *(*)(U *)) repr<U>;
595 type_object.tp_as_sequence = &seq_methods;
596 type_object.tp_str = (reprfunc) (PyObject *(*)(U *)) str<U>;
597 type_object.tp_flags = Py_TPFLAGS_DEFAULT;
598 type_object.tp_doc = "JArray<T> wrapper type";
599 type_object.tp_richcompare =
600 (richcmpfunc) (PyObject *(*)(U *, PyObject *, int)) richcompare<U>;
601 type_object.tp_iter = (getiterfunc) (PyObject *(*)(U *)) iter<U>;
602 type_object.tp_methods = methods;
603 type_object.tp_base = &PY_TYPE(Object);
604 type_object.tp_init =
605 (initproc) (int (*)(U *, PyObject *, PyObject *)) init<T,U>;
606 type_object.tp_new = (newfunc) _new;
610 template<typename T> class _t_jobjectarray : public _t_JArray<T> {
612 PyObject *(*wrapfn)(const T&);
615 template<> PyObject *get(_t_jobjectarray<jobject> *self, Py_ssize_t n)
617 return self->array.get(n, self->wrapfn);
620 template<> PyObject *toSequence(_t_jobjectarray<jobject> *self)
622 return self->array.toSequence(self->wrapfn);
625 template<> PyObject *toSequence(_t_jobjectarray<jobject> *self,
626 Py_ssize_t lo, Py_ssize_t hi)
628 return self->array.toSequence(lo, hi, self->wrapfn);
631 template<> int init< jobject,_t_jobjectarray<jobject> >(_t_jobjectarray<jobject> *self, PyObject *args, PyObject *kwds)
633 PyObject *obj, *clsObj = NULL;
634 PyObject *(*wrapfn)(const jobject &) = NULL;
637 if (!PyArg_ParseTuple(args, "O|O", &obj, &clsObj))
641 cls = env->findClass("java/lang/Object");
642 else if (PyObject_TypeCheck(clsObj, &PY_TYPE(Class)))
643 cls = (jclass) ((t_Class *) clsObj)->object.this$;
644 else if (PyType_Check(clsObj))
646 if (PyType_IsSubtype((PyTypeObject *) clsObj, &PY_TYPE(JObject)))
648 PyObject *cobj = PyObject_GetAttrString(clsObj, "wrapfn_");
654 wrapfn = (PyObject *(*)(const jobject &))
655 PyCObject_AsVoidPtr(cobj);
659 clsObj = PyObject_GetAttrString(clsObj, "class_");
663 cls = (jclass) ((t_Class *) clsObj)->object.this$;
668 PyErr_SetObject(PyExc_ValueError, clsObj);
674 PyErr_SetObject(PyExc_TypeError, clsObj);
678 if (PySequence_Check(obj))
680 self->array = JArray<jobject>(cls, obj);
681 if (PyErr_Occurred())
684 else if (PyGen_Check(obj))
687 PyObject_CallFunctionObjArgs((PyObject *) &PyTuple_Type, obj, NULL);
692 self->array = JArray<jobject>(cls, tuple);
694 if (PyErr_Occurred())
697 else if (PyInt_Check(obj))
699 int n = PyInt_AsLong(obj);
703 PyErr_SetObject(PyExc_ValueError, obj);
707 self->array = JArray<jobject>(cls, n);
711 PyErr_SetObject(PyExc_TypeError, obj);
715 self->wrapfn = wrapfn;
720 template<> jclass initializeClass<jobject>(void)
722 jclass cls = env->findClass("java/lang/Object");
723 return env->get_vm_env()->GetObjectClass(JArray<jobject>(cls, (Py_ssize_t) 0).this$);
726 template<> PyObject *cast_<jobject>(PyTypeObject *type,
727 PyObject *args, PyObject *kwds)
729 PyObject *arg, *clsArg = NULL;
730 PyObject *(*wrapfn)(const jobject&) = NULL;
733 if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
736 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
738 PyErr_SetObject(PyExc_TypeError, arg);
742 Class argCls = ((t_Object *) arg)->object.getClass();
744 if (!argCls.isArray())
746 PyErr_SetObject(PyExc_TypeError, arg);
752 if (!PyType_Check(clsArg))
754 PyErr_SetObject(PyExc_TypeError, clsArg);
757 else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
759 PyErr_SetObject(PyExc_ValueError, clsArg);
763 PyObject *cobj = PyObject_GetAttrString(clsArg, "wrapfn_");
769 wrapfn = (PyObject *(*)(const jobject &)) PyCObject_AsVoidPtr(cobj);
773 clsArg = PyObject_GetAttrString(clsArg, "class_");
777 elementCls = (jclass) ((t_Class *) clsArg)->object.this$;
781 elementCls = env->findClass("java/lang/Object");
783 JNIEnv *vm_env = env->get_vm_env();
784 jobjectArray array = vm_env->NewObjectArray(0, elementCls, NULL);
785 Class arrayCls(vm_env->GetObjectClass((jobject) array));
787 if (!arrayCls.isAssignableFrom(argCls))
789 PyErr_SetObject(PyExc_TypeError, arg);
793 return JArray<jobject>(((t_JObject *) arg)->object.this$).wrap(wrapfn);
796 template<> PyObject *instance_<jobject>(PyTypeObject *type,
797 PyObject *args, PyObject *kwds)
799 PyObject *arg, *clsArg = NULL;
802 if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
805 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
808 Class argCls = ((t_Object *) arg)->object.getClass();
810 if (!argCls.isArray())
815 if (!PyType_Check(clsArg))
817 PyErr_SetObject(PyExc_TypeError, clsArg);
820 else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
822 PyErr_SetObject(PyExc_ValueError, clsArg);
826 clsArg = PyObject_GetAttrString(clsArg, "class_");
830 elementCls = (jclass) ((t_Class *) clsArg)->object.this$;
834 elementCls = env->findClass("java/lang/Object");
836 JNIEnv *vm_env = env->get_vm_env();
837 jobjectArray array = vm_env->NewObjectArray(0, elementCls, NULL);
838 Class arrayCls(vm_env->GetObjectClass((jobject) array));
840 if (!arrayCls.isAssignableFrom(argCls))
846 template<> PyObject *assignable_<jobject>(PyTypeObject *type,
847 PyObject *args, PyObject *kwds)
849 PyObject *arg, *clsArg = NULL;
852 if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
855 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
858 Class argCls = ((t_Object *) arg)->object.getClass();
860 if (!argCls.isArray())
865 if (!PyType_Check(clsArg))
867 PyErr_SetObject(PyExc_TypeError, clsArg);
870 else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
872 PyErr_SetObject(PyExc_ValueError, clsArg);
876 clsArg = PyObject_GetAttrString(clsArg, "class_");
880 elementCls = (jclass) ((t_Class *) clsArg)->object.this$;
884 elementCls = env->findClass("java/lang/Object");
886 JNIEnv *vm_env = env->get_vm_env();
887 jobjectArray array = vm_env->NewObjectArray(0, elementCls, NULL);
888 Class arrayCls(vm_env->GetObjectClass((jobject) array));
890 if (!argCls.isAssignableFrom(arrayCls))
897 template<typename T> PyTypeObject *_t_iterator<T>::JArrayIterator;
898 template<typename T> PyObject *_t_JArray<T>::format;
900 static jarray_type< jobject, _t_jobjectarray<jobject> > jarray_jobject;
902 static jarray_type<jstring> jarray_jstring;
903 static jarray_type<jboolean> jarray_jboolean;
904 static jarray_type<jbyte> jarray_jbyte;
905 static jarray_type<jchar> jarray_jchar;
906 static jarray_type<jdouble> jarray_jdouble;
907 static jarray_type<jfloat> jarray_jfloat;
908 static jarray_type<jint> jarray_jint;
909 static jarray_type<jlong> jarray_jlong;
910 static jarray_type<jshort> jarray_jshort;
913 PyObject *JArray<jobject>::wrap(PyObject *(*wrapfn)(const jobject&))
917 _t_jobjectarray<jobject> *obj =
918 PyObject_New(_t_jobjectarray<jobject>, &jarray_jobject.type_object);
920 memset(&(obj->array), 0, sizeof(JArray<jobject>));
922 obj->wrapfn = wrapfn;
924 return (PyObject *) obj;
930 PyObject *JArray<jstring>::wrap() const
934 _t_JArray<jstring> *obj =
935 PyObject_New(_t_JArray<jstring>, &jarray_jstring.type_object);
937 memset(&(obj->array), 0, sizeof(JArray<jstring>));
940 return (PyObject *) obj;
946 PyObject *JArray<jboolean>::wrap() const
950 _t_JArray<jboolean> *obj =
951 PyObject_New(_t_JArray<jboolean>, &jarray_jboolean.type_object);
953 memset(&(obj->array), 0, sizeof(JArray<jboolean>));
956 return (PyObject *) obj;
962 PyObject *JArray<jbyte>::wrap() const
966 _t_JArray<jbyte> *obj =
967 PyObject_New(_t_JArray<jbyte>, &jarray_jbyte.type_object);
969 memset(&(obj->array), 0, sizeof(JArray<jbyte>));
972 return (PyObject *) obj;
978 PyObject *JArray<jchar>::wrap() const
982 _t_JArray<jchar> *obj =
983 PyObject_New(_t_JArray<jchar>, &jarray_jchar.type_object);
985 memset(&(obj->array), 0, sizeof(JArray<jchar>));
988 return (PyObject *) obj;
994 PyObject *JArray<jdouble>::wrap() const
998 _t_JArray<jdouble> *obj =
999 PyObject_New(_t_JArray<jdouble>, &jarray_jdouble.type_object);
1001 memset(&(obj->array), 0, sizeof(JArray<jdouble>));
1004 return (PyObject *) obj;
1010 PyObject *JArray<jfloat>::wrap() const
1014 _t_JArray<jfloat> *obj =
1015 PyObject_New(_t_JArray<jfloat>, &jarray_jfloat.type_object);
1017 memset(&(obj->array), 0, sizeof(JArray<jfloat>));
1020 return (PyObject *) obj;
1026 PyObject *JArray<jint>::wrap() const
1030 _t_JArray<jint> *obj =
1031 PyObject_New(_t_JArray<jint>, &jarray_jint.type_object);
1033 memset(&(obj->array), 0, sizeof(JArray<jint>));
1036 return (PyObject *) obj;
1042 PyObject *JArray<jlong>::wrap() const
1046 _t_JArray<jlong> *obj =
1047 PyObject_New(_t_JArray<jlong>, &jarray_jlong.type_object);
1049 memset(&(obj->array), 0, sizeof(JArray<jlong>));
1052 return (PyObject *) obj;
1058 PyObject *JArray<jshort>::wrap() const
1062 _t_JArray<jshort> *obj =
1063 PyObject_New(_t_JArray<jshort>, &jarray_jshort.type_object);
1065 memset(&(obj->array), 0, sizeof(JArray<jshort>));
1068 return (PyObject *) obj;
1074 PyObject *JArray_Type(PyObject *self, PyObject *arg)
1076 PyObject *type_name = NULL, *type;
1077 char const *name = NULL;
1079 if (PyType_Check(arg))
1081 type_name = PyObject_GetAttrString(arg, "__name__");
1085 else if (PyString_Check(arg))
1088 Py_INCREF(type_name);
1090 else if (PyFloat_Check(arg))
1097 PyObject *arg_type = (PyObject *) arg->ob_type;
1099 type_name = PyObject_GetAttrString(arg_type, "__name__");
1104 if (type_name != NULL)
1106 name = PyString_AsString(type_name);
1109 Py_DECREF(type_name);
1114 if (!strcmp(name, "object"))
1115 type = (PyObject *) &jarray_jobject.type_object;
1116 else if (!strcmp(name, "string"))
1117 type = (PyObject *) &jarray_jstring.type_object;
1118 else if (!strcmp(name, "bool"))
1119 type = (PyObject *) &jarray_jboolean.type_object;
1120 else if (!strcmp(name, "byte"))
1121 type = (PyObject *) &jarray_jbyte.type_object;
1122 else if (!strcmp(name, "char"))
1123 type = (PyObject *) &jarray_jchar.type_object;
1124 else if (!strcmp(name, "double"))
1125 type = (PyObject *) &jarray_jdouble.type_object;
1126 else if (!strcmp(name, "float"))
1127 type = (PyObject *) &jarray_jfloat.type_object;
1128 else if (!strcmp(name, "int"))
1129 type = (PyObject *) &jarray_jint.type_object;
1130 else if (!strcmp(name, "long"))
1131 type = (PyObject *) &jarray_jlong.type_object;
1132 else if (!strcmp(name, "short"))
1133 type = (PyObject *) &jarray_jshort.type_object;
1136 PyErr_SetObject(PyExc_ValueError, arg);
1137 Py_XDECREF(type_name);
1143 Py_XDECREF(type_name);
1148 static PyObject *t_JArray_jbyte__get_string_(t_JArray<jbyte> *self, void *data)
1150 return self->array.to_string_();
1153 static PyGetSetDef t_JArray_jbyte__fields[] = {
1154 { "string_", (getter) t_JArray_jbyte__get_string_, NULL, "", NULL },
1155 { NULL, NULL, NULL, NULL, NULL }
1159 PyTypeObject *PY_TYPE(JArrayObject);
1160 PyTypeObject *PY_TYPE(JArrayString);
1161 PyTypeObject *PY_TYPE(JArrayBool);
1162 PyTypeObject *PY_TYPE(JArrayByte);
1163 PyTypeObject *PY_TYPE(JArrayChar);
1164 PyTypeObject *PY_TYPE(JArrayDouble);
1165 PyTypeObject *PY_TYPE(JArrayFloat);
1166 PyTypeObject *PY_TYPE(JArrayInt);
1167 PyTypeObject *PY_TYPE(JArrayLong);
1168 PyTypeObject *PY_TYPE(JArrayShort);
1171 void _install_jarray(PyObject *module)
1173 jarray_jobject.install("JArray_object", "object",
1174 "__JArray_object_iterator", module);
1175 PY_TYPE(JArrayObject) = &jarray_jobject.type_object;
1177 jarray_jstring.install("JArray_string", "string",
1178 "__JArray_string_iterator", module);
1179 PY_TYPE(JArrayString) = &jarray_jstring.type_object;
1181 jarray_jboolean.install("JArray_bool", "bool",
1182 "__JArray_bool_iterator", module);
1183 PY_TYPE(JArrayBool) = &jarray_jboolean.type_object;
1185 jarray_jbyte.type_object.tp_getset = t_JArray_jbyte__fields;
1186 jarray_jbyte.install("JArray_byte", "byte",
1187 "__JArray_byte_iterator", module);
1188 PY_TYPE(JArrayByte) = &jarray_jbyte.type_object;
1190 jarray_jchar.install("JArray_char", "char",
1191 "__JArray_char_iterator", module);
1192 PY_TYPE(JArrayChar) = &jarray_jchar.type_object;
1194 jarray_jdouble.install("JArray_double", "double",
1195 "__JArray_double_iterator", module);
1196 PY_TYPE(JArrayDouble) = &jarray_jdouble.type_object;
1198 jarray_jfloat.install("JArray_float", "float",
1199 "__JArray_float_iterator", module);
1200 PY_TYPE(JArrayFloat) = &jarray_jfloat.type_object;
1202 jarray_jint.install("JArray_int", "int",
1203 "__JArray_int_iterator", module);
1204 PY_TYPE(JArrayInt) = &jarray_jint.type_object;
1206 jarray_jlong.install("JArray_long", "long",
1207 "__JArray_long_iterator", module);
1208 PY_TYPE(JArrayLong) = &jarray_jlong.type_object;
1210 jarray_jshort.install("JArray_short", "short",
1211 "__JArray_short_iterator", module);
1212 PY_TYPE(JArrayShort) = &jarray_jshort.type_object;