aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar michajlo <michajlo@google.com>2018-02-11 09:23:55 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-11 09:25:41 -0800
commite45c0555cfb15ce403ff2f447edb74495a633ec1 (patch)
tree28c7a697306b91d00a49602b991aea9476c65892
parente3bbfdb839a483f1a418a94d857c25794006fbe0 (diff)
Add context argument to ObjectCodec.{serialize,deserialize}
Context implementations are currently empty, just doing the plumbing in this change. Once this is in we can start passing along the ObjectCodecRegistry, which will allow runtime codec resolution for classes not known at compile time. We'll also inevitably add some memoization helpers, allowing us to optimize the serialization process further. PiperOrigin-RevId: 185305674
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java50
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Package.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValueCodec.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/EnumCodec.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodec.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/JavaSerializableCodec.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodec.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/SingletonCodec.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java67
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/Path.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/Root.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java15
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java48
43 files changed, 451 insertions, 275 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 562a208698..abeec41caa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -53,8 +53,10 @@ import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
@@ -2189,30 +2191,35 @@ public class BuildConfiguration implements BuildConfigurationInterface {
@Override
public void serialize(
- FileSystemProvider fsProvider, BuildConfiguration obj, CodedOutputStream codedOut)
+ FileSystemProvider fsProvider,
+ SerializationContext context,
+ BuildConfiguration obj,
+ CodedOutputStream codedOut)
throws SerializationException, IOException {
- BlazeDirectories.CODEC.serialize(fsProvider, obj.directories, codedOut);
+ BlazeDirectories.CODEC.serialize(fsProvider, context, obj.directories, codedOut);
codedOut.writeInt32NoTag(obj.fragments.size());
for (Fragment fragment : obj.fragments.values()) {
- Fragment.CODEC.serialize(fsProvider, fragment, codedOut);
+ Fragment.CODEC.serialize(fsProvider, context, fragment, codedOut);
}
- BuildOptions.CODEC.serialize(obj.buildOptions, codedOut);
- StringCodecs.asciiOptimized().serialize(obj.repositoryName, codedOut);
+ BuildOptions.CODEC.serialize(context, obj.buildOptions, codedOut);
+ StringCodecs.asciiOptimized().serialize(context, obj.repositoryName, codedOut);
}
@Override
- public BuildConfiguration deserialize(FileSystemProvider fsProvider, CodedInputStream codedIn)
+ public BuildConfiguration deserialize(
+ FileSystemProvider fsProvider, DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
- BlazeDirectories blazeDirectories = BlazeDirectories.CODEC.deserialize(fsProvider, codedIn);
+ BlazeDirectories blazeDirectories =
+ BlazeDirectories.CODEC.deserialize(fsProvider, context, codedIn);
int length = codedIn.readInt32();
ImmutableSortedMap.Builder<Class<? extends Fragment>, Fragment> builder =
new ImmutableSortedMap.Builder<>(lexicalFragmentSorter);
for (int i = 0; i < length; ++i) {
- Fragment fragment = Fragment.CODEC.deserialize(fsProvider, codedIn);
+ Fragment fragment = Fragment.CODEC.deserialize(fsProvider, context, codedIn);
builder.put(fragment.getClass(), fragment);
}
- BuildOptions options = BuildOptions.CODEC.deserialize(codedIn);
- String repositoryName = StringCodecs.asciiOptimized().deserialize(codedIn);
+ BuildOptions options = BuildOptions.CODEC.deserialize(context, codedIn);
+ String repositoryName = StringCodecs.asciiOptimized().deserialize(context, codedIn);
return new BuildConfiguration(blazeDirectories, builder.build(), options, repositoryName);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
index b1944f05a6..4a89121dd5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
@@ -22,7 +22,9 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedMap;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.util.Fingerprint;
import com.google.devtools.common.options.InvocationPolicyEnforcer;
@@ -337,22 +339,23 @@ public final class BuildOptions implements Cloneable, Serializable {
}
@Override
- public void serialize(BuildOptions buildOptions, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, BuildOptions buildOptions, CodedOutputStream codedOut)
throws IOException, SerializationException {
Collection<FragmentOptions> fragmentOptions = buildOptions.getOptions();
codedOut.writeInt32NoTag(fragmentOptions.size());
for (FragmentOptions options : buildOptions.getOptions()) {
- FragmentOptions.CODEC.serialize(options, codedOut);
+ FragmentOptions.CODEC.serialize(context, options, codedOut);
}
}
@Override
- public BuildOptions deserialize(CodedInputStream codedIn)
+ public BuildOptions deserialize(DeserializationContext context, CodedInputStream codedIn)
throws IOException, SerializationException {
BuildOptions.Builder builder = BuildOptions.builder();
int length = codedIn.readInt32();
for (int i = 0; i < length; ++i) {
- builder.add(FragmentOptions.CODEC.deserialize(codedIn));
+ builder.add(FragmentOptions.CODEC.deserialize(context, codedIn));
}
return builder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java b/src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java
index cda83dbf82..4153d5ecc2 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/LabelCodec.java
@@ -14,7 +14,9 @@
package com.google.devtools.build.lib.cmdline;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.protobuf.CodedInputStream;
@@ -35,16 +37,17 @@ public class LabelCodec implements ObjectCodec<Label> {
}
@Override
- public void serialize(Label label, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, Label label, CodedOutputStream codedOut)
throws IOException, SerializationException {
- packageIdCodec.serialize(label.getPackageIdentifier(), codedOut);
- stringCodec.serialize(label.getName(), codedOut);
+ packageIdCodec.serialize(context, label.getPackageIdentifier(), codedOut);
+ stringCodec.serialize(context, label.getName(), codedOut);
}
@Override
- public Label deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
- PackageIdentifier packageId = packageIdCodec.deserialize(codedIn);
- String name = stringCodec.deserialize(codedIn);
+ public Label deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
+ PackageIdentifier packageId = packageIdCodec.deserialize(context, codedIn);
+ String name = stringCodec.deserialize(context, codedIn);
return Label.createUnvalidated(packageId, name);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java
index dc94ea8574..1dcb78f06f 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifierCodec.java
@@ -14,7 +14,9 @@
package com.google.devtools.build.lib.cmdline;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.protobuf.CodedInputStream;
@@ -32,17 +34,18 @@ public class PackageIdentifierCodec implements ObjectCodec<PackageIdentifier> {
}
@Override
- public void serialize(PackageIdentifier pkgId, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, PackageIdentifier pkgId, CodedOutputStream codedOut)
throws IOException, SerializationException {
- repoNameCodec.serialize(pkgId.getRepository(), codedOut);
- PathFragment.CODEC.serialize(pkgId.getPackageFragment(), codedOut);
+ repoNameCodec.serialize(context, pkgId.getRepository(), codedOut);
+ PathFragment.CODEC.serialize(context, pkgId.getPackageFragment(), codedOut);
}
@Override
- public PackageIdentifier deserialize(CodedInputStream codedIn)
+ public PackageIdentifier deserialize(DeserializationContext context, CodedInputStream codedIn)
throws IOException, SerializationException {
- RepositoryName repoName = repoNameCodec.deserialize(codedIn);
- PathFragment pathFragment = PathFragment.CODEC.deserialize(codedIn);
+ RepositoryName repoName = repoNameCodec.deserialize(context, codedIn);
+ PathFragment pathFragment = PathFragment.CODEC.deserialize(context, codedIn);
return PackageIdentifier.create(repoName, pathFragment);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java
index 67a6c55eab..4949b2fd48 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryNameCodec.java
@@ -14,7 +14,9 @@
package com.google.devtools.build.lib.cmdline;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.ByteString;
import com.google.protobuf.CodedInputStream;
@@ -30,7 +32,9 @@ public class RepositoryNameCodec implements ObjectCodec<RepositoryName> {
}
@Override
- public void serialize(RepositoryName repoName, CodedOutputStream codedOut) throws IOException {
+ public void serialize(
+ SerializationContext context, RepositoryName repoName, CodedOutputStream codedOut)
+ throws IOException {
boolean isMain = repoName.isMain();
// Main is by far the most common. Use boolean to short-circuit string encoding on
// serialization and byte[]/ByteString creation on deserialization.
@@ -41,7 +45,7 @@ public class RepositoryNameCodec implements ObjectCodec<RepositoryName> {
}
@Override
- public RepositoryName deserialize(CodedInputStream codedIn)
+ public RepositoryName deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
boolean isMain = codedIn.readBool();
if (isMain) {
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java
index 072b936fcc..475e93b7ab 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetCodec.java
@@ -16,10 +16,12 @@ package com.google.devtools.build.lib.collect.nestedset;
import com.google.common.base.Preconditions;
import com.google.common.hash.Hashing;
import com.google.common.hash.HashingOutputStream;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.ByteString;
import com.google.protobuf.CodedInputStream;
@@ -61,20 +63,20 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
}
@Override
- public void serialize(NestedSet<T> obj, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, NestedSet<T> obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
// Topo sort the nested set to ensure digests are available for children at time of writing
Collection<Object> topoSortedChildren = getTopologicallySortedChildren(obj);
Map<Object, byte[]> childToDigest = new IdentityHashMap<>();
codedOut.writeInt32NoTag(topoSortedChildren.size());
- orderCodec.serialize(obj.getOrder(), codedOut);
+ orderCodec.serialize(context, obj.getOrder(), codedOut);
for (Object children : topoSortedChildren) {
- serializeOneNestedSet(children, codedOut, childToDigest);
+ serializeOneNestedSet(context, children, codedOut, childToDigest);
}
}
@Override
- public NestedSet<T> deserialize(CodedInputStream codedIn)
+ public NestedSet<T> deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
Map<ByteString, Object> digestToChild = new HashMap<>();
int nestedSetCount = codedIn.readInt32();
@@ -82,17 +84,20 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
nestedSetCount >= 1,
"Should have at least serialized one nested set, got: %d",
nestedSetCount);
- Order order = orderCodec.deserialize(codedIn);
+ Order order = orderCodec.deserialize(context, codedIn);
Object children = null;
for (int i = 0; i < nestedSetCount; ++i) {
// Update var, the last one in the list is the top level nested set
- children = deserializeOneNestedSet(codedIn, digestToChild);
+ children = deserializeOneNestedSet(context, codedIn, digestToChild);
}
return createNestedSet(order, children);
}
private void serializeOneNestedSet(
- Object children, CodedOutputStream codedOut, Map<Object, byte[]> childToDigest)
+ SerializationContext context,
+ Object children,
+ CodedOutputStream codedOut,
+ Map<Object, byte[]> childToDigest)
throws IOException, SerializationException {
// Serialize nested set into an inner byte array so we can take its digest
ByteArrayOutputStream childOutputStream = new ByteArrayOutputStream();
@@ -100,9 +105,9 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
new HashingOutputStream(Hashing.md5(), childOutputStream);
CodedOutputStream childCodedOut = CodedOutputStream.newInstance(hashingOutputStream);
if (children instanceof Object[]) {
- serializeMultiItemChildArray((Object[]) children, childToDigest, childCodedOut);
+ serializeMultiItemChildArray(context, (Object[]) children, childToDigest, childCodedOut);
} else if (children != NestedSet.EMPTY_CHILDREN) {
- serializeSingleItemChildArray(children, childCodedOut);
+ serializeSingleItemChildArray(context, children, childCodedOut);
} else {
// Empty set
childCodedOut.writeInt32NoTag(0);
@@ -116,7 +121,10 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
}
private void serializeMultiItemChildArray(
- Object[] children, Map<Object, byte[]> childToDigest, CodedOutputStream childCodedOut)
+ SerializationContext context,
+ Object[] children,
+ Map<Object, byte[]> childToDigest,
+ CodedOutputStream childCodedOut)
throws IOException, SerializationException {
childCodedOut.writeInt32NoTag(children.length);
for (Object child : children) {
@@ -129,20 +137,23 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
childCodedOut.writeByteArrayNoTag(digest);
} else {
childCodedOut.writeBoolNoTag(false);
- objectCodec.serialize(cast(child), childCodedOut);
+ objectCodec.serialize(context, cast(child), childCodedOut);
}
}
}
- private void serializeSingleItemChildArray(Object children, CodedOutputStream childCodedOut)
+ private void serializeSingleItemChildArray(
+ SerializationContext context, Object children, CodedOutputStream childCodedOut)
throws IOException, SerializationException {
childCodedOut.writeInt32NoTag(1);
T singleChild = cast(children);
- objectCodec.serialize(singleChild, childCodedOut);
+ objectCodec.serialize(context, singleChild, childCodedOut);
}
private Object deserializeOneNestedSet(
- CodedInputStream codedIn, Map<ByteString, Object> digestToChild)
+ DeserializationContext context,
+ CodedInputStream codedIn,
+ Map<ByteString, Object> digestToChild)
throws SerializationException, IOException {
ByteString digest = codedIn.readBytes();
CodedInputStream childCodedIn = codedIn.readBytes().newCodedInput();
@@ -150,9 +161,9 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
int childCount = childCodedIn.readInt32();
final Object result;
if (childCount > 1) {
- result = deserializeMultipleItemChildArray(digestToChild, childCodedIn, childCount);
+ result = deserializeMultipleItemChildArray(context, digestToChild, childCodedIn, childCount);
} else if (childCount == 1) {
- result = objectCodec.deserialize(childCodedIn);
+ result = objectCodec.deserialize(context, childCodedIn);
} else {
result = NestedSet.EMPTY_CHILDREN;
}
@@ -161,7 +172,10 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
}
private Object deserializeMultipleItemChildArray(
- Map<ByteString, Object> digestToChild, CodedInputStream childCodedIn, int childCount)
+ DeserializationContext context,
+ Map<ByteString, Object> digestToChild,
+ CodedInputStream childCodedIn,
+ int childCount)
throws IOException, SerializationException {
Object[] children = new Object[childCount];
for (int i = 0; i < childCount; ++i) {
@@ -171,7 +185,7 @@ public class NestedSetCodec<T> implements ObjectCodec<NestedSet<T>> {
children[i] =
Preconditions.checkNotNull(digestToChild.get(digest), "Transitive nested set missing");
} else {
- children[i] = objectCodec.deserialize(childCodedIn);
+ children[i] = objectCodec.deserialize(context, childCodedIn);
}
}
return children;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 8a1f02a63d..1d7ee3a792 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -1584,13 +1584,19 @@ public class Package {
@Override
public void serialize(
- PackageCodecDependencies codecDeps, Package input, CodedOutputStream codedOut)
+ PackageCodecDependencies codecDeps,
+ com.google.devtools.build.lib.skyframe.serialization.SerializationContext context,
+ Package input,
+ CodedOutputStream codedOut)
throws IOException, SerializationException {
codecDeps.getPackageSerializer().serialize(input, codedOut);
}
@Override
- public Package deserialize(PackageCodecDependencies codecDeps, CodedInputStream codedIn)
+ public Package deserialize(
+ PackageCodecDependencies codecDeps,
+ com.google.devtools.build.lib.skyframe.serialization.DeserializationContext context,
+ CodedInputStream codedIn)
throws SerializationException, IOException {
try {
return codecDeps.getPackageDeserializer().deserialize(codedIn);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
index fe7e4d9a38..249bc91c4c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsCodec.java
@@ -14,7 +14,9 @@
package com.google.devtools.build.lib.packages;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.syntax.SkylarkSemantics;
import com.google.protobuf.CodedInputStream;
@@ -37,7 +39,8 @@ public final class SkylarkSemanticsCodec implements ObjectCodec<SkylarkSemantics
}
@Override
- public void serialize(SkylarkSemantics semantics, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, SkylarkSemantics semantics, CodedOutputStream codedOut)
throws SerializationException, IOException {
// <== Add new options here in alphabetic order ==>
codedOut.writeBoolNoTag(semantics.incompatibleBzlDisallowLoadAfterStatement());
@@ -59,7 +62,7 @@ public final class SkylarkSemanticsCodec implements ObjectCodec<SkylarkSemantics
}
@Override
- public SkylarkSemantics deserialize(CodedInputStream codedIn)
+ public SkylarkSemantics deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
SkylarkSemantics.Builder builder = SkylarkSemantics.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index 3bf0afc5a4..bd7a0b78d8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -24,8 +24,10 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.EnumCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -508,13 +510,14 @@ public class AppleCommandLineOptions extends FragmentOptions {
return host;
}
- void serialize(CodedOutputStream out) throws IOException, SerializationException {
- CODEC.serialize(this, out);
+ void serialize(SerializationContext context, CodedOutputStream out)
+ throws IOException, SerializationException {
+ CODEC.serialize(context, this, out);
}
- static AppleCommandLineOptions deserialize(CodedInputStream in)
+ static AppleCommandLineOptions deserialize(DeserializationContext context, CodedInputStream in)
throws IOException, SerializationException {
- return CODEC.deserialize(in);
+ return CODEC.deserialize(context, in);
}
/** Converter for the Apple configuration distinguisher. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java
index 569c8e1c4a..12e236c2fa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/DottedVersion.java
@@ -21,7 +21,9 @@ import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -161,9 +163,12 @@ public final class DottedVersion implements Comparable<DottedVersion>, SkylarkVa
}
@Override
- @SkylarkCallable(name = "compare_to",
- doc = "Compares based on most signifigant (first) not-matching version component. "
- + "So, for example, 1.2.3 < 1.2.4")
+ @SkylarkCallable(
+ name = "compare_to",
+ doc =
+ "Compares based on most signifigant (first) not-matching version component. "
+ + "So, for example, 1.2.3 < 1.2.4"
+ )
public int compareTo(DottedVersion other) {
int maxComponents = Math.max(components.size(), other.components.size());
for (int componentIndex = 0; componentIndex < maxComponents; componentIndex++) {
@@ -180,16 +185,16 @@ public final class DottedVersion implements Comparable<DottedVersion>, SkylarkVa
/**
* Returns the string representation of this dotted version, padded to a minimum number of
* components if the string representation does not already contain that many components.
- *
+ *
* <p>For example, a dotted version of "7.3" will return "7.3" with either one or two components
* requested, "7.3.0" if three are requested, and "7.3.0.0" if four are requested.
- *
+ *
* <p>Trailing zero components at the end of a string representation will not be removed. For
- * example, a dotted version of "1.0.0" will return "1.0.0" if only one or two components
- * are requested.
+ * example, a dotted version of "1.0.0" will return "1.0.0" if only one or two components are
+ * requested.
*
- * @param numMinComponents the minimum number of dot-separated numbers that should be present
- * in the returned string representation
+ * @param numMinComponents the minimum number of dot-separated numbers that should be present in
+ * the returned string representation
*/
public String toStringWithMinimumComponents(int numMinComponents) {
ImmutableList.Builder<Component> stringComponents = ImmutableList.builder();
@@ -260,7 +265,9 @@ public final class DottedVersion implements Comparable<DottedVersion>, SkylarkVa
public static final ObjectCodec<DottedVersion> CODEC =
new ObjectCodec<DottedVersion>() {
@Override
- public void serialize(DottedVersion obj, CodedOutputStream codedOut) throws IOException {
+ public void serialize(
+ SerializationContext context, DottedVersion obj, CodedOutputStream codedOut)
+ throws IOException {
codedOut.writeInt32NoTag(obj.components.size());
for (Component component : obj.components) {
component.serialize(codedOut);
@@ -270,7 +277,8 @@ public final class DottedVersion implements Comparable<DottedVersion>, SkylarkVa
}
@Override
- public DottedVersion deserialize(CodedInputStream codedIn) throws IOException {
+ public DottedVersion deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws IOException {
int numComponents = codedIn.readInt32();
// TODO(janakr: Presize this if/when https://github.com/google/guava/issues/196 is
// resolved.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
index 0aca54b402..cf12d6220d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java
@@ -35,8 +35,10 @@ import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.skyframe.BuildConfigurationValue.Key;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey.KeyAndHost;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ImmutableListCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.syntax.SkylarkImport;
import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -277,25 +279,25 @@ public final class AspectValue extends ActionLookupValue {
}
@Override
- public void serialize(AspectKey obj, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, AspectKey obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
- Label.CODEC.serialize(obj.label, codedOut);
- ConfiguredTargetKey.CODEC.serialize(obj.baseConfiguredTargetKey, codedOut);
- listCodec.serialize(obj.baseKeys, codedOut);
- AspectDescriptor.CODEC.serialize(obj.aspectDescriptor, codedOut);
- Key.CODEC.serialize(obj.aspectConfigurationKey, codedOut);
+ Label.CODEC.serialize(context, obj.label, codedOut);
+ ConfiguredTargetKey.CODEC.serialize(context, obj.baseConfiguredTargetKey, codedOut);
+ listCodec.serialize(context, obj.baseKeys, codedOut);
+ AspectDescriptor.CODEC.serialize(context, obj.aspectDescriptor, codedOut);
+ Key.CODEC.serialize(context, obj.aspectConfigurationKey, codedOut);
codedOut.writeBoolNoTag(obj.aspectConfigurationIsHost());
}
@Override
- public AspectKey deserialize(CodedInputStream codedIn)
+ public AspectKey deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
return createAspectKey(
- Label.CODEC.deserialize(codedIn),
- ConfiguredTargetKey.CODEC.deserialize(codedIn),
- listCodec.deserialize(codedIn),
- AspectDescriptor.CODEC.deserialize(codedIn),
- Key.CODEC.deserialize(codedIn),
+ Label.CODEC.deserialize(context, codedIn),
+ ConfiguredTargetKey.CODEC.deserialize(context, codedIn),
+ listCodec.deserialize(context, codedIn),
+ AspectDescriptor.CODEC.deserialize(context, codedIn),
+ Key.CODEC.deserialize(context, codedIn),
codedIn.readBool());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
index da75352d25..76e8cbb4ea 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
@@ -21,8 +21,10 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
@@ -134,20 +136,21 @@ public class BuildConfigurationValue implements SkyValue {
}
@Override
- public void serialize(Key obj, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, Key obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
- BuildOptions.CODEC.serialize(obj.buildOptions, codedOut);
+ BuildOptions.CODEC.serialize(context, obj.buildOptions, codedOut);
codedOut.writeInt32NoTag(obj.fragments.fragmentClasses().size());
for (Class<? extends BuildConfiguration.Fragment> fragment :
obj.fragments.fragmentClasses()) {
- StringCodecs.asciiOptimized().serialize(fragment.getName(), codedOut);
+ StringCodecs.asciiOptimized().serialize(context, fragment.getName(), codedOut);
}
}
@Override
@SuppressWarnings("unchecked") // Class<? extends...> cast
- public Key deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
- BuildOptions buildOptions = BuildOptions.CODEC.deserialize(codedIn);
+ public Key deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
+ BuildOptions buildOptions = BuildOptions.CODEC.deserialize(context, codedIn);
int fragmentsSize = codedIn.readInt32();
ImmutableSortedSet.Builder<Class<? extends BuildConfiguration.Fragment>> fragmentsBuilder =
ImmutableSortedSet.orderedBy(BuildConfiguration.lexicalFragmentSorter);
@@ -155,7 +158,7 @@ public class BuildConfigurationValue implements SkyValue {
try {
fragmentsBuilder.add(
(Class<? extends BuildConfiguration.Fragment>)
- Class.forName(StringCodecs.asciiOptimized().deserialize(codedIn)));
+ Class.forName(StringCodecs.asciiOptimized().deserialize(context, codedIn)));
} catch (ClassNotFoundException e) {
throw new SerializationException(
"Couldn't deserialize BuildConfigurationValue$Key fragment class", e);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
index 3ec99dbcd1..c81f29c55d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
@@ -23,8 +23,10 @@ import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
import com.google.devtools.build.lib.packages.RuleClassProvider;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
@@ -137,22 +139,24 @@ public class ConfigurationFragmentValue implements SkyValue {
}
@Override
- public void serialize(ConfigurationFragmentKey obj, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, ConfigurationFragmentKey obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
- BuildOptions.CODEC.serialize(obj.buildOptions, codedOut);
- StringCodecs.asciiOptimized().serialize(obj.fragmentType.getName(), codedOut);
+ BuildOptions.CODEC.serialize(context, obj.buildOptions, codedOut);
+ StringCodecs.asciiOptimized().serialize(context, obj.fragmentType.getName(), codedOut);
}
@SuppressWarnings("unchecked") // Cast to Class<? extends Fragment>.
@Override
- public ConfigurationFragmentKey deserialize(CodedInputStream codedIn)
+ public ConfigurationFragmentKey deserialize(
+ DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
try {
return of(
- BuildOptions.CODEC.deserialize(codedIn),
+ BuildOptions.CODEC.deserialize(context, codedIn),
(Class<? extends Fragment>)
- Class.forName(StringCodecs.asciiOptimized().deserialize(codedIn)));
+ Class.forName(StringCodecs.asciiOptimized().deserialize(context, codedIn)));
} catch (ClassNotFoundException e) {
throw new SerializationException("Couldn't deserialize ConfigurationFragmentKey", e);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index 166119f6a4..5cdf67cd31 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -22,7 +22,9 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.protobuf.CodedInputStream;
@@ -211,24 +213,27 @@ public class ConfiguredTargetKey extends ActionLookupKey {
}
@Override
- public void serialize(ConfiguredTargetKey obj, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, ConfiguredTargetKey obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
- Label.CODEC.serialize(obj.label, codedOut);
+ Label.CODEC.serialize(context, obj.label, codedOut);
if (obj.configurationKey == null) {
codedOut.writeBoolNoTag(false);
} else {
codedOut.writeBoolNoTag(true);
- BuildConfigurationValue.Key.CODEC.serialize(obj.configurationKey, codedOut);
+ BuildConfigurationValue.Key.CODEC.serialize(context, obj.configurationKey, codedOut);
}
codedOut.writeBoolNoTag(obj.isHostConfiguration());
}
@Override
- public ConfiguredTargetKey deserialize(CodedInputStream codedIn)
+ public ConfiguredTargetKey deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
return of(
- Label.CODEC.deserialize(codedIn),
- codedIn.readBool() ? BuildConfigurationValue.Key.CODEC.deserialize(codedIn) : null,
+ Label.CODEC.deserialize(context, codedIn),
+ codedIn.readBool()
+ ? BuildConfigurationValue.Key.CODEC.deserialize(context, codedIn)
+ : null,
codedIn.readBool());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java
index 53c1aadc67..01db160289 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobDescriptor.java
@@ -19,7 +19,9 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.PackageIdentifierCodec;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.util.StringCanonicalizer;
@@ -181,22 +183,23 @@ public final class GlobDescriptor implements SkyKey {
}
@Override
- public void serialize(GlobDescriptor globDesc, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, GlobDescriptor globDesc, CodedOutputStream codedOut)
throws IOException, SerializationException {
- packageIdCodec.serialize(globDesc.getPackageId(), codedOut);
- rootCodec.serialize(globDesc.getPackageRoot(), codedOut);
- PathFragment.CODEC.serialize(globDesc.getSubdir(), codedOut);
- stringCodec.serialize(globDesc.getPattern(), codedOut);
+ packageIdCodec.serialize(context, globDesc.getPackageId(), codedOut);
+ rootCodec.serialize(context, globDesc.getPackageRoot(), codedOut);
+ PathFragment.CODEC.serialize(context, globDesc.getSubdir(), codedOut);
+ stringCodec.serialize(context, globDesc.getPattern(), codedOut);
codedOut.writeBoolNoTag(globDesc.excludeDirs());
}
@Override
- public GlobDescriptor deserialize(CodedInputStream codedIn)
+ public GlobDescriptor deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
- PackageIdentifier packageId = packageIdCodec.deserialize(codedIn);
- Root packageRoot = rootCodec.deserialize(codedIn);
- PathFragment pathFragment = PathFragment.CODEC.deserialize(codedIn);
- String pattern = stringCodec.deserialize(codedIn);
+ PackageIdentifier packageId = packageIdCodec.deserialize(context, codedIn);
+ Root packageRoot = rootCodec.deserialize(context, codedIn);
+ PathFragment pathFragment = PathFragment.CODEC.deserialize(context, codedIn);
+ String pattern = stringCodec.deserialize(context, codedIn);
boolean excludeDirs = codedIn.readBool();
return GlobDescriptor.create(packageId, packageRoot, pathFragment, pattern, excludeDirs);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValueCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValueCodec.java
index 2128edbf86..1fc108d778 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValueCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValueCodec.java
@@ -15,8 +15,10 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -42,7 +44,8 @@ public class PrecomputedValueCodec implements ObjectCodec<PrecomputedValue> {
}
@Override
- public void serialize(PrecomputedValue obj, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, PrecomputedValue obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
ObjectCodecs objectCodecs = objectCodecsSupplier.get();
Object val = obj.get();
@@ -55,7 +58,7 @@ public class PrecomputedValueCodec implements ObjectCodec<PrecomputedValue> {
}
@Override
- public PrecomputedValue deserialize(CodedInputStream codedIn)
+ public PrecomputedValue deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
ObjectCodecs objectCodecs = objectCodecsSupplier.get();
Object val = objectCodecs.deserialize(codedIn.readBytes(), codedIn);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java
new file mode 100644
index 0000000000..8b7d4354ea
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java
@@ -0,0 +1,34 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skyframe.serialization;
+
+/** Stateful class for providing additional context to a single deserialization "session". */
+// TODO(bazel-team): This class is just a shell, fill in.
+public class DeserializationContext {
+ // TODO(bazel-team): Replace with real stateless implementation when we start adding
+ // functionality.
+ private static final DeserializationContext EMPTY_STATELESS = new DeserializationContext();
+
+ public static DeserializationContext create() {
+ return new DeserializationContext();
+ }
+
+ /** Returns an empty instance which doesn't retain any state. */
+ public static DeserializationContext stateless() {
+ return EMPTY_STATELESS;
+ }
+
+ private DeserializationContext() {}
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/EnumCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/EnumCodec.java
index 523620e1cb..9363fb80dc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/EnumCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/EnumCodec.java
@@ -41,13 +41,15 @@ public class EnumCodec<T extends Enum<T>> implements ObjectCodec<T> {
}
@Override
- public void serialize(T value, CodedOutputStream codedOut) throws IOException {
+ public void serialize(SerializationContext context, T value, CodedOutputStream codedOut)
+ throws IOException {
Preconditions.checkNotNull(value, "Enum value for %s is null", enumClass);
codedOut.writeEnumNoTag(value.ordinal());
}
@Override
- public T deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
+ public T deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
int ordinal = codedIn.readEnum();
try {
return values.get(ordinal);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodec.java
index 1b54d1fb17..0c67c38763 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ImmutableListCodec.java
@@ -37,16 +37,17 @@ public class ImmutableListCodec<T> implements ObjectCodec<ImmutableList<T>> {
}
@Override
- public void serialize(ImmutableList<T> list, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, ImmutableList<T> list, CodedOutputStream codedOut)
throws SerializationException, IOException {
codedOut.writeInt32NoTag(list.size());
for (T item : list) {
- codec.serialize(item, codedOut);
+ codec.serialize(context, item, codedOut);
}
}
@Override
- public ImmutableList<T> deserialize(CodedInputStream codedIn)
+ public ImmutableList<T> deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
int length = codedIn.readInt32();
if (length < 0) {
@@ -55,7 +56,7 @@ public class ImmutableListCodec<T> implements ObjectCodec<ImmutableList<T>> {
ImmutableList.Builder<T> builder = ImmutableList.builder();
for (int i = 0; i < length; i++) {
- builder.add(codec.deserialize(codedIn));
+ builder.add(codec.deserialize(context, codedIn));
}
return builder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java
index 14f56c7ba1..abd9d4dcbf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodec.java
@@ -31,7 +31,7 @@ public interface InjectingObjectCodec<T, D> extends BaseCodec<T> {
* @throws SerializationException on failure to serialize
* @throws IOException on {@link IOException} during serialization
*/
- void serialize(D dependency, T obj, CodedOutputStream codedOut)
+ void serialize(D dependency, SerializationContext context, T obj, CodedOutputStream codedOut)
throws SerializationException, IOException;
/**
@@ -43,5 +43,6 @@ public interface InjectingObjectCodec<T, D> extends BaseCodec<T> {
* @throws SerializationException on failure to deserialize
* @throws IOException on {@link IOException} during deserialization
*/
- T deserialize(D dependency, CodedInputStream codedIn) throws SerializationException, IOException;
+ T deserialize(D dependency, DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java
index b6b398e816..ae44f245a9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/InjectingObjectCodecAdapter.java
@@ -41,13 +41,14 @@ public class InjectingObjectCodecAdapter<T, D> implements ObjectCodec<T> {
}
@Override
- public void serialize(T obj, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, T obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
- codec.serialize(dependency, obj, codedOut);
+ codec.serialize(dependency, context, obj, codedOut);
}
@Override
- public T deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
- return codec.deserialize(dependency, codedIn);
+ public T deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
+ return codec.deserialize(dependency, context, codedIn);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/JavaSerializableCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/JavaSerializableCodec.java
index f3ce577ccc..e6e4bd6f31 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/JavaSerializableCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/JavaSerializableCodec.java
@@ -33,7 +33,7 @@ class JavaSerializableCodec implements ObjectCodec<Object> {
}
@Override
- public void serialize(Object obj, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, Object obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
ByteString.Output out = ByteString.newOutput();
ObjectOutputStream objOut = new ObjectOutputStream(out);
@@ -49,7 +49,8 @@ class JavaSerializableCodec implements ObjectCodec<Object> {
}
@Override
- public Object deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
+ public Object deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
try {
// Get the ByteBuffer as it is potentially a view of the underlying bytes (not a copy), which
// is more efficient.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodec.java
index b7009236c2..4b9afbd9fc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodec.java
@@ -25,23 +25,29 @@ import java.io.IOException;
public interface ObjectCodec<T> extends BaseCodec<T> {
/**
- * Serializes {@code obj}, inverse of {@link #deserialize(CodedInputStream)}.
+ * Serializes {@code obj}, inverse of {@link #deserialize}.
*
+ * @param context {@link SerializationContext} providing additional information to the
+ * serialization process
* @param obj the object to serialize
* @param codedOut the {@link CodedOutputStream} to write this object into. Implementations need
* not call {@link CodedOutputStream#flush()}, this should be handled by the caller.
* @throws SerializationException on failure to serialize
* @throws IOException on {@link IOException} during serialization
*/
- void serialize(T obj, CodedOutputStream codedOut) throws SerializationException, IOException;
+ void serialize(SerializationContext context, T obj, CodedOutputStream codedOut)
+ throws SerializationException, IOException;
/**
- * Deserializes from {@code codedIn}, inverse of {@link #serialize(Object, CodedOutputStream)}.
+ * Deserializes from {@code codedIn}, inverse of {@link #serialize}.
*
+ * @param context {@link DeserialiationContext} for providing additional information to the
+ * deserialization process.
* @param codedIn the {@link CodedInputStream} to read the serialized object from
* @return the object deserialized from {@code codedIn}
* @throws SerializationException on failure to deserialize
* @throws IOException on {@link IOException} during deserialization
*/
- T deserialize(CodedInputStream codedIn) throws SerializationException, IOException;
+ T deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java
index c1a0d599c5..8eca0b578a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecs.java
@@ -94,7 +94,7 @@ public class ObjectCodecs {
// in some situations, bypassing a copy.
codedIn.enableAliasing(true);
try {
- Object result = codec.deserialize(codedIn);
+ Object result = codec.deserialize(DeserializationContext.create(), codedIn);
if (result == null) {
throw new NullPointerException(
"ObjectCodec " + codec + " for " + classifier.toStringUtf8() + " returned null");
@@ -110,7 +110,8 @@ public class ObjectCodecs {
String classifier, ObjectCodec<T> codec, Object subject, CodedOutputStream codedOut)
throws SerializationException, IOException {
try {
- codec.serialize(codec.getEncodedClass().cast(subject), codedOut);
+ codec.serialize(
+ SerializationContext.create(), codec.getEncodedClass().cast(subject), codedOut);
} catch (ClassCastException e) {
throw new SerializationException(
"Codec "
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
index 11689bade6..a92c1c53dd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
@@ -36,6 +36,7 @@ public class PolymorphicHelper {
*/
@SuppressWarnings("unchecked")
public static void serialize(
+ SerializationContext context,
Object input,
Class<?> baseClass,
CodedOutputStream codedOut,
@@ -47,15 +48,16 @@ public class PolymorphicHelper {
Class<?> clazz = classAndCodec.clazz;
Object codec = classAndCodec.codec;
codedOut.writeBoolNoTag(true);
- StringCodecs.asciiOptimized().serialize(clazz.getName(), codedOut);
+ StringCodecs.asciiOptimized().serialize(context, clazz.getName(), codedOut);
if (codec instanceof ObjectCodec) {
- ((ObjectCodec) codec).serialize(input, codedOut);
+ ((ObjectCodec) codec).serialize(context, input, codedOut);
} else if (codec instanceof InjectingObjectCodec) {
if (dependency == null) {
throw new SerializationException(
clazz.getCanonicalName() + " serialize parent class lacks required dependency.");
}
- ((InjectingObjectCodec) codec).serialize(dependency.orElse(null), input, codedOut);
+ ((InjectingObjectCodec) codec)
+ .serialize(dependency.orElse(null), context, input, codedOut);
} else {
throw new SerializationException(
clazz.getCanonicalName()
@@ -78,21 +80,23 @@ public class PolymorphicHelper {
* dependency itself is null (as opposed to non-existent).
*/
@SuppressWarnings("unchecked")
- public static Object deserialize(CodedInputStream codedIn, @Nullable Optional<?> dependency)
+ public static Object deserialize(
+ DeserializationContext context, CodedInputStream codedIn, @Nullable Optional<?> dependency)
throws IOException, SerializationException {
Object deserialized = null;
if (codedIn.readBool()) {
- String className = StringCodecs.asciiOptimized().deserialize(codedIn);
+ String className = StringCodecs.asciiOptimized().deserialize(context, codedIn);
try {
Object codec = getCodec(Class.forName(className));
if (codec instanceof ObjectCodec) {
- return ((ObjectCodec) codec).deserialize(codedIn);
+ return ((ObjectCodec) codec).deserialize(context, codedIn);
} else if (codec instanceof InjectingObjectCodec) {
if (dependency == null) {
throw new SerializationException(
className + " deserialize parent class lacks required dependency.");
}
- return ((InjectingObjectCodec) codec).deserialize(dependency.orElse(null), codedIn);
+ return ((InjectingObjectCodec) codec)
+ .deserialize(dependency.orElse(null), context, codedIn);
} else {
throw new SerializationException(
className + ".CODEC has unexpected type " + codec.getClass().getCanonicalName());
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
deleted file mode 100644
index b5baec07b2..0000000000
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationCommonUtils.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.skyframe.serialization;
-
-import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
-
-/** Common utilities for serialization. */
-public class SerializationCommonUtils {
- public static final ImmutableListCodec<String> STRING_LIST_CODEC =
- new ImmutableListCodec<>(StringCodecs.asciiOptimized());
-
- public static <T> void serializeNullable(T obj, CodedOutputStream out, ObjectCodec<T> codec)
- throws IOException, SerializationException {
- if (obj == null) {
- out.writeBoolNoTag(false);
- } else {
- out.writeBoolNoTag(true);
- codec.serialize(obj, out);
- }
- }
-
- public static <T> T deserializeNullable(CodedInputStream in, ObjectCodec<T> codec)
- throws IOException, SerializationException {
- return in.readBool() ? codec.deserialize(in) : null;
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java
new file mode 100644
index 0000000000..234d049e04
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationContext.java
@@ -0,0 +1,34 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skyframe.serialization;
+
+/** Stateful class for providing additional context to a single serialization "session". */
+// TODO(bazel-team): This class is just a shell, fill in.
+public class SerializationContext {
+ // TODO(bazel-team): Replace with real stateless implementation when we start adding
+ // functionality.
+ private static final SerializationContext EMPTY_STATELESS = new SerializationContext();
+
+ public static SerializationContext create() {
+ return stateless();
+ }
+
+ /** Returns an empty instance which doesn't retain any state. */
+ public static SerializationContext stateless() {
+ return EMPTY_STATELESS;
+ }
+
+ private SerializationContext() {}
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java
index 00004075f3..a6243cf771 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializerAdapter.java
@@ -37,7 +37,8 @@ public class SerializerAdapter<T> extends Serializer<T> {
try {
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
CodedOutputStream codedOut = CodedOutputStream.newInstance(byteOutput);
- codec.serialize(object, codedOut);
+ // TODO(shahan): Determine if there's any context we can/should pass along from kryo.
+ codec.serialize(SerializationContext.create(), object, codedOut);
codedOut.flush();
byte[] byteData = byteOutput.toByteArray();
output.writeInt(byteData.length, true);
@@ -51,7 +52,9 @@ public class SerializerAdapter<T> extends Serializer<T> {
public T read(Kryo kryo, Input input, Class<T> unusedClass) {
try {
byte[] byteData = input.readBytes(input.readInt(true));
- return codec.deserialize(CodedInputStream.newInstance(byteData));
+ // TODO(shahan): Determine if there's any context we can/should pass along from kryo.
+ return codec.deserialize(
+ DeserializationContext.create(), CodedInputStream.newInstance(byteData));
} catch (SerializationException | IOException e) {
throw new KryoException(e);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SingletonCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SingletonCodec.java
index 3dbf328f37..7175aadca5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SingletonCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SingletonCodec.java
@@ -53,14 +53,16 @@ public class SingletonCodec<T> implements ObjectCodec<T> {
}
@Override
- public void serialize(T t, CodedOutputStream codedOut) throws IOException {
+ public void serialize(SerializationContext context, T t, CodedOutputStream codedOut)
+ throws IOException {
// TODO(michajlo): See how usefuly mnemonic actually winds up being for debugging, we may
// want to just toss it and trust that the classifier for this value is good enough.
codedOut.writeByteArrayNoTag(mnemonic);
}
@Override
- public T deserialize(CodedInputStream codedIn) throws SerializationException, IOException {
+ public T deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
// Get ByteBuffer instead of raw bytes, as it may be a direct view of the data and not a copy,
// which is much more efficient.
ByteBuffer readMnemonic = codedIn.readByteBuffer();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
index ff99931c8e..2fc409637b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
@@ -411,8 +411,7 @@ public class AutoCodecProcessor extends AbstractProcessor {
break;
case DECLARED:
marshallers.writeSerializationCode(
- new Marshaller.Context(
- serializeBuilder, (DeclaredType) parameter.asType(), paramAccessor));
+ new Marshaller.Context(serializeBuilder, parameter.asType(), paramAccessor));
break;
default:
throw new UnsupportedOperationException("Unimplemented or invalid kind: " + typeKind);
@@ -446,7 +445,7 @@ public class AutoCodecProcessor extends AbstractProcessor {
break;
case DECLARED:
marshallers.writeDeserializationCode(
- new Marshaller.Context(builder, (DeclaredType) parameter.asType(), paramName));
+ new Marshaller.Context(builder, parameter.asType(), paramName));
break;
default:
throw new IllegalArgumentException("Unimplemented or invalid kind: " + typeKind);
@@ -616,10 +615,12 @@ public class AutoCodecProcessor extends AbstractProcessor {
TypeName polyClass = TypeName.get(env.getTypeUtils().erasure(encodedType.asType()));
if (dependency == null) {
builder.addStatement(
- "$T.serialize(input, $T.class, codedOut, null)", PolymorphicHelper.class, polyClass);
+ "$T.serialize(context, input, $T.class, codedOut, null)",
+ PolymorphicHelper.class,
+ polyClass);
} else {
builder.addStatement(
- "$T.serialize(input, $T.class, codedOut, $T.ofNullable(dependency))",
+ "$T.serialize(context, input, $T.class, codedOut, $T.ofNullable(dependency))",
PolymorphicHelper.class,
polyClass,
Optional.class);
@@ -633,12 +634,12 @@ public class AutoCodecProcessor extends AbstractProcessor {
AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, dependency);
if (dependency == null) {
builder.addStatement(
- "return ($T) $T.deserialize(codedIn, null)",
+ "return ($T) $T.deserialize(context, codedIn, null)",
TypeName.get(encodedType.asType()),
PolymorphicHelper.class);
} else {
builder.addStatement(
- "return ($T) $T.deserialize(codedIn, $T.ofNullable(dependency))",
+ "return ($T) $T.deserialize(context, codedIn, $T.ofNullable(dependency))",
TypeName.get(encodedType.asType()),
PolymorphicHelper.class,
Optional.class);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java
index 2edee1fbeb..4f5409269a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecUtil.java
@@ -15,8 +15,10 @@
package com.google.devtools.build.lib.skyframe.serialization.autocodec;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -106,6 +108,7 @@ class AutoCodecUtil {
builder.addParameter(TypeName.get(dependency.asType()), "dependency");
}
return builder
+ .addParameter(SerializationContext.class, "context")
.addParameter(TypeName.get(encodedType.asType()), "input")
.addParameter(CodedOutputStream.class, "codedOut");
}
@@ -136,7 +139,9 @@ class AutoCodecUtil {
if (dependency != null) {
builder.addParameter(TypeName.get(dependency.asType()), "dependency");
}
- return builder.addParameter(CodedInputStream.class, "codedIn");
+ return builder
+ .addParameter(DeserializationContext.class, "context")
+ .addParameter(CodedInputStream.class, "codedIn");
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java
index b625d347bb..541b1e3fa6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java
@@ -255,13 +255,17 @@ class Marshallers {
@Override
public void addSerializationCode(Context context) {
context.builder.addStatement(
- "$T.asciiOptimized().serialize($L, codedOut)", StringCodecs.class, context.name);
+ "$T.asciiOptimized().serialize(context, $L, codedOut)",
+ StringCodecs.class,
+ context.name);
}
@Override
public void addDeserializationCode(Context context) {
context.builder.addStatement(
- "$L = $T.asciiOptimized().deserialize(codedIn)", context.name, StringCodecs.class);
+ "$L = $T.asciiOptimized().deserialize(context, codedIn)",
+ context.name,
+ StringCodecs.class);
}
};
@@ -381,10 +385,9 @@ class Marshallers {
// Writes the target count to the stream so deserialization knows when to stop.
context.builder.addStatement(
"codedOut.writeInt32NoTag($T.size($L))", Iterables.class, context.name);
- Context repeated =
- context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
- context.makeName("repeated"));
+ Context repeated =
+ context.with(
+ context.getDeclaredType().getTypeArguments().get(0), context.makeName("repeated"));
context.builder.beginControlFlow(
"for ($T $L : $L)", repeated.getTypeName(), repeated.name, context.name);
writeSerializationCode(repeated);
@@ -394,8 +397,7 @@ class Marshallers {
private void addDeserializationCodeForIterable(Context context) {
Context repeated =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
- context.makeName("repeated"));
+ context.getDeclaredType().getTypeArguments().get(0), context.makeName("repeated"));
String builderName = context.makeName("builder");
context.builder.addStatement(
"$T<$T> $L = new $T<>()",
@@ -478,7 +480,7 @@ class Marshallers {
public void addDeserializationCode(Context context) {
Context repeated =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
+ context.getDeclaredType().getTypeArguments().get(0),
context.makeName("repeated"));
String builderName = context.makeName("builder");
context.builder.addStatement(
@@ -507,7 +509,7 @@ class Marshallers {
public void addDeserializationCode(Context context) {
Context repeated =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
+ context.getDeclaredType().getTypeArguments().get(0),
context.makeName("repeated"));
String builderName = context.makeName("builder");
context.builder.addStatement(
@@ -534,12 +536,10 @@ class Marshallers {
String entryName = context.makeName("entry");
Context key =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
- entryName + ".getKey()");
+ context.getDeclaredType().getTypeArguments().get(0), entryName + ".getKey()");
Context value =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(1),
- entryName + ".getValue()");
+ context.getDeclaredType().getTypeArguments().get(1), entryName + ".getValue()");
context.builder.beginControlFlow(
"for ($T<$T, $T> $L : $L.entrySet())",
Map.Entry.class,
@@ -637,13 +637,10 @@ class Marshallers {
Context context, MapBuilderInitializer mapBuilderInitializer, Consumer<String> finisher) {
String builderName = context.makeName("builder");
Context key =
- context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
- context.makeName("key"));
+ context.with(context.getDeclaredType().getTypeArguments().get(0), context.makeName("key"));
Context value =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(1),
- context.makeName("value"));
+ context.getDeclaredType().getTypeArguments().get(1), context.makeName("value"));
mapBuilderInitializer.initialize(builderName, key, value);
String lengthName = context.makeName("length");
context.builder.addStatement("int $L = codedIn.readInt32()", lengthName);
@@ -671,12 +668,10 @@ class Marshallers {
String entryName = context.makeName("entry");
Context key =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
- entryName + ".getKey()");
+ context.getDeclaredType().getTypeArguments().get(0), entryName + ".getKey()");
Context value =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(1),
- entryName + ".getValue()");
+ context.getDeclaredType().getTypeArguments().get(1), entryName + ".getValue()");
context.builder.beginControlFlow(
"for ($T<$T, $T> $L : $L.entries())",
Map.Entry.class,
@@ -693,12 +688,10 @@ class Marshallers {
public void addDeserializationCode(Context context) {
Context key =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(0),
- context.makeName("key"));
+ context.getDeclaredType().getTypeArguments().get(0), context.makeName("key"));
Context value =
context.with(
- (DeclaredType) context.getDeclaredType().getTypeArguments().get(1),
- context.makeName("value"));
+ context.getDeclaredType().getTypeArguments().get(1), context.makeName("value"));
String builderName = context.makeName("builder");
context.builder.addStatement(
"$T<$T, $T> $L = new $T<>()",
@@ -731,7 +724,7 @@ class Marshallers {
@Override
public void addSerializationCode(Context context) {
context.builder.addStatement(
- "$T.asciiOptimized().serialize($L.pattern(), codedOut)",
+ "$T.asciiOptimized().serialize(context, $L.pattern(), codedOut)",
StringCodecs.class,
context.name);
context.builder.addStatement("codedOut.writeInt32NoTag($L.flags())", context.name);
@@ -740,7 +733,9 @@ class Marshallers {
@Override
public void addDeserializationCode(Context context) {
context.builder.addStatement(
- "$L = $T.compile($T.asciiOptimized().deserialize(codedIn), codedIn.readInt32())",
+ "$L = $T.compile("
+ + "$T.asciiOptimized().deserialize(context, codedIn), "
+ + "codedIn.readInt32())",
context.name,
Pattern.class,
StringCodecs.class);
@@ -830,7 +825,7 @@ class Marshallers {
typeParameter);
}
context.builder.addStatement(
- "$L.serialize(($T<$T>) $L, codedOut)",
+ "$L.serialize(context, ($T<$T>) $L, codedOut)",
nestedSetCodec,
NestedSet.class,
typeParameter,
@@ -871,8 +866,8 @@ class Marshallers {
NestedSetCodec.class,
typeParameter);
}
- context.builder.addStatement(
- "$L = $L.deserialize(codedIn)", context.name, nestedSetCodec);
+ context.builder.addStatement(
+ "$L = $L.deserialize(context, codedIn)", context.name, nestedSetCodec);
}
private final Marshaller nestedSetMarshaller =
@@ -910,10 +905,10 @@ class Marshallers {
TypeMirror codecType = getCodec(context.getDeclaredType()).get().asType();
if (isSubtypeErased(codecType, ObjectCodec.class)) {
context.builder.addStatement(
- "$T.CODEC.serialize($L, codedOut)", context.getTypeName(), context.name);
+ "$T.CODEC.serialize(context, $L, codedOut)", context.getTypeName(), context.name);
} else if (isSubtypeErased(codecType, InjectingObjectCodec.class)) {
context.builder.addStatement(
- "$T.CODEC.serialize(dependency, $L, codedOut)",
+ "$T.CODEC.serialize(dependency, context, $L, codedOut)",
context.getTypeName(),
context.name);
} else {
@@ -929,10 +924,10 @@ class Marshallers {
TypeMirror codecType = getCodec(context.getDeclaredType()).get().asType();
if (isSubtypeErased(codecType, ObjectCodec.class)) {
context.builder.addStatement(
- "$L = $T.CODEC.deserialize(codedIn)", context.name, context.getTypeName());
+ "$L = $T.CODEC.deserialize(context, codedIn)", context.name, context.getTypeName());
} else if (isSubtypeErased(codecType, InjectingObjectCodec.class)) {
context.builder.addStatement(
- "$L = $T.CODEC.deserialize(dependency, codedIn)",
+ "$L = $T.CODEC.deserialize(dependency, context, codedIn)",
context.name,
context.getTypeName());
} else {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
index f4b44c1568..8e1a8fc641 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/FastStringCodec.java
@@ -15,7 +15,9 @@
package com.google.devtools.build.lib.skyframe.serialization.strings;
import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
@@ -63,12 +65,14 @@ class FastStringCodec implements ObjectCodec<String> {
}
@Override
- public void serialize(String string, CodedOutputStream codedOut) throws IOException {
+ public void serialize(SerializationContext context, String string, CodedOutputStream codedOut)
+ throws IOException {
codedOut.writeStringNoTag(string);
}
@Override
- public String deserialize(CodedInputStream codedIn) throws IOException {
+ public String deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws IOException {
int length = codedIn.readInt32();
if (length == 0) {
return EMPTY_STRING;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
index 8aaba608cc..30901ed95a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/strings/StringCodec.java
@@ -14,7 +14,9 @@
package com.google.devtools.build.lib.skyframe.serialization.strings;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
import java.io.IOException;
@@ -28,12 +30,14 @@ class StringCodec implements ObjectCodec<String> {
}
@Override
- public void serialize(String str, CodedOutputStream codedOut) throws IOException {
+ public void serialize(SerializationContext context, String str, CodedOutputStream codedOut)
+ throws IOException {
codedOut.writeStringNoTag(str);
}
@Override
- public String deserialize(CodedInputStream codedIn) throws IOException {
+ public String deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws IOException {
return codedIn.readString();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java
index 3f7071db29..82d4c36baa 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/ObjectCodecTester.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.fail;
import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.CodedInputStream;
@@ -109,7 +110,9 @@ public class ObjectCodecTester<T> {
/** Runs junk-data recognition tests. */
void testDeserializeJunkData() {
try {
- underTest.deserialize(CodedInputStream.newInstance("junk".getBytes(StandardCharsets.UTF_8)));
+ underTest.deserialize(
+ DeserializationContext.create(),
+ CodedInputStream.newInstance("junk".getBytes(StandardCharsets.UTF_8)));
fail("Expected exception");
} catch (SerializationException | IOException e) {
// Expected.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java
index 8eafe7f14f..8e87e46a6c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/TestUtils.java
@@ -16,7 +16,9 @@ package com.google.devtools.build.lib.skyframe.serialization.testutils;
import static com.google.common.truth.Truth.assertThat;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.syntax.Environment.Frame;
@@ -35,7 +37,7 @@ public class TestUtils {
throws IOException, SerializationException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
CodedOutputStream codedOut = CodedOutputStream.newInstance(bytes);
- codec.serialize(value, codedOut);
+ codec.serialize(SerializationContext.create(), value, codedOut);
codedOut.flush();
return bytes.toByteArray();
}
@@ -43,7 +45,7 @@ public class TestUtils {
/** Deserialize a value from a byte array. */
public static <T> T fromBytes(ObjectCodec<T> codec, byte[] bytes)
throws SerializationException, IOException {
- return codec.deserialize(CodedInputStream.newInstance(bytes));
+ return codec.deserialize(DeserializationContext.create(), CodedInputStream.newInstance(bytes));
}
/**
@@ -77,15 +79,15 @@ public class TestUtils {
}
@Override
- public void serialize(String value, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, String value, CodedOutputStream codedOut)
throws SerializationException, IOException {
- stringCodec.serialize("dummy", codedOut);
+ stringCodec.serialize(context, "dummy", codedOut);
}
@Override
- public String deserialize(CodedInputStream codedIn)
+ public String deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
- stringCodec.deserialize(codedIn);
+ stringCodec.deserialize(context, codedIn);
return "dummy";
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
index 075c47bd07..649eea9256 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
@@ -15,8 +15,10 @@ package com.google.devtools.build.lib.vfs;
import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrintable;
@@ -915,17 +917,22 @@ public class Path
}
@Override
- public void serialize(FileSystemProvider fsProvider, Path path, CodedOutputStream codedOut)
+ public void serialize(
+ FileSystemProvider fsProvider,
+ SerializationContext context,
+ Path path,
+ CodedOutputStream codedOut)
throws IOException, SerializationException {
Preconditions.checkArgument(path.getFileSystem() == fsProvider.getFileSystem());
- stringCodec.serialize(path.getPathString(), codedOut);
+ stringCodec.serialize(context, path.getPathString(), codedOut);
}
@Override
- public Path deserialize(FileSystemProvider fsProvider, CodedInputStream codedIn)
+ public Path deserialize(
+ FileSystemProvider fsProvider, DeserializationContext context, CodedInputStream codedIn)
throws IOException, SerializationException {
return Path.createAlreadyNormalized(
- stringCodec.deserialize(codedIn), fsProvider.getFileSystem());
+ stringCodec.deserialize(context, codedIn), fsProvider.getFileSystem());
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java b/src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java
index c7644ed960..6180572b24 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathCodec.java
@@ -15,7 +15,9 @@
package com.google.devtools.build.lib.vfs;
import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.protobuf.CodedInputStream;
@@ -39,7 +41,7 @@ public class PathCodec implements ObjectCodec<Path> {
}
@Override
- public void serialize(Path path, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, Path path, CodedOutputStream codedOut)
throws IOException, SerializationException {
Preconditions.checkState(
path.getFileSystem() == fileSystem,
@@ -47,11 +49,12 @@ public class PathCodec implements ObjectCodec<Path> {
path.getFileSystem(),
fileSystem,
path);
- stringCodec.serialize(path.getPathString(), codedOut);
+ stringCodec.serialize(context, path.getPathString(), codedOut);
}
@Override
- public Path deserialize(CodedInputStream codedIn) throws IOException, SerializationException {
- return fileSystem.getPath(stringCodec.deserialize(codedIn));
+ public Path deserialize(DeserializationContext context, CodedInputStream codedIn)
+ throws IOException, SerializationException {
+ return fileSystem.getPath(stringCodec.deserialize(context, codedIn));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index 88ae732590..2a5eed8552 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -16,7 +16,9 @@ package com.google.devtools.build.lib.vfs;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.actions.CommandLineItem;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrintable;
@@ -732,15 +734,16 @@ public final class PathFragment
}
@Override
- public void serialize(PathFragment pathFragment, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, PathFragment pathFragment, CodedOutputStream codedOut)
throws IOException, SerializationException {
- stringCodec.serialize(pathFragment.getPathString(), codedOut);
+ stringCodec.serialize(context, pathFragment.getPathString(), codedOut);
}
@Override
- public PathFragment deserialize(CodedInputStream codedIn)
+ public PathFragment deserialize(DeserializationContext context, CodedInputStream codedIn)
throws IOException, SerializationException {
- return PathFragment.createAlreadyNormalized(stringCodec.deserialize(codedIn));
+ return PathFragment.createAlreadyNormalized(stringCodec.deserialize(context, codedIn));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Root.java b/src/main/java/com/google/devtools/build/lib/vfs/Root.java
index 0df98c0c9c..73ff687b56 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Root.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Root.java
@@ -15,7 +15,9 @@ package com.google.devtools.build.lib.vfs;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -263,11 +265,15 @@ public interface Root extends Comparable<Root>, Serializable {
}
@Override
- public void serialize(FileSystemProvider dependency, Root obj, CodedOutputStream codedOut)
+ public void serialize(
+ FileSystemProvider dependency,
+ SerializationContext context,
+ Root obj,
+ CodedOutputStream codedOut)
throws SerializationException, IOException {
if (obj instanceof PathRoot) {
codedOut.writeBoolNoTag(false);
- Path.CODEC.serialize(dependency, ((PathRoot) obj).path, codedOut);
+ Path.CODEC.serialize(dependency, context, ((PathRoot) obj).path, codedOut);
} else if (obj instanceof AbsoluteRoot) {
Preconditions.checkArgument(((AbsoluteRoot) obj).fileSystem == dependency.getFileSystem());
codedOut.writeBoolNoTag(true);
@@ -277,13 +283,14 @@ public interface Root extends Comparable<Root>, Serializable {
}
@Override
- public Root deserialize(FileSystemProvider dependency, CodedInputStream codedIn)
+ public Root deserialize(
+ FileSystemProvider dependency, DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
boolean isAbsolute = codedIn.readBool();
if (isAbsolute) {
return dependency.getFileSystem().getAbsoluteRoot();
} else {
- Path path = Path.CODEC.deserialize(dependency, codedIn);
+ Path path = Path.CODEC.deserialize(dependency, context, codedIn);
return new PathRoot(path);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
index 82335c7921..aa3153463d 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
@@ -14,8 +14,10 @@
package com.google.devtools.build.lib.vfs;
import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -138,17 +140,18 @@ public class RootedPath implements Serializable {
}
@Override
- public void serialize(RootedPath rootedPath, CodedOutputStream codedOut)
+ public void serialize(
+ SerializationContext context, RootedPath rootedPath, CodedOutputStream codedOut)
throws IOException, SerializationException {
- rootCodec.serialize(rootedPath.getRoot(), codedOut);
- PathFragment.CODEC.serialize(rootedPath.getRootRelativePath(), codedOut);
+ rootCodec.serialize(context, rootedPath.getRoot(), codedOut);
+ PathFragment.CODEC.serialize(context, rootedPath.getRootRelativePath(), codedOut);
}
@Override
- public RootedPath deserialize(CodedInputStream codedIn)
+ public RootedPath deserialize(DeserializationContext context, CodedInputStream codedIn)
throws IOException, SerializationException {
- Root root = rootCodec.deserialize(codedIn);
- PathFragment rootRelativePath = PathFragment.CODEC.deserialize(codedIn);
+ Root root = rootCodec.deserialize(context, codedIn);
+ PathFragment rootRelativePath = PathFragment.CODEC.deserialize(context, codedIn);
return toRootedPath(root, rootRelativePath);
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java
index 2947249f85..3c3652d903 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageValueTest.java
@@ -25,6 +25,7 @@ import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.PackageCodecDependencies.SimplePackageCodecDependencies;
import com.google.devtools.build.lib.packages.PackageDeserializationException;
import com.google.devtools.build.lib.packages.PackageDeserializerInterface;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
@@ -62,7 +63,7 @@ public class PackageValueTest {
.thenReturn(mockPackage);
CodedInputStream codedIn = CodedInputStream.newInstance(new byte[] {1, 2, 3, 4});
- PackageValue result = underTest.deserialize(codedIn);
+ PackageValue result = underTest.deserialize(DeserializationContext.create(), codedIn);
assertThat(result.getPackage()).isSameAs(mockPackage);
}
@@ -73,7 +74,8 @@ public class PackageValueTest {
doThrow(staged).when(mockDeserializer).deserialize(any(CodedInputStream.class));
try {
- underTest.deserialize(CodedInputStream.newInstance(new byte[] {1, 2, 3, 4}));
+ underTest.deserialize(
+ DeserializationContext.create(), CodedInputStream.newInstance(new byte[] {1, 2, 3, 4}));
fail("Expected exception");
} catch (IllegalStateException e) {
assertThat(e)
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java
index 7e98f045b5..3b84c93353 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java
@@ -52,13 +52,13 @@ public class ObjectCodecsTest {
}
@Override
- public void serialize(Integer obj, CodedOutputStream codedOut)
+ public void serialize(SerializationContext context, Integer obj, CodedOutputStream codedOut)
throws SerializationException, IOException {
codedOut.writeInt32NoTag(obj);
}
@Override
- public Integer deserialize(CodedInputStream codedIn)
+ public Integer deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
return codedIn.readInt32();
}
@@ -93,15 +93,17 @@ public class ObjectCodecsTest {
new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws IOException {
- CodedOutputStream codedOutArg = (CodedOutputStream) invocation.getArguments()[1];
+ CodedOutputStream codedOutArg = (CodedOutputStream) invocation.getArguments()[2];
codedOutArg.writeInt32NoTag(42);
return null;
}
})
.when(spyObjectCodec)
- .serialize(eq(original), any(CodedOutputStream.class));
+ .serialize(any(SerializationContext.class), eq(original), any(CodedOutputStream.class));
ArgumentCaptor<CodedInputStream> captor = ArgumentCaptor.forClass(CodedInputStream.class);
- doReturn(original).when(spyObjectCodec).deserialize(captor.capture());
+ doReturn(original)
+ .when(spyObjectCodec)
+ .deserialize(any(DeserializationContext.class), captor.capture());
ByteString serialized = underTest.serialize(KNOWN_CLASSIFIER, original);
Object deserialized = underTest.deserialize(KNOWN_CLASSIFIER_BYTES, serialized);
@@ -128,8 +130,11 @@ public class ObjectCodecsTest {
Object deserialized = underTest.deserialize(UNKNOWN_CLASSIFIER_BYTES, serialized);
assertThat(deserialized).isEqualTo(original);
- verify(spyObjectCodec, never()).serialize(any(Integer.class), any(CodedOutputStream.class));
- verify(spyObjectCodec, never()).deserialize(any(CodedInputStream.class));
+ verify(spyObjectCodec, never())
+ .serialize(
+ any(SerializationContext.class), any(Integer.class), any(CodedOutputStream.class));
+ verify(spyObjectCodec, never())
+ .deserialize(any(DeserializationContext.class), any(CodedInputStream.class));
}
@Test
@@ -137,7 +142,9 @@ public class ObjectCodecsTest {
Integer original = Integer.valueOf(12345);
SerializationException staged = new SerializationException("BECAUSE FAIL");
- doThrow(staged).when(spyObjectCodec).serialize(eq(original), any(CodedOutputStream.class));
+ doThrow(staged)
+ .when(spyObjectCodec)
+ .serialize(any(SerializationContext.class), eq(original), any(CodedOutputStream.class));
try {
underTest.serialize(KNOWN_CLASSIFIER, original);
fail("Expected exception");
@@ -152,7 +159,9 @@ public class ObjectCodecsTest {
Integer original = Integer.valueOf(12345);
IOException staged = new IOException("BECAUSE FAIL");
- doThrow(staged).when(spyObjectCodec).serialize(eq(original), any(CodedOutputStream.class));
+ doThrow(staged)
+ .when(spyObjectCodec)
+ .serialize(any(SerializationContext.class), eq(original), any(CodedOutputStream.class));
try {
underTest.serialize(KNOWN_CLASSIFIER, original);
fail("Expected exception");
@@ -164,7 +173,9 @@ public class ObjectCodecsTest {
@Test
public void testDeserializePropagatesSerializationExceptionFromCustomCodec() throws Exception {
SerializationException staged = new SerializationException("BECAUSE FAIL");
- doThrow(staged).when(spyObjectCodec).deserialize(any(CodedInputStream.class));
+ doThrow(staged)
+ .when(spyObjectCodec)
+ .deserialize(any(DeserializationContext.class), any(CodedInputStream.class));
try {
underTest.deserialize(KNOWN_CLASSIFIER_BYTES, ByteString.EMPTY);
fail("Expected exception");
@@ -177,7 +188,9 @@ public class ObjectCodecsTest {
public void testDeserializePropagatesIOExceptionFromCustomCodecAsSerializationException()
throws Exception {
IOException staged = new IOException("BECAUSE FAIL");
- doThrow(staged).when(spyObjectCodec).deserialize(any(CodedInputStream.class));
+ doThrow(staged)
+ .when(spyObjectCodec)
+ .deserialize(any(DeserializationContext.class), any(CodedInputStream.class));
try {
underTest.deserialize(KNOWN_CLASSIFIER_BYTES, ByteString.EMPTY);
fail("Expected exception");
@@ -213,9 +226,9 @@ public class ObjectCodecsTest {
public void testSerializeFailsWhenNoCustomCodecAndFallbackDisabled() throws Exception {
ObjectCodecs underTest = new ObjectCodecs(
ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build());
- SerializationException.NoCodecException expected = expectThrows(
- SerializationException.NoCodecException.class,
- () -> underTest.serialize("X", "Y"));
+ SerializationException.NoCodecException expected =
+ expectThrows(
+ SerializationException.NoCodecException.class, () -> underTest.serialize("X", "Y"));
assertThat(expected)
.hasMessageThat()
.isEqualTo("No codec available for X and default fallback disabled");
@@ -226,9 +239,10 @@ public class ObjectCodecsTest {
ByteString serialized = ByteString.copyFromUtf8("doesn't matter");
ObjectCodecs underTest = new ObjectCodecs(
ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build());
- SerializationException.NoCodecException expected = expectThrows(
- SerializationException.NoCodecException.class,
- () -> underTest.deserialize(ByteString.copyFromUtf8("X"), serialized));
+ SerializationException.NoCodecException expected =
+ expectThrows(
+ SerializationException.NoCodecException.class,
+ () -> underTest.deserialize(ByteString.copyFromUtf8("X"), serialized));
assertThat(expected)
.hasMessageThat()