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;
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

View File

@ -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();
}
/**

View File

@ -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() + ";";
}
/**

View File

@ -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() );