From d252b1b202457ce35041352a6e29e4a5e0d52b21 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Fri, 16 Nov 2018 20:38:37 +0100 Subject: [PATCH] support WasmTextCode annotation --- .../jwebassembly/module/ModuleGenerator.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java index 288dfd0..ee32529 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java @@ -30,6 +30,7 @@ import de.inetsoftware.classparser.LocalVariableTable; import de.inetsoftware.classparser.MethodInfo; import de.inetsoftware.jwebassembly.JWebAssembly; import de.inetsoftware.jwebassembly.WasmException; +import de.inetsoftware.jwebassembly.watparser.WatParser; /** * Generate the WebAssembly output. @@ -40,7 +41,9 @@ public class ModuleGenerator { private final ModuleWriter writer; - private final JavaMethodWasmCodeBuilder codeBuilder = new JavaMethodWasmCodeBuilder(); + private final JavaMethodWasmCodeBuilder javaCodeBuilder = new JavaMethodWasmCodeBuilder(); + + private final WatParser watParser = new WatParser(); private String sourceFile; @@ -147,20 +150,29 @@ public class ModuleGenerator { if( method.getAnnotation( JWebAssembly.IMPORT_ANNOTATION ) != null ) { return; } + WasmCodeBuilder codeBuilder; Code code = method.getCode(); - if( code != null ) { // abstract methods and interface methods does not have code - FunctionName name = new FunctionName( method ); - writeExport( name, method ); - writer.writeMethodStart( name ); - - codeBuilder.buildCode( code, !method.getType().endsWith( ")V" ) ); - writeMethodSignature( method, code.getLocalVariableTable(), codeBuilder ); - - for( WasmInstruction instruction : codeBuilder.getInstructions() ) { - instruction.writeTo( writer ); - } - writer.writeMethodFinish(); + if( method.getAnnotation( JWebAssembly.TEXTCODE_ANNOTATION ) != null ) { + Map wat = method.getAnnotation( JWebAssembly.TEXTCODE_ANNOTATION ); + String watCode = (String)wat.get( "value" ); + watParser.parse( watCode, code == null ? -1 : code.getFirstLineNr() ); + codeBuilder = watParser; + } else if( code != null ) { // abstract methods and interface methods does not have code + javaCodeBuilder.buildCode( code, !method.getType().endsWith( ")V" ) ); + codeBuilder = javaCodeBuilder; + } else { + return; } + FunctionName name = new FunctionName( method ); + writeExport( name, method ); + writer.writeMethodStart( name ); + + writeMethodSignature( method, code.getLocalVariableTable(), codeBuilder ); + + for( WasmInstruction instruction : codeBuilder.getInstructions() ) { + instruction.writeTo( writer ); + } + writer.writeMethodFinish(); } catch( Exception ioex ) { int lineNumber = byteCode == null ? -1 : byteCode.getLineNumber(); throw WasmException.create( ioex, sourceFile, className, lineNumber );