mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-15 02:44:47 +01:00
implements java/lang/reflect/Array.newInstance
This commit is contained in:
parent
a74563c5d1
commit
1c84eac0dc
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user