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