Revert the change to wire_format.h.

It seems too much code relies on the broken behaviour. See issue #493.
Instead, we reimplement MakeTag just for C#, temporarily.
This commit is contained in:
Jon Skeet 2015-06-24 17:55:02 +01:00
parent bfee2dfe13
commit 322ec53161
5 changed files with 16 additions and 4 deletions

View File

@ -57,7 +57,7 @@ void FieldGeneratorBase::SetCommonFieldVariables(
// repeated fields varies by wire format. The wire format is encoded in the bottom 3 bits, which // repeated fields varies by wire format. The wire format is encoded in the bottom 3 bits, which
// never effects the tag size. // never effects the tag size.
int tag_size = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type()); int tag_size = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type());
uint tag = internal::WireFormat::MakeTag(descriptor_); uint tag = FixedMakeTag(descriptor_);
uint8 tag_array[5]; uint8 tag_array[5];
io::CodedOutputStream::WriteTagToArray(tag, tag_array); io::CodedOutputStream::WriteTagToArray(tag, tag_array);
string tag_bytes = SimpleItoa(tag_array[0]); string tag_bytes = SimpleItoa(tag_array[0]);

View File

@ -338,6 +338,17 @@ std::string FileDescriptorToBase64(const FileDescriptor* descriptor) {
return StringToBase64(fdp_bytes); return StringToBase64(fdp_bytes);
} }
// TODO(jonskeet): Remove this when internal::WireFormat::MakeTag works
// properly...
// Workaround for issue #493
uint FixedMakeTag(const FieldDescriptor* field) {
internal::WireFormatLite::WireType field_type = field->is_packed()
? internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED
: internal::WireFormat::WireTypeForFieldType(field->type());
return internal::WireFormatLite::MakeTag(field->number(), field_type);
}
FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor,
int fieldOrdinal) { int fieldOrdinal) {
switch (descriptor->type()) { switch (descriptor->type()) {

View File

@ -97,6 +97,8 @@ std::string StringToBase64(const std::string& input);
std::string FileDescriptorToBase64(const FileDescriptor* descriptor); std::string FileDescriptorToBase64(const FileDescriptor* descriptor);
uint FixedMakeTag(const FieldDescriptor* descriptor);
FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal); FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal);
bool HasRequiredFields(const Descriptor* descriptor); bool HasRequiredFields(const Descriptor* descriptor);

View File

@ -194,8 +194,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
"slash", field_names().size() > 0 ? "\"" : ""); "slash", field_names().size() > 0 ? "\"" : "");
std::vector<std::string> tags; std::vector<std::string> tags;
for (int i = 0; i < field_names().size(); i++) { for (int i = 0; i < field_names().size(); i++) {
uint32 tag = internal::WireFormat::MakeTag( uint32 tag = FixedMakeTag(descriptor_->FindFieldByName(field_names()[i]));
descriptor_->FindFieldByName(field_names()[i]));
tags.push_back(SimpleItoa(tag)); tags.push_back(SimpleItoa(tag));
} }
printer->Print( printer->Print(

View File

@ -290,7 +290,7 @@ class LIBPROTOBUF_EXPORT UnknownFieldSetFieldSkipper : public FieldSkipper {
inline WireFormatLite::WireType WireFormat::WireTypeForField( inline WireFormatLite::WireType WireFormat::WireTypeForField(
const FieldDescriptor* field) { const FieldDescriptor* field) {
if (field->is_packed()) { if (field->options().packed()) {
return WireFormatLite::WIRETYPE_LENGTH_DELIMITED; return WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
} else { } else {
return WireTypeForFieldType(field->type()); return WireTypeForFieldType(field->type());