Merge "Minimize method count for nanoproto."

pull/91/head
Max Cai 11 years ago committed by Gerrit Code Review
commit 335140f28a
  1. 70
      java/src/main/java/com/google/protobuf/nano/ExtendableMessageNano.java
  2. 16
      java/src/main/java/com/google/protobuf/nano/MessageNano.java
  3. 4
      src/google/protobuf/compiler/javanano/javanano_file.cc
  4. 63
      src/google/protobuf/compiler/javanano/javanano_message.cc

@ -0,0 +1,70 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2013 Google Inc. All rights reserved.
// http://code.google.com/p/protobuf/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package com.google.protobuf.nano;
import java.util.ArrayList;
import java.util.List;
/**
* Base class of those Protocol Buffer messages that need to store unknown fields,
* such as extensions.
*/
public abstract class ExtendableMessageNano extends MessageNano {
/**
* A container for fields unknown to the message, including extensions. Extension fields can
* can be accessed through the {@link getExtension()} and {@link setExtension()} methods.
*/
protected List<UnknownFieldData> unknownFieldData;
@Override
public int getSerializedSize() {
int size = WireFormatNano.computeWireSize(unknownFieldData);
cachedSize = size;
return size;
}
/**
* Gets the value stored in the specified extension of this message.
*/
public <T> T getExtension(Extension<T> extension) {
return WireFormatNano.getExtension(extension, unknownFieldData);
}
/**
* Sets the value of the specified extension of this message.
*/
public <T> void setExtension(Extension<T> extension, T value) {
if (unknownFieldData == null) {
unknownFieldData = new ArrayList<UnknownFieldData>();
}
WireFormatNano.setExtension(extension, value, unknownFieldData);
}
}

