OptimizationMethodVisitor: convert to Kotlin
This commit is contained in:
+43
-51
@@ -14,64 +14,56 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.optimization;
|
package org.jetbrains.kotlin.codegen.optimization
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer
|
||||||
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor;
|
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantCoercionToUnitTransformer
|
||||||
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer;
|
import org.jetbrains.kotlin.codegen.optimization.captured.CapturedVarsOptimizationMethodTransformer
|
||||||
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantCoercionToUnitTransformer;
|
import org.jetbrains.kotlin.codegen.optimization.common.prepareForEmitting
|
||||||
import org.jetbrains.kotlin.codegen.optimization.captured.CapturedVarsOptimizationMethodTransformer;
|
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckV2MethodTransformer
|
||||||
import org.jetbrains.kotlin.codegen.optimization.common.UtilKt;
|
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
||||||
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckV2MethodTransformer;
|
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
||||||
import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer;
|
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
|
||||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
|
|
||||||
|
|
||||||
public class OptimizationMethodVisitor extends TransformationMethodVisitor {
|
class OptimizationMethodVisitor(
|
||||||
private static final int MEMORY_LIMIT_BY_METHOD_MB = 50;
|
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();
|
override fun performTransformations(methodNode: MethodNode) {
|
||||||
|
MANDATORY_METHOD_TRANSFORMER.transform("fake", methodNode)
|
||||||
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);
|
|
||||||
if (canBeOptimized(methodNode) && !disableOptimization) {
|
if (canBeOptimized(methodNode) && !disableOptimization) {
|
||||||
for (MethodTransformer transformer : OPTIMIZATION_TRANSFORMERS) {
|
for (transformer in OPTIMIZATION_TRANSFORMERS) {
|
||||||
transformer.transform("fake", methodNode);
|
transformer.transform("fake", methodNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UtilKt.prepareForEmitting(methodNode);
|
methodNode.prepareForEmitting()
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean canBeOptimized(@NotNull MethodNode node) {
|
companion object {
|
||||||
int totalFramesSizeMb = node.instructions.size() * (node.maxLocals + node.maxStack) / (1024 * 1024);
|
private val MEMORY_LIMIT_BY_METHOD_MB = 50
|
||||||
return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB;
|
|
||||||
|
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