Index: third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc b/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
index c81723304f35792538cefa87ecdf094f0ba5e21c..c53aae6b6ac01c82e3b08e4e36199d0b46eb0bfb 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
@@ -177,7 +177,7 @@ void MaybeRestartJavaMethod(io::Printer* printer, |
// since otherwise we hit a hardcoded limit in the jvm and javac will |
// then fail with the error "code too large". This limit lets our |
// estimates be off by a factor of two and still we're okay. |
- static const int bytesPerMethod = 1<<15; // aka 32K |
+ static const int bytesPerMethod = kMaxStaticSize; |
if ((*bytecode_estimate) > bytesPerMethod) { |
++(*method_num); |
@@ -193,7 +193,8 @@ void MaybeRestartJavaMethod(io::Printer* printer, |
} // namespace |
-FileGenerator::FileGenerator(const FileDescriptor* file, bool immutable_api) |
+FileGenerator::FileGenerator(const FileDescriptor* file, bool immutable_api, |
+ bool enforce_lite) |
: file_(file), |
java_package_(FileJavaPackage(file, immutable_api)), |
message_generators_( |
@@ -204,6 +205,7 @@ FileGenerator::FileGenerator(const FileDescriptor* file, bool immutable_api) |
name_resolver_(context_->GetNameResolver()), |
immutable_api_(immutable_api) { |
classname_ = name_resolver_->GetFileClassName(file, immutable_api); |
+ context_->SetEnforceLite(enforce_lite); |
generator_factory_.reset( |
new ImmutableGeneratorFactory(context_.get())); |
for (int i = 0; i < file_->message_type_count(); ++i) { |
@@ -262,7 +264,8 @@ void FileGenerator::Generate(io::Printer* printer) { |
printer->Print( |
"public static void registerAllExtensions(\n" |
" com.google.protobuf.ExtensionRegistry$lite$ registry) {\n", |
- "lite", HasDescriptorMethods(file_) ? "" : "Lite"); |
+ "lite", |
+ HasDescriptorMethods(file_, context_->EnforceLite()) ? "" : "Lite"); |
printer->Indent(); |
@@ -282,7 +285,7 @@ void FileGenerator::Generate(io::Printer* printer) { |
if (!MultipleJavaFiles(file_, immutable_api_)) { |
for (int i = 0; i < file_->enum_type_count(); i++) { |
- if (HasDescriptorMethods(file_)) { |
+ if (HasDescriptorMethods(file_, context_->EnforceLite())) { |
EnumGenerator(file_->enum_type(i), immutable_api_, context_.get()) |
.Generate(printer); |
} else { |
@@ -294,7 +297,7 @@ void FileGenerator::Generate(io::Printer* printer) { |
message_generators_[i]->GenerateInterface(printer); |
message_generators_[i]->Generate(printer); |
} |
- if (HasGenericServices(file_)) { |
+ if (HasGenericServices(file_, context_->EnforceLite())) { |
for (int i = 0; i < file_->service_count(); i++) { |
google::protobuf::scoped_ptr<ServiceGenerator> generator( |
generator_factory_->NewServiceGenerator(file_->service(i))); |
@@ -309,14 +312,18 @@ void FileGenerator::Generate(io::Printer* printer) { |
extension_generators_[i]->Generate(printer); |
} |
- // Static variables. |
+ // Static variables. We'd like them to be final if possible, but due to |
+ // the JVM's 64k size limit on static blocks, we have to initialize some |
+ // of them in methods; thus they cannot be final. |
+ int static_block_bytecode_estimate = 0; |
for (int i = 0; i < file_->message_type_count(); i++) { |
- message_generators_[i]->GenerateStaticVariables(printer); |
+ message_generators_[i]->GenerateStaticVariables( |
+ printer, &static_block_bytecode_estimate); |
} |
printer->Print("\n"); |
- if (HasDescriptorMethods(file_)) { |
+ if (HasDescriptorMethods(file_, context_->EnforceLite())) { |
if (immutable_api_) { |
GenerateDescriptorInitializationCodeForImmutable(printer); |
} else { |
@@ -358,9 +365,11 @@ void FileGenerator::GenerateDescriptorInitializationCodeForImmutable( |
" getDescriptor() {\n" |
" return descriptor;\n" |
"}\n" |
- "private static com.google.protobuf.Descriptors.FileDescriptor\n" |
+ "private static $final$ com.google.protobuf.Descriptors.FileDescriptor\n" |
" descriptor;\n" |
- "static {\n"); |
+ "static {\n", |
+ // TODO(dweis): Mark this as final. |
+ "final", ""); |
printer->Indent(); |
SharedCodeGenerator shared_code_generator(file_); |
@@ -453,7 +462,7 @@ void FileGenerator::GenerateDescriptorInitializationCodeForMutable(io::Printer* |
" getDescriptor() {\n" |
" return descriptor;\n" |
"}\n" |
- "private static com.google.protobuf.Descriptors.FileDescriptor\n" |
+ "private static final com.google.protobuf.Descriptors.FileDescriptor\n" |
" descriptor;\n" |
"static {\n"); |
printer->Indent(); |
@@ -549,7 +558,7 @@ void FileGenerator::GenerateSiblings(const string& package_dir, |
vector<string>* file_list) { |
if (MultipleJavaFiles(file_, immutable_api_)) { |
for (int i = 0; i < file_->enum_type_count(); i++) { |
- if (HasDescriptorMethods(file_)) { |
+ if (HasDescriptorMethods(file_, context_->EnforceLite())) { |
EnumGenerator generator(file_->enum_type(i), immutable_api_, |
context_.get()); |
GenerateSibling<EnumGenerator>(package_dir, java_package_, |
@@ -582,7 +591,7 @@ void FileGenerator::GenerateSiblings(const string& package_dir, |
message_generators_[i].get(), |
&MessageGenerator::Generate); |
} |
- if (HasGenericServices(file_)) { |
+ if (HasGenericServices(file_, context_->EnforceLite())) { |
for (int i = 0; i < file_->service_count(); i++) { |
google::protobuf::scoped_ptr<ServiceGenerator> generator( |
generator_factory_->NewServiceGenerator(file_->service(i))); |