Clean code. Add LambdaInfo to InliningContext
This commit is contained in:
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user