mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
Fix bugs
This commit is contained in:
parent
54ecf6e00f
commit
a4d948f26b
|
@ -29,7 +29,6 @@ import org.teavm.vm.spi.TeaVMPlugin;
|
|||
public class JCLPlugin implements TeaVMPlugin {
|
||||
@Override
|
||||
public void install(TeaVMHost host) {
|
||||
host.add(new ObjectEnrichRenderer());
|
||||
ServiceLoaderSupport serviceLoaderSupp = new ServiceLoaderSupport(host.getClassLoader());
|
||||
host.add(serviceLoaderSupp);
|
||||
MethodReference loadServicesMethod = new MethodReference(ServiceLoader.class, "loadServices",
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
* Copyright 2014 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.classlib.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.teavm.javascript.RenderingContext;
|
||||
import org.teavm.model.ClassReader;
|
||||
import org.teavm.model.MethodDescriptor;
|
||||
import org.teavm.model.MethodReader;
|
||||
import org.teavm.vm.BuildTarget;
|
||||
import org.teavm.vm.spi.RendererListener;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alexey Andreev
|
||||
*/
|
||||
public class ObjectEnrichRenderer implements RendererListener {
|
||||
private RenderingContext context;
|
||||
|
||||
@Override
|
||||
public void begin(RenderingContext context, BuildTarget buildTarget) throws IOException {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void complete() throws IOException {
|
||||
ClassReader cls = context.getClassSource().get("java.lang.Object");
|
||||
MethodReader toString = cls.getMethod(new MethodDescriptor("toString", String.class));
|
||||
if (toString != null) {
|
||||
String clsName = context.getNaming().getNameFor(cls.getName());
|
||||
String toStringName = context.getNaming().getNameFor(toString.getReference());
|
||||
context.getWriter().append(clsName).append(".prototype.toString").ws().append('=').ws()
|
||||
.append("function()").ws().append('{').indent().softNewLine();
|
||||
context.getWriter().append("return this.").append(toStringName).ws().append('?').ws()
|
||||
.append("$rt_ustr(this.").append(toStringName).append("())").ws().append(':')
|
||||
.append("Object.prototype.toString.call(this);").softNewLine();
|
||||
context.getWriter().outdent().append("}").newLine();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -59,7 +59,6 @@ public class AstIO {
|
|||
}
|
||||
}
|
||||
}
|
||||
output.writeBoolean(method.isOriginalNamePreserved());
|
||||
try {
|
||||
method.getBody().acceptVisitor(new NodeWriter(output));
|
||||
} catch (IOExceptionWrapper e) {
|
||||
|
@ -83,7 +82,6 @@ public class AstIO {
|
|||
}
|
||||
node.getParameterDebugNames().add(debugNames);
|
||||
}
|
||||
node.setOriginalNamePreserved(input.readBoolean());
|
||||
node.setBody(readStatement(input));
|
||||
return node;
|
||||
}
|
||||
|
@ -511,12 +509,12 @@ public class AstIO {
|
|||
|
||||
@Override
|
||||
public void visit(MonitorEnterStatement statement) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visit(MonitorExitStatement statement) {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ import org.teavm.javascript.ast.*;
|
|||
import org.teavm.javascript.spi.GeneratedBy;
|
||||
import org.teavm.javascript.spi.Generator;
|
||||
import org.teavm.javascript.spi.InjectedBy;
|
||||
import org.teavm.javascript.spi.PreserveOriginalName;
|
||||
import org.teavm.model.*;
|
||||
import org.teavm.model.util.AsyncProgramSplitter;
|
||||
import org.teavm.model.util.ProgramUtils;
|
||||
|
@ -146,9 +145,6 @@ public class Decompiler {
|
|||
}
|
||||
MethodNode methodNode = decompile(method);
|
||||
clsNode.getMethods().add(methodNode);
|
||||
if (method.getAnnotations().get(PreserveOriginalName.class.getName()) != null) {
|
||||
methodNode.setOriginalNamePreserved(true);
|
||||
}
|
||||
}
|
||||
clsNode.getInterfaces().addAll(cls.getInterfaces());
|
||||
clsNode.getModifiers().addAll(mapModifiers(cls.getModifiers()));
|
||||
|
|
|
@ -278,7 +278,6 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
renderMethodBodies(cls);
|
||||
}
|
||||
renderClassMetadata(classes);
|
||||
renderMethodStubs(classes);
|
||||
}
|
||||
|
||||
private void renderDeclaration(ClassNode cls) throws RenderingException {
|
||||
|
@ -364,8 +363,6 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
} else {
|
||||
virtualMethods.add(method);
|
||||
}
|
||||
} else if (method.isOriginalNamePreserved()) {
|
||||
renderStaticDeclaration(method);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -381,56 +378,9 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
debugEmitter.emitClass(null);
|
||||
}
|
||||
|
||||
private void renderMethodStubs(List<ClassNode> classes) {
|
||||
try {
|
||||
boolean first = true;
|
||||
writer.append("$rt_methodStubs([");
|
||||
for (int i = 0; i < classes.size(); ++i) {
|
||||
ClassNode cls = classes.get(i);
|
||||
MethodHolder clinit = classSource.get(cls.getName()).getMethod(
|
||||
new MethodDescriptor("<clinit>", ValueType.VOID));
|
||||
if (clinit == null) {
|
||||
continue;
|
||||
}
|
||||
List<String> stubNames = new ArrayList<>();
|
||||
for (MethodNode method : cls.getMethods()) {
|
||||
if (method.getModifiers().contains(NodeModifier.STATIC) ||
|
||||
method.getReference().getName().equals("<init>")) {
|
||||
stubNames.add(naming.getFullNameFor(method.getReference()));
|
||||
}
|
||||
}
|
||||
if (stubNames.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (!first) {
|
||||
writer.append(',').softNewLine();
|
||||
}
|
||||
first = false;
|
||||
writer.appendClass(cls.getName()).append("_$clinit").append(",").ws();
|
||||
if (stubNames.size() == 1) {
|
||||
writer.append("'").append(stubNames.get(0)).append("'");
|
||||
} else {
|
||||
writer.append('[');
|
||||
for (int j = 0; j < stubNames.size(); ++j) {
|
||||
if (j > 0) {
|
||||
writer.append(",").ws();
|
||||
}
|
||||
writer.append("'").append(stubNames.get(j)).append("'");
|
||||
}
|
||||
writer.append(']');
|
||||
}
|
||||
}
|
||||
writer.append("]);").newLine();
|
||||
} catch (NamingException e) {
|
||||
throw new RenderingException("Error rendering method stubs. See a cause for details", e);
|
||||
} catch (IOException e) {
|
||||
throw new RenderingException("IO error occured", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void renderClassMetadata(List<ClassNode> classes) {
|
||||
try {
|
||||
writer.append("$rt_declClasses([");
|
||||
writer.append("$rt_metadata([");
|
||||
boolean first = true;
|
||||
for (ClassNode cls : classes) {
|
||||
if (!first) {
|
||||
|
@ -538,7 +488,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
}
|
||||
writer.append(variableName(i));
|
||||
}
|
||||
writer.append(")").ws().append("{").newLine().indent();
|
||||
writer.append(")").ws().append("{").softNewLine().indent();
|
||||
writer.append("var result").ws().append("=").ws().append("new ").appendClass(
|
||||
ref.getClassName()).append("();").softNewLine();
|
||||
writer.append(naming.getFullNameFor(ref)).append("(result");
|
||||
|
@ -563,12 +513,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
}
|
||||
first = false;
|
||||
String methodName = method.isAsync() ? naming.getNameForAsync(ref) : naming.getNameFor(ref);
|
||||
if (method.isOriginalNamePreserved()) {
|
||||
writer.append("[\"").append(methodName).append("\",").ws().append("\"").append(ref.getName())
|
||||
.append("\"]");
|
||||
} else {
|
||||
writer.append("\"").append(methodName).append("\"");
|
||||
}
|
||||
writer.append("\"").append(methodName).append("\"");
|
||||
writer.append(",").ws().append("function(");
|
||||
List<String> args = new ArrayList<>();
|
||||
for (int i = 1; i <= ref.parameterCount(); ++i) {
|
||||
|
@ -604,33 +549,6 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
|
|||
writer.append("]");
|
||||
}
|
||||
|
||||
private void renderStaticDeclaration(MethodNode method) throws NamingException, IOException {
|
||||
MethodReference ref = method.getReference();
|
||||
debugEmitter.emitMethod(ref.getDescriptor());
|
||||
if (ref.getDescriptor().getName().equals("<init>")) {
|
||||
renderInitializer(method);
|
||||
}
|
||||
writer.appendClass(ref.getClassName()).append(".").appendMethod(ref).ws().append("=").ws().append("function(");
|
||||
for (int i = 0; i < ref.parameterCount(); ++i) {
|
||||
if (i > 0) {
|
||||
writer.append(", ");
|
||||
}
|
||||
writer.append(variableName(i + 1));
|
||||
}
|
||||
writer.append(")").ws().append("{").softNewLine().indent();
|
||||
writer.append("return ").appendMethodBody(ref).append("(");
|
||||
for (int i = 0; i < ref.parameterCount(); ++i) {
|
||||
writer.append(",").ws().append(variableName(i + 1));
|
||||
}
|
||||
writer.append(");").softNewLine();
|
||||
writer.outdent().append("}").newLine();
|
||||
if (method.isOriginalNamePreserved()) {
|
||||
writer.appendClass(ref.getClassName()).append(".").append(ref.getName()).ws().append("=")
|
||||
.ws().appendClass(ref.getClassName()).append(".").appendMethod(ref).append(';').newLine();
|
||||
}
|
||||
debugEmitter.emitMethod(null);
|
||||
}
|
||||
|
||||
public void renderBody(MethodNode method, boolean inner) throws IOException {
|
||||
MethodReference ref = method.getReference();
|
||||
debugEmitter.emitMethod(ref.getDescriptor());
|
||||
|
|
|
@ -26,7 +26,6 @@ import org.teavm.model.MethodReference;
|
|||
public abstract class MethodNode {
|
||||
private MethodReference reference;
|
||||
private Set<NodeModifier> modifiers = EnumSet.noneOf(NodeModifier.class);
|
||||
private boolean originalNamePreserved;
|
||||
|
||||
public MethodNode(MethodReference reference) {
|
||||
this.reference = reference;
|
||||
|
@ -41,14 +40,6 @@ public abstract class MethodNode {
|
|||
return modifiers;
|
||||
}
|
||||
|
||||
public boolean isOriginalNamePreserved() {
|
||||
return originalNamePreserved;
|
||||
}
|
||||
|
||||
public void setOriginalNamePreserved(boolean originalNamePreserved) {
|
||||
this.originalNamePreserved = originalNamePreserved;
|
||||
}
|
||||
|
||||
public abstract void acceptVisitor(MethodNodeVisitor visitor);
|
||||
|
||||
public abstract boolean isAsync();
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* Copyright 2014 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.javascript.spi;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alexey Andreev
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface PreserveOriginalName {
|
||||
}
|
|
@ -466,11 +466,11 @@ public class TeaVM implements TeaVMHost, ServiceRepository {
|
|||
if (wrapAsync) {
|
||||
sourceWriter.append(")");
|
||||
}
|
||||
sourceWriter.append(";").softNewLine();
|
||||
sourceWriter.append(";").newLine();
|
||||
}
|
||||
for (Map.Entry<String, String> entry : exportedClasses.entrySet()) {
|
||||
sourceWriter.append("var ").append(entry.getKey()).ws().append("=").ws()
|
||||
.appendClass(entry.getValue()).append(";").softNewLine();
|
||||
.appendClass(entry.getValue()).append(";").newLine();
|
||||
}
|
||||
for (RendererListener listener : rendererListeners) {
|
||||
listener.complete();
|
||||
|
|
|
@ -217,14 +217,6 @@ function $rt_voidcls() {
|
|||
}
|
||||
return $rt_voidclsCache;
|
||||
}
|
||||
function $rt_clinit(cls) {
|
||||
if (cls.$clinit) {
|
||||
var f = cls.$clinit;
|
||||
delete cls.$clinit;
|
||||
f();
|
||||
}
|
||||
return cls;
|
||||
}
|
||||
function $rt_init(cls, constructor, args) {
|
||||
var obj = new cls();
|
||||
cls.prototype[constructor].apply(obj, args);
|
||||
|
@ -409,7 +401,7 @@ function $rt_metadata(data) {
|
|||
return function() {
|
||||
var clinit = cls.$clinit;
|
||||
cls.$clinit = function() {};
|
||||
cls.$clinit();
|
||||
clinit();
|
||||
return window[name].apply(window, arguments);
|
||||
}
|
||||
})(cls, names[j]);
|
||||
|
@ -417,7 +409,7 @@ function $rt_metadata(data) {
|
|||
|
||||
var virtualMethods = data[i + 7];
|
||||
for (var j = 0; j < virtualMethods.length; j += 2) {
|
||||
name = virtualMethods[j + 0];
|
||||
var name = virtualMethods[j + 0];
|
||||
var func = virtualMethods[j + 1];
|
||||
if (typeof name === 'string') {
|
||||
name = [name];
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
/*
|
||||
* Copyright 2014 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.platform.plugin;
|
||||
|
||||
import org.teavm.diagnostics.Diagnostics;
|
||||
import org.teavm.javascript.spi.PreserveOriginalName;
|
||||
import org.teavm.model.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alexey Andreev
|
||||
*/
|
||||
public class EnumTransformer implements ClassHolderTransformer {
|
||||
@Override
|
||||
public void transformClass(ClassHolder cls, ClassReaderSource innerSource, Diagnostics diagnostics) {
|
||||
if (cls.getParent() != null && !cls.getParent().equals("java.lang.Enum")) {
|
||||
return;
|
||||
}
|
||||
MethodHolder method = cls.getMethod(new MethodDescriptor("values",
|
||||
ValueType.arrayOf(ValueType.object(cls.getName()))));
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
method.getAnnotations().add(new AnnotationHolder(PreserveOriginalName.class.getName()));
|
||||
}
|
||||
}
|
|
@ -33,6 +33,5 @@ public class PlatformPlugin implements TeaVMPlugin {
|
|||
host.add(new NewInstanceDependencySupport());
|
||||
host.add(new ClassLookupDependencySupport());
|
||||
host.add(new EnumDependencySupport());
|
||||
host.add(new EnumTransformer());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user