From 7741dfe15bb36e6b56fa24de4145e25178a50b6c Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 14 Jun 2018 19:56:58 +0300 Subject: [PATCH] Fixed coroutines Duplication of descriptors caused by 8094cb7dc5506895466b4912a44e9e7f99a14902 --- .../org/jetbrains/kotlin/backend/konan/ir/Ir.kt | 12 ++++++++++-- .../backend/konan/lower/FunctionInlining.kt | 17 +++++------------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index 18538d27238..e0fe4cc3531 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt @@ -282,15 +282,23 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable): Sym val getContinuation = symbolTable.referenceSimpleFunction( context.getInternalFunctions("getContinuation").single()) - val intercepted = symbolTable.referenceSimpleFunction( + val konanIntercepted = symbolTable.referenceSimpleFunction( context.getInternalFunctions("intercepted").single()) - val suspendCoroutineUninterceptedOrReturn = symbolTable.referenceSimpleFunction( + val konanSuspendCoroutineUninterceptedOrReturn = symbolTable.referenceSimpleFunction( context.getInternalFunctions("suspendCoroutineUninterceptedOrReturn").single()) private val coroutinesPackage = context.builtIns.builtInsModule.getPackage( context.config.configuration.languageVersionSettings.coroutinesIntrinsicsPackageFqName()).memberScope + val intercepted = coroutinesPackage + .getContributedFunctions(INTERCEPTED_NAME, NoLookupLocation.FROM_BACKEND) + .single() + + val suspendCoroutineUninterceptedOrReturn = coroutinesPackage + .getContributedFunctions(SUSPEND_COROUTINE_UNINTERCEPTED_OR_RETURN_NAME, NoLookupLocation.FROM_BACKEND) + .single() + override val coroutineImpl = symbolTable.referenceClass(context.getInternalClass("CoroutineImpl")) override val coroutineSuspendedGetter = symbolTable.referenceSimpleFunction( diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index 4c1bbae493a..3693e4e757d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -26,27 +26,19 @@ import org.jetbrains.kotlin.backend.konan.descriptors.needsInlining import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor import org.jetbrains.kotlin.backend.konan.descriptors.resolveFakeOverride import org.jetbrains.kotlin.backend.konan.ir.DeserializerDriver -import org.jetbrains.kotlin.backend.konan.llvm.types import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.getDefault -import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl -import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -100,10 +92,11 @@ internal class FunctionInlining(val context: Context): IrElementTransformerVoidW private fun getFunctionDeclaration(descriptor: FunctionDescriptor): IrFunction? { val originalDescriptor = descriptor.resolveFakeOverride().original - if (originalDescriptor.isBuiltInIntercepted(languageVersionSettings)) - return getFunctionDeclaration(context.ir.symbols.intercepted.descriptor) - if (originalDescriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(languageVersionSettings)) - return getFunctionDeclaration(context.ir.symbols.suspendCoroutineUninterceptedOrReturn.descriptor) + if (originalDescriptor == context.ir.symbols.intercepted) + return getFunctionDeclaration(context.ir.symbols.konanIntercepted.descriptor) + if (originalDescriptor == context.ir.symbols.suspendCoroutineUninterceptedOrReturn) { + return getFunctionDeclaration(context.ir.symbols.konanSuspendCoroutineUninterceptedOrReturn.descriptor) + } val functionDeclaration = context.ir.originalModuleIndex.functions[originalDescriptor] ?: // If function is declared in the current module. deserializer.deserializeInlineBody(originalDescriptor) // Function is declared in another module.