Rename LabelOwner into ReturnLabelOwner
This commit is contained in:
+1
-1
@@ -280,7 +280,7 @@ class AnonymousObjectTransformer(
|
||||
), null
|
||||
)
|
||||
|
||||
val result = inliner.doInline(deferringVisitor, LocalVarRemapper(parameters, 0), false, LabelOwner.NOT_APPLICABLE)
|
||||
val result = inliner.doInline(deferringVisitor, LocalVarRemapper(parameters, 0), false, ReturnLabelOwner.NOT_APPLICABLE)
|
||||
result.reifiedTypeParametersUsages.mergeAll(typeParametersToReify)
|
||||
deferringVisitor.visitMaxs(-1, -1)
|
||||
return result
|
||||
|
||||
@@ -273,12 +273,12 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
|
||||
//hack to keep linenumber info, otherwise jdi will skip begin of linenumber chain
|
||||
adapter.visitInsn(Opcodes.NOP)
|
||||
|
||||
val result = inliner.doInline(adapter, remapper, true, LabelOwner.SKIP_ALL)
|
||||
val result = inliner.doInline(adapter, remapper, true, ReturnLabelOwner.SKIP_ALL)
|
||||
result.reifiedTypeParametersUsages.mergeAll(reificationResult)
|
||||
|
||||
val labels = sourceCompiler.getContextLabels()
|
||||
|
||||
val infos = MethodInliner.processReturns(adapter, LabelOwner { labels.contains(it) }, true, null)
|
||||
val infos = MethodInliner.processReturns(adapter, ReturnLabelOwner { labels.contains(it) }, true, null)
|
||||
sourceCompiler.generateAndInsertFinallyBlocks(
|
||||
adapter, infos, (remapper.remap(parameters.argsSizeOnStack + 1).value as StackValue.Local).index
|
||||
)
|
||||
|
||||
@@ -37,7 +37,7 @@ import kotlin.properties.Delegates
|
||||
|
||||
interface FunctionalArgument
|
||||
|
||||
abstract class LambdaInfo(@JvmField val isCrossInline: Boolean) : FunctionalArgument, LabelOwner {
|
||||
abstract class LambdaInfo(@JvmField val isCrossInline: Boolean) : FunctionalArgument, ReturnLabelOwner {
|
||||
|
||||
abstract val isBoundCallableReference: Boolean
|
||||
|
||||
@@ -102,7 +102,7 @@ class DefaultLambda(
|
||||
override lateinit var capturedVars: List<CapturedParamDesc>
|
||||
private set
|
||||
|
||||
override fun isMyLabel(name: String): Boolean = false
|
||||
override fun isReturnFromMe(labelName: String): Boolean = false
|
||||
|
||||
var originalBoundReceiverType: Type? = null
|
||||
private set
|
||||
@@ -300,8 +300,8 @@ class PsiExpressionLambda(
|
||||
}
|
||||
}
|
||||
|
||||
override fun isMyLabel(name: String): Boolean {
|
||||
return labels.contains(name)
|
||||
override fun isReturnFromMe(labelName: String): Boolean {
|
||||
return labels.contains(labelName)
|
||||
}
|
||||
|
||||
val isPropertyReference: Boolean
|
||||
|
||||
@@ -67,9 +67,9 @@ class MethodInliner(
|
||||
adapter: MethodVisitor,
|
||||
remapper: LocalVarRemapper,
|
||||
remapReturn: Boolean,
|
||||
labelOwner: LabelOwner
|
||||
returnLabelOwner: ReturnLabelOwner
|
||||
): InlineResult {
|
||||
return doInline(adapter, remapper, remapReturn, labelOwner, 0)
|
||||
return doInline(adapter, remapper, remapReturn, returnLabelOwner, 0)
|
||||
}
|
||||
|
||||
private fun recordTransformation(info: TransformationInfo) {
|
||||
@@ -83,11 +83,11 @@ class MethodInliner(
|
||||
adapter: MethodVisitor,
|
||||
remapper: LocalVarRemapper,
|
||||
remapReturn: Boolean,
|
||||
labelOwner: LabelOwner,
|
||||
returnLabelOwner: ReturnLabelOwner,
|
||||
finallyDeepShift: Int
|
||||
): InlineResult {
|
||||
//analyze body
|
||||
var transformedNode = markPlacesForInlineAndRemoveInlinable(node, labelOwner, finallyDeepShift)
|
||||
var transformedNode = markPlacesForInlineAndRemoveInlinable(node, returnLabelOwner, finallyDeepShift)
|
||||
if (inliningContext.isInliningLambda && isDefaultLambdaWithReification(inliningContext.lambdaInfo!!)) {
|
||||
//TODO maybe move reification in one place
|
||||
inliningContext.root.inlineMethodReifier.reifyInstructions(transformedNode)
|
||||
@@ -130,7 +130,7 @@ class MethodInliner(
|
||||
)
|
||||
}
|
||||
|
||||
processReturns(resultNode, labelOwner, remapReturn, end)
|
||||
processReturns(resultNode, returnLabelOwner, remapReturn, end)
|
||||
//flush transformed node to output
|
||||
resultNode.accept(SkipMaxAndEndVisitor(adapter))
|
||||
|
||||
@@ -485,11 +485,11 @@ class MethodInliner(
|
||||
}
|
||||
|
||||
private fun markPlacesForInlineAndRemoveInlinable(
|
||||
node: MethodNode, labelOwner: LabelOwner, finallyDeepShift: Int
|
||||
node: MethodNode, returnLabelOwner: ReturnLabelOwner, finallyDeepShift: Int
|
||||
): MethodNode {
|
||||
val processingNode = prepareNode(node, finallyDeepShift)
|
||||
|
||||
preprocessNodeBeforeInline(processingNode, labelOwner)
|
||||
preprocessNodeBeforeInline(processingNode, returnLabelOwner)
|
||||
|
||||
replaceContinuationAccessesWithFakeContinuationsIfNeeded(processingNode)
|
||||
|
||||
@@ -769,7 +769,7 @@ class MethodInliner(
|
||||
return Type.getArgumentTypes(invoke.desc).let { it.isNotEmpty() && it.last() == languageVersionSettings.continuationAsmType() }
|
||||
}
|
||||
|
||||
private fun preprocessNodeBeforeInline(node: MethodNode, labelOwner: LabelOwner) {
|
||||
private fun preprocessNodeBeforeInline(node: MethodNode, returnLabelOwner: ReturnLabelOwner) {
|
||||
try {
|
||||
FixStackWithLabelNormalizationMethodTransformer().transform("fake", node)
|
||||
} catch (e: Throwable) {
|
||||
@@ -796,7 +796,7 @@ class MethodInliner(
|
||||
// TODO extract isLocalReturn / isNonLocalReturn, see processReturns
|
||||
val labelName = getMarkedReturnLabelOrNull(insnNode)
|
||||
if (labelName != null) {
|
||||
if (!labelOwner.isMyLabel(labelName)) continue
|
||||
if (!returnLabelOwner.isReturnFromMe(labelName)) continue
|
||||
insertBeforeInsn = insnNode.previous
|
||||
}
|
||||
|
||||
@@ -1143,7 +1143,7 @@ class MethodInliner(
|
||||
//process local and global returns (local substituted with goto end-label global kept unchanged)
|
||||
@JvmStatic
|
||||
fun processReturns(
|
||||
node: MethodNode, labelOwner: LabelOwner, remapReturn: Boolean, endLabel: Label?
|
||||
node: MethodNode, returnLabelOwner: ReturnLabelOwner, remapReturn: Boolean, endLabel: Label?
|
||||
): List<PointForExternalFinallyBlocks> {
|
||||
if (!remapReturn) {
|
||||
return emptyList()
|
||||
@@ -1157,7 +1157,7 @@ class MethodInliner(
|
||||
val labelName = getMarkedReturnLabelOrNull(insnNode)
|
||||
|
||||
if (labelName != null) {
|
||||
isLocalReturn = labelOwner.isMyLabel(labelName)
|
||||
isLocalReturn = returnLabelOwner.isReturnFromMe(labelName)
|
||||
//remove global return flag
|
||||
if (isLocalReturn) {
|
||||
instructions.remove(insnNode.previous)
|
||||
|
||||
@@ -24,7 +24,7 @@ open class ParameterInfo(
|
||||
val isSkipped: Boolean, //for skipped parameter: e.g. inlined lambda
|
||||
val index: Int,
|
||||
var remapValue: StackValue?, //in case when parameter could be extracted from outer context (e.g. from local var)
|
||||
val declarationIndex: Int = -1
|
||||
val declarationIndex: Int
|
||||
) {
|
||||
|
||||
var isCaptured: Boolean = false
|
||||
|
||||
+4
-4
@@ -18,12 +18,12 @@ package org.jetbrains.kotlin.codegen.inline;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface LabelOwner {
|
||||
boolean isMyLabel(@NotNull String name);
|
||||
public interface ReturnLabelOwner {
|
||||
boolean isReturnFromMe(@NotNull String labelName);
|
||||
|
||||
LabelOwner SKIP_ALL = name -> false;
|
||||
ReturnLabelOwner SKIP_ALL = name -> false;
|
||||
|
||||
LabelOwner NOT_APPLICABLE = name -> {
|
||||
ReturnLabelOwner NOT_APPLICABLE = name -> {
|
||||
throw new RuntimeException("This operation not applicable for current context");
|
||||
};
|
||||
}
|
||||
+1
-1
@@ -114,7 +114,7 @@ class IrExpressionLambdaImpl(
|
||||
override val isExtensionLambda: Boolean
|
||||
) : ExpressionLambda(typeMapper, isCrossInline), IrExpressionLambda {
|
||||
|
||||
override fun isMyLabel(name: String): Boolean {
|
||||
override fun isReturnFromMe(labelName: String): Boolean {
|
||||
//TODO("not implemented")
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user