Fix array class name for more complex object arrays

This commit is contained in:
Volker Berlin 2020-09-23 19:47:06 +02:00
parent 0d7beb611b
commit b9a904ab42
4 changed files with 22 additions and 3 deletions

View File

@ -671,7 +671,7 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder {
break; break;
case 189: // anewarray case 189: // anewarray
name = ((ConstantClass)constantPool.get( byteCode.readUnsignedShort() )).getName(); 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 ); addArrayInstruction( ArrayOperator.NEW, type, codePos, lineNumber );
break; break;
case 190: // arraylength case 190: // arraylength

View File

@ -23,6 +23,7 @@ import javax.annotation.Nullable;
import de.inetsoftware.jwebassembly.WasmException; import de.inetsoftware.jwebassembly.WasmException;
import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName; import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName;
import de.inetsoftware.jwebassembly.module.TypeManager.StructType;
import de.inetsoftware.jwebassembly.wasm.AnyType; import de.inetsoftware.jwebassembly.wasm.AnyType;
import de.inetsoftware.jwebassembly.wasm.ArrayOperator; import de.inetsoftware.jwebassembly.wasm.ArrayOperator;
import de.inetsoftware.jwebassembly.wasm.ArrayType; import de.inetsoftware.jwebassembly.wasm.ArrayType;
@ -136,7 +137,10 @@ class WasmArrayInstruction extends WasmInstruction {
* @return the identifier that is valid * @return the identifier that is valid
*/ */
private static String validJsName( AnyType type ) { 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();
} }
/** /**

View File

@ -78,7 +78,10 @@ public class ArrayType extends StructType {
throw new WasmException( "Not supported array type: " + arrayType, -1 ); 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() + ";";
} }
/** /**

View File

@ -70,6 +70,8 @@ public class ArrayOperations extends AbstractBaseTest {
addParam( list, script, "doubleArrayClassName" ); addParam( list, script, "doubleArrayClassName" );
addParam( list, script, "booleanArrayClassName" ); addParam( list, script, "booleanArrayClassName" );
addParam( list, script, "objectArrayClassName" ); addParam( list, script, "objectArrayClassName" );
addParam( list, script, "stringArrayClassName" );
addParam( list, script, "stringMatrixClassName" );
addParam( list, script, "byteArrayComponentTypeClassName" ); addParam( list, script, "byteArrayComponentTypeClassName" );
addParam( list, script, "shortArrayComponentTypeClassName" ); addParam( list, script, "shortArrayComponentTypeClassName" );
addParam( list, script, "charArrayComponentTypeClassName" ); addParam( list, script, "charArrayComponentTypeClassName" );
@ -262,6 +264,16 @@ public class ArrayOperations extends AbstractBaseTest {
return JSObject.domString( new Object[0].getClass().getName() ); 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 @Export
static String byteArrayComponentTypeClassName() { static String byteArrayComponentTypeClassName() {
return JSObject.domString( new byte[0].getClass().getComponentType().getName() ); return JSObject.domString( new byte[0].getClass().getComponentType().getName() );