@ -38,6 +38,8 @@ import java.io.IOException;
* @author wink@google.com Wink Saville * @author wink@google.com Wink Saville
*/ */
public abstract class MessageNano { public abstract class MessageNano {
protected int cachedSize = -1;
/** /**
* Get the number of bytes required to encode this message. * Get the number of bytes required to encode this message.
* Returns the cached size or calls getSerializedSize which * Returns the cached size or calls getSerializedSize which
@ -45,14 +47,24 @@ public abstract class MessageNano {
* so the size is only computed once. If a member is modified * so the size is only computed once. If a member is modified
* then this could be stale call getSerializedSize if in doubt. * then this could be stale call getSerializedSize if in doubt.
*/ */
abstract public int getCachedSize(); public int getCachedSize() {
if (cachedSize < 0) {
// getSerializedSize sets cachedSize
getSerializedSize();
}
return cachedSize;
}
/** /**
* Computes the number of bytes required to encode this message. * Computes the number of bytes required to encode this message.
* The size is cached and the cached result can be retrieved * The size is cached and the cached result can be retrieved
* using getCachedSize(). * using getCachedSize().
*/ */
abstract public int getSerializedSize(); public int getSerializedSize() {
// This is overridden if the generated message has serialized fields.
cachedSize = 0;
return 0;
}
/** /**
* Serializes the message and writes it to {@code output}. This does not * Serializes the message and writes it to {@code output}. This does not

@ -177,9 +177,7 @@ void FileGenerator::Generate(io::Printer* printer) {
printer->Print( printer->Print(
"\n" "\n"
"@SuppressWarnings(\"hiding\")\n" "@SuppressWarnings(\"hiding\")\n"
"public final class $classname$ {\n" "public interface $classname$ {\n",
" \n"
" private $classname$() {}\n",
"classname", classname_); "classname", classname_);
printer->Indent(); printer->Indent();

@ -139,16 +139,21 @@ void MessageGenerator::Generate(io::Printer* printer) {
printer->Print( printer->Print(
"\n" "\n"
"@SuppressWarnings(\"hiding\")\n" "@SuppressWarnings(\"hiding\")\n"
"public final class $classname$ extends\n" "public final class $classname$ extends\n",
" com.google.protobuf.nano.MessageNano {\n",
"classname", descriptor_->name()); "classname", descriptor_->name());
} else { } else {
printer->Print( printer->Print(
"\n" "\n"
"public static final class $classname$ extends\n" "public static final class $classname$ extends\n",
" com.google.protobuf.nano.MessageNano {\n",
"classname", descriptor_->name()); "classname", descriptor_->name());
} }
if (params_.store_unknown_fields()) {
printer->Print(
" com.google.protobuf.nano.ExtendableMessageNano {\n");
} else {
printer->Print(
" com.google.protobuf.nano.MessageNano {\n");
}
printer->Indent(); printer->Indent();
printer->Print( printer->Print(
"\n" "\n"
@ -159,13 +164,6 @@ void MessageGenerator::Generate(io::Printer* printer) {
"}\n", "}\n",
"classname", descriptor_->name()); "classname", descriptor_->name());
if (params_.store_unknown_fields()) {
printer->Print(
"\n"
"private java.util.List<com.google.protobuf.nano.UnknownFieldData>\n"
" unknownFieldData;\n");
}
// Nested types and extensions // Nested types and extensions
for (int i = 0; i < descriptor_->extension_count(); i++) { for (int i = 0; i < descriptor_->extension_count(); i++) {
ExtensionGenerator(descriptor_->extension(i), params_).Generate(printer); ExtensionGenerator(descriptor_->extension(i), params_).Generate(printer);
@ -203,25 +201,6 @@ void MessageGenerator::Generate(io::Printer* printer) {
GenerateHashCode(printer); GenerateHashCode(printer);
} }
// If we have an extension range, generate accessors for extensions.
if (params_.store_unknown_fields()
&& descriptor_->extension_range_count() > 0) {
printer->Print(
"\n"
"public <T> T getExtension(com.google.protobuf.nano.Extension<T> extension) {\n"
" return com.google.protobuf.nano.WireFormatNano.getExtension(\n"
" extension, unknownFieldData);\n"
"}\n"
"\n"
"public <T> void setExtension(com.google.protobuf.nano.Extension<T> extension, T value) {\n"
" if (unknownFieldData == null) {\n"
" unknownFieldData =\n"
" new java.util.ArrayList<com.google.protobuf.nano.UnknownFieldData>();\n"
" }\n"
" com.google.protobuf.nano.WireFormatNano.setExtension(\n"
" extension, value, unknownFieldData);\n"
"}\n");
}
GenerateMessageSerializationMethods(printer); GenerateMessageSerializationMethods(printer);
GenerateMergeFromMethods(printer); GenerateMergeFromMethods(printer);
GenerateParseFromMethods(printer); GenerateParseFromMethods(printer);
@ -265,38 +244,28 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
} }
printer->Outdent(); printer->Outdent();
printer->Print("}\n");
// Rely on the parent implementation of getSerializedSize if there are no fields to
// serialize in this MessageNano.
if (descriptor_->field_count() != 0) {
printer->Print( printer->Print(
"}\n"
"\n"
"private int cachedSize;\n"
"@Override\n"
"public int getCachedSize() {\n"
" if (cachedSize < 0) {\n"
" // getSerializedSize sets cachedSize\n"
" getSerializedSize();\n"
" }\n"
" return cachedSize;\n"
"}\n"
"\n" "\n"
"@Override\n" "@Override\n"
"public int getSerializedSize() {\n" "public int getSerializedSize() {\n"
" int size = 0;\n"); " int size = super.getSerializedSize();\n");
printer->Indent(); printer->Indent();
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer); field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer);
} }
if (params_.store_unknown_fields()) {
printer->Print(
"size += com.google.protobuf.nano.WireFormatNano.computeWireSize(unknownFieldData);\n");
}
printer->Outdent(); printer->Outdent();
printer->Print( printer->Print(
" cachedSize = size;\n" " cachedSize = size;\n"
" return size;\n" " return size;\n"
"}\n"); "}\n");
}
} }
void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) { void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) {

Loading…
Cancel
Save