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.kotlin.codegen.ClassBuilder;
|
||||
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.org.objectweb.asm.MethodVisitor;
|
||||
|
||||
public class OptimizationClassBuilder extends DelegatingClassBuilder {
|
||||
private final ClassBuilder delegate;
|
||||
private final boolean disableOptimization;
|
||||
private final JVMConstructorCallNormalizationMode constructorCallNormalizationMode;
|
||||
private final GenerationState generationState;
|
||||
|
||||
public OptimizationClassBuilder(
|
||||
@NotNull ClassBuilder delegate,
|
||||
boolean disableOptimization,
|
||||
JVMConstructorCallNormalizationMode constructorCallNormalizationMode
|
||||
) {
|
||||
public OptimizationClassBuilder(@NotNull ClassBuilder delegate, @NotNull GenerationState generationState) {
|
||||
this.delegate = delegate;
|
||||
this.disableOptimization = disableOptimization;
|
||||
this.constructorCallNormalizationMode = constructorCallNormalizationMode;
|
||||
this.generationState = generationState;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -57,8 +51,7 @@ public class OptimizationClassBuilder extends DelegatingClassBuilder {
|
||||
) {
|
||||
return new OptimizationMethodVisitor(
|
||||
super.newMethod(origin, access, name, desc, signature, exceptions),
|
||||
disableOptimization, constructorCallNormalizationMode,
|
||||
access, name, desc, signature, exceptions
|
||||
generationState, 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.kotlin.codegen.ClassBuilderFactory;
|
||||
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;
|
||||
|
||||
public class OptimizationClassBuilderFactory extends DelegatingClassBuilderFactory {
|
||||
private final boolean disableOptimization;
|
||||
private final JVMConstructorCallNormalizationMode constructorCallNormalizationMode;
|
||||
private final GenerationState generationState;
|
||||
|
||||
public OptimizationClassBuilderFactory(
|
||||
ClassBuilderFactory delegate,
|
||||
boolean disableOptimization,
|
||||
JVMConstructorCallNormalizationMode constructorCallNormalizationMode
|
||||
) {
|
||||
public OptimizationClassBuilderFactory(ClassBuilderFactory delegate, @NotNull GenerationState generationState) {
|
||||
super(delegate);
|
||||
this.disableOptimization = disableOptimization;
|
||||
this.constructorCallNormalizationMode = constructorCallNormalizationMode;
|
||||
this.generationState = generationState;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public OptimizationClassBuilder newClassBuilder(@NotNull JvmDeclarationOrigin origin) {
|
||||
return new OptimizationClassBuilder(
|
||||
getDelegate().newClassBuilder(origin), disableOptimization, constructorCallNormalizationMode
|
||||
);
|
||||
return new OptimizationClassBuilder(getDelegate().newClassBuilder(origin), generationState);
|
||||
}
|
||||
}
|
||||
|
||||
+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.nullCheck.RedundantNullCheckMethodTransformer
|
||||
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.tree.MethodNode
|
||||
|
||||
class OptimizationMethodVisitor(
|
||||
delegate: MethodVisitor,
|
||||
private val disableOptimization: Boolean,
|
||||
private val constructorCallNormalizationMode: JVMConstructorCallNormalizationMode,
|
||||
private val generationState: GenerationState,
|
||||
access: Int,
|
||||
name: String,
|
||||
desc: String,
|
||||
@@ -38,13 +37,13 @@ class OptimizationMethodVisitor(
|
||||
exceptions: Array<String>?
|
||||
) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions) {
|
||||
private val constructorCallNormalizationTransformer =
|
||||
UninitializedStoresMethodTransformer(constructorCallNormalizationMode)
|
||||
UninitializedStoresMethodTransformer(generationState.constructorCallNormalizationMode)
|
||||
|
||||
override fun performTransformations(methodNode: MethodNode) {
|
||||
normalizationMethodTransformer.transform("fake", methodNode)
|
||||
constructorCallNormalizationTransformer.transform("fake", methodNode)
|
||||
|
||||
if (canBeOptimized(methodNode) && !disableOptimization) {
|
||||
if (canBeOptimized(methodNode) && !generationState.disableOptimization) {
|
||||
optimizationTransformer.transform("fake", methodNode)
|
||||
}
|
||||
|
||||
|
||||
@@ -229,12 +229,12 @@ class GenerationState private constructor(
|
||||
|
||||
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
|
||||
.wrapWith(
|
||||
{ OptimizationClassBuilderFactory(it, disableOptimization, constructorCallNormalizationMode) },
|
||||
{ OptimizationClassBuilderFactory(it, this) },
|
||||
{
|
||||
BuilderFactoryForDuplicateSignatureDiagnostics(
|
||||
it, this.bindingContext, diagnostics, this.moduleName,
|
||||
|
||||
Reference in New Issue
Block a user