add WasmOptions to reduce boilerplate code

This commit is contained in:
Volker Berlin 2019-09-09 21:07:45 +02:00
parent 713020ef60
commit c1041325b7
5 changed files with 71 additions and 20 deletions

View File

@ -40,6 +40,7 @@ import de.inetsoftware.jwebassembly.module.ModuleGenerator;
import de.inetsoftware.jwebassembly.module.ModuleWriter; import de.inetsoftware.jwebassembly.module.ModuleWriter;
import de.inetsoftware.jwebassembly.module.WasmTarget; import de.inetsoftware.jwebassembly.module.WasmTarget;
import de.inetsoftware.jwebassembly.text.TextModuleWriter; import de.inetsoftware.jwebassembly.text.TextModuleWriter;
import de.inetsoftware.jwebassembly.wasm.WasmOptions;
/** /**
* The main class of the compiler. * The main class of the compiler.
@ -325,7 +326,7 @@ public class JWebAssembly {
* if any conversion error occurs * if any conversion error occurs
*/ */
private void compile( ModuleWriter writer, WasmTarget target ) throws IOException, WasmException { private void compile( ModuleWriter writer, WasmTarget target ) throws IOException, WasmException {
ModuleGenerator generator = new ModuleGenerator( writer, target, libraries, properties ); ModuleGenerator generator = new ModuleGenerator( writer, target, libraries, new WasmOptions( properties ) );
for( URL url : classFiles ) { for( URL url : classFiles ) {
ClassFile classFile = new ClassFile( new BufferedInputStream( url.openStream() ) ); ClassFile classFile = new ClassFile( new BufferedInputStream( url.openStream() ) );
generator.prepare( classFile ); generator.prepare( classFile );

View File

@ -46,6 +46,7 @@ import de.inetsoftware.jwebassembly.wasm.AnyType;
import de.inetsoftware.jwebassembly.wasm.NamedStorageType; import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
import de.inetsoftware.jwebassembly.wasm.StructOperator; import de.inetsoftware.jwebassembly.wasm.StructOperator;
import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.ValueType;
import de.inetsoftware.jwebassembly.wasm.WasmOptions;
import de.inetsoftware.jwebassembly.watparser.WatParser; import de.inetsoftware.jwebassembly.watparser.WatParser;
/** /**
@ -84,18 +85,18 @@ public class ModuleGenerator {
* the target for the module data * the target for the module data
* @param libraries * @param libraries
* libraries * libraries
* @param properties * @param options
* compiler properties * compiler properties
*/ */
public ModuleGenerator( @Nonnull ModuleWriter writer, WasmTarget target, @Nonnull List<URL> libraries, HashMap<String, String> properties ) { public ModuleGenerator( @Nonnull ModuleWriter writer, WasmTarget target, @Nonnull List<URL> libraries, WasmOptions options ) {
this.javaCodeBuilder = new JavaMethodWasmCodeBuilder(); this.javaCodeBuilder = new JavaMethodWasmCodeBuilder();
this.watParser = new WatParser(); this.watParser = new WatParser();
this.writer = writer; this.writer = writer;
this.javaScript = new JavaScriptWriter( target ); this.javaScript = new JavaScriptWriter( target );
this.libraries = new URLClassLoader( libraries.toArray( new URL[libraries.size()] ) ); this.libraries = new URLClassLoader( libraries.toArray( new URL[libraries.size()] ) );
types.init( properties ); types.init( options );
javaCodeBuilder.init( types, functions, properties ); javaCodeBuilder.init( types, functions, options );
((WasmCodeBuilder)watParser).init( types, functions, properties ); ((WasmCodeBuilder)watParser).init( types, functions, options );
scanLibraries( libraries ); scanLibraries( libraries );
} }

View File

@ -37,6 +37,7 @@ import de.inetsoftware.jwebassembly.wasm.AnyType;
import de.inetsoftware.jwebassembly.wasm.ArrayType; import de.inetsoftware.jwebassembly.wasm.ArrayType;
import de.inetsoftware.jwebassembly.wasm.NamedStorageType; import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.ValueType;
import de.inetsoftware.jwebassembly.wasm.WasmOptions;
/** /**
* Manage the written and to write types (classes) * Manage the written and to write types (classes)
@ -54,16 +55,16 @@ public class TypeManager {
private boolean isFinish; private boolean isFinish;
private boolean useGC; private WasmOptions options;
/** /**
* Initialize the type manager. * Initialize the type manager.
* *
* @param properties * @param options
* compiler properties * compiler properties
*/ */
void init( HashMap<String, String> properties ) { void init( WasmOptions options ) {
this.useGC = Boolean.parseBoolean( properties.getOrDefault( JWebAssembly.WASM_USE_GC, "false" ) ); this.options = options;
} }
/** /**
@ -206,7 +207,7 @@ public class TypeManager {
methods = new ArrayList<>(); methods = new ArrayList<>();
HashSet<String> allNeededFields = new HashSet<>(); HashSet<String> allNeededFields = new HashSet<>();
listStructFields( name, functions, types, libraries, allNeededFields ); listStructFields( name, functions, types, libraries, allNeededFields );
code = types.useGC ? writer.writeStructType( this ) : ValueType.anyref.getCode(); code = types.options.useGC() ? writer.writeStructType( this ) : ValueType.anyref.getCode();
} }
/** /**

View File

@ -17,7 +17,6 @@ package de.inetsoftware.jwebassembly.module;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import javax.annotation.Nonnegative; import javax.annotation.Nonnegative;
@ -28,7 +27,6 @@ import de.inetsoftware.classparser.ClassFile;
import de.inetsoftware.classparser.LocalVariableTable; import de.inetsoftware.classparser.LocalVariableTable;
import de.inetsoftware.classparser.Member; import de.inetsoftware.classparser.Member;
import de.inetsoftware.classparser.MethodInfo; import de.inetsoftware.classparser.MethodInfo;
import de.inetsoftware.jwebassembly.JWebAssembly;
import de.inetsoftware.jwebassembly.WasmException; import de.inetsoftware.jwebassembly.WasmException;
import de.inetsoftware.jwebassembly.javascript.NonGC; import de.inetsoftware.jwebassembly.javascript.NonGC;
import de.inetsoftware.jwebassembly.module.WasmInstruction.Type; import de.inetsoftware.jwebassembly.module.WasmInstruction.Type;
@ -40,6 +38,7 @@ import de.inetsoftware.jwebassembly.wasm.StructOperator;
import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.ValueType;
import de.inetsoftware.jwebassembly.wasm.ValueTypeParser; import de.inetsoftware.jwebassembly.wasm.ValueTypeParser;
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator; import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
import de.inetsoftware.jwebassembly.wasm.WasmOptions;
/** /**
* Base class for Code Building. * Base class for Code Building.
@ -56,7 +55,7 @@ public abstract class WasmCodeBuilder {
private FunctionManager functions; private FunctionManager functions;
private boolean useGC; private WasmOptions options;
/** /**
* Get the list of instructions * Get the list of instructions
@ -87,14 +86,14 @@ public abstract class WasmCodeBuilder {
* the type manager * the type manager
* @param functions * @param functions
* the function manager * the function manager
* @param properties * @param options
* compiler properties * compiler properties
*/ */
void init( TypeManager types, FunctionManager functions, HashMap<String, String> properties ) { void init( TypeManager types, FunctionManager functions, WasmOptions options ) {
this.localVariables.init( types ); this.localVariables.init( types );
this.types = types; this.types = types;
this.functions = functions; this.functions = functions;
this.useGC = Boolean.parseBoolean( properties.getOrDefault( JWebAssembly.WASM_USE_GC, "false" ) ); this.options = options;
} }
/** /**
@ -262,7 +261,7 @@ public abstract class WasmCodeBuilder {
protected WasmNumericInstruction addNumericInstruction( @Nullable NumericOperator numOp, @Nullable ValueType valueType, int javaCodePos, int lineNumber ) { protected WasmNumericInstruction addNumericInstruction( @Nullable NumericOperator numOp, @Nullable ValueType valueType, int javaCodePos, int lineNumber ) {
WasmNumericInstruction numeric = new WasmNumericInstruction( numOp, valueType, javaCodePos, lineNumber ); WasmNumericInstruction numeric = new WasmNumericInstruction( numOp, valueType, javaCodePos, lineNumber );
instructions.add( numeric ); instructions.add( numeric );
if( !useGC && numOp == NumericOperator.ref_eq ) { if( !options.useGC() && numOp == NumericOperator.ref_eq ) {
functions.markAsNeeded( getNonGC( "ref_eq", lineNumber ), true ); functions.markAsNeeded( getNonGC( "ref_eq", lineNumber ), true );
} }
return numeric; return numeric;
@ -372,7 +371,7 @@ public abstract class WasmCodeBuilder {
* the line number in the Java source code * the line number in the Java source code
*/ */
protected void addArrayInstruction( ArrayOperator op, AnyType type, int javaCodePos, int lineNumber ) { protected void addArrayInstruction( ArrayOperator op, AnyType type, int javaCodePos, int lineNumber ) {
if( useGC ) { if( options.useGC() ) {
instructions.add( new WasmArrayInstruction( op, type, types, javaCodePos, lineNumber ) ); instructions.add( new WasmArrayInstruction( op, type, types, javaCodePos, lineNumber ) );
} else { } else {
if( type.getCode() >= 0 ) { if( type.getCode() >= 0 ) {
@ -401,7 +400,7 @@ public abstract class WasmCodeBuilder {
protected void addStructInstruction( StructOperator op, @Nonnull String typeName, @Nullable NamedStorageType fieldName, int javaCodePos, int lineNumber ) { protected void addStructInstruction( StructOperator op, @Nonnull String typeName, @Nullable NamedStorageType fieldName, int javaCodePos, int lineNumber ) {
WasmStructInstruction structInst = new WasmStructInstruction( op, typeName, fieldName, javaCodePos, lineNumber, types ); WasmStructInstruction structInst = new WasmStructInstruction( op, typeName, fieldName, javaCodePos, lineNumber, types );
instructions.add( structInst ); instructions.add( structInst );
if( !useGC ) { if( !options.useGC() ) {
SyntheticFunctionName name = structInst.createNonGcFunction(); SyntheticFunctionName name = structInst.createNonGcFunction();
if( name != null ) { if( name != null ) {
functions.markAsNeeded( name, true ); functions.markAsNeeded( name, true );

View File

@ -0,0 +1,49 @@
/*
* Copyright 2017 - 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;
import java.util.HashMap;
import de.inetsoftware.jwebassembly.JWebAssembly;
/**
* The option/properties for the behavior of the compiler.
*
* @author Volker Berlin
*/
public class WasmOptions {
private final boolean useGC;
/**
* Create a new instance of options
*
* @param properties
* compiler properties
*/
public WasmOptions( HashMap<String, String> properties ) {
useGC = Boolean.parseBoolean( properties.getOrDefault( JWebAssembly.WASM_USE_GC, "false" ) );
}
/**
* If the GC feature of WASM should be use or the GC of the JavaScript host.
*
* @return true, use the GC instructions of WASM.
*/
public boolean useGC() {
return useGC;
}
}