diff --git a/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForArray.java b/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForArray.java index 23cd958..ea771b8 100644 --- a/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForArray.java +++ b/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForArray.java @@ -129,4 +129,38 @@ public class ReplacementForArray { + "array.len [S " // + "return " ) private static native int getLengthOfShorts( Object obj ); + + /** + * Replacement of the native Java methods Array.newInstance(c,l) + * + * @param obj + * the object + * @return the length of the object + */ + @Replace( "java/lang/reflect/Array.newInstance(Ljava/lang/Class;I)Ljava/lang/Object;" ) + private static Object array_newInstance( ReplacementForClass componentClass, int length ) { + int vtable = componentClass.vtable; + int componentType = getIntFromMemory( vtable + TYPE_DESCRIPTION_INSTANCEOF_OFFSET ); + switch( componentType ) { + case BOOLEAN: + return new boolean[length]; + case BYTE: + return new byte[length]; + case CHAR: + return new char[length]; + case DOUBLE: + return new double[length]; + case FLOAT: + return new float[length]; + case INT: + return new int[length]; + case LONG: + return new long[length]; + case SHORT: + return new short[length]; + default: + //TODO it should return the right component array + return new Object[length]; + } + } } diff --git a/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForClass.java b/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForClass.java index 134a98b..d052cb1 100644 --- a/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForClass.java +++ b/src/de/inetsoftware/jwebassembly/module/nativecode/ReplacementForClass.java @@ -41,7 +41,10 @@ import de.inetsoftware.jwebassembly.module.TypeManager; @Replace( "java/lang/Class" ) class ReplacementForClass { - private final int vtable; + /** + * The pointer in the memory for the class/type description. + */ + final int vtable; /** * Create a instance diff --git a/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java b/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java index d93c066..e2d5962 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java +++ b/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java @@ -15,6 +15,7 @@ */ package de.inetsoftware.jwebassembly.runtime; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -81,6 +82,7 @@ public class ArrayOperations extends AbstractBaseTest { addParam( list, script, "doubleArrayComponentTypeClassName" ); addParam( list, script, "booleanArrayComponentTypeClassName" ); addParam( list, script, "objectArrayComponentTypeClassName" ); + addParam( list, script, "arrayNewInstance_getLength" ); } rule.setTestParameters( list ); return list; @@ -318,5 +320,11 @@ public class ArrayOperations extends AbstractBaseTest { static String objectArrayComponentTypeClassName() { return JSObject.domString( new Object[0].getClass().getComponentType().getName() ); } + + @Export + static int arrayNewInstance_getLength() { + Object obj = Array.newInstance( byte.class, 42 ); + return Array.getLength( obj ); + } } }