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.
17 #include "structmember.h"
19 #include "java/lang/Object.h"
20 #include "java/lang/Class.h"
21 #include "functions.h"
23 using namespace java::lang;
28 static PyObject *t_fc_call(PyObject *self, PyObject *args, PyObject *kwds);
30 static void t_fp_dealloc(t_fp *self);
31 static PyObject *t_fp_getattro(t_fp *self, PyObject *name);
32 static int t_fp_setattro(t_fp *self, PyObject *name, PyObject *value);
33 static int t_fp_traverse(t_fp *self, visitproc visit, void *arg);
34 static int t_fp_clear(t_fp *self);
35 static PyObject *t_fp_repr(t_fp *self);
36 static PyObject *t_fp_iter(t_fp *self);
38 static Py_ssize_t t_fp_map_length(t_fp *self);
39 static PyObject *t_fp_map_get(t_fp *self, PyObject *key);
40 static int t_fp_map_set(t_fp *self, PyObject *key, PyObject *value);
42 static Py_ssize_t t_fp_seq_length(t_fp *self);
43 static PyObject *t_fp_seq_get(t_fp *self, Py_ssize_t n);
44 static int t_fp_seq_contains(t_fp *self, PyObject *value);
45 static PyObject *t_fp_seq_concat(t_fp *self, PyObject *arg);
46 static PyObject *t_fp_seq_repeat(t_fp *self, Py_ssize_t n);
47 static PyObject *t_fp_seq_getslice(t_fp *self, Py_ssize_t low, Py_ssize_t high);
48 static int t_fp_seq_set(t_fp *self, Py_ssize_t i, PyObject *value);
49 static int t_fp_seq_setslice(t_fp *self, Py_ssize_t low,
50 Py_ssize_t high, PyObject *arg);
51 static PyObject *t_fp_seq_inplace_concat(t_fp *self, PyObject *arg);
52 static PyObject *t_fp_seq_inplace_repeat(t_fp *self, Py_ssize_t n);
55 PyTypeObject PY_TYPE(FinalizerClass) = {
56 PyObject_HEAD_INIT(NULL)
58 "jcc.FinalizerClass", /* tp_name */
59 PyType_Type.tp_basicsize, /* tp_basicsize */
68 0, /* tp_as_sequence */
69 0, /* tp_as_mapping */
71 (ternaryfunc) t_fc_call, /* tp_call */
76 Py_TPFLAGS_DEFAULT, /* tp_flags */
77 "FinalizerClass", /* tp_doc */
80 0, /* tp_richcompare */
81 0, /* tp_weaklistoffset */
87 &PyType_Type, /* tp_base */
91 0, /* tp_dictoffset */
97 static PyMappingMethods t_fp_as_mapping = {
98 (lenfunc)t_fp_map_length, /* mp_length */
99 (binaryfunc)t_fp_map_get, /* mp_subscript */
100 (objobjargproc)t_fp_map_set, /* mp_ass_subscript */
103 static PySequenceMethods t_fp_as_sequence = {
104 (lenfunc)t_fp_seq_length, /* sq_length */
105 (binaryfunc)t_fp_seq_concat, /* sq_concat */
106 (ssizeargfunc)t_fp_seq_repeat, /* sq_repeat */
107 (ssizeargfunc)t_fp_seq_get, /* sq_item */
108 (ssizessizeargfunc)t_fp_seq_getslice, /* sq_slice */
109 (ssizeobjargproc)t_fp_seq_set, /* sq_ass_item */
110 (ssizessizeobjargproc)t_fp_seq_setslice, /* sq_ass_slice */
111 (objobjproc)t_fp_seq_contains, /* sq_contains */
112 (binaryfunc)t_fp_seq_inplace_concat, /* sq_inplace_concat */
113 (ssizeargfunc)t_fp_seq_inplace_repeat, /* sq_inplace_repeat */
116 PyTypeObject PY_TYPE(FinalizerProxy) = {
117 PyObject_HEAD_INIT(NULL)
119 "jcc.FinalizerProxy", /* tp_name */
120 sizeof(t_fp), /* tp_basicsize */
122 (destructor)t_fp_dealloc, /* tp_dealloc */
127 (reprfunc)t_fp_repr, /* tp_repr */
128 0, /* tp_as_number */
129 &t_fp_as_sequence, /* tp_as_sequence */
130 &t_fp_as_mapping, /* tp_as_mapping */
134 (getattrofunc)t_fp_getattro, /* tp_getattro */
135 (setattrofunc)t_fp_setattro, /* tp_setattro */
136 0, /* tp_as_buffer */
137 (Py_TPFLAGS_DEFAULT |
138 Py_TPFLAGS_HAVE_GC), /* tp_flags */
139 "FinalizerProxy", /* tp_doc */
140 (traverseproc)t_fp_traverse, /* tp_traverse */
141 (inquiry)t_fp_clear, /* tp_clear */
142 0, /* tp_richcompare */
143 0, /* tp_weaklistoffset */
144 (getiterfunc)t_fp_iter, /* tp_iter */
151 0, /* tp_descr_get */
152 0, /* tp_descr_set */
153 0, /* tp_dictoffset */
159 static PyObject *t_fc_call(PyObject *self, PyObject *args, PyObject *kwds)
161 PyObject *obj = PyType_Type.tp_call(self, args, kwds);
165 t_fp *fp = (t_fp *) PY_TYPE(FinalizerProxy).tp_alloc(&PY_TYPE(FinalizerProxy), 0);
167 fp->object = obj; /* released by t_fp_clear() */
168 obj = (PyObject *) fp;
174 static void t_fp_dealloc(t_fp *self)
177 ((t_JObject *) self->object)->object.weaken$();
180 self->ob_type->tp_free((PyObject *) self);
183 static int t_fp_traverse(t_fp *self, visitproc visit, void *arg)
185 Py_VISIT(self->object);
189 static int t_fp_clear(t_fp *self)
191 Py_CLEAR(self->object);
195 static PyObject *t_fp_repr(t_fp *self)
197 return PyObject_Repr(self->object);
200 static PyObject *t_fp_iter(t_fp *self)
202 return PyObject_GetIter(self->object);
205 static PyObject *t_fp_getattro(t_fp *self, PyObject *name)
207 return PyObject_GetAttr(self->object, name);
210 static int t_fp_setattro(t_fp *self, PyObject *name, PyObject *value)
212 return PyObject_SetAttr(self->object, name, value);
215 static Py_ssize_t t_fp_map_length(t_fp *self)
217 return PyMapping_Size(self->object);
220 static PyObject *t_fp_map_get(t_fp *self, PyObject *key)
222 return PyObject_GetItem(self->object, key);
225 static int t_fp_map_set(t_fp *self, PyObject *key, PyObject *value)
228 return PyObject_DelItem(self->object, key);
230 return PyObject_SetItem(self->object, key, value);
233 static Py_ssize_t t_fp_seq_length(t_fp *self)
235 return PySequence_Length(self->object);
238 static PyObject *t_fp_seq_get(t_fp *self, Py_ssize_t n)
240 return PySequence_GetItem(self->object, n);
243 static int t_fp_seq_contains(t_fp *self, PyObject *value)
245 return PySequence_Contains(self->object, value);
248 static PyObject *t_fp_seq_concat(t_fp *self, PyObject *arg)
250 return PySequence_Concat(self->object, arg);
253 static PyObject *t_fp_seq_repeat(t_fp *self, Py_ssize_t n)
255 return PySequence_Repeat(self->object, n);
258 static PyObject *t_fp_seq_getslice(t_fp *self, Py_ssize_t low, Py_ssize_t high)
260 return PySequence_GetSlice(self->object, low, high);
263 static int t_fp_seq_set(t_fp *self, Py_ssize_t i, PyObject *value)
265 return PySequence_SetItem(self->object, i, value);
268 static int t_fp_seq_setslice(t_fp *self, Py_ssize_t low,
269 Py_ssize_t high, PyObject *arg)
271 return PySequence_SetSlice(self->object, low, high, arg);
274 static PyObject *t_fp_seq_inplace_concat(t_fp *self, PyObject *arg)
276 return PySequence_InPlaceConcat(self->object, arg);
279 static PyObject *t_fp_seq_inplace_repeat(t_fp *self, Py_ssize_t n)
281 return PySequence_InPlaceRepeat(self->object, n);
285 /* const variable descriptor */
293 getclassfn initializeClass;
297 #define DESCRIPTOR_VALUE 0x0001
298 #define DESCRIPTOR_CLASS 0x0002
299 #define DESCRIPTOR_GETFN 0x0004
300 #define DESCRIPTOR_GENERIC 0x0008
302 static void t_descriptor_dealloc(t_descriptor *self);
303 static PyObject *t_descriptor___get__(t_descriptor *self,
304 PyObject *obj, PyObject *type);
306 static PyMethodDef t_descriptor_methods[] = {
307 { NULL, NULL, 0, NULL }
311 PyTypeObject PY_TYPE(ConstVariableDescriptor) = {
312 PyObject_HEAD_INIT(NULL)
314 "jcc.ConstVariableDescriptor", /* tp_name */
315 sizeof(t_descriptor), /* tp_basicsize */
317 (destructor)t_descriptor_dealloc, /* tp_dealloc */
323 0, /* tp_as_number */
324 0, /* tp_as_sequence */
325 0, /* tp_as_mapping */
331 0, /* tp_as_buffer */
332 Py_TPFLAGS_DEFAULT, /* tp_flags */
333 "const variable descriptor", /* tp_doc */
336 0, /* tp_richcompare */
337 0, /* tp_weaklistoffset */
340 t_descriptor_methods, /* tp_methods */
345 (descrgetfunc)t_descriptor___get__, /* tp_descr_get */
346 0, /* tp_descr_set */
347 0, /* tp_dictoffset */
353 static void t_descriptor_dealloc(t_descriptor *self)
355 if (self->flags & DESCRIPTOR_VALUE)
357 Py_DECREF(self->access.value);
359 self->ob_type->tp_free((PyObject *) self);
362 PyObject *make_descriptor(PyTypeObject *value)
364 t_descriptor *self = (t_descriptor *)
365 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
370 self->access.value = (PyObject *) value;
371 self->flags = DESCRIPTOR_VALUE;
374 return (PyObject *) self;
377 PyObject *make_descriptor(getclassfn initializeClass)
379 t_descriptor *self = (t_descriptor *)
380 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
384 self->access.initializeClass = initializeClass;
385 self->flags = DESCRIPTOR_CLASS;
388 return (PyObject *) self;
391 PyObject *make_descriptor(getclassfn initializeClass, int generics)
393 t_descriptor *self = (t_descriptor *) make_descriptor(initializeClass);
395 if (self && generics)
396 self->flags |= DESCRIPTOR_GENERIC;
398 return (PyObject *) self;
401 PyObject *make_descriptor(PyObject *value)
403 t_descriptor *self = (t_descriptor *)
404 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
408 self->access.value = value;
409 self->flags = DESCRIPTOR_VALUE;
414 return (PyObject *) self;
417 PyObject *make_descriptor(PyObject *(*wrapfn)(const jobject &))
419 return make_descriptor(PyCObject_FromVoidPtr((void *) wrapfn, NULL));
422 PyObject *make_descriptor(boxfn fn)
424 return make_descriptor(PyCObject_FromVoidPtr((void *) fn, NULL));
427 PyObject *make_descriptor(jboolean b)
429 t_descriptor *self = (t_descriptor *)
430 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
434 PyObject *value = b ? Py_True : Py_False;
435 self->access.value = (PyObject *) value; Py_INCREF(value);
436 self->flags = DESCRIPTOR_VALUE;
439 return (PyObject *) self;
442 PyObject *make_descriptor(jbyte value)
444 t_descriptor *self = (t_descriptor *)
445 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
449 self->access.value = PyInt_FromLong(value);
450 self->flags = DESCRIPTOR_VALUE;
453 return (PyObject *) self;
456 PyObject *make_descriptor(jchar value)
458 t_descriptor *self = (t_descriptor *)
459 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
463 Py_UNICODE pchar = (Py_UNICODE) value;
465 self->access.value = PyUnicode_FromUnicode(&pchar, 1);
466 self->flags = DESCRIPTOR_VALUE;
469 return (PyObject *) self;
472 PyObject *make_descriptor(jdouble value)
474 t_descriptor *self = (t_descriptor *)
475 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
479 self->access.value = PyFloat_FromDouble(value);
480 self->flags = DESCRIPTOR_VALUE;
483 return (PyObject *) self;
486 PyObject *make_descriptor(jfloat value)
488 t_descriptor *self = (t_descriptor *)
489 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
493 self->access.value = PyFloat_FromDouble((double) value);
494 self->flags = DESCRIPTOR_VALUE;
497 return (PyObject *) self;
500 PyObject *make_descriptor(jint value)
502 t_descriptor *self = (t_descriptor *)
503 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
507 self->access.value = PyInt_FromLong(value);
508 self->flags = DESCRIPTOR_VALUE;
511 return (PyObject *) self;
514 PyObject *make_descriptor(jlong value)
516 t_descriptor *self = (t_descriptor *)
517 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
521 self->access.value = PyLong_FromLongLong((long long) value);
522 self->flags = DESCRIPTOR_VALUE;
525 return (PyObject *) self;
528 PyObject *make_descriptor(jshort value)
530 t_descriptor *self = (t_descriptor *)
531 PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
535 self->access.value = PyInt_FromLong((short) value);
536 self->flags = DESCRIPTOR_VALUE;
539 return (PyObject *) self;
542 static PyObject *t_descriptor___get__(t_descriptor *self,
543 PyObject *obj, PyObject *type)
545 if (self->flags & DESCRIPTOR_VALUE)
547 Py_INCREF(self->access.value);
548 return self->access.value;
551 if (self->flags & DESCRIPTOR_CLASS)
553 #ifdef _java_generics
554 if (self->flags & DESCRIPTOR_GENERIC)
555 return t_Class::wrap_Object(Class((*self->access.initializeClass)()), (PyTypeObject *) type);
558 return t_Class::wrap_Object(Class((*self->access.initializeClass)()));