79a23c435c
NOTE: This is a binary breaking change as structure sizes have changed size and/or order. - Drop capturing field options, no other options were captured and other mobile targeted languages don't try to capture this sort information (saved 8 bytes for every field defined (in static data and again in field descriptor instance size data). - No longer generate/compile in the messages/enums in descriptor.proto. If developers need it, they should generate it and compile it in. Reduced the overhead of the core library. - Compute the number of has_bits actually needs to avoid over reserving. - Let the boolean single fields store via a has_bit to avoid storage, makes the common cases of the instance size smaller. - Reorder some flags and down size the enums to contain the bits needed. - Reorder the items in the structures to manually ensure they are are packed better (especially when generating 64bit code - 8 bytes for every field, 16 bytes for every extension, instance sizes 8 bytes also). - Split off the structure initialization so when the default is zero, the generated static storage doesn't need to reserve the space. This is batched at the message level, so all the fields for the message have to have zero defaults to get the saves. By definition all proto3 syntax files fall into this case but it also saves space for the proto2 that use the standard defaults. (saves 8 bytes of static data for every field that had a zero default) - Don't track the enums defined by a message. Nothing in the runtime needs it and it was just generation and runtime overhead. (saves 8 bytes per enum) - Ensure EnumDescriptors are started up threadsafe in all cases. - Split some of the Descriptor initialization into multiple methods so the generated code isn't padded with lots of zero/nil args. - Change how oneof info is feed to the runtime enabling us to generate less static data (8 bytes saved per oneof for 64bit). - Change how enum value informat is capture to pack the data and only decode it if it ends up being needed. Avoids padding issues causing bloat of 64bit, and removes the needs for extra pointers in addition to the data (just the data and one pointer now).
86 lines
4.0 KiB
C
86 lines
4.0 KiB
C
// Protocol Buffers - Google's data interchange format
|
||
// Copyright 2008 Google Inc. All rights reserved.
|
||
// https://developers.google.com/protocol-buffers/
|
||
//
|
||
// Redistribution and use in source and binary forms, with or without
|
||
// modification, are permitted provided that the following conditions are
|
||
// met:
|
||
//
|
||
// * Redistributions of source code must retain the above copyright
|
||
// notice, this list of conditions and the following disclaimer.
|
||
// * Redistributions in binary form must reproduce the above
|
||
// copyright notice, this list of conditions and the following disclaimer
|
||
// in the documentation and/or other materials provided with the
|
||
// distribution.
|
||
// * Neither the name of Google Inc. nor the names of its
|
||
// contributors may be used to endorse or promote products derived from
|
||
// this software without specific prior written permission.
|
||
//
|
||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
||
// The Objective C runtime has complete enough info that most protos don’t end
|
||
// up using this, so leaving it on is no cost or very little cost. If you
|
||
// happen to see it causing bloat, this is the way to disable it. If you do
|
||
// need to disable it, try only disabling it for Release builds as having
|
||
// full TextFormat can be useful for debugging.
|
||
#ifndef GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
|
||
#define GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS 0
|
||
#endif
|
||
|
||
// Used in the generated code to give sizes to enums. int32_t was chosen based
|
||
// on the fact that Protocol Buffers enums are limited to this range.
|
||
#if !__has_feature(objc_fixed_enum)
|
||
#error All supported Xcode versions should support objc_fixed_enum.
|
||
#endif
|
||
// If the headers are imported into Objective-C++, we can run into an issue
|
||
// where the defintion of NS_ENUM (really CF_ENUM) changes based on the C++
|
||
// standard that is in effect. If it isn't C++11 or higher, the definition
|
||
// doesn't allow us to forward declare. We work around this one case by
|
||
// providing a local definition. The default case has to use NS_ENUM for the
|
||
// magic that is Swift bridging of enums.
|
||
#if (__cplusplus && __cplusplus < 201103L)
|
||
#define GPB_ENUM(X) enum X : int32_t X; enum X : int32_t
|
||
#else
|
||
#define GPB_ENUM(X) NS_ENUM(int32_t, X)
|
||
#endif
|
||
// GPB_ENUM_FWD_DECLARE is used for forward declaring enums, ex:
|
||
// GPB_ENUM_FWD_DECLARE(Foo_Enum)
|
||
// @property (nonatomic) Foo_Enum value;
|
||
#define GPB_ENUM_FWD_DECLARE(X) enum X : int32_t
|
||
|
||
// Based upon CF_INLINE. Forces inlining in release.
|
||
#if !defined(DEBUG)
|
||
#define GPB_INLINE static __inline__ __attribute__((always_inline))
|
||
#else
|
||
#define GPB_INLINE static __inline__
|
||
#endif
|
||
|
||
// For use in public headers that might need to deal with ARC.
|
||
#ifndef GPB_UNSAFE_UNRETAINED
|
||
#if __has_feature(objc_arc)
|
||
#define GPB_UNSAFE_UNRETAINED __unsafe_unretained
|
||
#else
|
||
#define GPB_UNSAFE_UNRETAINED
|
||
#endif
|
||
#endif
|
||
|
||
// If property name starts with init we need to annotate it to get past ARC.
|
||
// http://stackoverflow.com/questions/18723226/how-do-i-annotate-an-objective-c-property-with-an-objc-method-family/18723227#18723227
|
||
#define GPB_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
|
||
|
||
// The protoc-gen-objc version which works with the current version of the
|
||
// generated Objective C sources. In general we don't want to change the
|
||
// runtime interfaces (or this version) as it means everything has to be
|
||
// regenerated.
|
||
#define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30001
|