in application/org.openjdk.jmc.joverflow/src/main/java/org/openjdk/jmc/joverflow/descriptors/TreeMapDescriptor.java [144:204]
private void scanEntry(JavaThing entryThing, JavaThing[] entryFields, MapIteratorCallback cb) {
if (entryThing == null || entryThing instanceof UnresolvedObject) {
return;
}
JavaObject entry = (JavaObject) entryThing;
if (!cb.scanImplementationObject(entry)) {
return;
}
entryFields = entry.getFields(entryFields);
JavaThing keyThing = entryFields[keyFieldIdx];
JavaThing valueThing = entryFields[valueFieldIdx];
JavaHeapObject key = null, value = null;
if (((Factory) factory).isJRockitVersion) {
JavaObjectArray keysArr = (keyThing != null && keyThing instanceof JavaObjectArray)
? (JavaObjectArray) keyThing : null;
JavaObjectArray valuesArr = (valueThing != null && valueThing instanceof JavaObjectArray)
? (JavaObjectArray) valueThing : null;
JavaHeapObject[] keys = EMPTY_OBJ_ARRAY;
if (keysArr != null) {
if (!cb.scanImplementationObject(keysArr)) {
return;
}
keys = keysArr.getElements();
}
JavaHeapObject[] values = EMPTY_OBJ_ARRAY;
if (valuesArr != null) {
if (!cb.scanImplementationObject(valuesArr)) {
return;
}
values = valuesArr.getElements();
}
int maxLen = (keys.length > values.length) ? keys.length : values.length;
for (int i = 0; i < maxLen; i++) {
key = (i < keys.length) ? keys[i] : null;
value = (i < values.length) ? values[i] : null;
if (!cb.scanMapEntry(key, value)) {
return;
}
}
} else {
if (keyThing != null && keyThing instanceof JavaHeapObject) {
key = (JavaHeapObject) keyThing;
}
if (valueThing != null && valueThing instanceof JavaHeapObject) {
value = (JavaHeapObject) valueThing;
}
if (!cb.scanMapEntry(key, value)) {
return;
}
}
JavaThing leftThing = entryFields[leftFieldIdx];
JavaThing rightThing = entryFields[rightFieldIdx];
scanEntry(leftThing, entryFields, cb);
scanEntry(rightThing, entryFields, cb);
}