From ee5bf489c45bd41e63acecad349f13b594729f51 Mon Sep 17 00:00:00 2001 From: janakr Date: Mon, 26 Mar 2018 10:55:59 -0700 Subject: Add AspectCodec. Can't be @AutoCodec because we don't want to serialize the full content of native aspects. PiperOrigin-RevId: 190489694 --- .../google/devtools/build/lib/packages/Aspect.java | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/main/java/com/google/devtools/build/lib/packages/Aspect.java') diff --git a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java index 14e9d5dbf0..b0ccfe6c4e 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java @@ -15,6 +15,13 @@ package com.google.devtools.build.lib.packages; import com.google.common.base.Preconditions; 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.skyframe.serialization.SerializationException; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -105,4 +112,40 @@ public final class Aspect implements DependencyFilter.AttributeInfoProvider { // All aspect attributes are implicit. return false; } + + /** {@link ObjectCodec} for {@link Aspect}. */ + static class AspectCodec implements ObjectCodec { + @Override + public Class getEncodedClass() { + return Aspect.class; + } + + @Override + public void serialize(SerializationContext context, Aspect obj, CodedOutputStream codedOut) + throws SerializationException, IOException { + context.serialize(obj.getDescriptor(), codedOut); + boolean nativeAspect = obj.getDescriptor().getAspectClass() instanceof NativeAspectClass; + codedOut.writeBoolNoTag(nativeAspect); + if (!nativeAspect) { + context.serialize(obj.getDefinition(), codedOut); + } + } + + @Override + public Aspect deserialize(DeserializationContext context, CodedInputStream codedIn) + throws SerializationException, IOException { + AspectDescriptor aspectDescriptor = context.deserialize(codedIn); + if (codedIn.readBool()) { + return forNative( + (NativeAspectClass) aspectDescriptor.getAspectClass(), + aspectDescriptor.getParameters()); + } else { + AspectDefinition aspectDefinition = context.deserialize(codedIn); + return forSkylark( + (SkylarkAspectClass) aspectDescriptor.getAspectClass(), + aspectDefinition, + aspectDescriptor.getParameters()); + } + } + } } -- cgit v1.2.3