Skip to content

Commit 3e9c26f

Browse files
VolkerVolker
authored andcommitted
Add writeOpCode(int) for simpler handling of 2 byte opcodes
1 parent d7c13c0 commit 3e9c26f

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import javax.annotation.Nonnull;
2727
import javax.annotation.Nullable;
2828

29-
import de.inetsoftware.classparser.MethodInfo;
3029
import de.inetsoftware.jwebassembly.WasmException;
3130
import de.inetsoftware.jwebassembly.module.FunctionName;
3231
import de.inetsoftware.jwebassembly.module.ModuleWriter;
@@ -310,19 +309,19 @@ protected void writeMethodFinish( List<ValueType> locals ) throws IOException {
310309
protected void writeConst( Number value, ValueType valueType ) throws IOException {
311310
switch( valueType ) {
312311
case i32:
313-
codeStream.write( I32_CONST );
312+
codeStream.writeOpCode( I32_CONST );
314313
codeStream.writeVarint( value.intValue() );
315314
break;
316315
case i64:
317-
codeStream.write( I64_CONST );
316+
codeStream.writeOpCode( I64_CONST );
318317
codeStream.writeVarint( value.longValue() );
319318
break;
320319
case f32:
321-
codeStream.write( F32_CONST );
320+
codeStream.writeOpCode( F32_CONST );
322321
codeStream.writeFloat( value.floatValue() );
323322
break;
324323
case f64:
325-
codeStream.write( F64_CONST );
324+
codeStream.writeOpCode( F64_CONST );
326325
codeStream.writeDouble( value.doubleValue() );
327326
break;
328327
default:
@@ -335,7 +334,7 @@ protected void writeConst( Number value, ValueType valueType ) throws IOExceptio
335334
*/
336335
@Override
337336
protected void writeLoad( int idx ) throws IOException {
338-
codeStream.write( GET_LOCAL );
337+
codeStream.writeOpCode( GET_LOCAL );
339338
codeStream.writeVaruint32( idx );
340339
}
341340

@@ -344,7 +343,7 @@ protected void writeLoad( int idx ) throws IOException {
344343
*/
345344
@Override
346345
protected void writeStore( int idx ) throws IOException {
347-
codeStream.write( SET_LOCAL );
346+
codeStream.writeOpCode( SET_LOCAL );
348347
codeStream.writeVaruint32( idx );
349348
}
350349

@@ -599,7 +598,7 @@ protected void writeNumericOperator( NumericOperator numOp, @Nullable ValueType
599598
if( op == 0 ) {
600599
throw new Error( valueType + "." + numOp );
601600
}
602-
codeStream.write( op );
601+
codeStream.writeOpCode( op );
603602
}
604603

605604
/**
@@ -654,10 +653,7 @@ protected void writeCast( ValueTypeConvertion cast ) throws IOException {
654653
default:
655654
throw new Error( "Unknown cast: " + cast );
656655
}
657-
if( op > 255 ) {
658-
codeStream.write( op >> 8 );
659-
}
660-
codeStream.write( op );
656+
codeStream.writeOpCode( op );
661657
}
662658

663659
/**
@@ -677,7 +673,7 @@ protected void writeFunctionCall( String name ) throws IOException {
677673
throw new WasmException( "Call to unknown function: " + name, null, -1 );
678674
}
679675
}
680-
codeStream.write( CALL );
676+
codeStream.writeOpCode( CALL );
681677
codeStream.writeVaruint32( id );
682678
}
683679

@@ -688,47 +684,47 @@ protected void writeFunctionCall( String name ) throws IOException {
688684
protected void writeBlockCode( @Nonnull WasmBlockOperator op, @Nullable Object data ) throws IOException {
689685
switch( op ) {
690686
case RETURN:
691-
codeStream.write( RETURN );
687+
codeStream.writeOpCode( RETURN );
692688
break;
693689
case IF:
694-
codeStream.write( IF );
690+
codeStream.writeOpCode( IF );
695691
codeStream.write( ((ValueType)data).getCode() );
696692
break;
697693
case ELSE:
698-
codeStream.write( ELSE );
694+
codeStream.writeOpCode( ELSE );
699695
break;
700696
case END:
701-
codeStream.write( END );
697+
codeStream.writeOpCode( END );
702698
break;
703699
case DROP:
704-
codeStream.write( DROP );
700+
codeStream.writeOpCode( DROP );
705701
break;
706702
case BLOCK:
707-
codeStream.write( BLOCK );
703+
codeStream.writeOpCode( BLOCK );
708704
codeStream.write( ValueType.empty.getCode() ); // void; the return type of the block. currently we does not use it
709705
break;
710706
case BR:
711-
codeStream.write( BR );
707+
codeStream.writeOpCode( BR );
712708
codeStream.writeVaruint32( (Integer)data );
713709
break;
714710
case BR_IF:
715-
codeStream.write( BR_IF );
711+
codeStream.writeOpCode( BR_IF );
716712
codeStream.writeVaruint32( (Integer)data );
717713
break;
718714
case BR_TABLE:
719-
codeStream.write( BR_TABLE );
715+
codeStream.writeOpCode( BR_TABLE );
720716
int[] targets = (int[])data;
721717
codeStream.writeVaruint32( targets.length - 1 );
722718
for( int i : targets ) {
723719
codeStream.writeVaruint32( i );
724720
}
725721
break;
726722
case LOOP:
727-
codeStream.write( LOOP );
723+
codeStream.writeOpCode( LOOP );
728724
codeStream.write( ValueType.empty.getCode() ); // void; the return type of the loop. currently we does not use it
729725
break;
730726
case UNREACHABLE:
731-
codeStream.write( UNREACHABLE );
727+
codeStream.writeOpCode( UNREACHABLE );
732728
break;
733729
default:
734730
throw new Error( "Unknown block: " + op );

src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,21 @@ class WasmOutputStream extends FilterOutputStream {
4545
super( output );
4646
}
4747

48+
/**
49+
* Write a binary operation code.
50+
*
51+
* @param op
52+
* a constant from {@link InstructionOpcodes}
53+
* @throws IOException
54+
* if an I/O error occurs.
55+
*/
56+
public void writeOpCode( int op ) throws IOException {
57+
if( op > 255 ) {
58+
write( op >> 8 );
59+
}
60+
write( op );
61+
}
62+
4863
/**
4964
* Write a integer little endian (ever 4 bytes)
5065
*

0 commit comments

Comments
 (0)