OptimizationMethodVisitor: convert to Kotlin
This commit is contained in:
+43
-51
@@ -14,64 +14,56 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.codegen.optimization;
|
||||
package org.jetbrains.kotlin.codegen.optimization
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor;
|
||||
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer;
|
||||
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantCoercionToUnitTransformer;
|
||||
import org.jetbrains.kotlin.codegen.optimization.captured.CapturedVarsOptimizationMethodTransformer;
|
||||
import org.jetbrains.kotlin.codegen.optimization.common.UtilKt;
|
||||
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckV2MethodTransformer;
|
||||
import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer;
|
||||
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
|
||||
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor
|
||||
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer
|
||||
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantCoercionToUnitTransformer
|
||||
import org.jetbrains.kotlin.codegen.optimization.captured.CapturedVarsOptimizationMethodTransformer
|
||||
import org.jetbrains.kotlin.codegen.optimization.common.prepareForEmitting
|
||||
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckV2MethodTransformer
|
||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
||||
|
||||
public class OptimizationMethodVisitor extends TransformationMethodVisitor {
|
||||
private static final int MEMORY_LIMIT_BY_METHOD_MB = 50;
|
||||
class OptimizationMethodVisitor(
|
||||
delegate: MethodVisitor,
|
||||
private val disableOptimization: Boolean,
|
||||
access: Int,
|
||||
name: String,
|
||||
desc: String,
|
||||
signature: String?,
|
||||
exceptions: Array<String>?
|
||||
) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions) {
|
||||
|
||||
private static final MethodTransformer MANDATORY_METHOD_TRANSFORMER = new FixStackWithLabelNormalizationMethodTransformer();
|
||||
|
||||
private static final MethodTransformer[] OPTIMIZATION_TRANSFORMERS = new MethodTransformer[] {
|
||||
new CapturedVarsOptimizationMethodTransformer(),
|
||||
new RedundantNullCheckV2MethodTransformer(),
|
||||
new RedundantCheckCastEliminationMethodTransformer(),
|
||||
new RedundantBoxingMethodTransformer(),
|
||||
new RedundantCoercionToUnitTransformer(),
|
||||
new DeadCodeEliminationMethodTransformer(),
|
||||
new RedundantGotoMethodTransformer(),
|
||||
new RedundantNopsCleanupMethodTransformer()
|
||||
};
|
||||
|
||||
private final boolean disableOptimization;
|
||||
|
||||
public OptimizationMethodVisitor(
|
||||
@NotNull MethodVisitor delegate,
|
||||
boolean disableOptimization,
|
||||
int access,
|
||||
@NotNull String name,
|
||||
@NotNull String desc,
|
||||
@Nullable String signature,
|
||||
@Nullable String[] exceptions
|
||||
) {
|
||||
super(delegate, access, name, desc, signature, exceptions);
|
||||
this.disableOptimization = disableOptimization;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void performTransformations(@NotNull MethodNode methodNode) {
|
||||
MANDATORY_METHOD_TRANSFORMER.transform("fake", methodNode);
|
||||
override fun performTransformations(methodNode: MethodNode) {
|
||||
MANDATORY_METHOD_TRANSFORMER.transform("fake", methodNode)
|
||||
if (canBeOptimized(methodNode) && !disableOptimization) {
|
||||
for (MethodTransformer transformer : OPTIMIZATION_TRANSFORMERS) {
|
||||
transformer.transform("fake", methodNode);
|
||||
for (transformer in OPTIMIZATION_TRANSFORMERS) {
|
||||
transformer.transform("fake", methodNode)
|
||||
}
|
||||
}
|
||||
UtilKt.prepareForEmitting(methodNode);
|
||||
methodNode.prepareForEmitting()
|
||||
}
|
||||
|
||||
private static boolean canBeOptimized(@NotNull MethodNode node) {
|
||||
int totalFramesSizeMb = node.instructions.size() * (node.maxLocals + node.maxStack) / (1024 * 1024);
|
||||
return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB;
|
||||
companion object {
|
||||
private val MEMORY_LIMIT_BY_METHOD_MB = 50
|
||||
|
||||
private val MANDATORY_METHOD_TRANSFORMER = FixStackWithLabelNormalizationMethodTransformer()
|
||||
|
||||
private val OPTIMIZATION_TRANSFORMERS = arrayOf(
|
||||
CapturedVarsOptimizationMethodTransformer(),
|
||||
RedundantNullCheckV2MethodTransformer(),
|
||||
RedundantCheckCastEliminationMethodTransformer(),
|
||||
RedundantBoxingMethodTransformer(),
|
||||
RedundantCoercionToUnitTransformer(),
|
||||
DeadCodeEliminationMethodTransformer(),
|
||||
RedundantGotoMethodTransformer(),
|
||||
RedundantNopsCleanupMethodTransformer()
|
||||
)
|
||||
|
||||
private fun canBeOptimized(node: MethodNode): Boolean {
|
||||
val totalFramesSizeMb = node.instructions.size() * (node.maxLocals + node.maxStack) / (1024 * 1024)
|
||||
return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user