mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 23:47:51 +01:00
fix the order of parameters on the stack for array.get/set
This commit is contained in:
parent
762d7d2f6c
commit
6bd993617c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2018 - 2020 Volker Berlin (i-net software)
|
Copyright 2018 - 2021 Volker Berlin (i-net software)
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -62,7 +62,7 @@ public class TypeManager {
|
|||||||
/**
|
/**
|
||||||
* Name of field with array value.
|
* Name of field with array value.
|
||||||
*/
|
*/
|
||||||
static final String FIELD_VALUE = ".val";
|
public static final String FIELD_VALUE = ".array";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Byte position in the type description that contains the offset to the interfaces. Length 4 bytes.
|
* Byte position in the type description that contains the offset to the interfaces. Length 4 bytes.
|
||||||
@ -274,6 +274,7 @@ public class TypeManager {
|
|||||||
* the type name like java/lang/Object
|
* the type name like java/lang/Object
|
||||||
* @return the struct type
|
* @return the struct type
|
||||||
*/
|
*/
|
||||||
|
@Nonnull
|
||||||
public StructType valueOf( String name ) {
|
public StructType valueOf( String name ) {
|
||||||
StructType type = structTypes.get( name );
|
StructType type = structTypes.get( name );
|
||||||
if( type == null ) {
|
if( type == null ) {
|
||||||
@ -301,6 +302,7 @@ public class TypeManager {
|
|||||||
* the component type of the array
|
* the component type of the array
|
||||||
* @return the array type
|
* @return the array type
|
||||||
*/
|
*/
|
||||||
|
@Nonnull
|
||||||
public ArrayType arrayType( AnyType arrayType ) {
|
public ArrayType arrayType( AnyType arrayType ) {
|
||||||
ArrayType type = (ArrayType)structTypes.get( arrayType );
|
ArrayType type = (ArrayType)structTypes.get( arrayType );
|
||||||
if( type == null ) {
|
if( type == null ) {
|
||||||
@ -595,7 +597,7 @@ public class TypeManager {
|
|||||||
case array:
|
case array:
|
||||||
HashSet<String> allNeededFields = new HashSet<>();
|
HashSet<String> allNeededFields = new HashSet<>();
|
||||||
listStructFields( "java/lang/Object", functions, types, classFileLoader, allNeededFields );
|
listStructFields( "java/lang/Object", functions, types, classFileLoader, allNeededFields );
|
||||||
fields.add( new NamedStorageType( ((ArrayType)this).getNativeArrayType(), null, FIELD_VALUE ) );
|
fields.add( ((ArrayType)this).getNativeFieldName() );
|
||||||
break;
|
break;
|
||||||
case array_native:
|
case array_native:
|
||||||
fields.add( new NamedStorageType( ((ArrayType)this).getArrayType(), null, null ) );
|
fields.add( new NamedStorageType( ((ArrayType)this).getArrayType(), null, null ) );
|
||||||
|
@ -180,14 +180,6 @@ class WasmArrayInstruction extends WasmInstruction {
|
|||||||
if( functionName != null ) { // nonGC
|
if( functionName != null ) { // nonGC
|
||||||
writer.writeFunctionCall( functionName, null );
|
writer.writeFunctionCall( functionName, null );
|
||||||
} else {
|
} else {
|
||||||
switch( op ) {
|
|
||||||
case GET:
|
|
||||||
case SET:
|
|
||||||
case LEN:
|
|
||||||
writer.writeStructOperator( StructOperator.GET, arrayType, null, 2 ); // the native array is on position 2 (vtable, hashcode are before)
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
writer.writeArrayOperator( op, arrayType );
|
writer.writeArrayOperator( op, arrayType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -735,9 +735,32 @@ public abstract class WasmCodeBuilder {
|
|||||||
* the line number in the Java source code
|
* the line number in the Java source code
|
||||||
*/
|
*/
|
||||||
protected void addArrayInstruction( ArrayOperator op, AnyType type, int javaCodePos, int lineNumber ) {
|
protected void addArrayInstruction( ArrayOperator op, AnyType type, int javaCodePos, int lineNumber ) {
|
||||||
|
boolean useGC = options.useGC();
|
||||||
|
if( useGC ) {
|
||||||
|
// replace the the array wrapper on the stack with the native array
|
||||||
|
int idx;
|
||||||
|
switch( op ) {
|
||||||
|
case GET:
|
||||||
|
idx = StackInspector.findInstructionThatPushValue( instructions, 1, javaCodePos ).idx;
|
||||||
|
break;
|
||||||
|
case SET:
|
||||||
|
idx = StackInspector.findInstructionThatPushValue( instructions, 2, javaCodePos ).idx;
|
||||||
|
break;
|
||||||
|
case LEN:
|
||||||
|
idx = instructions.size();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
idx = -1;
|
||||||
|
}
|
||||||
|
if( idx >= 0 ) {
|
||||||
|
ArrayType arrayType = types.arrayType( type );
|
||||||
|
instructions.add( idx, new WasmStructInstruction( StructOperator.GET, arrayType, arrayType.getNativeFieldName(), javaCodePos, lineNumber, types ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WasmArrayInstruction arrayInst = new WasmArrayInstruction( op, type, types, javaCodePos, lineNumber );
|
WasmArrayInstruction arrayInst = new WasmArrayInstruction( op, type, types, javaCodePos, lineNumber );
|
||||||
instructions.add( arrayInst );
|
instructions.add( arrayInst );
|
||||||
SyntheticFunctionName name = arrayInst.createNonGcFunction( options.useGC() );
|
SyntheticFunctionName name = arrayInst.createNonGcFunction( useGC );
|
||||||
if( name != null ) {
|
if( name != null ) {
|
||||||
functions.markAsNeeded( name );
|
functions.markAsNeeded( name );
|
||||||
functions.markAsImport( name, name.getAnnotation() );
|
functions.markAsImport( name, name.getAnnotation() );
|
||||||
|
@ -66,9 +66,29 @@ class WasmStructInstruction extends WasmInstruction {
|
|||||||
* the type manager
|
* the type manager
|
||||||
*/
|
*/
|
||||||
WasmStructInstruction( @Nonnull StructOperator op, @Nonnull String typeName, @Nullable NamedStorageType fieldName, int javaCodePos, int lineNumber, TypeManager types ) {
|
WasmStructInstruction( @Nonnull StructOperator op, @Nonnull String typeName, @Nullable NamedStorageType fieldName, int javaCodePos, int lineNumber, TypeManager types ) {
|
||||||
|
this( op, types.valueOf( typeName ), fieldName, javaCodePos, lineNumber, types );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an instance of numeric operation.
|
||||||
|
*
|
||||||
|
* @param op
|
||||||
|
* the struct operation
|
||||||
|
* @param type
|
||||||
|
* the type of the parameters
|
||||||
|
* @param fieldName
|
||||||
|
* the name of field if needed for the operation
|
||||||
|
* @param javaCodePos
|
||||||
|
* the code position/offset in the Java method
|
||||||
|
* @param lineNumber
|
||||||
|
* the line number in the Java source code
|
||||||
|
* @param types
|
||||||
|
* the type manager
|
||||||
|
*/
|
||||||
|
WasmStructInstruction( @Nonnull StructOperator op, @Nonnull StructType type, @Nullable NamedStorageType fieldName, int javaCodePos, int lineNumber, TypeManager types ) {
|
||||||
super( javaCodePos, lineNumber );
|
super( javaCodePos, lineNumber );
|
||||||
this.op = op;
|
this.op = op;
|
||||||
this.type = types.valueOf( typeName );
|
this.type = type;
|
||||||
this.fieldName = fieldName;
|
this.fieldName = fieldName;
|
||||||
if( type != null && fieldName != null ) {
|
if( type != null && fieldName != null ) {
|
||||||
type.useFieldName( fieldName );
|
type.useFieldName( fieldName );
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019 - 2020 Volker Berlin (i-net software)
|
* Copyright 2019 - 2021 Volker Berlin (i-net software)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -35,6 +35,8 @@ public class ArrayType extends StructType {
|
|||||||
|
|
||||||
private AnyType nativeArrayType;
|
private AnyType nativeArrayType;
|
||||||
|
|
||||||
|
private NamedStorageType nativeFieldName;
|
||||||
|
|
||||||
private int componentClassIndex;
|
private int componentClassIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,6 +61,7 @@ public class ArrayType extends StructType {
|
|||||||
} else {
|
} else {
|
||||||
this.nativeArrayType = arrayType;
|
this.nativeArrayType = arrayType;
|
||||||
}
|
}
|
||||||
|
nativeFieldName = new NamedStorageType( this.nativeArrayType, getName(), TypeManager.FIELD_VALUE );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -126,10 +129,23 @@ public class ArrayType extends StructType {
|
|||||||
return arrayType;
|
return arrayType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The native webassembly array type that we wrap
|
||||||
|
* @return the type
|
||||||
|
*/
|
||||||
public AnyType getNativeArrayType() {
|
public AnyType getNativeArrayType() {
|
||||||
return nativeArrayType;
|
return nativeArrayType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The native field name
|
||||||
|
*
|
||||||
|
* @return the field name
|
||||||
|
*/
|
||||||
|
public NamedStorageType getNativeFieldName() {
|
||||||
|
return nativeFieldName;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user