aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/GroupedList.java29
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/BuildingState.java4
2 files changed, 25 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/util/GroupedList.java b/src/main/java/com/google/devtools/build/lib/util/GroupedList.java
index 43f6ff2cc6..a6642fe7ba 100644
--- a/src/main/java/com/google/devtools/build/lib/util/GroupedList.java
+++ b/src/main/java/com/google/devtools/build/lib/util/GroupedList.java
@@ -85,12 +85,27 @@ public class GroupedList<T> implements Iterable<Iterable<T>>, Serializable {
return elements.isEmpty();
}
- private static final Object EMPTY_LIST = new Serializable() {};
+ private static final class EmptyList implements Serializable {
+ private static final EmptyList INSTANCE = new EmptyList();
+
+ private EmptyList() {
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof EmptyList;
+ }
+
+ @Override
+ public int hashCode() {
+ return 42;
+ }
+ }
public Object compress() {
switch (size()) {
case 0:
- return EMPTY_LIST;
+ return EmptyList.INSTANCE;
case 1:
return Iterables.getOnlyElement(elements);
default:
@@ -116,7 +131,7 @@ public class GroupedList<T> implements Iterable<Iterable<T>>, Serializable {
}
public static <E> GroupedList<E> create(Object compressed) {
- if (compressed == EMPTY_LIST) {
+ if (compressed.equals(EmptyList.INSTANCE)) {
return new GroupedList<>();
}
if (compressed.getClass().isArray()) {
@@ -158,18 +173,18 @@ public class GroupedList<T> implements Iterable<Iterable<T>>, Serializable {
* iterator is needed here because, to optimize memory, we store single-element lists as elements
* internally, and so they must be wrapped before they're returned.
*/
- private class GroupedIterator implements Iterator<Iterable<T>> {
- private final Iterator<Object> iter = elements.iterator();
+ private class GroupedIterator implements Iterator<Iterable<T>>, Serializable {
+ private int pos = 0;
@Override
public boolean hasNext() {
- return iter.hasNext();
+ return pos < elements.size();
}
@SuppressWarnings("unchecked") // Cast of Object to List<T> or T.
@Override
public Iterable<T> next() {
- Object obj = iter.next();
+ Object obj = elements.get(pos++);
if (obj instanceof List) {
return (List<T>) obj;
}
diff --git a/src/main/java/com/google/devtools/build/skyframe/BuildingState.java b/src/main/java/com/google/devtools/build/skyframe/BuildingState.java
index c410a4199c..cbedfd1b1a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/BuildingState.java
+++ b/src/main/java/com/google/devtools/build/skyframe/BuildingState.java
@@ -38,9 +38,11 @@ import java.util.Set;
* classes should instantiate a {@code BuildingState} object or call any of its methods directly.
* It is in a separate file solely to keep the {@link NodeEntry} class readable. In particular, the
* caller must synchronize access to this class.
+ *
+ * <p>This class is not intended to be used outside of Skyframe.
*/
@ThreadCompatible
-final class BuildingState implements Serializable {
+public final class BuildingState implements Serializable {
/**
* During its life, a node can go through states as follows:
* <ol>