From b2f1fbc195fd666552e8e4f4835bdb0cf58d62e5 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Tue, 10 Sep 2019 21:41:50 +0200 Subject: [PATCH] call ref_eq polyfill in non gc mode --- .../jwebassembly/module/WasmCodeBuilder.java | 2 +- .../jwebassembly/text/TextModuleWriter.java | 34 ++++++++++++------- .../jwebassembly/wasm/WasmOptions.java | 6 ++++ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java index 45e837d..c0617f1 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java @@ -262,7 +262,7 @@ public abstract class WasmCodeBuilder { WasmNumericInstruction numeric = new WasmNumericInstruction( numOp, valueType, javaCodePos, lineNumber ); instructions.add( numeric ); if( !options.useGC() && numOp == NumericOperator.ref_eq ) { - functions.markAsNeeded( getNonGC( "ref_eq", lineNumber ), true ); + functions.markAsNeeded( options.ref_eq = getNonGC( "ref_eq", lineNumber ), true ); } return numeric; } diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index f80214f..6da0374 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -515,8 +515,8 @@ public class TextModuleWriter extends ModuleWriter { */ @Override protected void writeNumericOperator( NumericOperator numOp, @Nullable ValueType valueType ) throws IOException { - newline( methodOutput ); - String op = numOp.toString(); + boolean negate = false; + String op = valueType.toString() + '.' + numOp.toString(); switch( valueType ) { case i32: case i64: @@ -530,25 +530,33 @@ public class TextModuleWriter extends ModuleWriter { op += "_s"; break; case ifnonnull: - methodOutput.append( "ref.is_null" ); - writeNumericOperator( NumericOperator.eqz, ValueType.i32 ); - return; + op = "ref.is_null"; + negate = true; + break; case ifnull: - methodOutput.append( "ref.is_null" ); - return; + op = "ref.is_null"; + break; case ref_ne: - methodOutput.append( "ref.eq" ); - writeNumericOperator( NumericOperator.eqz, ValueType.i32 ); - return; + op = options.useGC() ? "ref.eq" : null; + negate = true; + break; case ref_eq: - methodOutput.append( "ref.eq" ); - return; + op = options.useGC() ? "ref.eq" : null; + break; default: } break; default: } - methodOutput.append( valueType ).append( '.' ).append( op ); + if( op != null ) { + newline( methodOutput ); + methodOutput.append( op ); + } else { + writeFunctionCall( options.ref_eq ); + } + if( negate ) { + writeNumericOperator( NumericOperator.eqz, ValueType.i32 ); + } } /** diff --git a/src/de/inetsoftware/jwebassembly/wasm/WasmOptions.java b/src/de/inetsoftware/jwebassembly/wasm/WasmOptions.java index 49e5b22..d3e5b3e 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/WasmOptions.java +++ b/src/de/inetsoftware/jwebassembly/wasm/WasmOptions.java @@ -18,6 +18,7 @@ package de.inetsoftware.jwebassembly.wasm; import java.util.HashMap; import de.inetsoftware.jwebassembly.JWebAssembly; +import de.inetsoftware.jwebassembly.module.FunctionName; /** * The option/properties for the behavior of the compiler. @@ -30,6 +31,11 @@ public class WasmOptions { private final boolean useGC; + /** + * NonGC function for ref_eq polyfill. + */ + public FunctionName ref_eq; + /** * Create a new instance of options *