mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-15 02:44:47 +01:00
The different writeConst summarized to one method
This commit is contained in:
parent
b1eb27c474
commit
ff3662db43
@ -307,36 +307,27 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstInt( int value ) throws IOException {
|
||||
codeStream.write( I32_CONST );
|
||||
codeStream.writeVarint( value );
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstLong( long value ) throws IOException {
|
||||
codeStream.write( I64_CONST );
|
||||
codeStream.writeVarint( value );
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstFloat( float value ) throws IOException {
|
||||
codeStream.write( F32_CONST );
|
||||
codeStream.writeFloat( value );
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstDouble( double value ) throws IOException {
|
||||
codeStream.write( F64_CONST );
|
||||
codeStream.writeDouble( value );
|
||||
protected void writeConst( Number value, ValueType valueType ) throws IOException {
|
||||
switch( valueType ) {
|
||||
case i32:
|
||||
codeStream.write( I32_CONST );
|
||||
codeStream.writeVarint( value.intValue() );
|
||||
break;
|
||||
case i64:
|
||||
codeStream.write( I64_CONST );
|
||||
codeStream.writeVarint( value.longValue() );
|
||||
break;
|
||||
case f32:
|
||||
codeStream.write( F32_CONST );
|
||||
codeStream.writeFloat( value.floatValue() );
|
||||
break;
|
||||
case f64:
|
||||
codeStream.write( F64_CONST );
|
||||
codeStream.writeDouble( value.doubleValue() );
|
||||
break;
|
||||
default:
|
||||
throw new Error( valueType + " " + value );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -301,31 +301,31 @@ public class ModuleGenerator {
|
||||
case 7: // iconst_4
|
||||
case 8: // iconst_5
|
||||
stackManager.add( ValueType.i32, codePos );
|
||||
instr = new WasmConstInstruction( Integer.valueOf( op - 3 ), codePos );
|
||||
instr = new WasmConstInstruction( Integer.valueOf( op - 3 ), ValueType.i32, codePos );
|
||||
break;
|
||||
case 9: // lconst_0
|
||||
case 10: // lconst_1
|
||||
stackManager.add( ValueType.i64, codePos );
|
||||
instr = new WasmConstInstruction( Long.valueOf( op - 9 ), codePos );
|
||||
instr = new WasmConstInstruction( Long.valueOf( op - 9 ), ValueType.i64, codePos );
|
||||
break;
|
||||
case 11: // fconst_0
|
||||
case 12: // fconst_1
|
||||
case 13: // fconst_2
|
||||
stackManager.add( ValueType.f32, codePos );
|
||||
instr = new WasmConstInstruction( Float.valueOf( op - 11 ), codePos );
|
||||
instr = new WasmConstInstruction( Float.valueOf( op - 11 ), ValueType.f32, codePos );
|
||||
break;
|
||||
case 14: // dconst_0
|
||||
case 15: // dconst_1
|
||||
stackManager.add( ValueType.f64, codePos );
|
||||
instr = new WasmConstInstruction( Double.valueOf( op - 14 ), codePos );
|
||||
instr = new WasmConstInstruction( Double.valueOf( op - 14 ), ValueType.f64, codePos );
|
||||
break;
|
||||
case 16: // bipush
|
||||
stackManager.add( ValueType.i32, codePos );
|
||||
instr = new WasmConstInstruction( Integer.valueOf( byteCode.readByte() ), codePos );
|
||||
instr = new WasmConstInstruction( Integer.valueOf( byteCode.readByte() ), ValueType.i32, codePos );
|
||||
break;
|
||||
case 17: // sipush
|
||||
stackManager.add( ValueType.i32, codePos );
|
||||
instr = new WasmConstInstruction( Integer.valueOf( byteCode.readShort() ), codePos );
|
||||
instr = new WasmConstInstruction( Integer.valueOf( byteCode.readShort() ), ValueType.i32, codePos );
|
||||
break;
|
||||
case 18: // ldc
|
||||
stackManager.add( null, codePos );
|
||||
@ -507,11 +507,11 @@ public class ModuleGenerator {
|
||||
//TODO can be implemented with a helper function like: (a - (long)(a / b) * (double)b)
|
||||
throw new WasmException( "Modulo/Remainder for floating numbers is not supported in WASM. Use int or long data types." + op, sourceFile, byteCode.getLineNumber() );
|
||||
case 116: // ineg
|
||||
instructions.add( new WasmConstInstruction( -1, codePos ) );
|
||||
instructions.add( new WasmConstInstruction( -1, ValueType.i32, codePos ) );
|
||||
instr = new WasmNumericInstruction( NumericOperator.mul, ValueType.i32, codePos );
|
||||
break;
|
||||
case 117: // lneg
|
||||
instructions.add( new WasmConstInstruction( (long)-1, codePos ) ) ;
|
||||
instructions.add( new WasmConstInstruction( (long)-1, ValueType.i64, codePos ) ) ;
|
||||
instr = new WasmNumericInstruction( NumericOperator.mul, ValueType.i64, codePos );
|
||||
break;
|
||||
case 118: // fneg
|
||||
@ -562,7 +562,7 @@ public class ModuleGenerator {
|
||||
case 132: // iinc
|
||||
int idx = byteCode.readUnsignedByte();
|
||||
instructions.add( new WasmLoadStoreInstruction( true, idx, localVariables, codePos ) );
|
||||
instructions.add( new WasmConstInstruction( (int)byteCode.readByte(), codePos ) );
|
||||
instructions.add( new WasmConstInstruction( (int)byteCode.readByte(), ValueType.i32, codePos ) );
|
||||
instructions.add( new WasmNumericInstruction( NumericOperator.add, ValueType.i32, codePos) );
|
||||
instr = new WasmLoadStoreInstruction( false, idx, localVariables, codePos );
|
||||
break;
|
||||
@ -606,7 +606,7 @@ public class ModuleGenerator {
|
||||
instr = new WasmConvertInstruction( ValueTypeConvertion.i2b, codePos );
|
||||
break;
|
||||
case 146: // i2c
|
||||
instructions.add( new WasmConstInstruction( 0xFFFF, codePos ) );
|
||||
instructions.add( new WasmConstInstruction( 0xFFFF, ValueType.i32, codePos ) );
|
||||
instr = new WasmNumericInstruction( NumericOperator.and, ValueType.i32, codePos );
|
||||
break;
|
||||
case 147: // i2s
|
||||
@ -778,7 +778,7 @@ public class ModuleGenerator {
|
||||
for( int i = 0; i < positions.length; i++ ) {
|
||||
if( positions[i] == currentPos ) {
|
||||
instructions.add( new WasmLoadStoreInstruction( true, tempI32, localVariables, codePos ) );
|
||||
instructions.add( new WasmConstInstruction( keys[i], codePos ) );
|
||||
instructions.add( new WasmConstInstruction( keys[i], ValueType.i32, codePos ) );
|
||||
instructions.add( new WasmNumericInstruction( NumericOperator.eq, ValueType.i32, codePos ) );
|
||||
instructions.add( new WasmBlockInstruction( WasmBlockOperator.BR_IF, block, codePos ) );
|
||||
}
|
||||
@ -798,7 +798,7 @@ public class ModuleGenerator {
|
||||
positions[i] = startPosition + byteCode.readInt();
|
||||
}
|
||||
if( low != 0 ) { // the br_table starts ever with the value 0. That we need to subtract the start value if it different
|
||||
instructions.add( new WasmConstInstruction( low, codePos ) );
|
||||
instructions.add( new WasmConstInstruction( low, ValueType.i32, codePos ) );
|
||||
instructions.add( new WasmNumericInstruction( NumericOperator.sub, ValueType.i32, codePos ) );
|
||||
}
|
||||
}
|
||||
@ -862,7 +862,7 @@ public class ModuleGenerator {
|
||||
* if any I/O errors occur.
|
||||
*/
|
||||
private void opIfCondition( NumericOperator compareOp, CodeInputStream byteCode, int codePos ) throws IOException {
|
||||
instructions.add( new WasmConstInstruction( 0, codePos ) );
|
||||
instructions.add( new WasmConstInstruction( 0, ValueType.i32, codePos ) );
|
||||
opIfCompareCondition( compareOp, byteCode, codePos );
|
||||
}
|
||||
|
||||
|
@ -113,44 +113,16 @@ public abstract class ModuleWriter implements Closeable {
|
||||
protected abstract void writeMethodFinish( List<ValueType> locals ) throws IOException;
|
||||
|
||||
/**
|
||||
* Write a constant integer value
|
||||
* Write a constant number value
|
||||
*
|
||||
* @param value
|
||||
* the value
|
||||
* @param valueType
|
||||
* the data type of the number
|
||||
* @throws IOException
|
||||
* if any I/O error occur
|
||||
*/
|
||||
protected abstract void writeConstInt( int value ) throws IOException;
|
||||
|
||||
/**
|
||||
* Write a constant long value
|
||||
*
|
||||
* @param value
|
||||
* the value
|
||||
* @throws IOException
|
||||
* if any I/O error occur
|
||||
*/
|
||||
protected abstract void writeConstLong( long value ) throws IOException;
|
||||
|
||||
/**
|
||||
* Write a constant float value
|
||||
*
|
||||
* @param value
|
||||
* the value
|
||||
* @throws IOException
|
||||
* if any I/O error occur
|
||||
*/
|
||||
protected abstract void writeConstFloat( float value ) throws IOException;
|
||||
|
||||
/**
|
||||
* Write a constant double value
|
||||
*
|
||||
* @param value
|
||||
* the value
|
||||
* @throws IOException
|
||||
* if any I/O error occur
|
||||
*/
|
||||
protected abstract void writeConstDouble( double value ) throws IOException;
|
||||
protected abstract void writeConst( Number value, ValueType valueType ) throws IOException;
|
||||
|
||||
/**
|
||||
* Write a variable load.
|
||||
|
@ -30,7 +30,25 @@ import de.inetsoftware.jwebassembly.WasmException;
|
||||
*/
|
||||
class WasmConstInstruction extends WasmInstruction {
|
||||
|
||||
private final Number value;
|
||||
private final Number value;
|
||||
|
||||
private final ValueType valueType;
|
||||
|
||||
/**
|
||||
* Create an instance of a constant instruction
|
||||
*
|
||||
* @param value
|
||||
* the constant value
|
||||
* @param valueType
|
||||
* the data type of the number
|
||||
* @param javaCodePos
|
||||
* the code position/offset in the Java method
|
||||
*/
|
||||
WasmConstInstruction( Number value, ValueType valueType, int javaCodePos ) {
|
||||
super( javaCodePos );
|
||||
this.value = value;
|
||||
this.valueType = valueType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of a constant instruction
|
||||
@ -41,25 +59,37 @@ class WasmConstInstruction extends WasmInstruction {
|
||||
* the code position/offset in the Java method
|
||||
*/
|
||||
WasmConstInstruction( Number value, int javaCodePos ) {
|
||||
super( javaCodePos );
|
||||
this.value = value;
|
||||
this( value, getValueType( value ), javaCodePos );
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the matching ValueType for the given value.
|
||||
*
|
||||
* @param value
|
||||
* the constant value
|
||||
* @return the ValueType
|
||||
*/
|
||||
@Nonnull
|
||||
private static ValueType getValueType( Number value ) {
|
||||
Class<?> clazz = value.getClass();
|
||||
if( clazz == Integer.class ) {
|
||||
return ValueType.i32;
|
||||
} else if( clazz == Long.class ) {
|
||||
return ValueType.i64;
|
||||
} else if( clazz == Float.class ) {
|
||||
return ValueType.f32;
|
||||
} else if( clazz == Double.class ) {
|
||||
return ValueType.f64;
|
||||
} else {
|
||||
throw new WasmException( "Not supported constant type: " + clazz, null, -1 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public void writeTo( @Nonnull ModuleWriter writer ) throws IOException {
|
||||
Class<?> clazz = value.getClass();
|
||||
if( clazz == Integer.class ) {
|
||||
writer.writeConstInt( ((Integer)value).intValue() );
|
||||
} else if( clazz == Long.class ) {
|
||||
writer.writeConstLong( ((Long)value).longValue() );
|
||||
} else if( clazz == Float.class ) {
|
||||
writer.writeConstFloat( ((Float)value).floatValue() );
|
||||
} else if( clazz == Double.class ) {
|
||||
writer.writeConstDouble( ((Double)value).doubleValue() );
|
||||
} else {
|
||||
throw new WasmException( "Not supported constant type: " + clazz, null, -1 );
|
||||
}
|
||||
writer.writeConst( value, valueType );
|
||||
}
|
||||
}
|
||||
|
@ -130,36 +130,9 @@ public class TextModuleWriter extends ModuleWriter {
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstInt( int value ) throws IOException {
|
||||
protected void writeConst( Number value, ValueType valueType ) throws IOException {
|
||||
newline( methodOutput );
|
||||
methodOutput.append( "i32.const " ).append( Integer.toString( value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstLong( long value ) throws IOException {
|
||||
newline( methodOutput );
|
||||
methodOutput.append( "i64.const " ).append( Long.toString( value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstFloat( float value ) throws IOException {
|
||||
newline( methodOutput );
|
||||
methodOutput.append( "f32.const " ).append( Float.toString( value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void writeConstDouble( double value ) throws IOException {
|
||||
newline( methodOutput );
|
||||
methodOutput.append( "f64.const " ).append( Double.toString( value ) );
|
||||
methodOutput.append( valueType ).append( ".const " ).append( value );
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user