in src/main/java/com/jetbrains/jdi/VirtualMachineImpl.java [1475:1545]
ObjectReferenceImpl objectMirror(long id, int tag) {
synchronized (state) {
// Handle any queue elements that are not strongly reachable
processQueue();
if (id == 0) {
return null;
}
ObjectReferenceImpl object = null;
Long key = id;
/*
* Attempt to retrieve an existing object reference
*/
SoftObjectReference ref = objectsByID.get(key);
if (ref != null) {
object = ref.object();
}
/*
* If the object wasn't in the table, or it's soft reference was
* cleared, create a new instance.
*/
if (object == null) {
switch (tag) {
case JDWP.Tag.OBJECT:
object = new ObjectReferenceImpl(vm, id);
break;
case JDWP.Tag.STRING:
object = new StringReferenceImpl(vm, id);
break;
case JDWP.Tag.ARRAY:
object = new ArrayReferenceImpl(vm, id);
break;
case JDWP.Tag.THREAD:
ThreadReferenceImpl thread =
new ThreadReferenceImpl(vm, id);
thread.addListener(this);
object = thread;
break;
case JDWP.Tag.THREAD_GROUP:
object = new ThreadGroupReferenceImpl(vm, id);
break;
case JDWP.Tag.CLASS_LOADER:
object = new ClassLoaderReferenceImpl(vm, id);
break;
case JDWP.Tag.CLASS_OBJECT:
object = new ClassObjectReferenceImpl(vm, id);
break;
default:
throw new IllegalArgumentException("Invalid object tag: " + tag);
}
ref = new SoftObjectReference(key, object, referenceQueue);
/*
* If there was no previous entry in the table, we add one here
* If the previous entry was cleared, we replace it here.
*/
objectsByID.put(key, ref);
if ((traceFlags & TRACE_OBJREFS) != 0) {
printTrace("Creating new " +
object.getClass().getName() + " (id = " + id + ")");
}
} else {
ref.incrementCount();
}
return object;
}
}