From 9b3c747763463a192d411fa0e7dc9c122c916baa Mon Sep 17 00:00:00 2001
From: Jari Vetoniemi <mailroxas@gmail.com>
Date: Tue, 8 May 2018 23:32:35 +0300
Subject: jvm: add some array implementation code

---
 src/jvm/jvm.c | 55 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 23 deletions(-)

(limited to 'src/jvm')

diff --git a/src/jvm/jvm.c b/src/jvm/jvm.c
index 1426190..213b549 100644
--- a/src/jvm/jvm.c
+++ b/src/jvm/jvm.c
@@ -749,6 +749,17 @@ JNIEnv_GetStringUTFLength(JNIEnv* p0, jstring p1)
    return jvm_get_object(jnienv_get_jvm(p0), p1)->string.size;
 }
 
+static jobject
+jvm_new_array(struct jvm *jvm, const size_t size, const size_t element_sz, const char *klass)
+{
+   assert(jvm && klass);
+   struct jvm_object o = { .array = { .size = size, .element_sz = element_sz }, .type = JVM_OBJECT_ARRAY };
+   o.this_klass = jvm_make_class(jvm, klass);
+   o.array.data = calloc(size, element_sz);
+   assert(o.array.data);
+   return jvm_add_object_if_not_there(jvm, &o);
+}
+
 static jsize
 JNIEnv_GetArrayLength(JNIEnv* p0, jarray p1)
 {
@@ -759,29 +770,7 @@ JNIEnv_GetArrayLength(JNIEnv* p0, jarray p1)
 static jobjectArray
 JNIEnv_NewObjectArray(JNIEnv* p0, jsize p1, jclass p2, jobject p3)
 {
-   return NULL;
-}
-
-static jobject
-JNIEnv_GetObjectArrayElement(JNIEnv* p0, jobjectArray p1, jsize p2)
-{
-   return NULL;
-}
-
-static void
-JNIEnv_SetObjectArrayElement(JNIEnv* p0, jobjectArray p1, jsize p2, jobject p3)
-{
-}
-
-static jobject
-jvm_new_array(struct jvm *jvm, const size_t size, const size_t element_sz, const char *klass)
-{
-   assert(jvm && klass);
-   struct jvm_object o = { .array = { .size = size, .element_sz = element_sz }, .type = JVM_OBJECT_ARRAY };
-   o.this_klass = jvm_make_class(jvm, klass);
-   o.array.data = calloc(size, element_sz);
-   assert(o.array.data);
-   return jvm_add_object_if_not_there(jvm, &o);
+   return jvm_new_array(jnienv_get_jvm(p0), p1, sizeof(jobject), "[Ljava/lang/Object;");
 }
 
 static jbooleanArray
@@ -843,6 +832,26 @@ jvm_get_array_elements(struct jvm *jvm, jobject array, jboolean *is_copy)
    return jvm_get_object(jvm, array)->array.data;
 }
 
+static jobject
+JNIEnv_GetObjectArrayElement(JNIEnv* p0, jobjectArray p1, jsize p2)
+{
+   const struct jvm_object *obj = jvm_get_object(jnienv_get_jvm(p0), p1);
+   if (!obj || obj->array.size <= (size_t)p2)
+      return NULL;
+
+   return (jobject)((uintptr_t*)obj->array.data)[p2];
+}
+
+static void
+JNIEnv_SetObjectArrayElement(JNIEnv* p0, jobjectArray p1, jsize p2, jobject p3)
+{
+   const struct jvm_object *obj = jvm_get_object(jnienv_get_jvm(p0), p1);
+   if (!obj || obj->array.size <= (size_t)p2)
+      return;
+
+   ((uintptr_t*)obj->array.data)[p2] = (uintptr_t)p3;
+}
+
 static jboolean*
 JNIEnv_GetBooleanArrayElements(JNIEnv* p0, jbooleanArray p1, jboolean* p2)
 {
-- 
cgit v1.2.3-70-g09d2