Pass GenerationState to OptimizationMethodVisitor

Original author is @dnpetrov
This commit is contained in:
Mikhail Zarechenskiy
2018-06-15 12:52:05 +03:00
parent 605cdcd8d8
commit 5bdd7bca65
4 changed files with 17 additions and 33 deletions
@@ -20,23 +20,17 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.codegen.ClassBuilder; import org.jetbrains.kotlin.codegen.ClassBuilder;
import org.jetbrains.kotlin.codegen.DelegatingClassBuilder; import org.jetbrains.kotlin.codegen.DelegatingClassBuilder;
import org.jetbrains.kotlin.config.JVMConstructorCallNormalizationMode; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.MethodVisitor;
public class OptimizationClassBuilder extends DelegatingClassBuilder { public class OptimizationClassBuilder extends DelegatingClassBuilder {
private final ClassBuilder delegate; private final ClassBuilder delegate;
private final boolean disableOptimization; private final GenerationState generationState;
private final JVMConstructorCallNormalizationMode constructorCallNormalizationMode;
public OptimizationClassBuilder( public OptimizationClassBuilder(@NotNull ClassBuilder delegate, @NotNull GenerationState generationState) {
@NotNull ClassBuilder delegate,
boolean disableOptimization,
JVMConstructorCallNormalizationMode constructorCallNormalizationMode
) {
this.delegate = delegate; this.delegate = delegate;
this.disableOptimization = disableOptimization; this.generationState = generationState;
this.constructorCallNormalizationMode = constructorCallNormalizationMode;
} }
@NotNull @NotNull
@@ -57,8 +51,7 @@ public class OptimizationClassBuilder extends DelegatingClassBuilder {
) { ) {
return new OptimizationMethodVisitor( return new OptimizationMethodVisitor(
super.newMethod(origin, access, name, desc, signature, exceptions), super.newMethod(origin, access, name, desc, signature, exceptions),
disableOptimization, constructorCallNormalizationMode, generationState, access, name, desc, signature, exceptions
access, name, desc, signature, exceptions
); );
} }
} }
@@ -19,28 +19,20 @@ package org.jetbrains.kotlin.codegen.optimization;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.codegen.ClassBuilderFactory; import org.jetbrains.kotlin.codegen.ClassBuilderFactory;
import org.jetbrains.kotlin.codegen.DelegatingClassBuilderFactory; import org.jetbrains.kotlin.codegen.DelegatingClassBuilderFactory;
import org.jetbrains.kotlin.config.JVMConstructorCallNormalizationMode; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
public class OptimizationClassBuilderFactory extends DelegatingClassBuilderFactory { public class OptimizationClassBuilderFactory extends DelegatingClassBuilderFactory {
private final boolean disableOptimization; private final GenerationState generationState;
private final JVMConstructorCallNormalizationMode constructorCallNormalizationMode;
public OptimizationClassBuilderFactory( public OptimizationClassBuilderFactory(ClassBuilderFactory delegate, @NotNull GenerationState generationState) {
ClassBuilderFactory delegate,
boolean disableOptimization,
JVMConstructorCallNormalizationMode constructorCallNormalizationMode
) {
super(delegate); super(delegate);
this.disableOptimization = disableOptimization; this.generationState = generationState;
this.constructorCallNormalizationMode = constructorCallNormalizationMode;
} }
@NotNull @NotNull
@Override @Override
public OptimizationClassBuilder newClassBuilder(@NotNull JvmDeclarationOrigin origin) { public OptimizationClassBuilder newClassBuilder(@NotNull JvmDeclarationOrigin origin) {
return new OptimizationClassBuilder( return new OptimizationClassBuilder(getDelegate().newClassBuilder(origin), generationState);
getDelegate().newClassBuilder(origin), disableOptimization, constructorCallNormalizationMode
);
} }
} }
@@ -23,14 +23,13 @@ import org.jetbrains.kotlin.codegen.optimization.boxing.StackPeepholeOptimizatio
import org.jetbrains.kotlin.codegen.optimization.common.prepareForEmitting import org.jetbrains.kotlin.codegen.optimization.common.prepareForEmitting
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckMethodTransformer import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckMethodTransformer
import org.jetbrains.kotlin.codegen.optimization.transformer.CompositeMethodTransformer import org.jetbrains.kotlin.codegen.optimization.transformer.CompositeMethodTransformer
import org.jetbrains.kotlin.config.JVMConstructorCallNormalizationMode import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
class OptimizationMethodVisitor( class OptimizationMethodVisitor(
delegate: MethodVisitor, delegate: MethodVisitor,
private val disableOptimization: Boolean, private val generationState: GenerationState,
private val constructorCallNormalizationMode: JVMConstructorCallNormalizationMode,
access: Int, access: Int,
name: String, name: String,
desc: String, desc: String,
@@ -38,13 +37,13 @@ class OptimizationMethodVisitor(
exceptions: Array<String>? exceptions: Array<String>?
) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions) { ) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions) {
private val constructorCallNormalizationTransformer = private val constructorCallNormalizationTransformer =
UninitializedStoresMethodTransformer(constructorCallNormalizationMode) UninitializedStoresMethodTransformer(generationState.constructorCallNormalizationMode)
override fun performTransformations(methodNode: MethodNode) { override fun performTransformations(methodNode: MethodNode) {
normalizationMethodTransformer.transform("fake", methodNode) normalizationMethodTransformer.transform("fake", methodNode)
constructorCallNormalizationTransformer.transform("fake", methodNode) constructorCallNormalizationTransformer.transform("fake", methodNode)
if (canBeOptimized(methodNode) && !disableOptimization) { if (canBeOptimized(methodNode) && !generationState.disableOptimization) {
optimizationTransformer.transform("fake", methodNode) optimizationTransformer.transform("fake", methodNode)
} }
@@ -229,12 +229,12 @@ class GenerationState private constructor(
val jvmDefaultMode = languageVersionSettings.getFlag(AnalysisFlag.jvmDefaultMode) val jvmDefaultMode = languageVersionSettings.getFlag(AnalysisFlag.jvmDefaultMode)
init { val disableOptimization = configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false)
val disableOptimization = configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false)
init {
this.interceptedBuilderFactory = builderFactory this.interceptedBuilderFactory = builderFactory
.wrapWith( .wrapWith(
{ OptimizationClassBuilderFactory(it, disableOptimization, constructorCallNormalizationMode) }, { OptimizationClassBuilderFactory(it, this) },
{ {
BuilderFactoryForDuplicateSignatureDiagnostics( BuilderFactoryForDuplicateSignatureDiagnostics(
it, this.bindingContext, diagnostics, this.moduleName, it, this.bindingContext, diagnostics, this.moduleName,