Kotlin / kotlinx-atomicfu

The idiomatic way to use atomic operations in Kotlin
Other
884 stars 57 forks source link

java.lang.IllegalStateException: Symbol with IrClassSymbolImpl is unbound #250

Open danny-su opened 1 year ago

danny-su commented 1 year ago

Kotlin 1.7.20

java.lang.IllegalStateException: Symbol with IrClassSymbolImpl is unbound at org.jetbrains.kotlin.ir.symbols.impl.IrBindableSymbolBase.getOwner(IrPrivateSymbolBase.kt:59) at org.jetbrains.kotlin.ir.types.IrTypesKt.getClassFqName(irTypes.kt:103) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer.isAtomicValueType(AtomicfuJvmIrTransformer.kt:847) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer.access$isAtomicValueType(AtomicfuJvmIrTransformer.kt:43) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitCall(AtomicfuJvmIrTransformer.kt:482) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitCall(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.expressions.IrCall.accept(IrCall.kt:25) at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:28) at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:21) at org.jetbrains.kotlin.ir.util.TransformKt.transformInPlace(transform.kt:35) at org.jetbrains.kotlin.ir.expressions.IrVararg.transformChildren(IrVararg.kt:33) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitExpression(IrElementTransformer.kt:173) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitExpression(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitExpression(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitVararg(IrElementTransformer.kt:345) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitVararg(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitVararg(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.expressions.IrVararg.accept(IrVararg.kt:26) at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:28) at org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression.transformChildren(IrMemberAccessExpression.kt:82) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitExpression(IrElementTransformer.kt:173) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitExpression(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitExpression(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitDeclarationReference(IrElementTransformer.kt:188) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclarationReference(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclarationReference(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitMemberAccess(IrElementTransformer.kt:191) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitMemberAccess(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitMemberAccess(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitFunctionAccess(IrElementTransformer.kt:194) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitFunctionAccess(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitFunctionAccess(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitCall(IrElementTransformer.kt:229) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitCall(AtomicfuJvmIrTransformer.kt:591) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitCall(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.expressions.IrCall.accept(IrCall.kt:25) at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:28) at org.jetbrains.kotlin.ir.expressions.IrReturn.transformChildren(IrReturn.kt:32) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitExpression(IrElementTransformer.kt:173) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitExpression(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitExpression(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitReturn(IrElementTransformer.kt:311) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitReturn(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitReturn(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.expressions.IrReturn.accept(IrReturn.kt:25) at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:28) at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:21) at org.jetbrains.kotlin.ir.util.TransformKt.transformInPlace(transform.kt:35) at org.jetbrains.kotlin.ir.expressions.IrBlockBody.transformChildren(IrBlockBody.kt:31) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitBody(IrElementTransformer.kt:178) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitBody(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitBody(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitBlockBody(IrElementTransformer.kt:185) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitBlockBody(AtomicfuJvmIrTransformer.kt:636) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitBlockBody(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.expressions.IrBlockBody.accept(IrBlockBody.kt:24) at org.jetbrains.kotlin.ir.expressions.IrBody.transform(IrBody.kt:21) at org.jetbrains.kotlin.ir.declarations.IrFunction.transformChildren(IrFunction.kt:61) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitDeclaration(IrElementTransformer.kt:103) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclaration(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclaration(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitFunction(IrElementTransformer.kt:120) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitFunction(AtomicfuJvmIrTransformer.kt:475) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitFunction(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitSimpleFunction(IrElementTransformer.kt:150) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitSimpleFunction(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitSimpleFunction(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.declarations.IrSimpleFunction.accept(IrSimpleFunction.kt:36) at org.jetbrains.kotlin.ir.IrElementBase.transform(IrElementBase.kt:24) at org.jetbrains.kotlin.ir.util.TransformKt.transformInPlace(transform.kt:35) at org.jetbrains.kotlin.ir.declarations.IrClass.transformChildren(IrClass.kt:74) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitDeclaration(IrElementTransformer.kt:103) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclaration(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclaration(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitClass(IrElementTransformer.kt:110) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitClass(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitClass(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:64) at org.jetbrains.kotlin.ir.IrElementBase.transform(IrElementBase.kt:24) at org.jetbrains.kotlin.ir.util.TransformKt.transformInPlace(transform.kt:35) at org.jetbrains.kotlin.ir.declarations.IrClass.transformChildren(IrClass.kt:74) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitDeclaration(IrElementTransformer.kt:103) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclaration(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitDeclaration(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitClass(IrElementTransformer.kt:110) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitClass(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitClass(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:64) at org.jetbrains.kotlin.ir.IrElementBase.transform(IrElementBase.kt:24) at org.jetbrains.kotlin.ir.util.TransformKt.transformInPlace(transform.kt:35) at org.jetbrains.kotlin.ir.declarations.IrFile.transformChildren(IrFile.kt:40) at org.jetbrains.kotlin.ir.visitors.IrElementTransformer$DefaultImpls.visitFile(IrElementTransformer.kt:168) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitFile(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer$AtomicfuTransformer.visitFile(AtomicfuJvmIrTransformer.kt:473) at org.jetbrains.kotlin.ir.declarations.IrFile.accept(IrFile.kt:30) at org.jetbrains.kotlin.ir.declarations.IrFile.transform(IrFile.kt:33) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer.transformAtomicfuDeclarations(AtomicfuJvmIrTransformer.kt:83) at org.jetbrains.kotlinx.atomicfu.compiler.backend.jvm.AtomicfuJvmIrTransformer.transform(AtomicfuJvmIrTransformer.kt:63) at org.jetbrains.kotlinx.atomicfu.compiler.extensions.AtomicfuLoweringExtension.generate(AtomicfuLoweringExtension.kt:32) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr$lambda$1(JvmIrCodegenFactory.kt:183) at org.jetbrains.kotlin.psi2ir.Psi2IrTranslator.generateModuleFragment(Psi2IrTranslator.kt:99) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr(JvmIrCodegenFactory.kt:215) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr(JvmIrCodegenFactory.kt:53) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.convertToIr(KotlinToJVMBytecodeCompiler.kt:230) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:113) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:58) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:158) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:99) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:47) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:475) at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:125) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:373) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally$default(IncrementalCompilerRunner.kt:318) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.rebuild(IncrementalCompilerRunner.kt:114) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:207) at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:79) at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:625) at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:101) at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1746) at jdk.internal.reflect.GeneratedMethodAccessor108.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)

mvicsokolova commented 1 year ago

Hi! Could you please provide a piece of code where you use atomics, that reproduces this issue?

Nek-12 commented 1 year ago

I have the same issue, will provide you with code instead:

    private var token = atomic<String?>(null)

    suspend fun <T> withToken(block: suspend (token: String) -> ApiResult<T>) =
        if (token.value == null) {
            tryWithRefresh(block) 
        } else {
            block(requireNotNull(token.value)) //suspend inline
                .onError { return tryWithRefresh(block) } //inline
        }

  private suspend fun <T> tryWithRefresh(block: suspend (token: String) -> ApiResult<T>) =
        refreshToken() // suspend
            .onSuccess { token.update { it } } // inline
            .then { block(it) } // nested inlining inside
            .onError { token.update { null } } //inline

Another usage (unclear which one causes the crash):

class SuspendLazy<T>(
    private val block: suspend CoroutineScope.() -> T,
) {
    private val value = atomic<Deferred<T>?>(null)

    suspend operator fun invoke(): T = (
            value.value
                ?: coroutineScope {
                    value.updateAndGet { actual ->
                        actual ?: async { block() }
                    }!!
                }
            ).await()
}
mvicsokolova commented 1 year ago

Hi! Thanks a lot for the reproducer! I'll have a look at it.

Nek-12 commented 1 year ago

Hello, any updates? Still keeping JvmIrTransformation to false because of this

mvicsokolova commented 4 months ago

Hi! A lot of updates were introduced in JVM IR compiler plugin since Kotlin 1.9.0. Can you confirm if this issue still occurs? đź‘€

Nek-12 commented 4 months ago

Nope! Already using IR transformation