summaryrefslogtreecommitdiffstatshomepage
path: root/unix/modjni.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-09-29 10:05:30 -0700
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-09-29 10:06:07 -0700
commitf3ca8623f7ee9e7c3fda11ddad3019d4910e9d4e (patch)
treecd9db5dc49f1b4734f2e88ddb75a2c8bc1bbb03b /unix/modjni.c
parent77020281ae7e95eccc990afc52ff04aabf696c22 (diff)
downloadmicropython-f3ca8623f7ee9e7c3fda11ddad3019d4910e9d4e.tar.gz
micropython-f3ca8623f7ee9e7c3fda11ddad3019d4910e9d4e.zip
unix/modjni: Implement len() for objects with java.util.List interface.
Diffstat (limited to 'unix/modjni.c')
-rw-r--r--unix/modjni.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/unix/modjni.c b/unix/modjni.c
index 44a0b47e7a..520677b623 100644
--- a/unix/modjni.c
+++ b/unix/modjni.c
@@ -30,6 +30,7 @@
#include <dlfcn.h>
#include "py/nlr.h"
+#include "py/runtime0.h"
#include "py/runtime.h"
#include "py/binary.h"
@@ -51,6 +52,7 @@ static jmethodID Method_toString_mid;
static jclass List_class;
static jmethodID List_get_mid;
static jmethodID List_set_mid;
+static jmethodID List_size_mid;
STATIC const mp_obj_type_t jobject_type;
STATIC const mp_obj_type_t jmethod_type;
@@ -207,10 +209,27 @@ STATIC mp_obj_t jobject_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value)
return MP_OBJ_NULL;
}
+STATIC mp_obj_t jobject_unary_op(mp_uint_t op, mp_obj_t self_in) {
+ mp_obj_jobject_t *self = self_in;
+ switch (op) {
+ case MP_UNARY_OP_BOOL:
+ case MP_UNARY_OP_LEN: {
+ jint len = JJ(CallIntMethod, self->obj, List_size_mid);
+ if (op == MP_UNARY_OP_BOOL) {
+ return MP_BOOL(len != 0);
+ }
+ return MP_OBJ_NEW_SMALL_INT(len);
+ }
+ default:
+ return MP_OBJ_NULL; // op not supported
+ }
+}
+
STATIC const mp_obj_type_t jobject_type = {
{ &mp_type_type },
.name = MP_QSTR_jobject,
.print = jobject_print,
+ .unary_op = jobject_unary_op,
.attr = jobject_attr,
.subscr = jobject_subscr,
// .locals_dict = (mp_obj_t)&jobject_locals_dict,
@@ -471,6 +490,8 @@ STATIC void create_jvm() {
"(I)Ljava/lang/Object;");
List_set_mid = JJ(GetMethodID, List_class, "set",
"(ILjava/lang/Object;)Ljava/lang/Object;");
+ List_size_mid = JJ(GetMethodID, List_class, "size",
+ "()I");
}
STATIC mp_obj_t mod_jni_cls(mp_obj_t cls_name_in) {