diff --git a/src/de/inetsoftware/jwebassembly/binary/StructType.java b/src/de/inetsoftware/jwebassembly/binary/StructType.java new file mode 100644 index 0000000..02cb91c --- /dev/null +++ b/src/de/inetsoftware/jwebassembly/binary/StructType.java @@ -0,0 +1,85 @@ +/* + * Copyright 2019 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.binary; + +import java.io.IOException; +import java.util.List; + +import de.inetsoftware.jwebassembly.wasm.NamedStorageType; +import de.inetsoftware.jwebassembly.wasm.ValueType; + +/** + * An struct type entry in the type section of the WebAssembly. + * + * @author Volker Berlin + */ +class StructType extends TypeEntry { + + private final List fields; + + /** + * Create a new instance. + * + * @param fields + * the fields of the struct + */ + StructType( List fields ) { + this.fields = fields; + } + + /** + * {@inheritDoc} + */ + @Override + ValueType getTypeForm() { + return ValueType.struct; + } + + /** + * {@inheritDoc} + */ + @Override + void writeSectionEntryDetails( WasmOutputStream stream ) throws IOException { + stream.writeVaruint32( this.fields.size() ); + for( NamedStorageType field : this.fields ) { + stream.writeVarint( 0 ); + stream.writeValueType( field.type ); + } + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return fields.hashCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals( Object obj ) { + if( obj == this ) { + return true; + } + if( obj == null || obj.getClass() != getClass() ) { + return false; + } + StructType type = (StructType)obj; + return fields.equals( type.fields ); + } +} diff --git a/src/de/inetsoftware/jwebassembly/binary/TypeEntry.java b/src/de/inetsoftware/jwebassembly/binary/TypeEntry.java new file mode 100644 index 0000000..7557407 --- /dev/null +++ b/src/de/inetsoftware/jwebassembly/binary/TypeEntry.java @@ -0,0 +1,65 @@ +/* + * Copyright 2019 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.binary; + +import java.io.IOException; + +import de.inetsoftware.jwebassembly.wasm.ValueType; + +/** + * An entry in the type section of the WebAssembly. + * + * @author Volker Berlin + */ +abstract class TypeEntry extends SectionEntry { + + /** + * {@inheritDoc} + */ + @Override + final void writeSectionEntry( WasmOutputStream stream ) throws IOException { + stream.writeValueType( ValueType.func ); + writeSectionEntryDetails( stream ); + } + + /** + * Get the form of the type. + * @return the form + */ + abstract ValueType getTypeForm(); + + /** + * Write this single entry to a section + * + * @param stream + * the target + * @throws IOException + * if any I/O error occur + */ + abstract void writeSectionEntryDetails( WasmOutputStream stream ) throws IOException; + + /** + * {@inheritDoc} + */ + @Override + public abstract int hashCode(); + + /** + * {@inheritDoc} + */ + @Override + public abstract boolean equals( Object obj ); +} diff --git a/src/de/inetsoftware/jwebassembly/wasm/NamedStorageType.java b/src/de/inetsoftware/jwebassembly/wasm/NamedStorageType.java new file mode 100644 index 0000000..8c79274 --- /dev/null +++ b/src/de/inetsoftware/jwebassembly/wasm/NamedStorageType.java @@ -0,0 +1,38 @@ +/* + * Copyright 2019 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; + +/** + * A ValueType with a name for debug information. + * + * @author Volker Berlin + */ +public class NamedStorageType { + + public final StorageType type; + + public final String name; + + /** + * Create a new instance + * @param type the type + * @param name the name + */ + public NamedStorageType( StorageType type, String name ) { + this.type = type; + this.name = name; + } +}