diff options
Diffstat (limited to 'src/google/protobuf/descriptor.cc')
-rw-r--r-- | src/google/protobuf/descriptor.cc | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc index a12e4e7..81c4ac0 100644 --- a/src/google/protobuf/descriptor.cc +++ b/src/google/protobuf/descriptor.cc @@ -37,6 +37,7 @@ #include <set> #include <vector> #include <algorithm> +#include <limits> #include <google/protobuf/descriptor.h> #include <google/protobuf/descriptor_database.h> @@ -796,6 +797,7 @@ bool DescriptorPool::InternalIsFileLoaded(const string& filename) const { namespace { + EncodedDescriptorDatabase* generated_database_ = NULL; DescriptorPool* generated_pool_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(generated_pool_init_); @@ -810,6 +812,7 @@ void DeleteGeneratedPool() { void InitGeneratedPool() { generated_database_ = new EncodedDescriptorDatabase; generated_pool_ = new DescriptorPool(generated_database_); + internal::OnShutdown(&DeleteGeneratedPool); } @@ -2998,12 +3001,28 @@ void DescriptorBuilder::BuildFieldOrExtension(const FieldDescriptorProto& proto, strtou64(proto.default_value().c_str(), &end_pos, 0); break; case FieldDescriptor::CPPTYPE_FLOAT: - result->default_value_float_ = - NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + if (proto.default_value() == "inf") { + result->default_value_float_ = numeric_limits<float>::infinity(); + } else if (proto.default_value() == "-inf") { + result->default_value_float_ = -numeric_limits<float>::infinity(); + } else if (proto.default_value() == "nan") { + result->default_value_float_ = numeric_limits<float>::quiet_NaN(); + } else { + result->default_value_float_ = + NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + } break; case FieldDescriptor::CPPTYPE_DOUBLE: - result->default_value_double_ = - NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + if (proto.default_value() == "inf") { + result->default_value_double_ = numeric_limits<double>::infinity(); + } else if (proto.default_value() == "-inf") { + result->default_value_double_ = -numeric_limits<double>::infinity(); + } else if (proto.default_value() == "nan") { + result->default_value_double_ = numeric_limits<double>::quiet_NaN(); + } else { + result->default_value_double_ = + NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + } break; case FieldDescriptor::CPPTYPE_BOOL: if (proto.default_value() == "true") { @@ -3651,17 +3670,11 @@ void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field, } // Only repeated primitive fields may be packed. - if (field->options().packed()) { - if (!field->is_repeated() || - field->type() == FieldDescriptor::TYPE_STRING || - field->type() == FieldDescriptor::TYPE_GROUP || - field->type() == FieldDescriptor::TYPE_MESSAGE || - field->type() == FieldDescriptor::TYPE_BYTES) { - AddError( - field->full_name(), proto, - DescriptorPool::ErrorCollector::TYPE, - "[packed = true] can only be specified for repeated primitive fields."); - } + if (field->options().packed() && !field->is_packable()) { + AddError( + field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "[packed = true] can only be specified for repeated primitive fields."); } // Note: Default instance may not yet be initialized here, so we have to |