| Index: third_party/protobuf/objectivec/GPBDescriptor_PackagePrivate.h
|
| diff --git a/third_party/protobuf/objectivec/GPBDescriptor_PackagePrivate.h b/third_party/protobuf/objectivec/GPBDescriptor_PackagePrivate.h
|
| index 7987d928700b4520148cf7783b7075d2b6dcadbf..e3d0a80f0525bea9d3b9d4869ece58cf7547d362 100644
|
| --- a/third_party/protobuf/objectivec/GPBDescriptor_PackagePrivate.h
|
| +++ b/third_party/protobuf/objectivec/GPBDescriptor_PackagePrivate.h
|
| @@ -36,7 +36,7 @@
|
| #import "GPBWireFormat.h"
|
|
|
| // Describes attributes of the field.
|
| -typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
|
| +typedef NS_OPTIONS(uint16_t, GPBFieldFlags) {
|
| // These map to standard protobuf concepts.
|
| GPBFieldRequired = 1 << 0,
|
| GPBFieldRepeated = 1 << 1,
|
| @@ -44,6 +44,12 @@ typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
|
| GPBFieldOptional = 1 << 3,
|
| GPBFieldHasDefaultValue = 1 << 4,
|
|
|
| + // Indicates the field needs custom handling for the TextFormat name, if not
|
| + // set, the name can be derived from the ObjC name.
|
| + GPBFieldTextFormatNameCustom = 1 << 6,
|
| + // Indicates the field has an enum descriptor.
|
| + GPBFieldHasEnumDescriptor = 1 << 7,
|
| +
|
| // These are not standard protobuf concepts, they are specific to the
|
| // Objective C runtime.
|
|
|
| @@ -62,67 +68,49 @@ typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
|
| GPBFieldMapKeySFixed64 = 10 << 8,
|
| GPBFieldMapKeyBool = 11 << 8,
|
| GPBFieldMapKeyString = 12 << 8,
|
| -
|
| - // Indicates the field needs custom handling for the TextFormat name, if not
|
| - // set, the name can be derived from the ObjC name.
|
| - GPBFieldTextFormatNameCustom = 1 << 16,
|
| - // Indicates the field has an enum descriptor.
|
| - GPBFieldHasEnumDescriptor = 1 << 17,
|
| };
|
|
|
| +// NOTE: The structures defined here have their members ordered to minimize
|
| +// their size. This directly impacts the size of apps since these exist per
|
| +// field/extension.
|
| +
|
| // Describes a single field in a protobuf as it is represented as an ivar.
|
| typedef struct GPBMessageFieldDescription {
|
| // Name of ivar.
|
| const char *name;
|
| + union {
|
| + const char *className; // Name for message class.
|
| + // For enums only: If EnumDescriptors are compiled in, it will be that,
|
| + // otherwise it will be the verifier.
|
| + GPBEnumDescriptorFunc enumDescFunc;
|
| + GPBEnumValidationFunc enumVerifier;
|
| + } dataTypeSpecific;
|
| // The field number for the ivar.
|
| uint32_t number;
|
| // The index (in bits) into _has_storage_.
|
| - // > 0: the bit to use for a value being set.
|
| - // = 0: no storage used.
|
| + // >= 0: the bit to use for a value being set.
|
| + // = GPBNoHasBit(INT32_MAX): no storage used.
|
| // < 0: in a oneOf, use a full int32 to record the field active.
|
| int32_t hasIndex;
|
| + // Offset of the variable into it's structure struct.
|
| + uint32_t offset;
|
| // Field flags. Use accessor functions below.
|
| GPBFieldFlags flags;
|
| // Data type of the ivar.
|
| GPBDataType dataType;
|
| - // Offset of the variable into it's structure struct.
|
| - size_t offset;
|
| - // FieldOptions protobuf, serialized as string.
|
| - const char *fieldOptions;
|
| -
|
| - GPBGenericValue defaultValue; // Default value for the ivar.
|
| - union {
|
| - const char *className; // Name for message class.
|
| - // For enums only: If EnumDescriptors are compiled in, it will be that,
|
| - // otherwise it will be the verifier.
|
| - GPBEnumDescriptorFunc enumDescFunc;
|
| - GPBEnumValidationFunc enumVerifier;
|
| - } dataTypeSpecific;
|
| } GPBMessageFieldDescription;
|
|
|
| -// Describes a oneof.
|
| -typedef struct GPBMessageOneofDescription {
|
| - // Name of this enum oneof.
|
| - const char *name;
|
| - // The index of this oneof in the has_storage.
|
| - int32_t index;
|
| -} GPBMessageOneofDescription;
|
| -
|
| -// Describes an enum type defined in a .proto file.
|
| -typedef struct GPBMessageEnumDescription {
|
| - GPBEnumDescriptorFunc enumDescriptorFunc;
|
| -} GPBMessageEnumDescription;
|
| +// Fields in messages defined in a 'proto2' syntax file can provide a default
|
| +// value. This struct provides the default along with the field info.
|
| +typedef struct GPBMessageFieldDescriptionWithDefault {
|
| + // Default value for the ivar.
|
| + GPBGenericValue defaultValue;
|
|
|
| -// Describes an individual enum constant of a particular type.
|
| -typedef struct GPBMessageEnumValueDescription {
|
| - // Name of this enum constant.
|
| - const char *name;
|
| - // Numeric value of this enum constant.
|
| - int32_t number;
|
| -} GPBMessageEnumValueDescription;
|
| + GPBMessageFieldDescription core;
|
| +} GPBMessageFieldDescriptionWithDefault;
|
|
|
| // Describes attributes of the extension.
|
| -typedef NS_OPTIONS(uint32_t, GPBExtensionOptions) {
|
| +typedef NS_OPTIONS(uint8_t, GPBExtensionOptions) {
|
| // These map to standard protobuf concepts.
|
| GPBExtensionRepeated = 1 << 0,
|
| GPBExtensionPacked = 1 << 1,
|
| @@ -131,65 +119,53 @@ typedef NS_OPTIONS(uint32_t, GPBExtensionOptions) {
|
|
|
| // An extension
|
| typedef struct GPBExtensionDescription {
|
| + GPBGenericValue defaultValue;
|
| const char *singletonName;
|
| - GPBDataType dataType;
|
| const char *extendedClass;
|
| - int32_t fieldNumber;
|
| - GPBGenericValue defaultValue;
|
| const char *messageOrGroupClassName;
|
| - GPBExtensionOptions options;
|
| GPBEnumDescriptorFunc enumDescriptorFunc;
|
| + int32_t fieldNumber;
|
| + GPBDataType dataType;
|
| + GPBExtensionOptions options;
|
| } GPBExtensionDescription;
|
|
|
| +typedef NS_OPTIONS(uint32_t, GPBDescriptorInitializationFlags) {
|
| + GPBDescriptorInitializationFlag_FieldsWithDefault = 1 << 0,
|
| + GPBDescriptorInitializationFlag_WireFormat = 1 << 1,
|
| +};
|
| +
|
| @interface GPBDescriptor () {
|
| @package
|
| NSArray *fields_;
|
| NSArray *oneofs_;
|
| - size_t storageSize_;
|
| + uint32_t storageSize_;
|
| }
|
|
|
| -// fieldDescriptions, enumDescriptions, rangeDescriptions, and
|
| -// extraTextFormatInfo have to be long lived, they are held as raw pointers.
|
| +// fieldDescriptions have to be long lived, they are held as raw pointers.
|
| + (instancetype)
|
| allocDescriptorForClass:(Class)messageClass
|
| rootClass:(Class)rootClass
|
| file:(GPBFileDescriptor *)file
|
| - fields:(GPBMessageFieldDescription *)fieldDescriptions
|
| - fieldCount:(NSUInteger)fieldCount
|
| - oneofs:(GPBMessageOneofDescription *)oneofDescriptions
|
| - oneofCount:(NSUInteger)oneofCount
|
| - enums:(GPBMessageEnumDescription *)enumDescriptions
|
| - enumCount:(NSUInteger)enumCount
|
| - ranges:(const GPBExtensionRange *)ranges
|
| - rangeCount:(NSUInteger)rangeCount
|
| - storageSize:(size_t)storageSize
|
| - wireFormat:(BOOL)wireFormat;
|
| -+ (instancetype)
|
| - allocDescriptorForClass:(Class)messageClass
|
| - rootClass:(Class)rootClass
|
| - file:(GPBFileDescriptor *)file
|
| - fields:(GPBMessageFieldDescription *)fieldDescriptions
|
| - fieldCount:(NSUInteger)fieldCount
|
| - oneofs:(GPBMessageOneofDescription *)oneofDescriptions
|
| - oneofCount:(NSUInteger)oneofCount
|
| - enums:(GPBMessageEnumDescription *)enumDescriptions
|
| - enumCount:(NSUInteger)enumCount
|
| - ranges:(const GPBExtensionRange *)ranges
|
| - rangeCount:(NSUInteger)rangeCount
|
| - storageSize:(size_t)storageSize
|
| - wireFormat:(BOOL)wireFormat
|
| - extraTextFormatInfo:(const char *)extraTextFormatInfo;
|
| + fields:(void *)fieldDescriptions
|
| + fieldCount:(uint32_t)fieldCount
|
| + storageSize:(uint32_t)storageSize
|
| + flags:(GPBDescriptorInitializationFlags)flags;
|
|
|
| - (instancetype)initWithClass:(Class)messageClass
|
| file:(GPBFileDescriptor *)file
|
| fields:(NSArray *)fields
|
| - oneofs:(NSArray *)oneofs
|
| - enums:(NSArray *)enums
|
| - extensionRanges:(const GPBExtensionRange *)ranges
|
| - extensionRangesCount:(NSUInteger)rangeCount
|
| - storageSize:(size_t)storage
|
| + storageSize:(uint32_t)storage
|
| wireFormat:(BOOL)wireFormat;
|
|
|
| +// Called right after init to provide extra information to avoid init having
|
| +// an explosion of args. These pointers are recorded, so they are expected
|
| +// to live for the lifetime of the app.
|
| +- (void)setupOneofs:(const char **)oneofNames
|
| + count:(uint32_t)count
|
| + firstHasIndex:(int32_t)firstHasIndex;
|
| +- (void)setupExtraTextInfo:(const char *)extraTextFormatInfo;
|
| +- (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count;
|
| +
|
| @end
|
|
|
| @interface GPBFileDescriptor ()
|
| @@ -199,14 +175,12 @@ typedef struct GPBExtensionDescription {
|
|
|
| @interface GPBOneofDescriptor () {
|
| @package
|
| - GPBMessageOneofDescription *oneofDescription_;
|
| + const char *name_;
|
| NSArray *fields_;
|
| -
|
| SEL caseSel_;
|
| }
|
| -- (instancetype)initWithOneofDescription:
|
| - (GPBMessageOneofDescription *)oneofDescription
|
| - fields:(NSArray *)fields;
|
| +// name must be long lived.
|
| +- (instancetype)initWithName:(const char *)name fields:(NSArray *)fields;
|
| @end
|
|
|
| @interface GPBFieldDescriptor () {
|
| @@ -222,30 +196,32 @@ typedef struct GPBExtensionDescription {
|
|
|
| // Single initializer
|
| // description has to be long lived, it is held as a raw pointer.
|
| -- (instancetype)initWithFieldDescription:
|
| - (GPBMessageFieldDescription *)description
|
| - rootClass:(Class)rootClass
|
| +- (instancetype)initWithFieldDescription:(void *)description
|
| + includesDefault:(BOOL)includesDefault
|
| syntax:(GPBFileSyntax)syntax;
|
| @end
|
|
|
| @interface GPBEnumDescriptor ()
|
| -// valueDescriptions and extraTextFormatInfo have to be long lived, they are
|
| +// valueNames, values and extraTextFormatInfo have to be long lived, they are
|
| // held as raw pointers.
|
| + (instancetype)
|
| allocDescriptorForName:(NSString *)name
|
| - values:(GPBMessageEnumValueDescription *)valueDescriptions
|
| - valueCount:(NSUInteger)valueCount
|
| + valueNames:(const char *)valueNames
|
| + values:(const int32_t *)values
|
| + count:(uint32_t)valueCount
|
| enumVerifier:(GPBEnumValidationFunc)enumVerifier;
|
| + (instancetype)
|
| allocDescriptorForName:(NSString *)name
|
| - values:(GPBMessageEnumValueDescription *)valueDescriptions
|
| - valueCount:(NSUInteger)valueCount
|
| + valueNames:(const char *)valueNames
|
| + values:(const int32_t *)values
|
| + count:(uint32_t)valueCount
|
| enumVerifier:(GPBEnumValidationFunc)enumVerifier
|
| extraTextFormatInfo:(const char *)extraTextFormatInfo;
|
|
|
| - (instancetype)initWithName:(NSString *)name
|
| - values:(GPBMessageEnumValueDescription *)valueDescriptions
|
| - valueCount:(NSUInteger)valueCount
|
| + valueNames:(const char *)valueNames
|
| + values:(const int32_t *)values
|
| + count:(uint32_t)valueCount
|
| enumVerifier:(GPBEnumValidationFunc)enumVerifier;
|
| @end
|
|
|
| @@ -314,5 +290,24 @@ GPB_INLINE BOOL GPBExtensionIsWireFormat(GPBExtensionDescription *description) {
|
| return (description->options & GPBExtensionSetWireFormat) != 0;
|
| }
|
|
|
| +// Helper for compile time assets.
|
| +#ifndef _GPBCompileAssert
|
| + #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
|
| + #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
|
| + #else
|
| + // Pre-Xcode 7 support.
|
| + #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
|
| + #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg)
|
| + #define _GPBCompileAssert(test, msg) \
|
| + typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
|
| + #endif // __has_feature(c_static_assert) || __has_extension(c_static_assert)
|
| +#endif // _GPBCompileAssert
|
| +
|
| +// Sanity check that there isn't padding between the field description
|
| +// structures with and without a default.
|
| +_GPBCompileAssert(sizeof(GPBMessageFieldDescriptionWithDefault) ==
|
| + (sizeof(GPBGenericValue) +
|
| + sizeof(GPBMessageFieldDescription)),
|
| + DescriptionsWithDefault_different_size_than_expected);
|
|
|
| CF_EXTERN_C_END
|
|
|