Pass GenerationState to OptimizationMethodVisitor
Original author is @dnpetrov
This commit is contained in:
+5
-12
@@ -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
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-13
@@ -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
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-5
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user