From 775496640cfb828d2586312702e70260ea13c3c6 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sun, 15 Mar 2020 15:49:52 +0100 Subject: [PATCH] add support for Class constants --- .../jwebassembly/module/ReplacementForClass.java | 2 +- .../jwebassembly/module/TypeManager.java | 6 ++++++ .../jwebassembly/module/WasmCodeBuilder.java | 7 +++++++ .../jwebassembly/runtime/RuntimeErrors.java | 13 ------------- .../jwebassembly/runtime/StructsNonGC.java | 7 +++++++ 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java b/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java index a6b4e59..a4f3042 100644 --- a/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java +++ b/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java @@ -81,7 +81,7 @@ class ReplacementForClass { * @param classIdx * the id/index of the Class. * @return the string - * @see #CLASS_CONSTANT_FUNCTION + * @see TypeManager#getClassConstantFunction() */ private static ReplacementForClass classConstant( int classIdx ) { ReplacementForClass clazz = getClassFromTable( classIdx ); diff --git a/src/de/inetsoftware/jwebassembly/module/TypeManager.java b/src/de/inetsoftware/jwebassembly/module/TypeManager.java index 3d46f5b..819b767 100644 --- a/src/de/inetsoftware/jwebassembly/module/TypeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/TypeManager.java @@ -79,6 +79,8 @@ public class TypeManager { */ 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 structTypes = new LinkedHashMap<>(); private Map arrayTypes = new LinkedHashMap<>(); @@ -151,6 +153,10 @@ public class TypeManager { return offsetFunction; } + FunctionName getClassConstantFunction() { + return CLASS_CONSTANT_FUNCTION; + } + /** * Get the StructType. If needed an instance is created. * diff --git a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java index e2cc439..2feeb2a 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java @@ -26,6 +26,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import de.inetsoftware.classparser.ClassFile; +import de.inetsoftware.classparser.ConstantClass; import de.inetsoftware.classparser.LocalVariableTable; import de.inetsoftware.classparser.Member; import de.inetsoftware.classparser.MethodInfo; @@ -400,6 +401,12 @@ public abstract class WasmCodeBuilder { addCallInstruction( name, javaCodePos, lineNumber ); } else if( value instanceof Number ) { 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 { //TODO There can be ConstantClass, MethodType and MethodHandle throw new WasmException( "Class constants are not supported. : " + value, lineNumber ); diff --git a/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java b/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java index 4462fec..b39d37c 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java +++ b/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java @@ -125,17 +125,4 @@ public class RuntimeErrors { 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); - } - } } diff --git a/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java b/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java index 8a89dc6..3910c6c 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java +++ b/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java @@ -59,6 +59,7 @@ public class StructsNonGC extends AbstractBaseTest { addParam( list, script, "objectClassName" ); addParam( list, script, "integerClassName" ); addParam( list, script, "classClassName" ); + addParam( list, script, "classConst" ); } rule.setTestParameters( list ); return list; @@ -195,6 +196,12 @@ public class StructsNonGC extends AbstractBaseTest { Class clazz = obj.getClass().getClass(); return JSObject.domString( clazz.getName() ); } + + @Export + static String classConst() { + Class clazz = Float.class; + return JSObject.domString( clazz.getName() ); + } } interface TestDefault {