.class public final Lkotlinx/coroutines/UndispatchedCoroutine; .super Lkotlinx/coroutines/internal/ScopeCoroutine; .source "SourceFile" # instance fields .field private volatile threadLocalIsSet:Z .field public final threadStateToRecover:Ljava/lang/ThreadLocal; # direct methods .method public constructor (Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V .locals 2 .line 168 sget-object v0, Lkotlinx/coroutines/UndispatchedMarker;->INSTANCE:Lkotlinx/coroutines/UndispatchedMarker; invoke-interface {p1, v0}, Lkotlin/coroutines/CoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; move-result-object v1 if-nez v1, :cond_0 invoke-interface {p1, v0}, Lkotlin/coroutines/CoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; move-result-object v0 goto :goto_0 :cond_0 move-object v0, p1 :goto_0 invoke-direct {p0, v0, p2}, Lkotlinx/coroutines/internal/ScopeCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V .line 201 new-instance v0, Ljava/lang/ThreadLocal; invoke-direct {v0}, Ljava/lang/ThreadLocal;->()V iput-object v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadStateToRecover:Ljava/lang/ThreadLocal; .line 236 invoke-interface {p2}, Lkotlin/coroutines/Continuation;->getContext()Lkotlin/coroutines/CoroutineContext; move-result-object p2 sget-object v0, Lkotlin/coroutines/ContinuationInterceptor;->Key:Lkotlin/coroutines/ContinuationInterceptor$Key; invoke-interface {p2, v0}, Lkotlin/coroutines/CoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; move-result-object p2 instance-of p2, p2, Lkotlinx/coroutines/CoroutineDispatcher; if-nez p2, :cond_1 const/4 p2, 0x0 .line 243 invoke-static {p1, p2}, Lkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; move-result-object p2 .line 244 invoke-static {p1, p2}, Lkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V .line 245 invoke-virtual {p0, p1, p2}, Lkotlinx/coroutines/UndispatchedCoroutine;->saveThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V :cond_1 return-void .end method # virtual methods .method public afterResume(Ljava/lang/Object;)V .locals 5 iget-boolean v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadLocalIsSet:Z if-eqz v0, :cond_1 iget-object v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadStateToRecover:Ljava/lang/ThreadLocal; .line 262 invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object; move-result-object v0 check-cast v0, Lkotlin/Pair; if-eqz v0, :cond_0 invoke-virtual {v0}, Lkotlin/Pair;->component1()Ljava/lang/Object; move-result-object v1 check-cast v1, Lkotlin/coroutines/CoroutineContext; invoke-virtual {v0}, Lkotlin/Pair;->component2()Ljava/lang/Object; move-result-object v0 .line 263 invoke-static {v1, v0}, Lkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V :cond_0 iget-object v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadStateToRecover:Ljava/lang/ThreadLocal; .line 265 invoke-virtual {v0}, Ljava/lang/ThreadLocal;->remove()V :cond_1 iget-object v0, p0, Lkotlinx/coroutines/internal/ScopeCoroutine;->uCont:Lkotlin/coroutines/Continuation; .line 268 invoke-static {p1, v0}, Lkotlinx/coroutines/CompletionStateKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; move-result-object p1 iget-object v0, p0, Lkotlinx/coroutines/internal/ScopeCoroutine;->uCont:Lkotlin/coroutines/Continuation; .line 107 invoke-interface {v0}, Lkotlin/coroutines/Continuation;->getContext()Lkotlin/coroutines/CoroutineContext; move-result-object v1 const/4 v2, 0x0 .line 108 invoke-static {v1, v2}, Lkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; move-result-object v3 .line 109 sget-object v4, Lkotlinx/coroutines/internal/ThreadContextKt;->NO_THREAD_ELEMENTS:Lkotlinx/coroutines/internal/Symbol; if-eq v3, v4, :cond_2 .line 111 invoke-static {v0, v1, v3}, Lkotlinx/coroutines/CoroutineContextKt;->updateUndispatchedCompletion(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Lkotlinx/coroutines/UndispatchedCoroutine; move-result-object v2 :cond_2 :try_start_0 iget-object v0, p0, Lkotlinx/coroutines/internal/ScopeCoroutine;->uCont:Lkotlin/coroutines/Continuation; .line 270 invoke-interface {v0, p1}, Lkotlin/coroutines/Continuation;->resumeWith(Ljava/lang/Object;)V .line 271 sget-object p1, Lkotlin/Unit;->INSTANCE:Lkotlin/Unit; :try_end_0 .catchall {:try_start_0 .. :try_end_0} :catchall_0 if-eqz v2, :cond_3 .line 118 invoke-virtual {v2}, Lkotlinx/coroutines/UndispatchedCoroutine;->clearThreadContext()Z move-result p1 if-eqz p1, :cond_4 .line 119 :cond_3 invoke-static {v1, v3}, Lkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V :cond_4 return-void :catchall_0 move-exception p1 if-eqz v2, :cond_5 .line 118 invoke-virtual {v2}, Lkotlinx/coroutines/UndispatchedCoroutine;->clearThreadContext()Z move-result v0 if-eqz v0, :cond_6 .line 119 :cond_5 invoke-static {v1, v3}, Lkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V :cond_6 throw p1 .end method .method public final clearThreadContext()Z .locals 3 iget-boolean v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadLocalIsSet:Z const/4 v1, 0x1 if-eqz v0, :cond_0 iget-object v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadStateToRecover:Ljava/lang/ThreadLocal; .line 255 invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object; move-result-object v0 if-nez v0, :cond_0 move v0, v1 goto :goto_0 :cond_0 const/4 v0, 0x0 :goto_0 iget-object v2, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadStateToRecover:Ljava/lang/ThreadLocal; .line 256 invoke-virtual {v2}, Ljava/lang/ThreadLocal;->remove()V xor-int/2addr v0, v1 return v0 .end method .method public final saveThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V .locals 1 const/4 v0, 0x1 iput-boolean v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadLocalIsSet:Z iget-object v0, p0, Lkotlinx/coroutines/UndispatchedCoroutine;->threadStateToRecover:Ljava/lang/ThreadLocal; .line 251 invoke-static {p1, p2}, Lkotlin/TuplesKt;->to(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair; move-result-object p1 invoke-virtual {v0, p1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V return-void .end method