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, &Object$$Type))
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, &Object$$Type))
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 = &Object$$Type;
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, &Class$$Type))
642
cls = (jclass) ((t_Class *) clsObj)->object.this$;
643
else if (PyType_Check(clsObj))
645
if (PyType_IsSubtype((PyTypeObject *) clsObj, &JObject$$Type))
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, &Object$$Type))
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, &JObject$$Type))
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, &Object$$Type))
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, &JObject$$Type))
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, &Object$$Type))
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, &JObject$$Type))
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()
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()
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()
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()
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()
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()
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()
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()
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()
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 *JArrayObject$$Type;
1154
PyTypeObject *JArrayString$$Type;
1155
PyTypeObject *JArrayBool$$Type;
1156
PyTypeObject *JArrayByte$$Type;
1157
PyTypeObject *JArrayChar$$Type;
1158
PyTypeObject *JArrayDouble$$Type;
1159
PyTypeObject *JArrayFloat$$Type;
1160
PyTypeObject *JArrayInt$$Type;
1161
PyTypeObject *JArrayLong$$Type;
1162
PyTypeObject *JArrayShort$$Type;
1165
void _install_jarray(PyObject *module)
1167
jarray_jobject.install("JArray_object", "object",
1168
"__JArray_object_iterator", module);
1169
JArrayObject$$Type = &jarray_jobject.type_object;
1171
jarray_jstring.install("JArray_string", "string",
1172
"__JArray_string_iterator", module);
1173
JArrayString$$Type = &jarray_jstring.type_object;
1175
jarray_jboolean.install("JArray_bool", "bool",
1176
"__JArray_bool_iterator", module);
1177
JArrayBool$$Type = &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
JArrayByte$$Type = &jarray_jbyte.type_object;
1184
jarray_jchar.install("JArray_char", "char",
1185
"__JArray_char_iterator", module);
1186
JArrayChar$$Type = &jarray_jchar.type_object;
1188
jarray_jdouble.install("JArray_double", "double",
1189
"__JArray_double_iterator", module);
1190
JArrayDouble$$Type = &jarray_jdouble.type_object;
1192
jarray_jfloat.install("JArray_float", "float",
1193
"__JArray_float_iterator", module);
1194
JArrayFloat$$Type = &jarray_jfloat.type_object;
1196
jarray_jint.install("JArray_int", "int",
1197
"__JArray_int_iterator", module);
1198
JArrayInt$$Type = &jarray_jint.type_object;
1200
jarray_jlong.install("JArray_long", "long",
1201
"__JArray_long_iterator", module);
1202
JArrayLong$$Type = &jarray_jlong.type_object;
1204
jarray_jshort.install("JArray_short", "short",
1205
"__JArray_short_iterator", module);
1206
JArrayShort$$Type = &jarray_jshort.type_object;