* src/vmcore/primitive.c (stdint.h): Added.
authortwisti <none@none>
Sun, 15 Jul 2007 10:37:50 +0000 (10:37 +0000)
committertwisti <none@none>
Sun, 15 Jul 2007 10:37:50 +0000 (10:37 +0000)
(primitive_arrayclass_get_by_name): New function.

* src/vmcore/primitive.h (stdint.h): Added.
(primitive_arrayclass_get_by_name): Likewise.

* src/native/vm/sun/jvm.c (JVM_NewArray): Implemented handling for
primitive arrays.

src/native/vm/sun/jvm.c
src/vmcore/primitive.c
src/vmcore/primitive.h

index 62aa9b13259c93dd272197ac27fbd0b24123ce4b..72bbc5b85c0aaa19ea65bc53bdd527accb9dd94a 100644 (file)
@@ -1876,10 +1876,27 @@ void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v
 
 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
 {
+       classinfo        *c;
+       classinfo        *pc;
+       java_objectarray *oa;
+
+       c = (classinfo *) eltClass;
+
 #if PRINTJVM
-       log_println("JVM_NewArray: eltClass=%p, length=%d", eltClass, length);
+       log_println("JVM_NewArray(eltClass=%p, length=%d)", eltClass, length);
 #endif
-       return (jobject) builtin_anewarray(length, (classinfo *) eltClass);
+
+       /* create primitive or object array */
+
+       if (primitive_class_is_primitive(c)) {
+               pc = primitive_arrayclass_get_by_name(c->name);
+               oa = builtin_newarray(length, pc);
+       }
+       else {
+               oa = builtin_anewarray(length, c);
+       }
+
+       return (jobject) oa;
 }
 
 
index ba2b3e258ca3c44cad5d52210763d8c6a008102e..f1f2e4bef8b025486a8f0e82337d623d85c41824 100644 (file)
@@ -30,8 +30,7 @@
 #include "config.h"
 
 #include <assert.h>
-
-#include "vm/types.h"
+#include <stdint.h>
 
 #include "vm/global.h"
 
@@ -82,7 +81,7 @@ bool primitive_init(void)
        utf       *name;
        classinfo *c;
        utf       *u;
-       s4         i;
+       int        i;
 
        for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
                /* skip dummies */
@@ -161,7 +160,7 @@ bool primitive_init(void)
 
 bool primitive_class_is_primitive(classinfo *c)
 {
-       s4 i;
+       int i;
 
        /* search table of primitive classes */
 
@@ -181,7 +180,7 @@ bool primitive_class_is_primitive(classinfo *c)
 
 classinfo *primitive_class_get_by_name(utf *name)
 {
-       s4 i;
+       int i;
 
        /* search table of primitive classes */
 
@@ -201,7 +200,7 @@ classinfo *primitive_class_get_by_name(utf *name)
 
 *******************************************************************************/
 
-classinfo *primitive_class_get_by_type(s4 type)
+classinfo *primitive_class_get_by_type(int32_t type)
 {
        return primitivetype_table[type].class_primitive;
 }
@@ -215,7 +214,7 @@ classinfo *primitive_class_get_by_type(s4 type)
 
 classinfo *primitive_class_get_by_char(char ch)
 {
-       s4 index;
+       int32_t index;
 
        switch (ch) {
        case 'I':
@@ -253,13 +252,36 @@ classinfo *primitive_class_get_by_char(char ch)
 }
 
 
+/* primitive_arrayclass_get_by_name ********************************************
+
+   Returns the primitive array-class of the given primitive class
+   name.
+
+*******************************************************************************/
+
+classinfo *primitive_arrayclass_get_by_name(utf *name)
+{
+       int i;
+
+       /* search table of primitive classes */
+
+       for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
+               if (primitivetype_table[i].name == name)
+                       return primitivetype_table[i].arrayclass;
+
+       /* keep compiler happy */
+
+       return NULL;
+}
+
+
 /* primitive_arrayclass_get_by_type ********************************************
 
    Returns the primitive array-class of the given type.
 
 *******************************************************************************/
 
-classinfo *primitive_arrayclass_get_by_type(s4 type)
+classinfo *primitive_arrayclass_get_by_type(int32_t type)
 {
        return primitivetype_table[type].arrayclass;
 }
index eb04084c7892466e87da7b10706d723222e1e3eb..a3873f8f2d93d052a835f7648efe35f864d6ed09 100644 (file)
@@ -32,6 +32,8 @@
 
 #include "config.h"
 
+#include <stdint.h>
+
 #include "vm/global.h"
 
 #include "vmcore/class.h"
@@ -105,9 +107,10 @@ extern primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT];
 bool       primitive_init(void);
 bool       primitive_class_is_primitive(classinfo *c);
 classinfo *primitive_class_get_by_name(utf *name);
-classinfo *primitive_class_get_by_type(s4 type);
+classinfo *primitive_class_get_by_type(int32_t type);
 classinfo *primitive_class_get_by_char(char ch);
-classinfo *primitive_arrayclass_get_by_type(s4 type);
+classinfo *primitive_arrayclass_get_by_name(utf *name);
+classinfo *primitive_arrayclass_get_by_type(int32_t type);
 
 #endif /* _PRIMITIVE_H */