Seq$RefTracker.smali
.class final Lgo/Seq$RefTracker;
.super Ljava/lang/Object;
.source "Seq.java"
# static fields
.field private static final REF_OFFSET:I = 0x2a
# instance fields
.field private final javaObjs:Lgo/Seq$RefMap;
.field private final javaRefs:Ljava/util/IdentityHashMap;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/IdentityHashMap",
"<",
"Ljava/lang/Object;",
"Ljava/lang/Integer;",
">;"
}
.end annotation
.end field
.field private next:I
# direct methods
.method constructor <init>()V
.registers 2
.prologue
.line 144
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 152
const/16 v0, 0x2a
iput v0, p0, Lgo/Seq$RefTracker;->next:I
.line 158
new-instance v0, Lgo/Seq$RefMap;
invoke-direct {v0}, Lgo/Seq$RefMap;-><init>()V
iput-object v0, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
.line 161
new-instance v0, Ljava/util/IdentityHashMap;
invoke-direct {v0}, Ljava/util/IdentityHashMap;-><init>()V
iput-object v0, p0, Lgo/Seq$RefTracker;->javaRefs:Ljava/util/IdentityHashMap;
return-void
.end method
# virtual methods
.method final declared-synchronized dec(I)V
.registers 5
.prologue
.line 203
monitor-enter p0
if-gtz p1, :cond_1b
.line 206
:try_start_3
# getter for: Lgo/Seq;->log:Ljava/util/logging/Logger;
invoke-static {}, Lgo/Seq;->access$000()Ljava/util/logging/Logger;
move-result-object v0
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "dec request for Go object "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/util/logging/Logger;->severe(Ljava/lang/String;)V
:try_end_19
.catchall {:try_start_3 .. :try_end_19} :catchall_3e
.line 222
:cond_19
:goto_19
monitor-exit p0
return-void
.line 209
:cond_1b
:try_start_1b
sget-object v0, Lgo/Seq;->nullRef:Lgo/Seq$Ref;
iget v0, v0, Lgo/Seq$Ref;->refnum:I
if-eq p1, v0, :cond_19
.line 213
iget-object v0, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
invoke-virtual {v0, p1}, Lgo/Seq$RefMap;->get(I)Lgo/Seq$Ref;
move-result-object v0
.line 214
if-nez v0, :cond_41
.line 215
new-instance v0, Ljava/lang/RuntimeException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "referenced Java object is not found: refnum="
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_3e
.catchall {:try_start_1b .. :try_end_3e} :catchall_3e
.line 203
:catchall_3e
move-exception v0
monitor-exit p0
throw v0
.line 217
:cond_41
:try_start_41
# operator-- for: Lgo/Seq$Ref;->refcnt:I
invoke-static {v0}, Lgo/Seq$Ref;->access$110(Lgo/Seq$Ref;)I
.line 218
# getter for: Lgo/Seq$Ref;->refcnt:I
invoke-static {v0}, Lgo/Seq$Ref;->access$100(Lgo/Seq$Ref;)I
move-result v1
if-gtz v1, :cond_19
.line 219
iget-object v1, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
invoke-virtual {v1, p1}, Lgo/Seq$RefMap;->remove(I)V
.line 220
iget-object v1, p0, Lgo/Seq$RefTracker;->javaRefs:Ljava/util/IdentityHashMap;
iget-object v0, v0, Lgo/Seq$Ref;->obj:Ljava/lang/Object;
invoke-virtual {v1, v0}, Ljava/util/IdentityHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
:try_end_56
.catchall {:try_start_41 .. :try_end_56} :catchall_3e
goto :goto_19
.end method
.method final declared-synchronized get(I)Lgo/Seq$Ref;
.registers 5
.prologue
.line 235
monitor-enter p0
const/16 v0, 0x29
if-ne p1, v0, :cond_9
.line 236
:try_start_5
sget-object v0, Lgo/Seq;->nullRef:Lgo/Seq$Ref;
:try_end_7
.catchall {:try_start_5 .. :try_end_7} :catchall_28
.line 245
:cond_7
:goto_7
monitor-exit p0
return-object v0
.line 237
:cond_9
if-lez p1, :cond_2b
.line 238
:try_start_b
iget-object v0, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
invoke-virtual {v0, p1}, Lgo/Seq$RefMap;->get(I)Lgo/Seq$Ref;
move-result-object v0
.line 239
if-nez v0, :cond_7
.line 240
new-instance v0, Ljava/lang/RuntimeException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "unknown java Ref: "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_28
.catchall {:try_start_b .. :try_end_28} :catchall_28
.line 235
:catchall_28
move-exception v0
monitor-exit p0
throw v0
.line 245
:cond_2b
:try_start_2b
new-instance v0, Lgo/Seq$Ref;
const/4 v1, 0x0
invoke-direct {v0, p1, v1}, Lgo/Seq$Ref;-><init>(ILjava/lang/Object;)V
:try_end_31
.catchall {:try_start_2b .. :try_end_31} :catchall_28
goto :goto_7
.end method
.method final declared-synchronized inc(Ljava/lang/Object;)I
.registers 5
.prologue
.line 166
monitor-enter p0
if-nez p1, :cond_7
.line 167
const/16 v0, 0x29
.line 187
:goto_5
monitor-exit p0
return v0
.line 169
:cond_7
:try_start_7
instance-of v0, p1, Lgo/Seq$Proxy;
if-eqz v0, :cond_12
.line 170
check-cast p1, Lgo/Seq$Proxy;
invoke-interface {p1}, Lgo/Seq$Proxy;->incRefnum()I
move-result v0
goto :goto_5
.line 172
:cond_12
iget-object v0, p0, Lgo/Seq$RefTracker;->javaRefs:Ljava/util/IdentityHashMap;
invoke-virtual {v0, p1}, Ljava/util/IdentityHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/Integer;
.line 173
if-nez v0, :cond_4a
.line 174
iget v0, p0, Lgo/Seq$RefTracker;->next:I
const v1, 0x7fffffff
if-ne v0, v1, :cond_3b
.line 175
new-instance v0, Ljava/lang/RuntimeException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "createRef overflow for "
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_38
.catchall {:try_start_7 .. :try_end_38} :catchall_38
.line 166
:catchall_38
move-exception v0
monitor-exit p0
throw v0
.line 177
:cond_3b
:try_start_3b
iget v0, p0, Lgo/Seq$RefTracker;->next:I
add-int/lit8 v1, v0, 0x1
iput v1, p0, Lgo/Seq$RefTracker;->next:I
invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v0
.line 178
iget-object v1, p0, Lgo/Seq$RefTracker;->javaRefs:Ljava/util/IdentityHashMap;
invoke-virtual {v1, p1, v0}, Ljava/util/IdentityHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
.line 180
:cond_4a
invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
move-result v0
.line 181
iget-object v1, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
invoke-virtual {v1, v0}, Lgo/Seq$RefMap;->get(I)Lgo/Seq$Ref;
move-result-object v1
.line 182
if-nez v1, :cond_60
.line 183
new-instance v1, Lgo/Seq$Ref;
invoke-direct {v1, v0, p1}, Lgo/Seq$Ref;-><init>(ILjava/lang/Object;)V
.line 184
iget-object v2, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
invoke-virtual {v2, v0, v1}, Lgo/Seq$RefMap;->put(ILgo/Seq$Ref;)V
.line 186
:cond_60
invoke-virtual {v1}, Lgo/Seq$Ref;->inc()V
:try_end_63
.catchall {:try_start_3b .. :try_end_63} :catchall_38
goto :goto_5
.end method
.method final declared-synchronized incRefnum(I)V
.registers 5
.prologue
.line 191
monitor-enter p0
:try_start_1
iget-object v0, p0, Lgo/Seq$RefTracker;->javaObjs:Lgo/Seq$RefMap;
invoke-virtual {v0, p1}, Lgo/Seq$RefMap;->get(I)Lgo/Seq$Ref;
move-result-object v0
.line 192
if-nez v0, :cond_21
.line 193
new-instance v0, Ljava/lang/RuntimeException;
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "referenced Java object is not found: refnum="
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
throw v0
:try_end_1e
.catchall {:try_start_1 .. :try_end_1e} :catchall_1e
.line 191
:catchall_1e
move-exception v0
monitor-exit p0
throw v0
.line 195
:cond_21
:try_start_21
invoke-virtual {v0}, Lgo/Seq$Ref;->inc()V
:try_end_24
.catchall {:try_start_21 .. :try_end_24} :catchall_1e
.line 196
monitor-exit p0
return-void
.end method