mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
Allow to run WASM generator via maven.
This commit is contained in:
parent
8b3e160d8c
commit
40af27811f
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
* Copyright 2016 Alexey Andreev.
|
||||
*
|
||||
* 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 org.teavm.backend.wasm.binary;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
class MetadataWriter {
|
||||
private byte[] data = new byte[256];
|
||||
private int offset;
|
||||
private Map<DataStructure, Integer> structureUsages = new HashMap<>();
|
||||
|
||||
void write(DataType[] types) {
|
||||
writeLeb(types.length);
|
||||
for (DataType type : types) {
|
||||
write(type);
|
||||
}
|
||||
}
|
||||
|
||||
private void write(DataType type) {
|
||||
if (type == DataPrimitives.BYTE) {
|
||||
writeByte(0);
|
||||
} else if (type == DataPrimitives.SHORT) {
|
||||
writeByte(1);
|
||||
} else if (type == DataPrimitives.INT) {
|
||||
writeByte(2);
|
||||
} else if (type == DataPrimitives.LONG) {
|
||||
writeByte(3);
|
||||
} else if (type == DataPrimitives.FLOAT) {
|
||||
writeByte(4);
|
||||
} else if (type == DataPrimitives.DOUBLE) {
|
||||
writeByte(5);
|
||||
} else if (type == DataPrimitives.ADDRESS) {
|
||||
writeByte(6);
|
||||
} else if (type instanceof DataArray) {
|
||||
DataArray array = (DataArray) type;
|
||||
writeByte(7);
|
||||
writeLeb(array.getSize());
|
||||
write(array.getComponentType());
|
||||
} else if (type instanceof DataStructure) {
|
||||
DataStructure structure = (DataStructure) type;
|
||||
Integer usage = structureUsages.get(structure);
|
||||
if (usage == null) {
|
||||
structureUsages.put(structure, offset);
|
||||
writeByte(8);
|
||||
writeByte(structure.getAlignment());
|
||||
DataType[] components = structure.getComponents();
|
||||
writeLeb(components.length);
|
||||
for (int i = 0; i < components.length; ++i) {
|
||||
write(components[i]);
|
||||
}
|
||||
} else {
|
||||
int start = offset;
|
||||
structureUsages.put(structure, offset);
|
||||
writeByte(9);
|
||||
writeLeb(start - usage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void writeLeb(int value) {
|
||||
if (value >>> 7 == 0) {
|
||||
writeByte(value);
|
||||
} else if (value >>> 14 == 0) {
|
||||
byte first = (byte) ((value & 0x7F) | 0x80);
|
||||
byte second = (byte) (value >>> 7);
|
||||
writeBytes(new byte[] { first, second });
|
||||
} else if (value >>> 21 == 0) {
|
||||
byte first = (byte) ((value & 0x7F) | 0x80);
|
||||
byte second = (byte) (((value >>> 7) & 0x7F) | 0x80);
|
||||
byte third = (byte) (value >>> 14);
|
||||
writeBytes(new byte[] { first, second, third });
|
||||
} else if (value >>> 28 == 0) {
|
||||
byte first = (byte) ((value & 0x7F) | 0x80);
|
||||
byte second = (byte) (((value >>> 7) & 0x7F) | 0x80);
|
||||
byte third = (byte) (((value >>> 14) & 0x7F) | 0x80);
|
||||
byte fourth = (byte) (value >>> 21);
|
||||
writeBytes(new byte[] { first, second, third, fourth });
|
||||
} else {
|
||||
byte first = (byte) ((value & 0x7F) | 0x80);
|
||||
byte second = (byte) (((value >>> 7) & 0x7F) | 0x80);
|
||||
byte third = (byte) (((value >>> 14) & 0x7F) | 0x80);
|
||||
byte fourth = (byte) (((value >>> 21) & 0x7F) | 0x80);
|
||||
byte fifth = (byte) (value >>> 28);
|
||||
writeBytes(new byte[] { first, second, third, fourth, fifth });
|
||||
}
|
||||
}
|
||||
|
||||
private void writeByte(int value) {
|
||||
if (offset >= data.length) {
|
||||
data = Arrays.copyOf(data, data.length * 2);
|
||||
}
|
||||
data[offset++] = (byte) value;
|
||||
}
|
||||
|
||||
private void writeBytes(byte[] values) {
|
||||
int count = values.length;
|
||||
if (offset + count > data.length) {
|
||||
data = Arrays.copyOf(data, data.length * 2);
|
||||
}
|
||||
System.arraycopy(values, 0, data, offset, count);
|
||||
offset += count;
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
return Arrays.copyOf(data, offset);
|
||||
}
|
||||
}
|
|
@ -330,6 +330,8 @@ public class TeaVMTool implements BaseTeaVMTool {
|
|||
private WasmTarget prepareWebAssemblyTarget() {
|
||||
webAssemblyTarget = new WasmTarget();
|
||||
webAssemblyTarget.setDebugging(debugInformationGenerated);
|
||||
webAssemblyTarget.setCEmitted(debugInformationGenerated);
|
||||
webAssemblyTarget.setWastEmitted(debugInformationGenerated);
|
||||
return webAssemblyTarget;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,11 +38,7 @@ import org.teavm.model.ClassHolderTransformer;
|
|||
import org.teavm.tooling.BaseTeaVMTool;
|
||||
import org.teavm.tooling.sources.SourceFileProvider;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alexey Andreev
|
||||
*/
|
||||
public abstract class AbstractJavascriptMojo extends AbstractMojo {
|
||||
public abstract class AbstractTeaVMMojo extends AbstractMojo {
|
||||
@Component
|
||||
protected MavenProject project;
|
||||
|
||||
|
@ -180,7 +176,7 @@ public abstract class AbstractJavascriptMojo extends AbstractMojo {
|
|||
}
|
||||
log.info("Using the following classpath for JavaScript generation: " + classpath);
|
||||
classLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]),
|
||||
AbstractJavascriptMojo.class.getClassLoader());
|
||||
AbstractTeaVMMojo.class.getClassLoader());
|
||||
return classLoader;
|
||||
} catch (MalformedURLException e) {
|
||||
throw new MojoExecutionException("Error gathering classpath information", e);
|
|
@ -27,19 +27,17 @@ import org.apache.maven.plugins.annotations.ResolutionScope;
|
|||
import org.teavm.tooling.ClassAlias;
|
||||
import org.teavm.tooling.MethodAlias;
|
||||
import org.teavm.tooling.RuntimeCopyOperation;
|
||||
import org.teavm.tooling.TeaVMTargetType;
|
||||
import org.teavm.tooling.TeaVMTool;
|
||||
import org.teavm.tooling.TeaVMToolException;
|
||||
import org.teavm.tooling.sources.DirectorySourceFileProvider;
|
||||
import org.teavm.tooling.sources.SourceFileProvider;
|
||||
import org.teavm.vm.TeaVMOptimizationLevel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alexey Andreev
|
||||
*/
|
||||
@Mojo(name = "compile", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
|
||||
requiresDependencyCollection = ResolutionScope.COMPILE_PLUS_RUNTIME,
|
||||
defaultPhase = LifecyclePhase.PROCESS_CLASSES)
|
||||
public class BuildJavascriptMojo extends AbstractJavascriptMojo {
|
||||
public class TeaVMCompileMojo extends AbstractTeaVMMojo {
|
||||
@Parameter(defaultValue = "${project.build.directory}/javascript")
|
||||
private File targetDirectory;
|
||||
|
||||
|
@ -47,7 +45,7 @@ public class BuildJavascriptMojo extends AbstractJavascriptMojo {
|
|||
private File sourceDirectory;
|
||||
|
||||
@Parameter
|
||||
private String targetFileName = "classes.js";
|
||||
private String targetFileName = "";
|
||||
|
||||
@Parameter
|
||||
private String mainClass;
|
||||
|
@ -67,6 +65,12 @@ public class BuildJavascriptMojo extends AbstractJavascriptMojo {
|
|||
@Parameter
|
||||
protected RuntimeCopyOperation runtime = RuntimeCopyOperation.SEPARATE;
|
||||
|
||||
@Parameter
|
||||
private TeaVMOptimizationLevel optimizationLevel = TeaVMOptimizationLevel.SIMPLE;
|
||||
|
||||
@Parameter
|
||||
private TeaVMTargetType targetType = TeaVMTargetType.JAVASCRIPT;
|
||||
|
||||
@Parameter(defaultValue = "${project.build.directory}/teavm-cache")
|
||||
protected File cacheDirectory;
|
||||
|
||||
|
@ -86,7 +90,10 @@ public class BuildJavascriptMojo extends AbstractJavascriptMojo {
|
|||
tool.setMainClass(mainClass);
|
||||
tool.setMainPageIncluded(mainPageIncluded);
|
||||
tool.setRuntime(runtime);
|
||||
tool.setTargetFileName(targetFileName);
|
||||
if (!targetFileName.isEmpty()) {
|
||||
tool.setTargetFileName(targetFileName);
|
||||
}
|
||||
tool.setOptimizationLevel(optimizationLevel);
|
||||
if (classAliases != null) {
|
||||
tool.getClassAliases().addAll(Arrays.asList(classAliases));
|
||||
}
|
||||
|
@ -94,6 +101,7 @@ public class BuildJavascriptMojo extends AbstractJavascriptMojo {
|
|||
tool.getMethodAliases().addAll(Arrays.asList(methodAliases));
|
||||
}
|
||||
tool.setCacheDirectory(cacheDirectory);
|
||||
tool.setTargetType(targetType);
|
||||
tool.generate();
|
||||
if (stopOnErrors && !tool.getProblemProvider().getSevereProblems().isEmpty()) {
|
||||
throw new MojoExecutionException("Build error");
|
Loading…
Reference in New Issue
Block a user