use of com.squareup.haha.perflib.ArrayInstance in project leakcanary by square.
the class HahaHelperTest method createCharArrayValueInstance_M_Preview2.
private void createCharArrayValueInstance_M_Preview2() {
ArrayInstance valueInstance = new ArrayInstance(0, null, Type.CHAR, VALUE_ARRAY_LENGTH, 0);
snapshot.addInstance(STRING_INSTANCE_ID + 16, valueInstance);
}
use of com.squareup.haha.perflib.ArrayInstance in project leakcanary by square.
the class HahaHelper method asString.
static String asString(Object stringObject) {
Instance instance = (Instance) stringObject;
List<ClassInstance.FieldValue> values = classInstanceValues(instance);
Integer count = fieldValue(values, "count");
Object value = fieldValue(values, "value");
Integer offset;
ArrayInstance charArray;
if (isCharArray(value)) {
charArray = (ArrayInstance) value;
offset = 0;
// https://android-review.googlesource.com/#/c/83611/
if (hasField(values, "offset")) {
offset = fieldValue(values, "offset");
}
} else {
// In M preview 2, the underlying char buffer resides in the heap with ID equaling the
// String's ID + 16.
// https://android-review.googlesource.com/#/c/160380/2/android/src/com/android/tools/idea/
// editors/hprof/descriptors/InstanceFieldDescriptorImpl.java
// This workaround is only needed for M preview 2, as it has been fixed on the hprof
// generation end by reintroducing a virtual "value" variable.
// https://android.googlesource.com/platform/art/+/master/runtime/hprof/hprof.cc#1242
Heap heap = instance.getHeap();
Instance inlineInstance = heap.getInstance(instance.getId() + 16);
if (isCharArray(inlineInstance)) {
charArray = (ArrayInstance) inlineInstance;
offset = 0;
} else {
throw new UnsupportedOperationException("Could not find char array in " + instance);
}
}
checkNotNull(count, "count");
checkNotNull(charArray, "charArray");
checkNotNull(offset, "offset");
if (count == 0) {
return "";
}
char[] chars = charArray.asCharArray(offset, count);
return new String(chars);
}
use of com.squareup.haha.perflib.ArrayInstance in project leakcanary by square.
the class HeapAnalyzer method describeFields.
private List<String> describeFields(Instance instance) {
List<String> fields = new ArrayList<>();
if (instance instanceof ClassObj) {
ClassObj classObj = (ClassObj) instance;
for (Map.Entry<Field, Object> entry : classObj.getStaticFieldValues().entrySet()) {
Field field = entry.getKey();
Object value = entry.getValue();
fields.add("static " + field.getName() + " = " + value);
}
} else if (instance instanceof ArrayInstance) {
ArrayInstance arrayInstance = (ArrayInstance) instance;
if (arrayInstance.getArrayType() == Type.OBJECT) {
Object[] values = arrayInstance.getValues();
for (int i = 0; i < values.length; i++) {
fields.add("[" + i + "] = " + values[i]);
}
}
} else {
ClassObj classObj = instance.getClassObj();
for (Map.Entry<Field, Object> entry : classObj.getStaticFieldValues().entrySet()) {
fields.add("static " + fieldToString(entry));
}
ClassInstance classInstance = (ClassInstance) instance;
for (ClassInstance.FieldValue field : classInstance.getValues()) {
fields.add(fieldToString(field));
}
}
return fields;
}
Aggregations