From 6468df956fe86125b7b3108dbabab081e5b37f1f Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sat, 1 Jun 2019 13:29:29 +0200 Subject: [PATCH] write the function type definitions to the text format --- .../jwebassembly/text/TextModuleWriter.java | 23 ++++++++++++++++++- .../samples/FunctionParameters.wat | 3 ++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 9bc6118..3d84d59 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -57,6 +57,10 @@ public class TextModuleWriter extends ModuleWriter { private final ArrayList methodParamNames = new ArrayList<>(); + private StringBuilder typeOutput = new StringBuilder(); + + private ArrayList types = new ArrayList<>(); + private StringBuilder methodOutput = new StringBuilder(); private int inset; @@ -98,6 +102,11 @@ public class TextModuleWriter extends ModuleWriter { */ @Override public void close() throws IOException { + for( int i = 0; i < types.size(); i++ ) { + newline( output ); + output.append( "(type $t" ).append( Integer.toString( i ) ).append( " (func" ).append( types.get( i ) ).append( "))" ); + } + output.append( methodOutput ); if( callIndirect ) { @@ -230,6 +239,7 @@ public class TextModuleWriter extends ModuleWriter { */ @Override protected void writeMethodStart( FunctionName name, String sourceFile ) throws IOException { + typeOutput.setLength( 0 ); newline( methodOutput ); methodOutput.append( "(func $" ); methodOutput.append( normalizeName( name ) ); @@ -261,7 +271,12 @@ public class TextModuleWriter extends ModuleWriter { */ @Override protected void writeMethodParam( String kind, AnyType valueType, @Nullable String name ) throws IOException { - methodOutput.append( " (" ).append( kind ); + if( kind != "local" ) { + typeOutput.append( '(' ).append( kind ).append( ' ' ); + writeTypeName( typeOutput, valueType ); + typeOutput.append( ')' ); + } + methodOutput.append( '(' ).append( kind ); if( debugNames ) { if( name != null ) { methodOutput.append( " $" ).append( name ); @@ -280,6 +295,12 @@ public class TextModuleWriter extends ModuleWriter { */ @Override protected void writeMethodParamFinish( ) throws IOException { + String typeStr = typeOutput.toString(); + int idx = types.indexOf( typeStr ); + if( idx < 0 ) { + idx = types.size(); + types.add( typeStr ); + } if( isImport ) { isImport = false; methodOutput.append( "))" ); diff --git a/test/de/inetsoftware/jwebassembly/samples/FunctionParameters.wat b/test/de/inetsoftware/jwebassembly/samples/FunctionParameters.wat index fb93c62..4c8de86 100644 --- a/test/de/inetsoftware/jwebassembly/samples/FunctionParameters.wat +++ b/test/de/inetsoftware/jwebassembly/samples/FunctionParameters.wat @@ -1,6 +1,7 @@ (module (export "abc" (func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt)) - (func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt (param i32) (local i32) + (type $t0 (func(param i32))) + (func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt(param i32)(local i32) local.get 0 i32.const 1 i32.add