Skip to content

Commit

Permalink
Implement @AutoCodec.Interner code generation.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 587149949
Change-Id: Iaa2a1328ede8e97e4ec67a3a07b9f4961f9ec959
  • Loading branch information
aoeui authored and copybara-github committed Dec 2, 2023
1 parent 0226327 commit 9aca477
Show file tree
Hide file tree
Showing 6 changed files with 708 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,16 @@ public double[] deserializeArrayData(CodedInputStream codedIn, int length)
}
};

/**
* Handles possibly nested arrays of {@code Object} or any type derived from {@code Object}.
*
* <p>This processor observes the nesting level of the array by reflective operations on the
* {@code type} parameter passed into its methods. It similarly uses reflective calls to create
* nested arrays of appropriate type and nesting level.
*
* <p>Finally, at the leaf level, it uses the {@code (Ser|Deser)ializationContext} to apply codecs
* to the base array components.
*/
public static final ArrayProcessor OBJECT_ARRAY_PROCESSOR =
new ArrayProcessor() {
// Special case uses `Array.newInstance` to also create leaf-level arrays. Additionally,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright 2023 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.protobuf.CodedInputStream;
import java.io.IOException;

/** Codec variant that interns the deserialization result. */
public abstract class InterningObjectCodec<T> implements ObjectCodec<T> {

@Override
public final MemoizationStrategy getStrategy() {
// There is no fixed reference to an interned object until after it has been constructed and
// passes through the interner. Therefore this is always MEMOIZE_AFTER.
return MemoizationStrategy.MEMOIZE_AFTER;
}

/**
* Adapter for synchronous contexts.
*
* <p>Deserializes using {@link #deserializeInterned} then calls {@link #intern} on the result.
*/
@Override
public final T deserialize(DeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException {
return intern(deserializeInterned(context, codedIn));
}

/** Performs the (async) deserialization work. */
public abstract T deserializeInterned(
AsyncDeserializationContext context, CodedInputStream codedIn)
throws SerializationException, IOException;

/** Interns the result of {@link #deserializeInterned}. */
public abstract T intern(T value);
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ java_library(
deps = [
":serialization-processing-exception",
"//third_party:guava",
"//third_party:jsr305",
"//third_party/java/javapoet",
],
)
Expand Down Expand Up @@ -110,6 +111,8 @@ java_library(
"CodecGenerator.java",
"FieldGenerator.java",
"Initializers.java",
"InterningObjectCodecFieldGenerators.java",
"InterningObjectCodecGenerator.java",
"Marshallers.java",
"SerializationCodeGenerator.java",
],
Expand Down
Loading

0 comments on commit 9aca477

Please sign in to comment.