Skip to content

Commit b2d880d

Browse files
committed
unix/modjni: Support for subscripting of Java lists (r/o so far).
1 parent 6196aa4 commit b2d880d

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

unix/modjni.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ static jmethodID Class_getConstructors_mid;
4848
static jmethodID Method_getName_mid;
4949
static jmethodID Method_toString_mid;
5050

51+
static jclass List_class;
52+
static jmethodID List_get_mid;
53+
static jmethodID List_set_mid;
54+
5155
STATIC const mp_obj_type_t jobject_type;
5256
STATIC const mp_obj_type_t jmethod_type;
5357

@@ -167,11 +171,36 @@ STATIC void jobject_attr(mp_obj_t self_in, qstr attr_in, mp_obj_t *dest) {
167171
}
168172
}
169173

174+
STATIC mp_obj_t jobject_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
175+
mp_obj_jobject_t *self = self_in;
176+
if (!JJ(IsInstanceOf, self->obj, List_class)) {
177+
return MP_OBJ_NULL;
178+
}
179+
180+
mp_uint_t idx = mp_obj_get_int(index);
181+
182+
if (value == MP_OBJ_NULL) {
183+
// delete
184+
assert(0);
185+
} else if (value == MP_OBJ_SENTINEL) {
186+
// load
187+
jobject el = JJ(CallObjectMethod, self->obj, List_get_mid, idx);
188+
return new_jobject(el);
189+
} else {
190+
// store
191+
assert(0);
192+
}
193+
194+
195+
return MP_OBJ_NULL;
196+
}
197+
170198
STATIC const mp_obj_type_t jobject_type = {
171199
{ &mp_type_type },
172200
.name = MP_QSTR_jobject,
173201
.print = jobject_print,
174202
.attr = jobject_attr,
203+
.subscr = jobject_subscr,
175204
// .locals_dict = (mp_obj_t)&jobject_locals_dict,
176205
};
177206

@@ -414,6 +443,12 @@ STATIC void create_jvm() {
414443
"()Ljava/lang/String;");
415444
Method_toString_mid = (*env)->GetMethodID(env, method_class, "toString",
416445
"()Ljava/lang/String;");
446+
447+
List_class = JJ(FindClass, "java/util/List");
448+
List_get_mid = JJ(GetMethodID, List_class, "get",
449+
"(I)Ljava/lang/Object;");
450+
List_set_mid = JJ(GetMethodID, List_class, "set",
451+
"(ILjava/lang/Object;)Ljava/lang/Object;");
417452
}
418453

419454
STATIC mp_obj_t mod_jni_cls(mp_obj_t cls_name_in) {

0 commit comments

Comments
 (0)