mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
TeaVM(C): fix unnecessary call to Fiber.isResuming
This commit is contained in:
parent
c430578426
commit
b6cfbe7f5b
|
@ -152,6 +152,7 @@ public class CTarget implements TeaVMTarget, TeaVMCHost {
|
|||
private List<GeneratorFactory> generatorFactories = new ArrayList<>();
|
||||
private Characteristics characteristics;
|
||||
private Set<MethodReference> asyncMethods;
|
||||
private boolean hasThreads;
|
||||
private MethodNodeCache astCache = EmptyMethodNodeCache.INSTANCE;
|
||||
private boolean incremental;
|
||||
private boolean lineNumbersGenerated;
|
||||
|
@ -285,11 +286,11 @@ public class CTarget implements TeaVMTarget, TeaVMCHost {
|
|||
|
||||
@Override
|
||||
public void analyzeBeforeOptimizations(ListableClassReaderSource classSource) {
|
||||
AsyncMethodFinder asyncFinder = new AsyncMethodFinder(controller.getDependencyInfo().getCallGraph(),
|
||||
controller.getDiagnostics());
|
||||
AsyncMethodFinder asyncFinder = new AsyncMethodFinder(controller.getDependencyInfo().getCallGraph());
|
||||
asyncFinder.find(classSource);
|
||||
asyncMethods = new HashSet<>(asyncFinder.getAsyncMethods());
|
||||
asyncMethods.addAll(asyncFinder.getAsyncFamilyMethods());
|
||||
hasThreads = asyncFinder.hasAsyncMethods();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -302,7 +303,7 @@ public class CTarget implements TeaVMTarget, TeaVMCHost {
|
|||
classInitializerEliminator.apply(program);
|
||||
classInitializerTransformer.transform(program);
|
||||
nullCheckTransformation.apply(program, method.getResultType());
|
||||
new CoroutineTransformation(controller.getUnprocessedClassSource(), asyncMethods)
|
||||
new CoroutineTransformation(controller.getUnprocessedClassSource(), asyncMethods, hasThreads)
|
||||
.apply(program, method.getReference());
|
||||
ShadowStackTransformer shadowStackTransformer = !incremental
|
||||
? this.shadowStackTransformer
|
||||
|
|
|
@ -470,8 +470,7 @@ public class JavaScriptTarget implements TeaVMTarget, TeaVMJavaScriptHost {
|
|||
}
|
||||
|
||||
private List<PreparedClass> modelToAst(ListableClassHolderSource classes) {
|
||||
AsyncMethodFinder asyncFinder = new AsyncMethodFinder(controller.getDependencyInfo().getCallGraph(),
|
||||
controller.getDiagnostics());
|
||||
AsyncMethodFinder asyncFinder = new AsyncMethodFinder(controller.getDependencyInfo().getCallGraph());
|
||||
asyncFinder.find(classes);
|
||||
asyncMethods.addAll(asyncFinder.getAsyncMethods());
|
||||
asyncFamilyMethods.addAll(asyncFinder.getAsyncFamilyMethods());
|
||||
|
|
|
@ -79,10 +79,13 @@ public class CoroutineTransformation {
|
|||
private SwitchInstruction resumeSwitch;
|
||||
private int parameterCount;
|
||||
private ValueType returnType;
|
||||
private boolean hasThreads;
|
||||
|
||||
public CoroutineTransformation(ClassReaderSource classSource, Set<MethodReference> asyncMethods) {
|
||||
public CoroutineTransformation(ClassReaderSource classSource, Set<MethodReference> asyncMethods,
|
||||
boolean hasThreads) {
|
||||
this.classSource = classSource;
|
||||
this.asyncMethods = asyncMethods;
|
||||
this.hasThreads = hasThreads;
|
||||
}
|
||||
|
||||
public void apply(Program program, MethodReference methodReference) {
|
||||
|
@ -233,7 +236,7 @@ public class CoroutineTransformation {
|
|||
} else if (instruction instanceof InitClassInstruction) {
|
||||
return isSplittingClassInitializer(((InitClassInstruction) instruction).getClassName());
|
||||
} else {
|
||||
return instruction instanceof MonitorEnterInstruction;
|
||||
return hasThreads && instruction instanceof MonitorEnterInstruction;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@ import java.util.Set;
|
|||
import org.teavm.callgraph.CallGraph;
|
||||
import org.teavm.callgraph.CallGraphNode;
|
||||
import org.teavm.callgraph.CallSite;
|
||||
import org.teavm.diagnostics.Diagnostics;
|
||||
import org.teavm.interop.Async;
|
||||
import org.teavm.model.ClassReader;
|
||||
import org.teavm.model.ElementModifier;
|
||||
|
@ -44,13 +43,11 @@ public class AsyncMethodFinder {
|
|||
private Set<MethodReference> readonlyAsyncMethods = Collections.unmodifiableSet(asyncMethods);
|
||||
private Set<MethodReference> readonlyAsyncFamilyMethods = Collections.unmodifiableSet(asyncFamilyMethods.keySet());
|
||||
private CallGraph callGraph;
|
||||
private Diagnostics diagnostics;
|
||||
private ListableClassReaderSource classSource;
|
||||
private boolean hasAsyncMethods;
|
||||
|
||||
public AsyncMethodFinder(CallGraph callGraph, Diagnostics diagnostics) {
|
||||
public AsyncMethodFinder(CallGraph callGraph) {
|
||||
this.callGraph = callGraph;
|
||||
this.diagnostics = diagnostics;
|
||||
}
|
||||
|
||||
public Set<MethodReference> getAsyncMethods() {
|
||||
|
@ -63,7 +60,7 @@ public class AsyncMethodFinder {
|
|||
|
||||
public void find(ListableClassReaderSource classSource) {
|
||||
this.classSource = classSource;
|
||||
hasAsyncMethods = hasAsyncMethods();
|
||||
hasAsyncMethods = findAsyncMethods();
|
||||
for (String clsName : classSource.getClassNames()) {
|
||||
ClassReader cls = classSource.get(clsName);
|
||||
for (MethodReader method : cls.getMethods()) {
|
||||
|
@ -104,7 +101,7 @@ public class AsyncMethodFinder {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean hasAsyncMethods() {
|
||||
private boolean findAsyncMethods() {
|
||||
boolean result = false;
|
||||
loop: for (String clsName : classSource.getClassNames()) {
|
||||
ClassReader cls = classSource.get(clsName);
|
||||
|
@ -123,6 +120,10 @@ public class AsyncMethodFinder {
|
|||
return result && method != null;
|
||||
}
|
||||
|
||||
public boolean hasAsyncMethods() {
|
||||
return hasAsyncMethods;
|
||||
}
|
||||
|
||||
private boolean hasMonitor(MethodReader method) {
|
||||
if (method.hasModifier(ElementModifier.SYNCHRONIZED)) {
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue
Block a user