Clean code. Add LambdaInfo to InliningContext

This commit is contained in:
Mikhael Bogdanov
2017-05-12 14:55:06 +02:00
parent 9dae183e3a
commit 9fdd4c647a
2 changed files with 20 additions and 20 deletions
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.codegen.ClassBuilder
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.coroutines.COROUTINE_IMPL_ASM_TYPE import org.jetbrains.kotlin.codegen.coroutines.COROUTINE_IMPL_ASM_TYPE
import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil.isThis0 import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil.isThis0
import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.Companion.NO_ORIGIN import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.Companion.NO_ORIGIN
import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.*
@@ -26,9 +26,12 @@ open class InliningContext(
val nameGenerator: NameGenerator, val nameGenerator: NameGenerator,
val typeRemapper: TypeRemapper, val typeRemapper: TypeRemapper,
val reifiedTypeInliner: ReifiedTypeInliner, val reifiedTypeInliner: ReifiedTypeInliner,
val isInliningLambda: Boolean, val lambdaInfo: LambdaInfo?,
val classRegeneration: Boolean val classRegeneration: Boolean
) { ) {
val isInliningLambda = lambdaInfo != null
val internalNameToAnonymousObjectTransformationInfo = hashMapOf<String, AnonymousObjectTransformationInfo>() val internalNameToAnonymousObjectTransformationInfo = hashMapOf<String, AnonymousObjectTransformationInfo>()
var isContinuation: Boolean = false var isContinuation: Boolean = false
@@ -38,15 +41,13 @@ open class InliningContext(
val root: RootInliningContext val root: RootInliningContext
get() = if (isRoot) this as RootInliningContext else parent!!.root get() = if (isRoot) this as RootInliningContext else parent!!.root
fun subInline(generator: NameGenerator): InliningContext { fun subInlineLambda(lambdaInfo: LambdaInfo): InliningContext =
return subInline(generator, emptyMap(), isInliningLambda) subInline(
} nameGenerator.subGenerator("lambda"),
//mark lambda inlined
fun subInlineLambda(lambdaInfo: LambdaInfo): InliningContext { hashMapOf(lambdaInfo.lambdaClassType.internalName to null),
val map = HashMap<String, String?>() lambdaInfo
map.put(lambdaInfo.lambdaClassType.internalName, null) //mark lambda inlined )
return subInline(nameGenerator.subGenerator("lambda"), map, true)
}
fun subInlineWithClassRegeneration( fun subInlineWithClassRegeneration(
generator: NameGenerator, generator: NameGenerator,
@@ -59,10 +60,14 @@ open class InliningContext(
) )
} }
private fun subInline( @JvmOverloads
generator: NameGenerator, additionalTypeMappings: Map<String, String?>, isInliningLambda: Boolean fun subInline(
generator: NameGenerator,
additionalTypeMappings: Map<String, String?> = emptyMap(),
lambdaInfo: LambdaInfo? = this.lambdaInfo
): InliningContext { ): InliningContext {
//isInliningLambda && !this.isInliningLambda for root inline lambda //isInliningLambda && !this.isInliningLambda for root inline lambda
val isInliningLambda = lambdaInfo != null
return InliningContext( return InliningContext(
this, expressionMap, state, generator, this, expressionMap, state, generator,
TypeRemapper.createFrom( TypeRemapper.createFrom(
@@ -71,20 +76,16 @@ open class InliningContext(
//root inline lambda //root inline lambda
isInliningLambda && !this.isInliningLambda isInliningLambda && !this.isInliningLambda
), ),
reifiedTypeInliner, isInliningLambda, classRegeneration reifiedTypeInliner, lambdaInfo, classRegeneration
) )
} }
open val callSiteInfo: InlineCallSiteInfo open val callSiteInfo: InlineCallSiteInfo
get() { get() {
return parent?.callSiteInfo ?: throw AssertionError("At least root context should return proper value") return parent!!.callSiteInfo
} }
fun findAnonymousObjectTransformationInfo(internalName: String): AnonymousObjectTransformationInfo? { fun findAnonymousObjectTransformationInfo(internalName: String): AnonymousObjectTransformationInfo? {
if (root.internalNameToAnonymousObjectTransformationInfo.containsKey(internalName)) { return root.internalNameToAnonymousObjectTransformationInfo[internalName]
return root.internalNameToAnonymousObjectTransformationInfo[internalName]
}
return null
} }
} }