From 026f962677f658b834f2e47ab36a531a69842ce0 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sat, 4 Apr 2020 16:09:58 +0200 Subject: [PATCH] Add support for primitive classes --- .../module/ReplacementForClass.java | 40 +++++++++++++++++++ .../jwebassembly/module/TypeManager.java | 18 ++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java b/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java index 07941e2..3fe0acb 100644 --- a/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java +++ b/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java @@ -158,4 +158,44 @@ class ReplacementForClass { "i32.load offset=0 align=4 " + // "return" ) private static native int getIntFromMemory( int pos ); + + + /** + * Replacement of the native Java methods + * + * @param name + * the class name + * @return the class + * @see TypeManager#PRIMITIVE_CLASSES + */ + static ReplacementForClass getPrimitiveClass( String name ) { + switch( name ) { + case "boolean": + return classConstant( 0 ); + case "byte": + return classConstant( 1 ); + case "char": + return classConstant( 2 ); + case "double": + return classConstant( 3 ); + case "float": + return classConstant( 4 ); + case "int": + return classConstant( 5 ); + case "long": + return classConstant( 6 ); + case "short": + return classConstant( 7 ); + case "void": + return classConstant( 8 ); + } + return null; + } + + /** + * Replacement of the native Java methods. + */ + public boolean desiredAssertionStatus() { + return false; + } } diff --git a/src/de/inetsoftware/jwebassembly/module/TypeManager.java b/src/de/inetsoftware/jwebassembly/module/TypeManager.java index 78b4d89..2d9273c 100644 --- a/src/de/inetsoftware/jwebassembly/module/TypeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/TypeManager.java @@ -81,6 +81,13 @@ public class TypeManager { private static final FunctionName CLASS_CONSTANT_FUNCTION = new FunctionName( "java/lang/Class.classConstant(I)Ljava/lang/Class;" ); + /** + * the list of primitive types. The order is important and must correlate with getPrimitiveClass. + * + * @see ReplacementForClass#getPrimitiveClass(String) + */ + private static final String[] PRIMITIVE_CLASSES = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "void" }; + private Map structTypes = new LinkedHashMap<>(); private Map arrayTypes = new LinkedHashMap<>(); @@ -188,6 +195,13 @@ public class TypeManager { if( isFinish ) { throw new WasmException( "Register needed type after scanning: " + name, -1 ); } + + if( structTypes.size() == 0 ) { + for( String primitiveTypeName : PRIMITIVE_CLASSES ) { + structTypes.put( primitiveTypeName, new StructType( primitiveTypeName, structTypes.size() ) ); + } + } + type = new StructType( name, structTypes.size() ); structTypes.put( name, type ); } @@ -363,7 +377,9 @@ public class TypeManager { instanceOFs = new LinkedHashSet<>(); // remembers the order from bottom to top class. instanceOFs.add( this ); HashSet allNeededFields = new HashSet<>(); - listStructFields( name, functions, types, classFileLoader, allNeededFields ); + if( classIndex >= PRIMITIVE_CLASSES.length ) { + listStructFields( name, functions, types, classFileLoader, allNeededFields ); + } } /**