in src/com/facebook/buck/json/BuildFileToJsonParser.java [118:160]
static Object toRawTypes(JsonElement json) {
// Cases are ordered from most common to least common.
if (json.isJsonPrimitive()) {
JsonPrimitive primitive = json.getAsJsonPrimitive();
if (primitive.isString()) {
// On a large project, without invoking intern(), we have seen `buck targets` OOM. When this
// happened, according to the .hprof file generated using -XX:+HeapDumpOnOutOfMemoryError,
// 39.6% of the memory was spent on char[] objects while 14.5% was spent on Strings.
// (Another 10.5% was spent on java.util.HashMap$Entry.) Introducing intern() stopped the
// OOM from happening.
return primitive.getAsString().intern();
} else if (primitive.isBoolean()) {
return primitive.getAsBoolean();
} else if (primitive.isNumber()) {
Number number = primitive.getAsNumber();
// Number is likely an instance of class com.google.gson.internal.LazilyParsedNumber.
if (number.longValue() == number.doubleValue()) {
return number.longValue();
} else {
return number;
}
} else {
throw new IllegalStateException("Unknown primitive type: " + primitive);
}
} else if (json.isJsonArray()) {
JsonArray array = json.getAsJsonArray();
List<Object> out = Lists.newArrayListWithCapacity(array.size());
for (JsonElement item : array) {
out.add(toRawTypes(item));
}
return out;
} else if (json.isJsonObject()) {
Map<String, Object> out = Maps.newHashMap();
for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
out.put(entry.getKey(), toRawTypes(entry.getValue()));
}
return out;
} else if (json.isJsonNull()) {
return null;
} else {
throw new IllegalStateException("Unknown type: " + json);
}
}