1
0
mirror of https://github.com/i-net-software/JWebAssembly.git synced 2025-03-26 07:49:28 +01:00
2020-02-26 18:02:59 +01:00

169 lines
5.1 KiB
Java

/*
* Copyright 2017 - 2020 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.module;
import java.util.HashMap;
import javax.annotation.Nonnull;
import de.inetsoftware.jwebassembly.JWebAssembly;
import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName;
import de.inetsoftware.jwebassembly.module.CodeOptimizer;
import de.inetsoftware.jwebassembly.module.FunctionManager;
import de.inetsoftware.jwebassembly.module.FunctionName;
import de.inetsoftware.jwebassembly.module.StringManager;
import de.inetsoftware.jwebassembly.module.TypeManager;
import de.inetsoftware.jwebassembly.wasm.ValueType;
/**
* The option/properties for the behavior of the compiler.
*
* @author Volker Berlin
*/
public class WasmOptions {
final FunctionManager functions = new FunctionManager();
final TypeManager types = new TypeManager( this );
final StringManager strings = new StringManager( this );
final CodeOptimizer optimizer = new CodeOptimizer();
private final boolean debugNames;
private final boolean useGC;
private final boolean useEH;
@Nonnull
private final String sourceMapBase;
/**
* NonGC function for ref_eq polyfill.
*/
public FunctionName ref_eq;
private FunctionName get_i32;
private FunctionName callVirtual;
private FunctionName instanceOf;
/**
* Create a new instance of options
*
* @param properties
* compiler properties
*/
public WasmOptions( HashMap<String, String> properties ) {
debugNames = Boolean.parseBoolean( properties.get( JWebAssembly.DEBUG_NAMES ) );
useGC = Boolean.parseBoolean( properties.getOrDefault( JWebAssembly.WASM_USE_GC, "false" ) );
useEH = Boolean.parseBoolean( properties.getOrDefault( JWebAssembly.WASM_USE_EH, "false" ) );
String base = properties.getOrDefault( JWebAssembly.SOURCE_MAP_BASE, "" );
if( !base.isEmpty() && !base.endsWith( "/" ) ) {
base += "/";
}
sourceMapBase = base;
}
/**
* Property for adding debug names to the output if true.
*
* @return true, add debug information
*/
public boolean debugNames() {
return debugNames;
}
/**
* 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;
}
/**
* If the exception handling feature of WASM should be use or an unreachable instruction.
*
* @return true, use the EH instructions of WASM; false, generate an unreachable instruction
*/
public boolean useEH() {
return useEH;
}
/**
* Get the relative path between the final wasm file location and the source files location.
* If not empty it should end with a slash like "../../src/main/java/".
* @return the path
*/
@Nonnull
public String getSourceMapBase() {
return sourceMapBase;
}
/**
* Register FunctionName "NonGC.get_i32" for frequently access to vtable with non GC mode.
*/
void registerGet_i32() {
if( useGC ) {
return;
}
if( get_i32 == null ) {
SyntheticFunctionName name;
get_i32 = name = new JavaScriptSyntheticFunctionName( "NonGC", "get_i32", () -> "(a,i) => a[i]", ValueType.anyref, ValueType.i32, null, ValueType.i32 );
functions.markAsNeeded( name );
functions.markAsImport( name, name.getAnnotation() );
}
}
/**
* Get the FunctionName for a virtual call and mark it as used. The function has 2 parameters (THIS,
* virtualfunctionIndex) and returns the index of the function.
*
* @return the name
*/
@Nonnull
FunctionName getCallVirtual() {
FunctionName name = callVirtual;
if( name == null ) {
callVirtual = name = types.createCallVirtualGC();
functions.markAsNeeded( name );
registerGet_i32();
}
return name;
}
/**
* Get the FunctionName for an INSTANCEOF check and mark it as used. The function has 2 parameters (THIS,
* classIndex) and returns true or false.
*
* @return the name
*/
@Nonnull
FunctionName getInstanceOf() {
FunctionName name = instanceOf;
if( name == null ) {
instanceOf = name = types.createInstanceOf();
functions.markAsNeeded( name );
registerGet_i32();
}
return name;
}
}