implements java/lang/reflect/Array.newInstance

This commit is contained in:
Volker Berlin 2020-09-27 13:17:58 +02:00
parent a74563c5d1
commit 1c84eac0dc
3 changed files with 46 additions and 1 deletions

View File

@ -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];
}
}
}

View File

@ -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

View File

@ -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 );
}
}
}