This looks to be a real problem. Kenton's on vacation but should be back soon (tomorrow I think) so he can take a look at the patch then.
On Jul 22, 8:36 am, anonymous <eric.pe...@hp.com> wrote: > Hello, > > I was not able to compile a Java file generated by protoc 2.10 from a > rather big .proto file. > It seems I have hit the upper limit for a Java string literal > (65535???). > > I slightly modified src/google/protobuf/compiler/java/java_file.cc so > that static initialization is performed from > an array of literal strings in the case CEscape(file_data).size() > > 65535. > > Is this a real problem, or am I missing something ? > > Here is the patch: > > diff -r -u protobuf-2.1.0/src/google/protobuf/compiler/java/ > java_file.cc protobuf-2.1.0.new/src/google/protobuf/compiler/java/ > java_file.cc > --- protobuf-2.1.0/src/google/protobuf/compiler/java/java_file.cc > 2009-05-13 16:36:30.000000000 -0400 > +++ protobuf-2.1.0.new/src/google/protobuf/compiler/java/java_file.cc > 2009-07-22 10:37:28.000000000 -0400 > @@ -207,6 +207,9 @@ > // This makes huge bytecode files and can easily hit the compiler's > internal > // code size limits (error "code to large"). String literals are > apparently > // embedded raw, which is what we want. > + // In the case the FileDescriptorProto is too big for fitting into > a string > + // literal, first creating ain array of string literals, then > concatenating > + // them into the final FileDescriptorProto string. > FileDescriptorProto file_proto; > file_->CopyTo(&file_proto); > string file_data; > @@ -218,22 +221,51 @@ > " return descriptor;\n" > "}\n" > "private static com.google.protobuf.Descriptors.FileDescriptor\n" > - " descriptor;\n" > - "static {\n" > - " java.lang.String descriptorData =\n"); > - printer->Indent(); > - printer->Indent(); > + " descriptor;\n"); > > - // 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"); > - printer->Print("\"$data$\"", > - "data", CEscape(file_data.substr(i, kBytesPerLine))); > - } > - printer->Print(";\n"); > > - printer->Outdent(); > + // Limit for a Java literal string is 65535 > + bool stringTooLong = (CEscape(file_data).size() > 65535); > + > + if (stringTooLong) { > + printer->Print("static {\n" > + " java.lang.String descriptorDataArray[] = {\n"); > + printer->Indent(); > + printer->Indent(); > + > + // Only write 40 bytes per line. > + for (int i = 0; i < file_data.size(); i += kBytesPerLine) { > + if (i > 0) printer->Print(",\n"); > + printer->Print("\"$data$\"", > + "data", CEscape(file_data.substr(i, kBytesPerLine))); > + } > + printer->Outdent(); > + printer->Print("\n" > + "};\n\n"); > + printer->Print("java.lang.String descriptorData = \"\";\n"); > + printer->Print("for (String data : descriptorDataArray) {\n"); > + printer->Indent(); > + printer->Print("descriptorData += data;\n"); > + printer->Outdent(); > + printer->Print("}\n\n"); > + } else { > + printer->Print("static {\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"); > + printer->Print("\"$data$\"", > + "data", CEscape(file_data.substr(i, kBytesPerLine))); > + } > + printer->Print(";\n"); > + > + printer->Outdent(); > + } > > // > ----------------------------------------------------------------- > // Create the InternalDescriptorAssigner. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/protobuf?hl=en -~----------~----~----~----~------~----~------~--~---