aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/java/java_file.cc
diff options
context:
space:
mode:
authorkenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-08-07 21:02:02 +0000
committerkenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-08-07 21:02:02 +0000
commit68996fc874300337ec7349f50d0b1cbb3a6f1bec (patch)
treefd0f9a7b63b00dc0bc2898e6d44913dd95150423 /src/google/protobuf/compiler/java/java_file.cc
parent445f1023e1159212c65cb6c27c4f0a3121248a79 (diff)
downloadprotobuf-68996fc874300337ec7349f50d0b1cbb3a6f1bec.tar.gz
protobuf-68996fc874300337ec7349f50d0b1cbb3a6f1bec.tar.bz2
protobuf-68996fc874300337ec7349f50d0b1cbb3a6f1bec.zip
Gigantic descriptors shouldn't overflow the Java string literal size limit.
Diffstat (limited to 'src/google/protobuf/compiler/java/java_file.cc')
-rw-r--r--src/google/protobuf/compiler/java/java_file.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/google/protobuf/compiler/java/java_file.cc b/src/google/protobuf/compiler/java/java_file.cc
index 0e170b38..2aedde5e 100644
--- a/src/google/protobuf/compiler/java/java_file.cc
+++ b/src/google/protobuf/compiler/java/java_file.cc
@@ -256,20 +256,28 @@ void FileGenerator::GenerateEmbeddedDescriptor(io::Printer* printer) {
"private static com.google.protobuf.Descriptors.FileDescriptor\n"
" descriptor;\n"
"static {\n"
- " java.lang.String descriptorData =\n");
+ " java.lang.String[] descriptorData = {\n");
printer->Indent();
printer->Indent();
// Only write 40 bytes per line.
static const int kBytesPerLine = 40;
for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
- if (i > 0) printer->Print(" +\n");
+ if (i > 0) {
+ // Every 400 lines, start a new string literal, in order to avoid the
+ // 64k length limit.
+ if (i % 400 == 0) {
+ printer->Print(",\n");
+ } else {
+ printer->Print(" +\n");
+ }
+ }
printer->Print("\"$data$\"",
"data", CEscape(file_data.substr(i, kBytesPerLine)));
}
- printer->Print(";\n");
printer->Outdent();
+ printer->Print("\n};\n");
// -----------------------------------------------------------------
// Create the InternalDescriptorAssigner.