• Feng Xiao's avatar
    Fix compatiblity issues. · 1bce70dd
    Feng Xiao authored
    Currently some public API methods are defined in GenreatedMessage.java
    and they have a generric return type:
      class GeneratedMessage {
        class Builder<BuilderType extends Builder<BuilderType>> {
          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<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
    1bce70dd
Name
Last commit
Last update
benchmarks Loading commit data...
cmake Loading commit data...
conformance Loading commit data...
csharp Loading commit data...
docs Loading commit data...
editors Loading commit data...
examples Loading commit data...
java Loading commit data...
javanano Loading commit data...
jenkins Loading commit data...
js Loading commit data...
m4 Loading commit data...
more_tests Loading commit data...
objectivec Loading commit data...
php Loading commit data...
protoc-artifacts Loading commit data...
python Loading commit data...
ruby Loading commit data...
src Loading commit data...
util/python Loading commit data...
.gitignore Loading commit data...
.travis.yml Loading commit data...
BUILD Loading commit data...
CHANGES.txt Loading commit data...
CONTRIBUTORS.txt Loading commit data...
LICENSE Loading commit data...
Makefile.am Loading commit data...
Protobuf.podspec Loading commit data...
README.md Loading commit data...
WORKSPACE Loading commit data...
appveyor.bat Loading commit data...
appveyor.yml Loading commit data...
autogen.sh Loading commit data...
configure.ac Loading commit data...
generate_descriptor_proto.sh Loading commit data...
gmock.BUILD Loading commit data...
post_process_dist.sh Loading commit data...
protobuf-lite.pc.in Loading commit data...
protobuf.bzl Loading commit data...
protobuf.pc.in Loading commit data...
six.BUILD Loading commit data...
tests.sh Loading commit data...
update_file_lists.sh Loading commit data...