blob: f63722595d5d425687037ca3031f2a3c4118bcb1 [file] [log] [blame]
// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.conversion;
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.contexts.CompilationContext.ProcessorContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
/**
* A {@link MethodProcessor} that doesn't persist; rather just processes the given methods one-time,
* along with a default abstraction of concurrent processing.
*/
public class OneTimeMethodProcessor extends MethodProcessorWithWave {
private final ProcessorContext processorContext;
private OneTimeMethodProcessor(ProcessorContext processorContext, SortedProgramMethodSet wave) {
this.processorContext = processorContext;
this.wave = wave;
}
public static OneTimeMethodProcessor create(ProgramMethod methodToProcess, AppView<?> appView) {
return create(SortedProgramMethodSet.create(methodToProcess), appView);
}
public static OneTimeMethodProcessor create(
ProgramMethod methodToProcess, ProcessorContext processorContext) {
return create(SortedProgramMethodSet.create(methodToProcess), processorContext);
}
public static OneTimeMethodProcessor create(
SortedProgramMethodSet methodsToProcess, AppView<?> appView) {
return create(methodsToProcess, appView.createProcessorContext());
}
public static OneTimeMethodProcessor create(
SortedProgramMethodSet methodsToProcess, ProcessorContext processorContext) {
return new OneTimeMethodProcessor(processorContext, methodsToProcess);
}
@Override
public boolean shouldApplyCodeRewritings(ProgramMethod method) {
return true;
}
@FunctionalInterface
public interface MethodAction<E extends Exception> {
void accept(ProgramMethod method, MethodProcessingContext methodProcessingContext) throws E;
}
public <E extends Exception> void forEachWaveWithExtension(MethodAction<E> consumer) throws E {
while (!wave.isEmpty()) {
for (ProgramMethod method : wave) {
consumer.accept(method, processorContext.createMethodProcessingContext(method));
}
prepareForWaveExtensionProcessing();
}
}
public <E extends Exception> void forEachWaveWithExtension(
MethodAction<E> consumer, ExecutorService executorService) throws ExecutionException {
while (!wave.isEmpty()) {
ThreadUtils.processItems(
wave,
method -> consumer.accept(method, processorContext.createMethodProcessingContext(method)),
executorService);
prepareForWaveExtensionProcessing();
}
}
}