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, int n)
36 return self->array.get(n);
40 static PyObject *toSequence(U *self)
42 return self->array.toSequence();
46 static PyObject *toSequence(U *self, int lo, int 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 int 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 int size = PySequence_Fast_GET_SIZE(sequence);
380 PyErr_SetString(PyExc_ValueError, "array size cannot change");
384 for (int 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>(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, int 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, int lo, int hi)
627 return self->array.toSequence(lo, hi, self->wrapfn);
630 template<> int init< jobject,_t_jobjectarray<jobject> >(_t_jobjectarray<jobject> *self, PyObject *args, PyObject *kwds)
632 PyObject *obj, *clsObj = NULL;
633 PyObject *(*wrapfn)(const jobject &) = NULL;
636 if (!PyArg_ParseTuple(args, "O|O", &obj, &clsObj))
640 cls = env->findClass("java/lang/Object");
641 else if (PyObject_TypeCheck(clsObj, &PY_TYPE(Class)))
642 cls = (jclass) ((t_Class *) clsObj)->object.this$;
643 else if (PyType_Check(clsObj))
645 if (PyType_IsSubtype((PyTypeObject *) clsObj, &PY_TYPE(JObject)))
647 PyObject *cobj = PyObject_GetAttrString(clsObj, "wrapfn_");
653 wrapfn = (PyObject *(*)(const jobject &))
654 PyCObject_AsVoidPtr(cobj);
658 clsObj = PyObject_GetAttrString(clsObj, "class_");
662 cls = (jclass) ((t_Class *) clsObj)->object.this$;
667 PyErr_SetObject(PyExc_ValueError, clsObj);
673 PyErr_SetObject(PyExc_TypeError, clsObj);
677 if (PySequence_Check(obj))
679 self->array = JArray<jobject>(cls, obj);
680 if (PyErr_Occurred())
683 else if (PyGen_Check(obj))
686 PyObject_CallFunctionObjArgs((PyObject *) &PyTuple_Type, obj, NULL);
691 self->array = JArray<jobject>(cls, tuple);
693 if (PyErr_Occurred())
696 else if (PyInt_Check(obj))
698 int n = PyInt_AsLong(obj);
702 PyErr_SetObject(PyExc_ValueError, obj);
706 self->array = JArray<jobject>(cls, n);
710 PyErr_SetObject(PyExc_TypeError, obj);
714 self->wrapfn = wrapfn;
719 template<> jclass initializeClass<jobject>(void)
721 jclass cls = env->findClass("java/lang/Object");
722 return env->get_vm_env()->GetObjectClass(JArray<jobject>(cls, 0).this$);
725 template<> PyObject *cast_<jobject>(PyTypeObject *type,
726 PyObject *args, PyObject *kwds)
728 PyObject *arg, *clsArg = NULL;
729 PyObject *(*wrapfn)(const jobject&) = NULL;
732 if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
735 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
737 PyErr_SetObject(PyExc_TypeError, arg);
741 Class argCls = ((t_Object *) arg)->object.getClass();
743 if (!argCls.isArray())
745 PyErr_SetObject(PyExc_TypeError, arg);
751 if (!PyType_Check(clsArg))
753 PyErr_SetObject(PyExc_TypeError, clsArg);
756 else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
758 PyErr_SetObject(PyExc_ValueError, clsArg);
762 PyObject *cobj = PyObject_GetAttrString(clsArg, "wrapfn_");
768 wrapfn = (PyObject *(*)(const jobject &)) PyCObject_AsVoidPtr(cobj);
772 clsArg = PyObject_GetAttrString(clsArg, "class_");
776 elementCls = (jclass) ((t_Class *) clsArg)->object.this$;
780 elementCls = env->findClass("java/lang/Object");
782 JNIEnv *vm_env = env->get_vm_env();
783 jobjectArray array = vm_env->NewObjectArray(0, elementCls, NULL);
784 Class arrayCls(vm_env->GetObjectClass((jobject) array));
786 if (!arrayCls.isAssignableFrom(argCls))
788 PyErr_SetObject(PyExc_TypeError, arg);
792 return JArray<jobject>(((t_JObject *) arg)->object.this$).wrap(wrapfn);
795 template<> PyObject *instance_<jobject>(PyTypeObject *type,
796 PyObject *args, PyObject *kwds)
798 PyObject *arg, *clsArg = NULL;
801 if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
804 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
807 Class argCls = ((t_Object *) arg)->object.getClass();
809 if (!argCls.isArray())
814 if (!PyType_Check(clsArg))
816 PyErr_SetObject(PyExc_TypeError, clsArg);
819 else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
821 PyErr_SetObject(PyExc_ValueError, clsArg);
825 clsArg = PyObject_GetAttrString(clsArg, "class_");
829 elementCls = (jclass) ((t_Class *) clsArg)->object.this$;
833 elementCls = env->findClass("java/lang/Object");
835 JNIEnv *vm_env = env->get_vm_env();
836 jobjectArray array = vm_env->NewObjectArray(0, elementCls, NULL);
837 Class arrayCls(vm_env->GetObjectClass((jobject) array));
839 if (!arrayCls.isAssignableFrom(argCls))
845 template<> PyObject *assignable_<jobject>(PyTypeObject *type,
846 PyObject *args, PyObject *kwds)
848 PyObject *arg, *clsArg = NULL;
851 if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
854 if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
857 Class argCls = ((t_Object *) arg)->object.getClass();
859 if (!argCls.isArray())
864 if (!PyType_Check(clsArg))
866 PyErr_SetObject(PyExc_TypeError, clsArg);
869 else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
871 PyErr_SetObject(PyExc_ValueError, clsArg);
875 clsArg = PyObject_GetAttrString(clsArg, "class_");
879 elementCls = (jclass) ((t_Class *) clsArg)->object.this$;
883 elementCls = env->findClass("java/lang/Object");
885 JNIEnv *vm_env = env->get_vm_env();
886 jobjectArray array = vm_env->NewObjectArray(0, elementCls, NULL);
887 Class arrayCls(vm_env->GetObjectClass((jobject) array));
889 if (!argCls.isAssignableFrom(arrayCls))
896 template<typename T> PyTypeObject *_t_iterator<T>::JArrayIterator;
897 template<typename T> PyObject *_t_JArray<T>::format;
899 static jarray_type< jobject, _t_jobjectarray<jobject> > jarray_jobject;
901 static jarray_type<jstring> jarray_jstring;
902 static jarray_type<jboolean> jarray_jboolean;
903 static jarray_type<jbyte> jarray_jbyte;
904 static jarray_type<jchar> jarray_jchar;
905 static jarray_type<jdouble> jarray_jdouble;
906 static jarray_type<jfloat> jarray_jfloat;
907 static jarray_type<jint> jarray_jint;
908 static jarray_type<jlong> jarray_jlong;
909 static jarray_type<jshort> jarray_jshort;
912 PyObject *JArray<jobject>::wrap(PyObject *(*wrapfn)(const jobject&))
916 _t_jobjectarray<jobject> *obj =
917 PyObject_New(_t_jobjectarray<jobject>, &jarray_jobject.type_object);
919 memset(&(obj->array), 0, sizeof(JArray<jobject>));
921 obj->wrapfn = wrapfn;
923 return (PyObject *) obj;
929 PyObject *JArray<jstring>::wrap() const
933 _t_JArray<jstring> *obj =
934 PyObject_New(_t_JArray<jstring>, &jarray_jstring.type_object);
936 memset(&(obj->array), 0, sizeof(JArray<jstring>));
939 return (PyObject *) obj;
945 PyObject *JArray<jboolean>::wrap() const
949 _t_JArray<jboolean> *obj =
950 PyObject_New(_t_JArray<jboolean>, &jarray_jboolean.type_object);
952 memset(&(obj->array), 0, sizeof(JArray<jboolean>));
955 return (PyObject *) obj;
961 PyObject *JArray<jbyte>::wrap() const
965 _t_JArray<jbyte> *obj =
966 PyObject_New(_t_JArray<jbyte>, &jarray_jbyte.type_object);
968 memset(&(obj->array), 0, sizeof(JArray<jbyte>));
971 return (PyObject *) obj;
977 PyObject *JArray<jchar>::wrap() const
981 _t_JArray<jchar> *obj =
982 PyObject_New(_t_JArray<jchar>, &jarray_jchar.type_object);
984 memset(&(obj->array), 0, sizeof(JArray<jchar>));
987 return (PyObject *) obj;
993 PyObject *JArray<jdouble>::wrap() const
997 _t_JArray<jdouble> *obj =
998 PyObject_New(_t_JArray<jdouble>, &jarray_jdouble.type_object);
1000 memset(&(obj->array), 0, sizeof(JArray<jdouble>));
1003 return (PyObject *) obj;
1009 PyObject *JArray<jfloat>::wrap() const
1013 _t_JArray<jfloat> *obj =
1014 PyObject_New(_t_JArray<jfloat>, &jarray_jfloat.type_object);
1016 memset(&(obj->array), 0, sizeof(JArray<jfloat>));
1019 return (PyObject *) obj;
1025 PyObject *JArray<jint>::wrap() const
1029 _t_JArray<jint> *obj =
1030 PyObject_New(_t_JArray<jint>, &jarray_jint.type_object);
1032 memset(&(obj->array), 0, sizeof(JArray<jint>));
1035 return (PyObject *) obj;
1041 PyObject *JArray<jlong>::wrap() const
1045 _t_JArray<jlong> *obj =
1046 PyObject_New(_t_JArray<jlong>, &jarray_jlong.type_object);
1048 memset(&(obj->array), 0, sizeof(JArray<jlong>));
1051 return (PyObject *) obj;
1057 PyObject *JArray<jshort>::wrap() const
1061 _t_JArray<jshort> *obj =
1062 PyObject_New(_t_JArray<jshort>, &jarray_jshort.type_object);
1064 memset(&(obj->array), 0, sizeof(JArray<jshort>));
1067 return (PyObject *) obj;
1073 PyObject *JArray_Type(PyObject *self, PyObject *arg)
1075 PyObject *type_name = NULL, *type;
1076 char const *name = NULL;
1078 if (PyType_Check(arg))
1080 type_name = PyObject_GetAttrString(arg, "__name__");
1084 else if (PyString_Check(arg))
1087 Py_INCREF(type_name);
1089 else if (PyFloat_Check(arg))
1096 PyObject *arg_type = (PyObject *) arg->ob_type;
1098 type_name = PyObject_GetAttrString(arg_type, "__name__");
1103 if (type_name != NULL)
1105 name = PyString_AsString(type_name);
1106 Py_DECREF(type_name);
1112 if (!strcmp(name, "object"))
1113 type = (PyObject *) &jarray_jobject.type_object;
1114 else if (!strcmp(name, "string"))
1115 type = (PyObject *) &jarray_jstring.type_object;
1116 else if (!strcmp(name, "bool"))
1117 type = (PyObject *) &jarray_jboolean.type_object;
1118 else if (!strcmp(name, "byte"))
1119 type = (PyObject *) &jarray_jbyte.type_object;
1120 else if (!strcmp(name, "char"))
1121 type = (PyObject *) &jarray_jchar.type_object;
1122 else if (!strcmp(name, "double"))
1123 type = (PyObject *) &jarray_jdouble.type_object;
1124 else if (!strcmp(name, "float"))
1125 type = (PyObject *) &jarray_jfloat.type_object;
1126 else if (!strcmp(name, "int"))
1127 type = (PyObject *) &jarray_jint.type_object;
1128 else if (!strcmp(name, "long"))
1129 type = (PyObject *) &jarray_jlong.type_object;
1130 else if (!strcmp(name, "short"))
1131 type = (PyObject *) &jarray_jshort.type_object;
1134 PyErr_SetObject(PyExc_ValueError, arg);
1142 static PyObject *t_JArray_jbyte__get_string_(t_JArray<jbyte> *self, void *data)
1144 return self->array.to_string_();
1147 static PyGetSetDef t_JArray_jbyte__fields[] = {
1148 { "string_", (getter) t_JArray_jbyte__get_string_, NULL, "", NULL },
1149 { NULL, NULL, NULL, NULL, NULL }
1153 PyTypeObject *PY_TYPE(JArrayObject);
1154 PyTypeObject *PY_TYPE(JArrayString);
1155 PyTypeObject *PY_TYPE(JArrayBool);
1156 PyTypeObject *PY_TYPE(JArrayByte);
1157 PyTypeObject *PY_TYPE(JArrayChar);
1158 PyTypeObject *PY_TYPE(JArrayDouble);
1159 PyTypeObject *PY_TYPE(JArrayFloat);
1160 PyTypeObject *PY_TYPE(JArrayInt);
1161 PyTypeObject *PY_TYPE(JArrayLong);
1162 PyTypeObject *PY_TYPE(JArrayShort);
1165 void _install_jarray(PyObject *module)
1167 jarray_jobject.install("JArray_object", "object",
1168 "__JArray_object_iterator", module);
1169 PY_TYPE(JArrayObject) = &jarray_jobject.type_object;
1171 jarray_jstring.install("JArray_string", "string",
1172 "__JArray_string_iterator", module);
1173 PY_TYPE(JArrayString) = &jarray_jstring.type_object;
1175 jarray_jboolean.install("JArray_bool", "bool",
1176 "__JArray_bool_iterator", module);
1177 PY_TYPE(JArrayBool) = &jarray_jboolean.type_object;
1179 jarray_jbyte.type_object.tp_getset = t_JArray_jbyte__fields;
1180 jarray_jbyte.install("JArray_byte", "byte",
1181 "__JArray_byte_iterator", module);
1182 PY_TYPE(JArrayByte) = &jarray_jbyte.type_object;
1184 jarray_jchar.install("JArray_char", "char",
1185 "__JArray_char_iterator", module);
1186 PY_TYPE(JArrayChar) = &jarray_jchar.type_object;
1188 jarray_jdouble.install("JArray_double", "double",
1189 "__JArray_double_iterator", module);
1190 PY_TYPE(JArrayDouble) = &jarray_jdouble.type_object;
1192 jarray_jfloat.install("JArray_float", "float",
1193 "__JArray_float_iterator", module);
1194 PY_TYPE(JArrayFloat) = &jarray_jfloat.type_object;
1196 jarray_jint.install("JArray_int", "int",
1197 "__JArray_int_iterator", module);
1198 PY_TYPE(JArrayInt) = &jarray_jint.type_object;
1200 jarray_jlong.install("JArray_long", "long",
1201 "__JArray_long_iterator", module);
1202 PY_TYPE(JArrayLong) = &jarray_jlong.type_object;
1204 jarray_jshort.install("JArray_short", "short",
1205 "__JArray_short_iterator", module);
1206 PY_TYPE(JArrayShort) = &jarray_jshort.type_object;