|  | @@ -520,34 +520,26 @@ void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer)
 | 
	
		
			
				|  |  |    WriteGeneratedCodeAttributes(printer);
 | 
	
		
			
				|  |  |    printer->Print(
 | 
	
		
			
				|  |  |        "public void WriteTo(pb::CodedOutputStream output) {\n");
 | 
	
		
			
				|  |  | +  printer->Print("#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE\n");
 | 
	
		
			
				|  |  |    printer->Indent();
 | 
	
		
			
				|  |  | +  printer->Print("output.WriteRawMessage(this);\n");
 | 
	
		
			
				|  |  | +  printer->Outdent();
 | 
	
		
			
				|  |  | +  printer->Print("#else\n");
 | 
	
		
			
				|  |  | +  printer->Indent();
 | 
	
		
			
				|  |  | +  GenerateWriteToBody(printer, false);
 | 
	
		
			
				|  |  | +  printer->Outdent();
 | 
	
		
			
				|  |  | +  printer->Print("#endif\n");
 | 
	
		
			
				|  |  | +  printer->Print("}\n\n");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // Serialize all the fields
 | 
	
		
			
				|  |  | -  for (int i = 0; i < fields_by_number().size(); i++) {
 | 
	
		
			
				|  |  | -    std::unique_ptr<FieldGeneratorBase> generator(
 | 
	
		
			
				|  |  | -      CreateFieldGeneratorInternal(fields_by_number()[i]));
 | 
	
		
			
				|  |  | -    generator->GenerateSerializationCode(printer);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  if (has_extension_ranges_) {
 | 
	
		
			
				|  |  | -    // Serialize extensions
 | 
	
		
			
				|  |  | -    printer->Print(
 | 
	
		
			
				|  |  | -      "if (_extensions != null) {\n"
 | 
	
		
			
				|  |  | -      "  _extensions.WriteTo(output);\n"
 | 
	
		
			
				|  |  | -      "}\n");
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Serialize unknown fields
 | 
	
		
			
				|  |  | -  printer->Print(
 | 
	
		
			
				|  |  | -    "if (_unknownFields != null) {\n"
 | 
	
		
			
				|  |  | -    "  _unknownFields.WriteTo(output);\n"
 | 
	
		
			
				|  |  | -    "}\n");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // TODO(jonskeet): Memoize size of frozen messages?
 | 
	
		
			
				|  |  | +  printer->Print("#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE\n");
 | 
	
		
			
				|  |  | +  WriteGeneratedCodeAttributes(printer);
 | 
	
		
			
				|  |  | +  printer->Print("void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {\n");
 | 
	
		
			
				|  |  | +  printer->Indent();
 | 
	
		
			
				|  |  | +  GenerateWriteToBody(printer, true);
 | 
	
		
			
				|  |  |    printer->Outdent();
 | 
	
		
			
				|  |  | -  printer->Print(
 | 
	
		
			
				|  |  | -    "}\n"
 | 
	
		
			
				|  |  | -    "\n");
 | 
	
		
			
				|  |  | +  printer->Print("}\n");
 | 
	
		
			
				|  |  | +  printer->Print("#endif\n\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    WriteGeneratedCodeAttributes(printer);
 | 
	
		
			
				|  |  |    printer->Print(
 | 
	
		
			
				|  |  |      "public int CalculateSize() {\n");
 | 
	
	
		
			
				|  | @@ -576,6 +568,39 @@ void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer)
 | 
	
		
			
				|  |  |    printer->Print("}\n\n");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void MessageGenerator::GenerateWriteToBody(io::Printer* printer, bool use_write_context) {
 | 
	
		
			
				|  |  | +  // Serialize all the fields
 | 
	
		
			
				|  |  | +  for (int i = 0; i < fields_by_number().size(); i++) {
 | 
	
		
			
				|  |  | +    std::unique_ptr<FieldGeneratorBase> generator(
 | 
	
		
			
				|  |  | +      CreateFieldGeneratorInternal(fields_by_number()[i]));
 | 
	
		
			
				|  |  | +    generator->GenerateSerializationCode(printer, use_write_context);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (has_extension_ranges_) {
 | 
	
		
			
				|  |  | +    // Serialize extensions
 | 
	
		
			
				|  |  | +    printer->Print(
 | 
	
		
			
				|  |  | +      use_write_context
 | 
	
		
			
				|  |  | +      ? "if (_extensions != null) {\n"
 | 
	
		
			
				|  |  | +        "  _extensions.WriteTo(ref output);\n"
 | 
	
		
			
				|  |  | +        "}\n"
 | 
	
		
			
				|  |  | +      : "if (_extensions != null) {\n"
 | 
	
		
			
				|  |  | +        "  _extensions.WriteTo(output);\n"
 | 
	
		
			
				|  |  | +        "}\n");
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Serialize unknown fields
 | 
	
		
			
				|  |  | +  printer->Print(
 | 
	
		
			
				|  |  | +    use_write_context
 | 
	
		
			
				|  |  | +    ? "if (_unknownFields != null) {\n"
 | 
	
		
			
				|  |  | +      "  _unknownFields.WriteTo(ref output);\n"
 | 
	
		
			
				|  |  | +      "}\n"
 | 
	
		
			
				|  |  | +    : "if (_unknownFields != null) {\n"
 | 
	
		
			
				|  |  | +      "  _unknownFields.WriteTo(output);\n"
 | 
	
		
			
				|  |  | +      "}\n");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // TODO(jonskeet): Memoize size of frozen messages?
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void MessageGenerator::GenerateMergingMethods(io::Printer* printer) {
 | 
	
		
			
				|  |  |    // Note:  These are separate from GenerateMessageSerializationMethods()
 | 
	
		
			
				|  |  |    //   because they need to be generated even for messages that are optimized
 |