mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 15:37:52 +01:00
add support for Class constants
This commit is contained in:
parent
eba564fe67
commit
775496640c
@ -81,7 +81,7 @@ class ReplacementForClass {
|
|||||||
* @param classIdx
|
* @param classIdx
|
||||||
* the id/index of the Class.
|
* the id/index of the Class.
|
||||||
* @return the string
|
* @return the string
|
||||||
* @see #CLASS_CONSTANT_FUNCTION
|
* @see TypeManager#getClassConstantFunction()
|
||||||
*/
|
*/
|
||||||
private static ReplacementForClass classConstant( int classIdx ) {
|
private static ReplacementForClass classConstant( int classIdx ) {
|
||||||
ReplacementForClass clazz = getClassFromTable( classIdx );
|
ReplacementForClass clazz = getClassFromTable( classIdx );
|
||||||
|
@ -79,6 +79,8 @@ public class TypeManager {
|
|||||||
*/
|
*/
|
||||||
private static final int VTABLE_FIRST_FUNCTION_INDEX = 3;
|
private static final int VTABLE_FIRST_FUNCTION_INDEX = 3;
|
||||||
|
|
||||||
|
private static final FunctionName CLASS_CONSTANT_FUNCTION = new FunctionName( "java/lang/Class.classConstant(I)Lde/inetsoftware/jwebassembly/module/ReplacementForClass;" );
|
||||||
|
|
||||||
private Map<String, StructType> structTypes = new LinkedHashMap<>();
|
private Map<String, StructType> structTypes = new LinkedHashMap<>();
|
||||||
|
|
||||||
private Map<AnyType, ArrayType> arrayTypes = new LinkedHashMap<>();
|
private Map<AnyType, ArrayType> arrayTypes = new LinkedHashMap<>();
|
||||||
@ -151,6 +153,10 @@ public class TypeManager {
|
|||||||
return offsetFunction;
|
return offsetFunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FunctionName getClassConstantFunction() {
|
||||||
|
return CLASS_CONSTANT_FUNCTION;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the StructType. If needed an instance is created.
|
* Get the StructType. If needed an instance is created.
|
||||||
*
|
*
|
||||||
|
@ -26,6 +26,7 @@ import javax.annotation.Nonnull;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import de.inetsoftware.classparser.ClassFile;
|
import de.inetsoftware.classparser.ClassFile;
|
||||||
|
import de.inetsoftware.classparser.ConstantClass;
|
||||||
import de.inetsoftware.classparser.LocalVariableTable;
|
import de.inetsoftware.classparser.LocalVariableTable;
|
||||||
import de.inetsoftware.classparser.Member;
|
import de.inetsoftware.classparser.Member;
|
||||||
import de.inetsoftware.classparser.MethodInfo;
|
import de.inetsoftware.classparser.MethodInfo;
|
||||||
@ -400,6 +401,12 @@ public abstract class WasmCodeBuilder {
|
|||||||
addCallInstruction( name, javaCodePos, lineNumber );
|
addCallInstruction( name, javaCodePos, lineNumber );
|
||||||
} else if( value instanceof Number ) {
|
} else if( value instanceof Number ) {
|
||||||
instructions.add( new WasmConstInstruction( (Number)value, javaCodePos, lineNumber ) );
|
instructions.add( new WasmConstInstruction( (Number)value, javaCodePos, lineNumber ) );
|
||||||
|
} else if( value instanceof ConstantClass ) {
|
||||||
|
String className = ((ConstantClass)value).getName();
|
||||||
|
Integer id = types.valueOf( className ).getClassIndex();
|
||||||
|
FunctionName name = types.getClassConstantFunction();
|
||||||
|
instructions.add( new WasmConstInstruction( id, ValueType.i32, javaCodePos, lineNumber ) );
|
||||||
|
addCallInstruction( name, javaCodePos, lineNumber );
|
||||||
} else {
|
} else {
|
||||||
//TODO There can be ConstantClass, MethodType and MethodHandle
|
//TODO There can be ConstantClass, MethodType and MethodHandle
|
||||||
throw new WasmException( "Class constants are not supported. : " + value, lineNumber );
|
throw new WasmException( "Class constants are not supported. : " + value, lineNumber );
|
||||||
|
@ -125,17 +125,4 @@ public class RuntimeErrors {
|
|||||||
return list.size();
|
return list.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void classConatnt() throws IOException {
|
|
||||||
compileErrorTest( "Class constants are not supported.", ClassConstant.class );
|
|
||||||
}
|
|
||||||
|
|
||||||
static class ClassConstant {
|
|
||||||
@Export
|
|
||||||
static Object runnable() {
|
|
||||||
Class elemtentType = Integer.class;
|
|
||||||
return java.lang.reflect.Array.newInstance(elemtentType, 42);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,7 @@ public class StructsNonGC extends AbstractBaseTest {
|
|||||||
addParam( list, script, "objectClassName" );
|
addParam( list, script, "objectClassName" );
|
||||||
addParam( list, script, "integerClassName" );
|
addParam( list, script, "integerClassName" );
|
||||||
addParam( list, script, "classClassName" );
|
addParam( list, script, "classClassName" );
|
||||||
|
addParam( list, script, "classConst" );
|
||||||
}
|
}
|
||||||
rule.setTestParameters( list );
|
rule.setTestParameters( list );
|
||||||
return list;
|
return list;
|
||||||
@ -195,6 +196,12 @@ public class StructsNonGC extends AbstractBaseTest {
|
|||||||
Class clazz = obj.getClass().getClass();
|
Class clazz = obj.getClass().getClass();
|
||||||
return JSObject.domString( clazz.getName() );
|
return JSObject.domString( clazz.getName() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Export
|
||||||
|
static String classConst() {
|
||||||
|
Class clazz = Float.class;
|
||||||
|
return JSObject.domString( clazz.getName() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TestDefault {
|
interface TestDefault {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user