|  | @@ -434,20 +434,52 @@ void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) {
 | 
	
		
			
				|  |  |      string file_data;
 | 
	
		
			
				|  |  |      file_proto.SerializeToString(&file_data);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    printer->Print(
 | 
	
		
			
				|  |  | -      "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // Only write 40 bytes per line.
 | 
	
		
			
				|  |  | -    static const int kBytesPerLine = 40;
 | 
	
		
			
				|  |  | -    for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
 | 
	
		
			
				|  |  | -      printer->Print("\n  \"$data$\"",
 | 
	
		
			
				|  |  | -                     "data",
 | 
	
		
			
				|  |  | -                     EscapeTrigraphs(
 | 
	
		
			
				|  |  | -                         CEscape(file_data.substr(i, kBytesPerLine))));
 | 
	
		
			
				|  |  | +    // Workaround for MSVC: "Error C1091: compiler limit: string exceeds 65535
 | 
	
		
			
				|  |  | +    // bytes in length". Declare a static array of characters rather than use a
 | 
	
		
			
				|  |  | +    // string literal.
 | 
	
		
			
				|  |  | +    if (file_data.size() > 65535) {
 | 
	
		
			
				|  |  | +      printer->Print(
 | 
	
		
			
				|  |  | +        "static const char descriptor[] = {\n");
 | 
	
		
			
				|  |  | +      printer->Indent();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // Only write 25 bytes per line.
 | 
	
		
			
				|  |  | +      static const int kBytesPerLine = 25;
 | 
	
		
			
				|  |  | +      for (int i = 0; i < file_data.size();) {
 | 
	
		
			
				|  |  | +          for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) {
 | 
	
		
			
				|  |  | +            printer->Print(
 | 
	
		
			
				|  |  | +              "$char$, ",
 | 
	
		
			
				|  |  | +              "char", SimpleItoa(file_data[i]));
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          printer->Print(
 | 
	
		
			
				|  |  | +            "\n");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      printer->Outdent();
 | 
	
		
			
				|  |  | +      printer->Print(
 | 
	
		
			
				|  |  | +        "};\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      printer->Print(
 | 
	
		
			
				|  |  | +        "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(descriptor, $size$);\n",
 | 
	
		
			
				|  |  | +        "size", SimpleItoa(file_data.size()));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      printer->Print(
 | 
	
		
			
				|  |  | +        "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(");
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +      // Only write 40 bytes per line.
 | 
	
		
			
				|  |  | +      static const int kBytesPerLine = 40;
 | 
	
		
			
				|  |  | +      for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
 | 
	
		
			
				|  |  | +        printer->Print("\n  \"$data$\"",
 | 
	
		
			
				|  |  | +                       "data",
 | 
	
		
			
				|  |  | +                       EscapeTrigraphs(
 | 
	
		
			
				|  |  | +                           CEscape(file_data.substr(i, kBytesPerLine))));
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      printer->Print(
 | 
	
		
			
				|  |  | +          ", $size$);\n",
 | 
	
		
			
				|  |  | +        "size", SimpleItoa(file_data.size()));
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    printer->Print(
 | 
	
		
			
				|  |  | -        ", $size$);\n",
 | 
	
		
			
				|  |  | -      "size", SimpleItoa(file_data.size()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Call MessageFactory::InternalRegisterGeneratedFile().
 | 
	
		
			
				|  |  |      printer->Print(
 |