Remove fix for tail-placed branch operations in suspend functions
It has been introduced in2286027bedand should've help to avoid verify error Now it became both impossible and unnecessary: - It's impossible now since we can't determine in codegen if we'll needa state machine (it depends from inline functions' contents) - It's unnecessary since we'll introduce the state machines for cases described in the2286027bedtests NB: There's still a problem that now we work a bit suboptimally because actually these samples can be generated without state machines
This commit is contained in:
@@ -428,16 +428,6 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
return typeMapper.mapType(type);
|
return typeMapper.mapType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private Type expressionTypeForBranchingOperation(@Nullable KtExpression expression) {
|
|
||||||
if (context.getFunctionDescriptor().isSuspend() &&
|
|
||||||
!CoroutineCodegenUtilKt.isStateMachineNeeded(context.getFunctionDescriptor(), bindingContext) &&
|
|
||||||
Boolean.TRUE.equals(bindingContext.get(IS_TAIL_EXPRESSION_IN_SUSPEND_FUNCTION, expression))) {
|
|
||||||
return AsmTypes.OBJECT_TYPE;
|
|
||||||
}
|
|
||||||
return expressionType(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Type expressionType(@Nullable KtExpression expression) {
|
public Type expressionType(@Nullable KtExpression expression) {
|
||||||
return CodegenUtilKt.asmType(expression, typeMapper, bindingContext);
|
return CodegenUtilKt.asmType(expression, typeMapper, bindingContext);
|
||||||
@@ -478,7 +468,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* package */ StackValue generateIfExpression(@NotNull KtIfExpression expression, boolean isStatement) {
|
/* package */ StackValue generateIfExpression(@NotNull KtIfExpression expression, boolean isStatement) {
|
||||||
Type asmType = isStatement ? Type.VOID_TYPE : expressionTypeForBranchingOperation(expression);
|
Type asmType = isStatement ? Type.VOID_TYPE : expressionType(expression);
|
||||||
StackValue condition = gen(expression.getCondition());
|
StackValue condition = gen(expression.getCondition());
|
||||||
|
|
||||||
KtExpression thenExpression = expression.getThen();
|
KtExpression thenExpression = expression.getThen();
|
||||||
@@ -3767,7 +3757,7 @@ The "returned" value of try expression with no finally is either the last expres
|
|||||||
(or blocks).
|
(or blocks).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Type expectedAsmType = isStatement ? Type.VOID_TYPE : expressionTypeForBranchingOperation(expression);
|
Type expectedAsmType = isStatement ? Type.VOID_TYPE : expressionType(expression);
|
||||||
|
|
||||||
return StackValue.operation(expectedAsmType, v -> {
|
return StackValue.operation(expectedAsmType, v -> {
|
||||||
KtFinallySection finallyBlock = expression.getFinallyBlock();
|
KtFinallySection finallyBlock = expression.getFinallyBlock();
|
||||||
@@ -4034,7 +4024,7 @@ The "returned" value of try expression with no finally is either the last expres
|
|||||||
KtExpression expr = expression.getSubjectExpression();
|
KtExpression expr = expression.getSubjectExpression();
|
||||||
Type subjectType = expressionType(expr);
|
Type subjectType = expressionType(expr);
|
||||||
|
|
||||||
Type resultType = isStatement ? Type.VOID_TYPE : expressionTypeForBranchingOperation(expression);
|
Type resultType = isStatement ? Type.VOID_TYPE : expressionType(expression);
|
||||||
|
|
||||||
return StackValue.operation(resultType, v -> {
|
return StackValue.operation(resultType, v -> {
|
||||||
SwitchCodegen switchCodegen = SwitchCodegenUtil.buildAppropriateSwitchCodegenIfPossible(
|
SwitchCodegen switchCodegen = SwitchCodegenUtil.buildAppropriateSwitchCodegenIfPossible(
|
||||||
|
|||||||
@@ -60,7 +60,6 @@ import org.jetbrains.kotlin.types.TypeUtils.*
|
|||||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
||||||
import org.jetbrains.kotlin.types.isFlexible
|
import org.jetbrains.kotlin.types.isFlexible
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class ControlFlowInformationProvider private constructor(
|
class ControlFlowInformationProvider private constructor(
|
||||||
@@ -879,23 +878,6 @@ class ControlFlowInformationProvider private constructor(
|
|||||||
if (containsNonTailCalls) {
|
if (containsNonTailCalls) {
|
||||||
trace.record(BindingContext.CONTAINS_NON_TAIL_SUSPEND_CALLS, currentFunction.original)
|
trace.record(BindingContext.CONTAINS_NON_TAIL_SUSPEND_CALLS, currentFunction.original)
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
val tailInstructionDetector = TailInstructionDetector(subroutine)
|
|
||||||
traverseFollowingInstructions(
|
|
||||||
pseudocode.sinkInstruction,
|
|
||||||
order = TraversalOrder.BACKWARD
|
|
||||||
) { instruction ->
|
|
||||||
|
|
||||||
instruction.safeAs<KtElementInstruction>()?.element?.safeAs<KtExpression>()?.let { expression ->
|
|
||||||
trace.record(BindingContext.IS_TAIL_EXPRESSION_IN_SUSPEND_FUNCTION, expression)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (instruction.accept(tailInstructionDetector))
|
|
||||||
TraverseInstructionResult.CONTINUE
|
|
||||||
else
|
|
||||||
TraverseInstructionResult.SKIP
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun markAndCheckRecursiveTailCalls(subroutineDescriptor: FunctionDescriptor) {
|
private fun markAndCheckRecursiveTailCalls(subroutineDescriptor: FunctionDescriptor) {
|
||||||
|
|||||||
@@ -135,7 +135,6 @@ public interface BindingContext {
|
|||||||
|
|
||||||
WritableSlice<Call, FunctionDescriptor> ENCLOSING_SUSPEND_FUNCTION_FOR_SUSPEND_FUNCTION_CALL = Slices.createSimpleSlice();
|
WritableSlice<Call, FunctionDescriptor> ENCLOSING_SUSPEND_FUNCTION_FOR_SUSPEND_FUNCTION_CALL = Slices.createSimpleSlice();
|
||||||
WritableSlice<FunctionDescriptor, Boolean> CONTAINS_NON_TAIL_SUSPEND_CALLS = Slices.createSimpleSetSlice();
|
WritableSlice<FunctionDescriptor, Boolean> CONTAINS_NON_TAIL_SUSPEND_CALLS = Slices.createSimpleSetSlice();
|
||||||
WritableSlice<KtExpression, Boolean> IS_TAIL_EXPRESSION_IN_SUSPEND_FUNCTION = Slices.createSimpleSetSlice();
|
|
||||||
|
|
||||||
WritableSlice<VariableAccessorDescriptor, ResolvedCall<FunctionDescriptor>> DELEGATED_PROPERTY_RESOLVED_CALL = Slices.createSimpleSlice();
|
WritableSlice<VariableAccessorDescriptor, ResolvedCall<FunctionDescriptor>> DELEGATED_PROPERTY_RESOLVED_CALL = Slices.createSimpleSlice();
|
||||||
WritableSlice<VariableAccessorDescriptor, Call> DELEGATED_PROPERTY_CALL = Slices.createSimpleSlice();
|
WritableSlice<VariableAccessorDescriptor, Call> DELEGATED_PROPERTY_CALL = Slices.createSimpleSlice();
|
||||||
|
|||||||
Reference in New Issue
Block a user