From 1bce70dddb57aa82c3e6a74b072f6a742f47c900 Mon Sep 17 00:00:00 2001 From: Feng Xiao Date: Thu, 14 Jul 2016 15:33:45 -0700 Subject: Fix compatiblity issues. Currently some public API methods are defined in GenreatedMessage.java and they have a generric return type: class GeneratedMessage { class Builder> { public BuilderType setField(...); public BuilderType setExtension(...); } } With these definitions, the compiled byte code of a callsite will have a direct reference to GeneratedMessage. For example: fooBuilder.setField(...); becomes: ##: invokevirtual // Method Builder.setField:(...)LGeneratedMessage.Builder ##: checkcast // class Builder This will prevent us from updating generated classes to subclass a different versioned GeneratedMessageV3 class in the future (we can't do it in a binary compatible way). This change addresses the problem by overriding these methods directly in the generated class: class Foo { class Builder extends GeneratedMessage.Builder { public Builder setField(...) { return super.setField(...); } } } After this, fooBuilder.setField(...) will be compiled to: ##: invokevirtual // Method Builder.setField:(...)LFoo.Builder The callsites will no longer reference GeneratedMessage directly and we can change Foo to subclass GeneratedMessageV3 without breaking binary compatiblity. The downside of this change is: 1. It increases generated code size (though it saves some instructions on the callsites). 2. We can never stop generating these overrides because doing that will break binary compatibility. Change-Id: I879afbbc1325a66324a51565e017143489b06e97 --- java/core/src/main/java/com/google/protobuf/GeneratedMessage.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'java/core') diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java index 2c87302b..cea05794 100644 --- a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java +++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java @@ -1396,7 +1396,7 @@ public abstract class GeneratedMessage extends AbstractMessage return setExtension((ExtensionLite) extension, value); } /** Set the value of an extension. */ - public final BuilderType setExtension( + public BuilderType setExtension( final GeneratedExtension extension, final Type value) { return setExtension((ExtensionLite) extension, value); } @@ -1407,7 +1407,7 @@ public abstract class GeneratedMessage extends AbstractMessage return setExtension((ExtensionLite>) extension, index, value); } /** Set the value of one element of a repeated extension. */ - public final BuilderType setExtension( + public BuilderType setExtension( final GeneratedExtension> extension, final int index, final Type value) { return setExtension((ExtensionLite>) extension, index, value); @@ -1418,7 +1418,7 @@ public abstract class GeneratedMessage extends AbstractMessage return addExtension((ExtensionLite>) extension, value); } /** Append a value to a repeated extension. */ - public final BuilderType addExtension( + public BuilderType addExtension( final GeneratedExtension> extension, final Type value) { return addExtension((ExtensionLite>) extension, value); } @@ -1428,7 +1428,7 @@ public abstract class GeneratedMessage extends AbstractMessage return clearExtension((ExtensionLite) extension); } /** Clear an extension. */ - public final BuilderType clearExtension( + public BuilderType clearExtension( final GeneratedExtension extension) { return clearExtension((ExtensionLite) extension); } -- cgit v1.2.3