Heh, I remember complaining about this to James when they first
published the byte code spec. It was annoying then and continues to be
annoying today.


On 7/24/09, Kenton Varda <ken...@google.com> wrote:
> How annoying.  I'll make sure this or something like it gets into the next
> release -- which I'm going to try to push next week.
>
> On Wed, Jul 22, 2009 at 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.
>>
>> >
>>
>
> >
>

-- 
Sent from my mobile device

Chris

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to