mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +01:00
improve array handling with GC
This commit is contained in:
parent
28b03b05c2
commit
be56c02b15
@ -40,6 +40,7 @@ import de.inetsoftware.jwebassembly.sourcemap.SourceMapWriter;
|
|||||||
import de.inetsoftware.jwebassembly.sourcemap.SourceMapping;
|
import de.inetsoftware.jwebassembly.sourcemap.SourceMapping;
|
||||||
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.FunctionType;
|
import de.inetsoftware.jwebassembly.wasm.FunctionType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.MemoryOperator;
|
import de.inetsoftware.jwebassembly.wasm.MemoryOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
|
import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
|
||||||
@ -1353,7 +1354,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void writeArrayOperator( @Nonnull ArrayOperator op, AnyType type ) throws IOException {
|
protected void writeArrayOperator( @Nonnull ArrayOperator op, ArrayType type ) throws IOException {
|
||||||
int opCode;
|
int opCode;
|
||||||
switch(op) {
|
switch(op) {
|
||||||
case NEW:
|
case NEW:
|
||||||
|
@ -26,6 +26,7 @@ import javax.annotation.Nullable;
|
|||||||
import de.inetsoftware.jwebassembly.module.TypeManager.StructType;
|
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.FunctionType;
|
import de.inetsoftware.jwebassembly.wasm.FunctionType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.MemoryOperator;
|
import de.inetsoftware.jwebassembly.wasm.MemoryOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
|
import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
|
||||||
@ -304,11 +305,11 @@ public abstract class ModuleWriter implements Closeable {
|
|||||||
* @param op
|
* @param op
|
||||||
* the operation
|
* the operation
|
||||||
* @param type
|
* @param type
|
||||||
* the resulting type
|
* the type of the array
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* if any I/O error occur
|
* if any I/O error occur
|
||||||
*/
|
*/
|
||||||
protected abstract void writeArrayOperator( @Nonnull ArrayOperator op, AnyType type ) throws IOException;
|
protected abstract void writeArrayOperator( @Nonnull ArrayOperator op, ArrayType type ) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a struct operation
|
* Write a struct operation
|
||||||
|
@ -36,11 +36,13 @@ import de.inetsoftware.jwebassembly.wasm.ValueType;
|
|||||||
*/
|
*/
|
||||||
class WasmArrayInstruction extends WasmInstruction {
|
class WasmArrayInstruction extends WasmInstruction {
|
||||||
|
|
||||||
private final ArrayOperator op;
|
private final ArrayOperator op;
|
||||||
|
|
||||||
private final AnyType type;
|
private final AnyType type;
|
||||||
|
|
||||||
private final TypeManager types;
|
private final ArrayType arrayType;
|
||||||
|
|
||||||
|
private final TypeManager types;
|
||||||
|
|
||||||
private SyntheticFunctionName functionName;
|
private SyntheticFunctionName functionName;
|
||||||
|
|
||||||
@ -51,6 +53,8 @@ class WasmArrayInstruction extends WasmInstruction {
|
|||||||
* the array operation
|
* the array operation
|
||||||
* @param type
|
* @param type
|
||||||
* the type of the parameters
|
* the type of the parameters
|
||||||
|
* @param types
|
||||||
|
* the type manager
|
||||||
* @param javaCodePos
|
* @param javaCodePos
|
||||||
* the code position/offset in the Java method
|
* the code position/offset in the Java method
|
||||||
* @param lineNumber
|
* @param lineNumber
|
||||||
@ -61,6 +65,7 @@ class WasmArrayInstruction extends WasmInstruction {
|
|||||||
this.op = op;
|
this.op = op;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.types = types;
|
this.types = types;
|
||||||
|
this.arrayType = types.arrayType( type );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -100,7 +105,6 @@ class WasmArrayInstruction extends WasmInstruction {
|
|||||||
cmd = "Object.seal(new Array(l).fill(null))";
|
cmd = "Object.seal(new Array(l).fill(null))";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ArrayType arrayType = types.arrayType( type );
|
|
||||||
functionName = new JavaScriptSyntheticFunctionName( "NonGC", "array_new_" + validJsName( type ), () -> {
|
functionName = new JavaScriptSyntheticFunctionName( "NonGC", "array_new_" + validJsName( type ), () -> {
|
||||||
// create the default values of a new type
|
// create the default values of a new type
|
||||||
return new StringBuilder( "(l)=>Object.seal({0:" ) // fix count of elements
|
return new StringBuilder( "(l)=>Object.seal({0:" ) // fix count of elements
|
||||||
@ -150,7 +154,7 @@ class WasmArrayInstruction extends WasmInstruction {
|
|||||||
if( functionName != null ) { // nonGC
|
if( functionName != null ) { // nonGC
|
||||||
writer.writeFunctionCall( functionName, null );
|
writer.writeFunctionCall( functionName, null );
|
||||||
} else {
|
} else {
|
||||||
writer.writeArrayOperator( op, type );
|
writer.writeArrayOperator( op, arrayType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +164,7 @@ class WasmArrayInstruction extends WasmInstruction {
|
|||||||
AnyType getPushValueType() {
|
AnyType getPushValueType() {
|
||||||
switch( op ) {
|
switch( op ) {
|
||||||
case NEW:
|
case NEW:
|
||||||
return types.arrayType( type );
|
return arrayType;
|
||||||
case GET:
|
case GET:
|
||||||
return type instanceof ValueType ? (ValueType)type : ValueType.externref;
|
return type instanceof ValueType ? (ValueType)type : ValueType.externref;
|
||||||
case SET:
|
case SET:
|
||||||
|
@ -37,6 +37,7 @@ import de.inetsoftware.jwebassembly.module.WasmOptions;
|
|||||||
import de.inetsoftware.jwebassembly.module.WasmTarget;
|
import de.inetsoftware.jwebassembly.module.WasmTarget;
|
||||||
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.FunctionType;
|
import de.inetsoftware.jwebassembly.wasm.FunctionType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.MemoryOperator;
|
import de.inetsoftware.jwebassembly.wasm.MemoryOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
|
import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
|
||||||
@ -820,7 +821,7 @@ public class TextModuleWriter extends ModuleWriter {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void writeArrayOperator( @Nonnull ArrayOperator op, AnyType type ) throws IOException {
|
protected void writeArrayOperator( @Nonnull ArrayOperator op, ArrayType type ) throws IOException {
|
||||||
String operation;
|
String operation;
|
||||||
switch( op ) {
|
switch( op ) {
|
||||||
case NEW:
|
case NEW:
|
||||||
@ -839,7 +840,7 @@ public class TextModuleWriter extends ModuleWriter {
|
|||||||
throw new Error( "Unknown operator: " + op );
|
throw new Error( "Unknown operator: " + op );
|
||||||
}
|
}
|
||||||
newline( methodOutput );
|
newline( methodOutput );
|
||||||
methodOutput.append( "array." ).append( operation ).append( ' ' ).append( type );
|
methodOutput.append( "array." ).append( operation ).append( ' ' ).append( normalizeName( type.toString() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,13 +121,4 @@ public class ArrayType extends StructType {
|
|||||||
public boolean isSubTypeOf( AnyType type ) {
|
public boolean isSubTypeOf( AnyType type ) {
|
||||||
return type == this || type == ValueType.externref;
|
return type == this || type == ValueType.externref;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
// until there is a real type definition we will define write it as externref
|
|
||||||
return ValueType.externref.toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user