From f3ca8623f7ee9e7c3fda11ddad3019d4910e9d4e Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Tue, 29 Sep 2015 10:05:30 -0700 Subject: [PATCH] unix/modjni: Implement len() for objects with java.util.List interface. --- unix/modjni.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) 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 #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) {