diff --git a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java index e6a99dd..f22f4fa 100644 --- a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java @@ -641,10 +641,10 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { int typeValue = byteCode.readByte(); switch( typeValue ) { case 4: // boolean - type = ValueType.i8; + type = ValueType.bool; break; case 5: // char - type = ValueType.i16; + type = ValueType.u16; break; case 6: //float type = ValueType.f32; diff --git a/src/de/inetsoftware/jwebassembly/module/TypeManager.java b/src/de/inetsoftware/jwebassembly/module/TypeManager.java index d82ed3e..526dd25 100644 --- a/src/de/inetsoftware/jwebassembly/module/TypeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/TypeManager.java @@ -248,10 +248,13 @@ public class TypeManager { if( !arrayType.isRefType() ) { // see ReplacementForClass.getPrimitiveClass(String) switch( (ValueType)arrayType ) { + case bool: + componentClassIndex = 0; + break; case i8: componentClassIndex = 1; break; - case i16: + case u16: componentClassIndex = 2; break; case f64: @@ -266,6 +269,9 @@ public class TypeManager { case i64: componentClassIndex = 6; break; + case i16: + componentClassIndex = 7; + break; case externref: componentClassIndex = valueOf( "java/lang/Object" ).classIndex; break; diff --git a/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java b/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java index 6c70950..4a306ab 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java +++ b/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java @@ -15,6 +15,7 @@ */ package de.inetsoftware.jwebassembly.wasm; +import de.inetsoftware.jwebassembly.WasmException; import de.inetsoftware.jwebassembly.module.TypeManager.StructType; /** @@ -40,12 +41,46 @@ public class ArrayType extends StructType { * the running index of the component/array class/type */ public ArrayType( AnyType arrayType, int classIndex, int componentClassIndex ) { - //TODO name - super( "[", classIndex ); + super( getJavaClassName( arrayType ), classIndex ); this.arrayType = arrayType; this.componentClassIndex = componentClassIndex; } + /** + * Create class name for the array class. + * + * @param arrayType + * the type of the array + * @return the name + */ + private static String getJavaClassName( AnyType arrayType ) { + if( !arrayType.isRefType() ) { + switch( (ValueType)arrayType ) { + case bool: + return "[Z"; + case i8: + return "[B"; + case i16: + return "[S"; + case u16: + return "[C"; + case f64: + return "[D"; + case f32: + return "[F"; + case i32: + return "[I"; + case i64: + return "[J"; + case externref: + return "[Ljava.lang.Object;"; + default: + throw new WasmException( "Not supported array type: " + arrayType, -1 ); + } + } + return "[" + ((StructType)arrayType).getName(); + } + /** * The element type of the array * @return the type diff --git a/src/de/inetsoftware/jwebassembly/wasm/ValueType.java b/src/de/inetsoftware/jwebassembly/wasm/ValueType.java index 1280b9e..041563c 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/ValueType.java +++ b/src/de/inetsoftware/jwebassembly/wasm/ValueType.java @@ -24,8 +24,10 @@ public enum ValueType implements AnyType { f32(-0x03), f64(-0x04), v128(-0x05), + bool(-0x06), i8(-0x06), i16(-0x07), + u16(-0x07), funcref(-0x10), externref(-0x11), anyref(-0x12), diff --git a/src/de/inetsoftware/jwebassembly/wasm/ValueTypeParser.java b/src/de/inetsoftware/jwebassembly/wasm/ValueTypeParser.java index 0e66c87..53155e6 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/ValueTypeParser.java +++ b/src/de/inetsoftware/jwebassembly/wasm/ValueTypeParser.java @@ -87,9 +87,11 @@ public class ValueTypeParser implements Iterator { idx = idx2 + 1; return types.valueOf( name ); case 'Z': // boolean + return isArray ? ValueType.bool : ValueType.i32; case 'B': // byte return isArray ? ValueType.i8 : ValueType.i32; case 'C': // char + return isArray ? ValueType.u16 : ValueType.i32; case 'S': // short return isArray ? ValueType.i16 : ValueType.i32; case 'I': // int