|  | @@ -178,7 +178,7 @@ namespace Google.ProtocolBuffers.ProtoGen
 | 
	
		
			
				|  |  |                               RuntimeSuffix);
 | 
	
		
			
				|  |  |              writer.Indent();
 | 
	
		
			
				|  |  |              // Must call BuildPartial() to make sure all lists are made read-only
 | 
	
		
			
				|  |  | -            writer.WriteLine("private static readonly {0} defaultInstance = new Builder().BuildPartial();", ClassName);
 | 
	
		
			
				|  |  | +            writer.WriteLine("private static readonly {0} defaultInstance = new {0}().MakeReadOnly();", ClassName);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (OptimizeSpeed)
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -199,7 +199,7 @@ namespace Google.ProtocolBuffers.ProtoGen
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  |              writer.WriteLine();
 | 
	
		
			
				|  |  |              writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName);
 | 
	
		
			
				|  |  | -            writer.WriteLine("  get { return defaultInstance; }");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  get { return DefaultInstance; }");
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  |              writer.WriteLine();
 | 
	
		
			
				|  |  |              writer.WriteLine("protected override {0} ThisMessage {{", ClassName);
 | 
	
	
		
			
				|  | @@ -547,6 +547,17 @@ namespace Google.ProtocolBuffers.ProtoGen
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private void GenerateBuilder(TextGenerator writer)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | +            writer.WriteLine("private {0} MakeReadOnly() {{", ClassName);
 | 
	
		
			
				|  |  | +            writer.Indent();
 | 
	
		
			
				|  |  | +            foreach (FieldDescriptor field in Descriptor.Fields)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                CreateFieldGenerator(field).GenerateBuildingCode(writer);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            writer.WriteLine("return this;");
 | 
	
		
			
				|  |  | +            writer.Outdent();
 | 
	
		
			
				|  |  | +            writer.WriteLine("}");
 | 
	
		
			
				|  |  | +            writer.WriteLine();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              writer.WriteLine("public static Builder CreateBuilder() { return new Builder(); }");
 | 
	
		
			
				|  |  |              writer.WriteLine("public override Builder ToBuilder() { return CreateBuilder(this); }");
 | 
	
		
			
				|  |  |              writer.WriteLine("public override Builder CreateBuilderForType() { return new Builder(); }");
 | 
	
	
		
			
				|  | @@ -585,23 +596,23 @@ namespace Google.ProtocolBuffers.ProtoGen
 | 
	
		
			
				|  |  |              //default constructor
 | 
	
		
			
				|  |  |              writer.WriteLine("public Builder() {");
 | 
	
		
			
				|  |  |              //Durring static initialization of message, DefaultInstance is expected to return null.
 | 
	
		
			
				|  |  | -            writer.WriteLine("  result = DefaultInstance ?? new {0}();", ClassName);
 | 
	
		
			
				|  |  | -            writer.WriteLine("  builderIsReadOnly = result == DefaultInstance;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  result = DefaultInstance;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  resultIsReadOnly = true;");
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  |              //clone constructor
 | 
	
		
			
				|  |  |              writer.WriteLine("internal Builder({0} cloneFrom) {{", ClassName);
 | 
	
		
			
				|  |  |              writer.WriteLine("  result = cloneFrom;");
 | 
	
		
			
				|  |  | -            writer.WriteLine("  builderIsReadOnly = true;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  resultIsReadOnly = true;");
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  |              writer.WriteLine();
 | 
	
		
			
				|  |  | -            writer.WriteLine("bool builderIsReadOnly;");
 | 
	
		
			
				|  |  | -            writer.WriteLine("{0} result;", ClassName);
 | 
	
		
			
				|  |  | +            writer.WriteLine("private bool resultIsReadOnly;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("private {0} result;", ClassName);
 | 
	
		
			
				|  |  |              writer.WriteLine();
 | 
	
		
			
				|  |  |              writer.WriteLine("private {0} PrepareBuilder() {{", ClassName);
 | 
	
		
			
				|  |  | -            writer.WriteLine("  if (builderIsReadOnly) {");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  if (resultIsReadOnly) {");
 | 
	
		
			
				|  |  |              writer.WriteLine("    {0} original = result;", ClassName);
 | 
	
		
			
				|  |  |              writer.WriteLine("    result = new {0}();", ClassName);
 | 
	
		
			
				|  |  | -            writer.WriteLine("    builderIsReadOnly = false;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("    resultIsReadOnly = false;");
 | 
	
		
			
				|  |  |              writer.WriteLine("    MergeFrom(original);");
 | 
	
		
			
				|  |  |              writer.WriteLine("  }");
 | 
	
		
			
				|  |  |              writer.WriteLine("  return result;");
 | 
	
	
		
			
				|  | @@ -617,13 +628,13 @@ namespace Google.ProtocolBuffers.ProtoGen
 | 
	
		
			
				|  |  |              writer.WriteLine();
 | 
	
		
			
				|  |  |              //Not actually expecting that DefaultInstance would ever be null here; however, we will ensure it does not break
 | 
	
		
			
				|  |  |              writer.WriteLine("public override Builder Clear() {");
 | 
	
		
			
				|  |  | -            writer.WriteLine("  result = DefaultInstance ?? new {0}();", ClassName);
 | 
	
		
			
				|  |  | -            writer.WriteLine("  builderIsReadOnly = true;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  result = DefaultInstance;", ClassName);
 | 
	
		
			
				|  |  | +            writer.WriteLine("  resultIsReadOnly = true;");
 | 
	
		
			
				|  |  |              writer.WriteLine("  return this;");
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  |              writer.WriteLine();
 | 
	
		
			
				|  |  |              writer.WriteLine("public override Builder Clone() {");
 | 
	
		
			
				|  |  | -            writer.WriteLine("  if (builderIsReadOnly) {");
 | 
	
		
			
				|  |  | +            writer.WriteLine("  if (resultIsReadOnly) {");
 | 
	
		
			
				|  |  |              writer.WriteLine("    return new Builder(result);");
 | 
	
		
			
				|  |  |              writer.WriteLine("  } else {");
 | 
	
		
			
				|  |  |              writer.WriteLine("    return new Builder().MergeFrom(result);");
 | 
	
	
		
			
				|  | @@ -644,15 +655,11 @@ namespace Google.ProtocolBuffers.ProtoGen
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              writer.WriteLine("public override {0} BuildPartial() {{", ClassName);
 | 
	
		
			
				|  |  |              writer.Indent();
 | 
	
		
			
				|  |  | -            writer.WriteLine("if (builderIsReadOnly) {");
 | 
	
		
			
				|  |  | +            writer.WriteLine("if (resultIsReadOnly) {");
 | 
	
		
			
				|  |  |              writer.WriteLine("  return result;");
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  | -            foreach (FieldDescriptor field in Descriptor.Fields)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                CreateFieldGenerator(field).GenerateBuildingCode(writer);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            writer.WriteLine("builderIsReadOnly = true;");
 | 
	
		
			
				|  |  | -            writer.WriteLine("return result;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("resultIsReadOnly = true;");
 | 
	
		
			
				|  |  | +            writer.WriteLine("return result.MakeReadOnly();");
 | 
	
		
			
				|  |  |              writer.Outdent();
 | 
	
		
			
				|  |  |              writer.WriteLine("}");
 | 
	
		
			
				|  |  |              writer.WriteLine();
 |