Skip to content
Draft

Internal #25674

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions java/core/src/main/java/com/google/protobuf/FieldSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,16 @@ public Object getField(final T descriptor) {
return o;
}

/** Returns the LazyField if it exists, or null otherwise. */
@SuppressWarnings({"ReturnMissingNullable", "PatternMatchingInstanceof"})
LazyField getLazyField(final T descriptor) {
Object o = fields.get(descriptor);
if (o instanceof LazyField) {
return (LazyField) o;
}
return null;
}

/** Returns true if the field is a lazy field and it is corrupted. */
boolean lazyFieldCorrupted(final T descriptor) {
Object o = fields.get(descriptor);
Expand Down Expand Up @@ -1137,6 +1147,16 @@ public Object getField(final T descriptor) {
return replaceBuilders(descriptor, value, true);
}

/** Returns the LazyField if it exists, or null otherwise. */
@SuppressWarnings({"ReturnMissingNullable", "PatternMatchingInstanceof"})
public LazyField getLazyField(final T descriptor) {
Object value = fields.get(descriptor);
if (value instanceof LazyField) {
return (LazyField) value;
}
return null;
}

/** Same as {@link #getField(F)}, but allow a {@link MessageLite.Builder} to be returned. */
Object getFieldAllowBuilders(final T descriptor) {
Object o = fields.get(descriptor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,9 +331,19 @@ void mergeMessage(
CodedInputStream input,
ExtensionRegistryLite extensionRegistry,
FieldDescriptor field,
Message defaultInstance)
Message defaultInstance,
boolean lazy)
throws IOException;

default void mergeMessage(
CodedInputStream input,
ExtensionRegistryLite extensionRegistry,
FieldDescriptor field,
Message defaultInstance)
throws IOException {
mergeMessage(input, extensionRegistry, field, defaultInstance, /* lazy= */ false);
}

/** Returns the UTF8 validation level for the field. */
WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor);

Expand Down Expand Up @@ -569,7 +579,8 @@ public void mergeMessage(
CodedInputStream input,
ExtensionRegistryLite extensionRegistry,
Descriptors.FieldDescriptor field,
Message defaultInstance)
Message defaultInstance,
boolean lazy)
throws IOException {
if (!field.isRepeated()) {
Message.Builder subBuilder;
Expand Down Expand Up @@ -801,15 +812,28 @@ public void mergeMessage(
CodedInputStream input,
ExtensionRegistryLite extensionRegistry,
FieldDescriptor field,
Message defaultInstance)
Message defaultInstance,
boolean lazy)
throws IOException {
if (!field.isRepeated()) {
if (hasField(field)) {
// If the field is present and lazy, merge the bytes into the lazy field.
LazyField lazyField = extensions.getLazyField(field);
if (lazyField != null) {
lazyField.mergeFrom(input, extensionRegistry);
return;
}
MessageLite.Builder current = ((MessageLite) getField(field)).toBuilder();
input.readMessage(current, extensionRegistry);
Object unused = setField(field, current.buildPartial());
return;
}
if (lazy) {
LazyField lazyField =
new LazyField(defaultInstance, extensionRegistry, input.readBytes());
extensions.setField(field, lazyField);
return;
}
Message.Builder subBuilder = defaultInstance.newBuilderForType();
input.readMessage(subBuilder, extensionRegistry);
Object unused = setField(field, subBuilder.buildPartial());
Expand Down Expand Up @@ -1022,10 +1046,17 @@ public void mergeMessage(
CodedInputStream input,
ExtensionRegistryLite extensionRegistry,
FieldDescriptor field,
Message defaultInstance)
Message defaultInstance,
boolean lazy)
throws IOException {
if (!field.isRepeated()) {
if (hasField(field)) {
// If the field is present and lazy, merge the bytes into the lazy field.
LazyField lazyField = extensions.getLazyField(field);
if (lazyField != null) {
lazyField.mergeFrom(input, extensionRegistry);
return;
}
Object fieldOrBuilder = extensions.getFieldAllowBuilders(field);
MessageLite.Builder subBuilder;
if (fieldOrBuilder instanceof MessageLite.Builder) {
Expand All @@ -1037,6 +1068,12 @@ public void mergeMessage(
input.readMessage(subBuilder, extensionRegistry);
return;
}
if (lazy) {
LazyField lazyField =
new LazyField(defaultInstance, extensionRegistry, input.readBytes());
extensions.setField(field, lazyField);
return;
}
Message.Builder subBuilder = defaultInstance.newBuilderForType();
input.readMessage(subBuilder, extensionRegistry);
Object unused = setField(field, subBuilder);
Expand Down Expand Up @@ -1111,6 +1148,25 @@ static boolean mergeFieldFrom(
MergeTarget target,
int tag)
throws IOException {
return mergeFieldFrom(
input,
unknownFields,
extensionRegistry,
type,
target,
tag,
/* allowUnverifiedLazyExtensions= */ false);
}

static boolean mergeFieldFrom(
CodedInputStream input,
UnknownFieldSet.Builder unknownFields,
ExtensionRegistryLite extensionRegistry,
Descriptors.Descriptor type,
MergeTarget target,
int tag,
boolean allowUnverifiedLazyExtensions)
throws IOException {
if (type.getOptions().getMessageSetWireFormat() && tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
mergeMessageSetExtensionFromCodedStream(
input, unknownFields, extensionRegistry, type, target);
Expand Down Expand Up @@ -1215,7 +1271,8 @@ static boolean mergeFieldFrom(
}
case MESSAGE:
{
target.mergeMessage(input, extensionRegistry, field, defaultInstance);
target.mergeMessage(
input, extensionRegistry, field, defaultInstance, allowUnverifiedLazyExtensions);
return true;
}
case ENUM:
Expand Down
Loading