From f5e5d11af797b04bcc28d58b7ecb805f8494d1c4 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Tue, 4 Dec 2018 21:06:41 +0100 Subject: [PATCH] Add interface StorageType for struct support --- .../binary/BinaryModuleWriter.java | 5 ++- .../jwebassembly/binary/WasmOutputStream.java | 3 +- .../jwebassembly/module/ModuleWriter.java | 5 ++- .../module/WasmArrayInstruction.java | 17 +++++---- .../jwebassembly/text/TextModuleWriter.java | 5 ++- .../jwebassembly/wasm/StorageType.java | 37 +++++++++++++++++++ .../jwebassembly/wasm/ValueType.java | 5 +-- 7 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 src/de/inetsoftware/jwebassembly/wasm/StorageType.java diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 6ea8543..541623b 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -36,6 +36,7 @@ import de.inetsoftware.jwebassembly.module.ModuleWriter; import de.inetsoftware.jwebassembly.module.ValueTypeConvertion; import de.inetsoftware.jwebassembly.wasm.ArrayOperator; import de.inetsoftware.jwebassembly.wasm.NumericOperator; +import de.inetsoftware.jwebassembly.wasm.StorageType; import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator; @@ -784,7 +785,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod * {@inheritDoc} */ @Override - protected void writeArrayOperator( @Nonnull ArrayOperator op, ValueType valueType ) throws IOException { + protected void writeArrayOperator( @Nonnull ArrayOperator op, StorageType type ) throws IOException { int opCode; switch(op) { case NEW: @@ -803,6 +804,6 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod throw new Error( "Unknown operator: " + op ); } codeStream.writeOpCode( opCode ); - codeStream.writeValueType( valueType ); + codeStream.writeValueType( type ); } } diff --git a/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java b/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java index b9b73ef..8701f10 100644 --- a/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java +++ b/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java @@ -24,6 +24,7 @@ import java.nio.charset.StandardCharsets; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; +import de.inetsoftware.jwebassembly.wasm.StorageType; import de.inetsoftware.jwebassembly.wasm.ValueType; /** @@ -71,7 +72,7 @@ class WasmOutputStream extends FilterOutputStream { * @throws IOException * if an I/O error occurs. */ - public void writeValueType( ValueType type ) throws IOException { + public void writeValueType( StorageType type ) throws IOException { writeVarint( type.getCode() ); } diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java index 8d41966..0fe810c 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java @@ -24,6 +24,7 @@ import javax.annotation.Nullable; import de.inetsoftware.classparser.Member; import de.inetsoftware.jwebassembly.wasm.ArrayOperator; import de.inetsoftware.jwebassembly.wasm.NumericOperator; +import de.inetsoftware.jwebassembly.wasm.StorageType; import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator; @@ -213,10 +214,10 @@ public abstract class ModuleWriter implements Closeable { * * @param op * the operation - * @param valueType + * @param type * the resulting type * @throws IOException * if any I/O error occur */ - protected abstract void writeArrayOperator( @Nonnull ArrayOperator op, ValueType valueType ) throws IOException; + protected abstract void writeArrayOperator( @Nonnull ArrayOperator op, StorageType type ) throws IOException; } diff --git a/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java index 44f10b8..a4c1020 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmArrayInstruction.java @@ -23,6 +23,7 @@ import javax.annotation.Nullable; import de.inetsoftware.jwebassembly.WasmException; import de.inetsoftware.jwebassembly.wasm.ArrayOperator; +import de.inetsoftware.jwebassembly.wasm.StorageType; import de.inetsoftware.jwebassembly.wasm.ValueType; /** @@ -35,29 +36,29 @@ class WasmArrayInstruction extends WasmInstruction { private final ArrayOperator op; - private final ValueType valueType; + private final StorageType type; /** * Create an instance of numeric operation. * - * @param numOp - * the numeric operation - * @param valueType + * @param op + * the array operation + * @param type * the type of the parameters * @param javaCodePos * the code position/offset in the Java method */ - WasmArrayInstruction( @Nullable ArrayOperator op, @Nullable ValueType valueType, int javaCodePos ) { + WasmArrayInstruction( @Nullable ArrayOperator op, @Nullable StorageType type, int javaCodePos ) { super( javaCodePos ); this.op = op; - this.valueType = valueType; + this.type = type; } /** * {@inheritDoc} */ public void writeTo( @Nonnull ModuleWriter writer ) throws IOException { - writer.writeArrayOperator( op, valueType ); + writer.writeArrayOperator( op, type ); } /** @@ -68,7 +69,7 @@ class WasmArrayInstruction extends WasmInstruction { case NEW: return ValueType.anyref; case GET: - return valueType; + return type instanceof ValueType ? (ValueType)type : ValueType.anyref; case SET: return null; case LENGTH: diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 8e4a01d..b6ad0df 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -29,6 +29,7 @@ import de.inetsoftware.jwebassembly.module.ModuleWriter; import de.inetsoftware.jwebassembly.module.ValueTypeConvertion; import de.inetsoftware.jwebassembly.wasm.ArrayOperator; import de.inetsoftware.jwebassembly.wasm.NumericOperator; +import de.inetsoftware.jwebassembly.wasm.StorageType; import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator; @@ -365,7 +366,7 @@ public class TextModuleWriter extends ModuleWriter { } @Override - protected void writeArrayOperator( @Nonnull ArrayOperator op, ValueType valueType ) throws IOException { + protected void writeArrayOperator( @Nonnull ArrayOperator op, StorageType type ) throws IOException { String operation; switch( op ) { case NEW: @@ -384,6 +385,6 @@ public class TextModuleWriter extends ModuleWriter { throw new Error( "Unknown operator: " + op ); } newline( methodOutput ); - methodOutput.append( "array." ).append( operation ).append( ' ' ).append( valueType ); + methodOutput.append( "array." ).append( operation ).append( ' ' ).append( type ); } } diff --git a/src/de/inetsoftware/jwebassembly/wasm/StorageType.java b/src/de/inetsoftware/jwebassembly/wasm/StorageType.java new file mode 100644 index 0000000..b975768 --- /dev/null +++ b/src/de/inetsoftware/jwebassembly/wasm/StorageType.java @@ -0,0 +1,37 @@ +/* + * Copyright 2018 Volker Berlin (i-net software) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.inetsoftware.jwebassembly.wasm; + +/** + *

+ * numtype ::= i32 | i64 | f32 | f64
+ * packedtype ::= i8 | i16
+ * reftype ::= anyref | anyfunc | nullref
+ * valtype ::= numtype | reftype
+ * 
+ * storagetype ::= valtype | packedtype
+ * 
+ * @author Volker Berlin + */ +public interface StorageType { + + /** + * The operation code in WebAssembly. + * + * @return the code + */ + public int getCode(); +} diff --git a/src/de/inetsoftware/jwebassembly/wasm/ValueType.java b/src/de/inetsoftware/jwebassembly/wasm/ValueType.java index d7aa4c3..b79ce75 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/ValueType.java +++ b/src/de/inetsoftware/jwebassembly/wasm/ValueType.java @@ -15,12 +15,10 @@ */ package de.inetsoftware.jwebassembly.wasm; -import de.inetsoftware.jwebassembly.WasmException; - /** * @author Volker Berlin */ -public enum ValueType { +public enum ValueType implements StorageType { i32(-0x01), i64(-0x02), f32(-0x03), @@ -50,6 +48,7 @@ public enum ValueType { * * @return the code */ + @Override public int getCode() { return code; }