From 7e02f374901ff471db5140f415de157ac6243050 Mon Sep 17 00:00:00 2001 From: Tom Chao Date: Mon, 11 Nov 2013 11:22:02 -0800 Subject: Minimize method count for nanoproto. - Migrates getCachedSize to the MessageNano parent class to save one method per message. - Create ExtendableMessageNano parent class for protos with extensions, this saves the getExtension and setExtension methods on the relevant messages. - getSerializedSize's default case (with no fields to serialize) also migrate to the parent class, which saves methods on empty messages. - Container classes become interfaces to save the constructor. Change-Id: I81f1a1b6d6a660096835e9df3ea20456655aab4a --- .../protobuf/compiler/javanano/javanano_file.cc | 4 +- .../protobuf/compiler/javanano/javanano_message.cc | 85 +++++++--------------- 2 files changed, 28 insertions(+), 61 deletions(-) (limited to 'src') diff --git a/src/google/protobuf/compiler/javanano/javanano_file.cc b/src/google/protobuf/compiler/javanano/javanano_file.cc index 4e9fe0a..bdc51c4 100644 --- a/src/google/protobuf/compiler/javanano/javanano_file.cc +++ b/src/google/protobuf/compiler/javanano/javanano_file.cc @@ -177,9 +177,7 @@ void FileGenerator::Generate(io::Printer* printer) { printer->Print( "\n" "@SuppressWarnings(\"hiding\")\n" - "public final class $classname$ {\n" - " \n" - " private $classname$() {}\n", + "public interface $classname$ {\n", "classname", classname_); printer->Indent(); diff --git a/src/google/protobuf/compiler/javanano/javanano_message.cc b/src/google/protobuf/compiler/javanano/javanano_message.cc index 63f8955..901870f 100644 --- a/src/google/protobuf/compiler/javanano/javanano_message.cc +++ b/src/google/protobuf/compiler/javanano/javanano_message.cc @@ -139,16 +139,21 @@ void MessageGenerator::Generate(io::Printer* printer) { printer->Print( "\n" "@SuppressWarnings(\"hiding\")\n" - "public final class $classname$ extends\n" - " com.google.protobuf.nano.MessageNano {\n", + "public final class $classname$ extends\n", "classname", descriptor_->name()); } else { printer->Print( "\n" - "public static final class $classname$ extends\n" - " com.google.protobuf.nano.MessageNano {\n", + "public static final class $classname$ extends\n", "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->Print( "\n" @@ -159,13 +164,6 @@ void MessageGenerator::Generate(io::Printer* printer) { "}\n", "classname", descriptor_->name()); - if (params_.store_unknown_fields()) { - printer->Print( - "\n" - "private java.util.List\n" - " unknownFieldData;\n"); - } - // Nested types and extensions for (int i = 0; i < descriptor_->extension_count(); i++) { ExtensionGenerator(descriptor_->extension(i), params_).Generate(printer); @@ -203,25 +201,6 @@ void MessageGenerator::Generate(io::Printer* 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 getExtension(com.google.protobuf.nano.Extension extension) {\n" - " return com.google.protobuf.nano.WireFormatNano.getExtension(\n" - " extension, unknownFieldData);\n" - "}\n" - "\n" - "public void setExtension(com.google.protobuf.nano.Extension extension, T value) {\n" - " if (unknownFieldData == null) {\n" - " unknownFieldData =\n" - " new java.util.ArrayList();\n" - " }\n" - " com.google.protobuf.nano.WireFormatNano.setExtension(\n" - " extension, value, unknownFieldData);\n" - "}\n"); - } GenerateMessageSerializationMethods(printer); GenerateMergeFromMethods(printer); GenerateParseFromMethods(printer); @@ -265,38 +244,28 @@ GenerateMessageSerializationMethods(io::Printer* printer) { } printer->Outdent(); - 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" - "@Override\n" - "public int getSerializedSize() {\n" - " int size = 0;\n"); - printer->Indent(); + printer->Print("}\n"); - for (int i = 0; i < descriptor_->field_count(); i++) { - field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer); - } + // Rely on the parent implementation of getSerializedSize if there are no fields to + // serialize in this MessageNano. + if (descriptor_->field_count() != 0) { + printer->Print( + "\n" + "@Override\n" + "public int getSerializedSize() {\n" + " int size = super.getSerializedSize();\n"); + printer->Indent(); - if (params_.store_unknown_fields()) { + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer); + } + + printer->Outdent(); printer->Print( - "size += com.google.protobuf.nano.WireFormatNano.computeWireSize(unknownFieldData);\n"); + " cachedSize = size;\n" + " return size;\n" + "}\n"); } - - printer->Outdent(); - printer->Print( - " cachedSize = size;\n" - " return size;\n" - "}\n"); } void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) { -- cgit v1.1