diff --git a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java index f22f4fa..c82f2ce 100644 --- a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java @@ -671,7 +671,7 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { break; case 189: // anewarray name = ((ConstantClass)constantPool.get( byteCode.readUnsignedShort() )).getName(); - type = ValueType.externref; //TODO we need to use the right type from name; getTypeManager().valueOf( name ); + type = getTypeManager().valueOf( name ); addArrayInstruction( ArrayOperator.NEW, type, codePos, lineNumber ); break; case 190: // arraylength diff --git a/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java index 4e01011..c5eaac7 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java @@ -23,6 +23,7 @@ import javax.annotation.Nullable; import de.inetsoftware.jwebassembly.WasmException; import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName; +import de.inetsoftware.jwebassembly.module.TypeManager.StructType; import de.inetsoftware.jwebassembly.wasm.AnyType; import de.inetsoftware.jwebassembly.wasm.ArrayOperator; import de.inetsoftware.jwebassembly.wasm.ArrayType; @@ -136,7 +137,10 @@ class WasmArrayInstruction extends WasmInstruction { * @return the identifier that is valid */ private static String validJsName( AnyType type ) { - return type.isRefType() ? "obj" : type.toString(); + if( type.isRefType() ) { + return ((StructType)type).getName().replace( '[', '_' ).replace( '/', '_' ).replace( '.', '_' ).replace( ";", "" ); + } + return type.toString(); } /** diff --git a/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java b/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java index 70b8c12..4fdeaa4 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java +++ b/src/de/inetsoftware/jwebassembly/wasm/ArrayType.java @@ -78,7 +78,10 @@ public class ArrayType extends StructType { throw new WasmException( "Not supported array type: " + arrayType, -1 ); } } - return "[" + ((StructType)arrayType).getName(); + if( arrayType instanceof ArrayType ) { + return "[" + getJavaClassName( ((ArrayType)arrayType).arrayType ); + } + return "[L" + ((StructType)arrayType).getName() + ";"; } /** diff --git a/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java b/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java index b4461da..d93c066 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java +++ b/test/de/inetsoftware/jwebassembly/runtime/ArrayOperations.java @@ -70,6 +70,8 @@ public class ArrayOperations extends AbstractBaseTest { addParam( list, script, "doubleArrayClassName" ); addParam( list, script, "booleanArrayClassName" ); addParam( list, script, "objectArrayClassName" ); + addParam( list, script, "stringArrayClassName" ); + addParam( list, script, "stringMatrixClassName" ); addParam( list, script, "byteArrayComponentTypeClassName" ); addParam( list, script, "shortArrayComponentTypeClassName" ); addParam( list, script, "charArrayComponentTypeClassName" ); @@ -262,6 +264,16 @@ public class ArrayOperations extends AbstractBaseTest { return JSObject.domString( new Object[0].getClass().getName() ); } + @Export + static String stringArrayClassName() { + return JSObject.domString( new String[0].getClass().getName() ); + } + + @Export + static String stringMatrixClassName() { + return JSObject.domString( new String[0][].getClass().getName() ); + } + @Export static String byteArrayComponentTypeClassName() { return JSObject.domString( new byte[0].getClass().getComponentType().getName() );