From 6d4bf1d34741d05cf2d290ab9115aaaa16e7d9c5 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Thu, 25 Jul 2019 16:50:38 +0200 Subject: [PATCH] improve wat parser --- .../jwebassembly/watparser/WatParser.java | 28 +++++++++++++++++++ .../jwebassembly/module/WatParserTest.java | 12 +++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/de/inetsoftware/jwebassembly/watparser/WatParser.java b/src/de/inetsoftware/jwebassembly/watparser/WatParser.java index fab3bbd..00993f8 100644 --- a/src/de/inetsoftware/jwebassembly/watparser/WatParser.java +++ b/src/de/inetsoftware/jwebassembly/watparser/WatParser.java @@ -168,6 +168,24 @@ public class WatParser extends WasmCodeBuilder { case "return": addBlockInstruction( WasmBlockOperator.RETURN, null, javaCodePos, lineNumber ); break; + case "if": + Object data = ValueType.empty; + if( "(".equals( get( tokens, i+1 ) ) ) { + i++; + if( "result".equals( get( tokens, ++i ) ) && ")".equals( get( tokens, ++i + 1) ) ) { + data = ValueType.valueOf( get( tokens, i++ ) ); + } else { + throw new WasmException( "Unknown WASM token: " + get( tokens, i-1 ), lineNumber ); + } + } + addBlockInstruction( WasmBlockOperator.IF, data, javaCodePos, lineNumber ); + break; + case "else": + addBlockInstruction( WasmBlockOperator.ELSE, null, javaCodePos, lineNumber ); + break; + case "end": + addBlockInstruction( WasmBlockOperator.END, null, javaCodePos, lineNumber ); + break; default: throw new WasmException( "Unknown WASM token: " + tok, lineNumber ); } @@ -227,10 +245,20 @@ public class WatParser extends WasmCodeBuilder { case '\n': case '\r': case '\t': + case '(': + case ')': if( off < i ) { tokens.add( wat.substring( off, i ) ); } off = i + 1; + switch(ch) { + case '(': + tokens.add( "(" ); + break; + case ')': + tokens.add( ")" ); + break; + } break; } } diff --git a/test/de/inetsoftware/jwebassembly/module/WatParserTest.java b/test/de/inetsoftware/jwebassembly/module/WatParserTest.java index f0e0abe..27739f9 100644 --- a/test/de/inetsoftware/jwebassembly/module/WatParserTest.java +++ b/test/de/inetsoftware/jwebassembly/module/WatParserTest.java @@ -263,7 +263,17 @@ public class WatParserTest { @Test public void return_() throws IOException { - test( "return\n" ); + test( "return" ); + } + + @Test + public void ifElseEnd() throws IOException { + test( "if else end" ); + } + + @Test + public void ifElseEndI32() throws IOException { + test( "if (result i32) else end" ); } @Test