OLD | NEW |
1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 #import <objc/runtime.h> | 33 #import <objc/runtime.h> |
34 | 34 |
35 #import "GPBArray_PackagePrivate.h" | 35 #import "GPBArray_PackagePrivate.h" |
36 #import "GPBDescriptor_PackagePrivate.h" | 36 #import "GPBDescriptor_PackagePrivate.h" |
37 #import "GPBDictionary_PackagePrivate.h" | 37 #import "GPBDictionary_PackagePrivate.h" |
38 #import "GPBMessage_PackagePrivate.h" | 38 #import "GPBMessage_PackagePrivate.h" |
39 #import "GPBUnknownField.h" | 39 #import "GPBUnknownField.h" |
40 #import "GPBUnknownFieldSet.h" | 40 #import "GPBUnknownFieldSet.h" |
41 | 41 |
| 42 // Direct access is use for speed, to avoid even internally declaring things |
| 43 // read/write, etc. The warning is enabled in the project to ensure code calling |
| 44 // protos can turn on -Wdirect-ivar-access without issues. |
| 45 #pragma clang diagnostic push |
| 46 #pragma clang diagnostic ignored "-Wdirect-ivar-access" |
| 47 |
42 static void AppendTextFormatForMessage(GPBMessage *message, | 48 static void AppendTextFormatForMessage(GPBMessage *message, |
43 NSMutableString *toStr, | 49 NSMutableString *toStr, |
44 NSString *lineIndent); | 50 NSString *lineIndent); |
45 | 51 |
46 NSData *GPBEmptyNSData(void) { | 52 NSData *GPBEmptyNSData(void) { |
47 static dispatch_once_t onceToken; | 53 static dispatch_once_t onceToken; |
48 static NSData *defaultNSData = nil; | 54 static NSData *defaultNSData = nil; |
49 dispatch_once(&onceToken, ^{ | 55 dispatch_once(&onceToken, ^{ |
50 defaultNSData = [[NSData alloc] init]; | 56 defaultNSData = [[NSData alloc] init]; |
51 }); | 57 }); |
52 return defaultNSData; | 58 return defaultNSData; |
53 } | 59 } |
54 | 60 |
| 61 // -- About Version Checks -- |
| 62 // There's actually 3 places these checks all come into play: |
| 63 // 1. When the generated source is compile into .o files, the header check |
| 64 // happens. This is checking the protoc used matches the library being used |
| 65 // when making the .o. |
| 66 // 2. Every place a generated proto header is included in a developer's code, |
| 67 // the header check comes into play again. But this time it is checking that |
| 68 // the current library headers being used still support/match the ones for |
| 69 // the generated code. |
| 70 // 3. At runtime the final check here (GPBCheckRuntimeVersionsInternal), is |
| 71 // called from the generated code passing in values captured when the |
| 72 // generated code's .o was made. This checks that at runtime the generated |
| 73 // code and runtime library match. |
| 74 |
| 75 void GPBCheckRuntimeVersionSupport(int32_t objcRuntimeVersion) { |
| 76 // NOTE: This is passing the value captured in the compiled code to check |
| 77 // against the values captured when the runtime support was compiled. This |
| 78 // ensures the library code isn't in a different framework/library that |
| 79 // was generated with a non matching version. |
| 80 if (GOOGLE_PROTOBUF_OBJC_VERSION < objcRuntimeVersion) { |
| 81 // Library is too old for headers. |
| 82 [NSException raise:NSInternalInconsistencyException |
| 83 format:@"Linked to ProtocolBuffer runtime version %d," |
| 84 @" but code compiled needing atleast %d!", |
| 85 GOOGLE_PROTOBUF_OBJC_VERSION, objcRuntimeVersion]; |
| 86 } |
| 87 if (objcRuntimeVersion < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION) { |
| 88 // Headers are too old for library. |
| 89 [NSException raise:NSInternalInconsistencyException |
| 90 format:@"Proto generation source compiled against runtime" |
| 91 @" version %d, but this version of the runtime only" |
| 92 @" supports back to %d!", |
| 93 objcRuntimeVersion, |
| 94 GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION]; |
| 95 } |
| 96 } |
| 97 |
| 98 // This api is no longer used for version checks. 30001 is the last version |
| 99 // using this old versioning model. When that support is removed, this function |
| 100 // can be removed (along with the declaration in GPBUtilities_PackagePrivate.h). |
55 void GPBCheckRuntimeVersionInternal(int32_t version) { | 101 void GPBCheckRuntimeVersionInternal(int32_t version) { |
56 if (version != GOOGLE_PROTOBUF_OBJC_GEN_VERSION) { | 102 GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION == 30001, |
| 103 time_to_remove_this_old_version_shim); |
| 104 if (version != GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION) { |
57 [NSException raise:NSInternalInconsistencyException | 105 [NSException raise:NSInternalInconsistencyException |
58 format:@"Linked to ProtocolBuffer runtime version %d," | 106 format:@"Linked to ProtocolBuffer runtime version %d," |
59 @" but code compiled with version %d!", | 107 @" but code compiled with version %d!", |
60 GOOGLE_PROTOBUF_OBJC_GEN_VERSION, version]; | 108 GOOGLE_PROTOBUF_OBJC_GEN_VERSION, version]; |
61 } | 109 } |
62 } | 110 } |
63 | 111 |
64 BOOL GPBMessageHasFieldNumberSet(GPBMessage *self, uint32_t fieldNumber) { | 112 BOOL GPBMessageHasFieldNumberSet(GPBMessage *self, uint32_t fieldNumber) { |
65 GPBDescriptor *descriptor = [self descriptor]; | 113 GPBDescriptor *descriptor = [self descriptor]; |
66 GPBFieldDescriptor *field = [descriptor fieldWithNumber:fieldNumber]; | 114 GPBFieldDescriptor *field = [descriptor fieldWithNumber:fieldNumber]; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 //% NSCAssert(self->messageStorage_ != NULL, | 253 //% NSCAssert(self->messageStorage_ != NULL, |
206 //% @"%@: All messages should have storage (from init)", | 254 //% @"%@: All messages should have storage (from init)", |
207 //% [self class]); | 255 //% [self class]); |
208 //%#if defined(__clang_analyzer__) | 256 //%#if defined(__clang_analyzer__) |
209 //% if (self->messageStorage_ == NULL) return; | 257 //% if (self->messageStorage_ == NULL) return; |
210 //%#endif | 258 //%#endif |
211 //% uint8_t *storage = (uint8_t *)self->messageStorage_; | 259 //% uint8_t *storage = (uint8_t *)self->messageStorage_; |
212 //% TYPE *typePtr = (TYPE *)&storage[field->description_->offset]; | 260 //% TYPE *typePtr = (TYPE *)&storage[field->description_->offset]; |
213 //% *typePtr = value; | 261 //% *typePtr = value; |
214 //% // proto2: any value counts as having been set; proto3, it | 262 //% // proto2: any value counts as having been set; proto3, it |
215 //% // has to be a non zero value. | 263 //% // has to be a non zero value or be in a oneof. |
216 //% BOOL hasValue = | 264 //% BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
217 //% (syntax == GPBFileSyntaxProto2) || (value != (TYPE)0); | 265 //% || (value != (TYPE)0) |
| 266 //% || (field->containingOneof_ != NULL)); |
218 //% GPBSetHasIvarField(self, field, hasValue); | 267 //% GPBSetHasIvarField(self, field, hasValue); |
219 //% GPBBecomeVisibleToAutocreator(self); | 268 //% GPBBecomeVisibleToAutocreator(self); |
220 //%} | 269 //%} |
221 //% | 270 //% |
222 //%PDDM-DEFINE IVAR_ALIAS_DEFN_OBJECT(NAME, TYPE) | 271 //%PDDM-DEFINE IVAR_ALIAS_DEFN_OBJECT(NAME, TYPE) |
223 //%// Only exists for public api, no core code should use this. | 272 //%// Only exists for public api, no core code should use this. |
224 //%TYPE *GPBGetMessage##NAME##Field(GPBMessage *self, | 273 //%TYPE *GPBGetMessage##NAME##Field(GPBMessage *self, |
225 //% TYPE$S NAME$S GPBFieldDescriptor *field) { | 274 //% TYPE$S NAME$S GPBFieldDescriptor *field) { |
226 //% return (TYPE *)GPBGetObjectIvarWithField(self, field); | 275 //% return (TYPE *)GPBGetObjectIvarWithField(self, field); |
227 //%} | 276 //%} |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 GPBMessageFieldDescription *fieldDesc = field->description_; | 373 GPBMessageFieldDescription *fieldDesc = field->description_; |
325 GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number); | 374 GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number); |
326 } | 375 } |
327 // Clear "has" if they are being set to nil. | 376 // Clear "has" if they are being set to nil. |
328 BOOL setHasValue = (value != nil); | 377 BOOL setHasValue = (value != nil); |
329 // Under proto3, Bytes & String fields get cleared by resetting them to | 378 // Under proto3, Bytes & String fields get cleared by resetting them to |
330 // their default (empty) values, so if they are set to something of length | 379 // their default (empty) values, so if they are set to something of length |
331 // zero, they are being cleared. | 380 // zero, they are being cleared. |
332 if ((syntax == GPBFileSyntaxProto3) && !fieldIsMessage && | 381 if ((syntax == GPBFileSyntaxProto3) && !fieldIsMessage && |
333 ([value length] == 0)) { | 382 ([value length] == 0)) { |
334 setHasValue = NO; | 383 // Except, if the field was in a oneof, then it still gets recorded as |
335 value = nil; | 384 // having been set so the state of the oneof can be serialized back out. |
| 385 if (!oneof) { |
| 386 setHasValue = NO; |
| 387 } |
| 388 if (setHasValue) { |
| 389 NSCAssert(value != nil, @"Should never be setting has for nil"); |
| 390 } else { |
| 391 // The value passed in was retained, it must be released since we |
| 392 // aren't saving anything in the field. |
| 393 [value release]; |
| 394 value = nil; |
| 395 } |
336 } | 396 } |
337 GPBSetHasIvarField(self, field, setHasValue); | 397 GPBSetHasIvarField(self, field, setHasValue); |
338 } | 398 } |
339 uint8_t *storage = (uint8_t *)self->messageStorage_; | 399 uint8_t *storage = (uint8_t *)self->messageStorage_; |
340 id *typePtr = (id *)&storage[field->description_->offset]; | 400 id *typePtr = (id *)&storage[field->description_->offset]; |
341 | 401 |
342 id oldValue = *typePtr; | 402 id oldValue = *typePtr; |
343 | 403 |
344 *typePtr = value; | 404 *typePtr = value; |
345 | 405 |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number); | 571 GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number); |
512 } | 572 } |
513 | 573 |
514 // Bools are stored in the has bits to avoid needing explicit space in the | 574 // Bools are stored in the has bits to avoid needing explicit space in the |
515 // storage structure. | 575 // storage structure. |
516 // (the field number passed to the HasIvar helper doesn't really matter since | 576 // (the field number passed to the HasIvar helper doesn't really matter since |
517 // the offset is never negative) | 577 // the offset is never negative) |
518 GPBSetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number, value); | 578 GPBSetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number, value); |
519 | 579 |
520 // proto2: any value counts as having been set; proto3, it | 580 // proto2: any value counts as having been set; proto3, it |
521 // has to be a non zero value. | 581 // has to be a non zero value or be in a oneof. |
522 BOOL hasValue = | 582 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
523 (syntax == GPBFileSyntaxProto2) || (value != (BOOL)0); | 583 || (value != (BOOL)0) |
| 584 || (field->containingOneof_ != NULL)); |
524 GPBSetHasIvarField(self, field, hasValue); | 585 GPBSetHasIvarField(self, field, hasValue); |
525 GPBBecomeVisibleToAutocreator(self); | 586 GPBBecomeVisibleToAutocreator(self); |
526 } | 587 } |
527 | 588 |
528 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Int32, int32_t) | 589 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Int32, int32_t) |
529 // This block of code is generated, do not edit it directly. | 590 // This block of code is generated, do not edit it directly. |
530 | 591 |
531 int32_t GPBGetMessageInt32Field(GPBMessage *self, | 592 int32_t GPBGetMessageInt32Field(GPBMessage *self, |
532 GPBFieldDescriptor *field) { | 593 GPBFieldDescriptor *field) { |
533 if (GPBGetHasIvarField(self, field)) { | 594 if (GPBGetHasIvarField(self, field)) { |
(...skipping 26 matching lines...) Expand all Loading... |
560 NSCAssert(self->messageStorage_ != NULL, | 621 NSCAssert(self->messageStorage_ != NULL, |
561 @"%@: All messages should have storage (from init)", | 622 @"%@: All messages should have storage (from init)", |
562 [self class]); | 623 [self class]); |
563 #if defined(__clang_analyzer__) | 624 #if defined(__clang_analyzer__) |
564 if (self->messageStorage_ == NULL) return; | 625 if (self->messageStorage_ == NULL) return; |
565 #endif | 626 #endif |
566 uint8_t *storage = (uint8_t *)self->messageStorage_; | 627 uint8_t *storage = (uint8_t *)self->messageStorage_; |
567 int32_t *typePtr = (int32_t *)&storage[field->description_->offset]; | 628 int32_t *typePtr = (int32_t *)&storage[field->description_->offset]; |
568 *typePtr = value; | 629 *typePtr = value; |
569 // proto2: any value counts as having been set; proto3, it | 630 // proto2: any value counts as having been set; proto3, it |
570 // has to be a non zero value. | 631 // has to be a non zero value or be in a oneof. |
571 BOOL hasValue = | 632 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
572 (syntax == GPBFileSyntaxProto2) || (value != (int32_t)0); | 633 || (value != (int32_t)0) |
| 634 || (field->containingOneof_ != NULL)); |
573 GPBSetHasIvarField(self, field, hasValue); | 635 GPBSetHasIvarField(self, field, hasValue); |
574 GPBBecomeVisibleToAutocreator(self); | 636 GPBBecomeVisibleToAutocreator(self); |
575 } | 637 } |
576 | 638 |
577 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(UInt32, uint32_t) | 639 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(UInt32, uint32_t) |
578 // This block of code is generated, do not edit it directly. | 640 // This block of code is generated, do not edit it directly. |
579 | 641 |
580 uint32_t GPBGetMessageUInt32Field(GPBMessage *self, | 642 uint32_t GPBGetMessageUInt32Field(GPBMessage *self, |
581 GPBFieldDescriptor *field) { | 643 GPBFieldDescriptor *field) { |
582 if (GPBGetHasIvarField(self, field)) { | 644 if (GPBGetHasIvarField(self, field)) { |
(...skipping 26 matching lines...) Expand all Loading... |
609 NSCAssert(self->messageStorage_ != NULL, | 671 NSCAssert(self->messageStorage_ != NULL, |
610 @"%@: All messages should have storage (from init)", | 672 @"%@: All messages should have storage (from init)", |
611 [self class]); | 673 [self class]); |
612 #if defined(__clang_analyzer__) | 674 #if defined(__clang_analyzer__) |
613 if (self->messageStorage_ == NULL) return; | 675 if (self->messageStorage_ == NULL) return; |
614 #endif | 676 #endif |
615 uint8_t *storage = (uint8_t *)self->messageStorage_; | 677 uint8_t *storage = (uint8_t *)self->messageStorage_; |
616 uint32_t *typePtr = (uint32_t *)&storage[field->description_->offset]; | 678 uint32_t *typePtr = (uint32_t *)&storage[field->description_->offset]; |
617 *typePtr = value; | 679 *typePtr = value; |
618 // proto2: any value counts as having been set; proto3, it | 680 // proto2: any value counts as having been set; proto3, it |
619 // has to be a non zero value. | 681 // has to be a non zero value or be in a oneof. |
620 BOOL hasValue = | 682 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
621 (syntax == GPBFileSyntaxProto2) || (value != (uint32_t)0); | 683 || (value != (uint32_t)0) |
| 684 || (field->containingOneof_ != NULL)); |
622 GPBSetHasIvarField(self, field, hasValue); | 685 GPBSetHasIvarField(self, field, hasValue); |
623 GPBBecomeVisibleToAutocreator(self); | 686 GPBBecomeVisibleToAutocreator(self); |
624 } | 687 } |
625 | 688 |
626 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Int64, int64_t) | 689 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Int64, int64_t) |
627 // This block of code is generated, do not edit it directly. | 690 // This block of code is generated, do not edit it directly. |
628 | 691 |
629 int64_t GPBGetMessageInt64Field(GPBMessage *self, | 692 int64_t GPBGetMessageInt64Field(GPBMessage *self, |
630 GPBFieldDescriptor *field) { | 693 GPBFieldDescriptor *field) { |
631 if (GPBGetHasIvarField(self, field)) { | 694 if (GPBGetHasIvarField(self, field)) { |
(...skipping 26 matching lines...) Expand all Loading... |
658 NSCAssert(self->messageStorage_ != NULL, | 721 NSCAssert(self->messageStorage_ != NULL, |
659 @"%@: All messages should have storage (from init)", | 722 @"%@: All messages should have storage (from init)", |
660 [self class]); | 723 [self class]); |
661 #if defined(__clang_analyzer__) | 724 #if defined(__clang_analyzer__) |
662 if (self->messageStorage_ == NULL) return; | 725 if (self->messageStorage_ == NULL) return; |
663 #endif | 726 #endif |
664 uint8_t *storage = (uint8_t *)self->messageStorage_; | 727 uint8_t *storage = (uint8_t *)self->messageStorage_; |
665 int64_t *typePtr = (int64_t *)&storage[field->description_->offset]; | 728 int64_t *typePtr = (int64_t *)&storage[field->description_->offset]; |
666 *typePtr = value; | 729 *typePtr = value; |
667 // proto2: any value counts as having been set; proto3, it | 730 // proto2: any value counts as having been set; proto3, it |
668 // has to be a non zero value. | 731 // has to be a non zero value or be in a oneof. |
669 BOOL hasValue = | 732 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
670 (syntax == GPBFileSyntaxProto2) || (value != (int64_t)0); | 733 || (value != (int64_t)0) |
| 734 || (field->containingOneof_ != NULL)); |
671 GPBSetHasIvarField(self, field, hasValue); | 735 GPBSetHasIvarField(self, field, hasValue); |
672 GPBBecomeVisibleToAutocreator(self); | 736 GPBBecomeVisibleToAutocreator(self); |
673 } | 737 } |
674 | 738 |
675 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(UInt64, uint64_t) | 739 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(UInt64, uint64_t) |
676 // This block of code is generated, do not edit it directly. | 740 // This block of code is generated, do not edit it directly. |
677 | 741 |
678 uint64_t GPBGetMessageUInt64Field(GPBMessage *self, | 742 uint64_t GPBGetMessageUInt64Field(GPBMessage *self, |
679 GPBFieldDescriptor *field) { | 743 GPBFieldDescriptor *field) { |
680 if (GPBGetHasIvarField(self, field)) { | 744 if (GPBGetHasIvarField(self, field)) { |
(...skipping 26 matching lines...) Expand all Loading... |
707 NSCAssert(self->messageStorage_ != NULL, | 771 NSCAssert(self->messageStorage_ != NULL, |
708 @"%@: All messages should have storage (from init)", | 772 @"%@: All messages should have storage (from init)", |
709 [self class]); | 773 [self class]); |
710 #if defined(__clang_analyzer__) | 774 #if defined(__clang_analyzer__) |
711 if (self->messageStorage_ == NULL) return; | 775 if (self->messageStorage_ == NULL) return; |
712 #endif | 776 #endif |
713 uint8_t *storage = (uint8_t *)self->messageStorage_; | 777 uint8_t *storage = (uint8_t *)self->messageStorage_; |
714 uint64_t *typePtr = (uint64_t *)&storage[field->description_->offset]; | 778 uint64_t *typePtr = (uint64_t *)&storage[field->description_->offset]; |
715 *typePtr = value; | 779 *typePtr = value; |
716 // proto2: any value counts as having been set; proto3, it | 780 // proto2: any value counts as having been set; proto3, it |
717 // has to be a non zero value. | 781 // has to be a non zero value or be in a oneof. |
718 BOOL hasValue = | 782 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
719 (syntax == GPBFileSyntaxProto2) || (value != (uint64_t)0); | 783 || (value != (uint64_t)0) |
| 784 || (field->containingOneof_ != NULL)); |
720 GPBSetHasIvarField(self, field, hasValue); | 785 GPBSetHasIvarField(self, field, hasValue); |
721 GPBBecomeVisibleToAutocreator(self); | 786 GPBBecomeVisibleToAutocreator(self); |
722 } | 787 } |
723 | 788 |
724 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Float, float) | 789 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Float, float) |
725 // This block of code is generated, do not edit it directly. | 790 // This block of code is generated, do not edit it directly. |
726 | 791 |
727 float GPBGetMessageFloatField(GPBMessage *self, | 792 float GPBGetMessageFloatField(GPBMessage *self, |
728 GPBFieldDescriptor *field) { | 793 GPBFieldDescriptor *field) { |
729 if (GPBGetHasIvarField(self, field)) { | 794 if (GPBGetHasIvarField(self, field)) { |
(...skipping 26 matching lines...) Expand all Loading... |
756 NSCAssert(self->messageStorage_ != NULL, | 821 NSCAssert(self->messageStorage_ != NULL, |
757 @"%@: All messages should have storage (from init)", | 822 @"%@: All messages should have storage (from init)", |
758 [self class]); | 823 [self class]); |
759 #if defined(__clang_analyzer__) | 824 #if defined(__clang_analyzer__) |
760 if (self->messageStorage_ == NULL) return; | 825 if (self->messageStorage_ == NULL) return; |
761 #endif | 826 #endif |
762 uint8_t *storage = (uint8_t *)self->messageStorage_; | 827 uint8_t *storage = (uint8_t *)self->messageStorage_; |
763 float *typePtr = (float *)&storage[field->description_->offset]; | 828 float *typePtr = (float *)&storage[field->description_->offset]; |
764 *typePtr = value; | 829 *typePtr = value; |
765 // proto2: any value counts as having been set; proto3, it | 830 // proto2: any value counts as having been set; proto3, it |
766 // has to be a non zero value. | 831 // has to be a non zero value or be in a oneof. |
767 BOOL hasValue = | 832 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
768 (syntax == GPBFileSyntaxProto2) || (value != (float)0); | 833 || (value != (float)0) |
| 834 || (field->containingOneof_ != NULL)); |
769 GPBSetHasIvarField(self, field, hasValue); | 835 GPBSetHasIvarField(self, field, hasValue); |
770 GPBBecomeVisibleToAutocreator(self); | 836 GPBBecomeVisibleToAutocreator(self); |
771 } | 837 } |
772 | 838 |
773 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Double, double) | 839 //%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Double, double) |
774 // This block of code is generated, do not edit it directly. | 840 // This block of code is generated, do not edit it directly. |
775 | 841 |
776 double GPBGetMessageDoubleField(GPBMessage *self, | 842 double GPBGetMessageDoubleField(GPBMessage *self, |
777 GPBFieldDescriptor *field) { | 843 GPBFieldDescriptor *field) { |
778 if (GPBGetHasIvarField(self, field)) { | 844 if (GPBGetHasIvarField(self, field)) { |
(...skipping 26 matching lines...) Expand all Loading... |
805 NSCAssert(self->messageStorage_ != NULL, | 871 NSCAssert(self->messageStorage_ != NULL, |
806 @"%@: All messages should have storage (from init)", | 872 @"%@: All messages should have storage (from init)", |
807 [self class]); | 873 [self class]); |
808 #if defined(__clang_analyzer__) | 874 #if defined(__clang_analyzer__) |
809 if (self->messageStorage_ == NULL) return; | 875 if (self->messageStorage_ == NULL) return; |
810 #endif | 876 #endif |
811 uint8_t *storage = (uint8_t *)self->messageStorage_; | 877 uint8_t *storage = (uint8_t *)self->messageStorage_; |
812 double *typePtr = (double *)&storage[field->description_->offset]; | 878 double *typePtr = (double *)&storage[field->description_->offset]; |
813 *typePtr = value; | 879 *typePtr = value; |
814 // proto2: any value counts as having been set; proto3, it | 880 // proto2: any value counts as having been set; proto3, it |
815 // has to be a non zero value. | 881 // has to be a non zero value or be in a oneof. |
816 BOOL hasValue = | 882 BOOL hasValue = ((syntax == GPBFileSyntaxProto2) |
817 (syntax == GPBFileSyntaxProto2) || (value != (double)0); | 883 || (value != (double)0) |
| 884 || (field->containingOneof_ != NULL)); |
818 GPBSetHasIvarField(self, field, hasValue); | 885 GPBSetHasIvarField(self, field, hasValue); |
819 GPBBecomeVisibleToAutocreator(self); | 886 GPBBecomeVisibleToAutocreator(self); |
820 } | 887 } |
821 | 888 |
822 //%PDDM-EXPAND-END (6 expansions) | 889 //%PDDM-EXPAND-END (6 expansions) |
823 | 890 |
824 // Aliases are function calls that are virtually the same. | 891 // Aliases are function calls that are virtually the same. |
825 | 892 |
826 //%PDDM-EXPAND IVAR_ALIAS_DEFN_OBJECT(String, NSString) | 893 //%PDDM-EXPAND IVAR_ALIAS_DEFN_OBJECT(String, NSString) |
827 // This block of code is generated, do not edit it directly. | 894 // This block of code is generated, do not edit it directly. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 | 949 |
883 // Only exists for public api, no core code should use this. | 950 // Only exists for public api, no core code should use this. |
884 void GPBSetMessageGroupField(GPBMessage *self, | 951 void GPBSetMessageGroupField(GPBMessage *self, |
885 GPBFieldDescriptor *field, | 952 GPBFieldDescriptor *field, |
886 GPBMessage *value) { | 953 GPBMessage *value) { |
887 GPBSetObjectIvarWithField(self, field, (id)value); | 954 GPBSetObjectIvarWithField(self, field, (id)value); |
888 } | 955 } |
889 | 956 |
890 //%PDDM-EXPAND-END (4 expansions) | 957 //%PDDM-EXPAND-END (4 expansions) |
891 | 958 |
| 959 // GPBGetMessageRepeatedField is defined in GPBMessage.m |
| 960 |
892 // Only exists for public api, no core code should use this. | 961 // Only exists for public api, no core code should use this. |
893 id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field) { | 962 void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id
array) { |
894 #if DEBUG | 963 #if defined(DEBUG) && DEBUG |
895 if (field.fieldType != GPBFieldTypeRepeated) { | 964 if (field.fieldType != GPBFieldTypeRepeated) { |
896 [NSException raise:NSInvalidArgumentException | 965 [NSException raise:NSInvalidArgumentException |
897 format:@"%@.%@ is not a repeated field.", | 966 format:@"%@.%@ is not a repeated field.", |
898 [self class], field.name]; | |
899 } | |
900 #endif | |
901 return GPBGetObjectIvarWithField(self, field); | |
902 } | |
903 | |
904 // Only exists for public api, no core code should use this. | |
905 void GPBSetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field, id
array) { | |
906 #if DEBUG | |
907 if (field.fieldType != GPBFieldTypeRepeated) { | |
908 [NSException raise:NSInvalidArgumentException | |
909 format:@"%@.%@ is not a repeated field.", | |
910 [self class], field.name]; | 967 [self class], field.name]; |
911 } | 968 } |
912 Class expectedClass = Nil; | 969 Class expectedClass = Nil; |
913 switch (GPBGetFieldDataType(field)) { | 970 switch (GPBGetFieldDataType(field)) { |
914 case GPBDataTypeBool: | 971 case GPBDataTypeBool: |
915 expectedClass = [GPBBoolArray class]; | 972 expectedClass = [GPBBoolArray class]; |
916 break; | 973 break; |
917 case GPBDataTypeSFixed32: | 974 case GPBDataTypeSFixed32: |
918 case GPBDataTypeInt32: | 975 case GPBDataTypeInt32: |
919 case GPBDataTypeSInt32: | 976 case GPBDataTypeSInt32: |
(...skipping 15 matching lines...) Expand all Loading... |
935 case GPBDataTypeFloat: | 992 case GPBDataTypeFloat: |
936 expectedClass = [GPBFloatArray class]; | 993 expectedClass = [GPBFloatArray class]; |
937 break; | 994 break; |
938 case GPBDataTypeDouble: | 995 case GPBDataTypeDouble: |
939 expectedClass = [GPBDoubleArray class]; | 996 expectedClass = [GPBDoubleArray class]; |
940 break; | 997 break; |
941 case GPBDataTypeBytes: | 998 case GPBDataTypeBytes: |
942 case GPBDataTypeString: | 999 case GPBDataTypeString: |
943 case GPBDataTypeMessage: | 1000 case GPBDataTypeMessage: |
944 case GPBDataTypeGroup: | 1001 case GPBDataTypeGroup: |
945 expectedClass = [NSMutableDictionary class]; | 1002 expectedClass = [NSMutableArray class]; |
946 break; | 1003 break; |
947 case GPBDataTypeEnum: | 1004 case GPBDataTypeEnum: |
948 expectedClass = [GPBBoolArray class]; | 1005 expectedClass = [GPBEnumArray class]; |
949 break; | 1006 break; |
950 } | 1007 } |
951 if (array && ![array isKindOfClass:expectedClass]) { | 1008 if (array && ![array isKindOfClass:expectedClass]) { |
952 [NSException raise:NSInvalidArgumentException | 1009 [NSException raise:NSInvalidArgumentException |
953 format:@"%@.%@: Expected %@ object, got %@.", | 1010 format:@"%@.%@: Expected %@ object, got %@.", |
954 [self class], field.name, expectedClass, [array class]]; | 1011 [self class], field.name, expectedClass, [array class]]; |
955 } | 1012 } |
956 #endif | 1013 #endif |
957 GPBSetObjectIvarWithField(self, field, array); | 1014 GPBSetObjectIvarWithField(self, field, array); |
958 } | 1015 } |
959 | 1016 |
960 #if DEBUG | 1017 #if defined(DEBUG) && DEBUG |
961 static NSString *TypeToStr(GPBDataType dataType) { | 1018 static NSString *TypeToStr(GPBDataType dataType) { |
962 switch (dataType) { | 1019 switch (dataType) { |
963 case GPBDataTypeBool: | 1020 case GPBDataTypeBool: |
964 return @"Bool"; | 1021 return @"Bool"; |
965 case GPBDataTypeSFixed32: | 1022 case GPBDataTypeSFixed32: |
966 case GPBDataTypeInt32: | 1023 case GPBDataTypeInt32: |
967 case GPBDataTypeSInt32: | 1024 case GPBDataTypeSInt32: |
968 return @"Int32"; | 1025 return @"Int32"; |
969 case GPBDataTypeFixed32: | 1026 case GPBDataTypeFixed32: |
970 case GPBDataTypeUInt32: | 1027 case GPBDataTypeUInt32: |
(...skipping 13 matching lines...) Expand all Loading... |
984 case GPBDataTypeString: | 1041 case GPBDataTypeString: |
985 case GPBDataTypeMessage: | 1042 case GPBDataTypeMessage: |
986 case GPBDataTypeGroup: | 1043 case GPBDataTypeGroup: |
987 return @"Object"; | 1044 return @"Object"; |
988 case GPBDataTypeEnum: | 1045 case GPBDataTypeEnum: |
989 return @"Bool"; | 1046 return @"Bool"; |
990 } | 1047 } |
991 } | 1048 } |
992 #endif | 1049 #endif |
993 | 1050 |
994 // Only exists for public api, no core code should use this. | 1051 // GPBGetMessageMapField is defined in GPBMessage.m |
995 id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field) { | |
996 #if DEBUG | |
997 if (field.fieldType != GPBFieldTypeMap) { | |
998 [NSException raise:NSInvalidArgumentException | |
999 format:@"%@.%@ is not a map<> field.", | |
1000 [self class], field.name]; | |
1001 } | |
1002 #endif | |
1003 return GPBGetObjectIvarWithField(self, field); | |
1004 } | |
1005 | 1052 |
1006 // Only exists for public api, no core code should use this. | 1053 // Only exists for public api, no core code should use this. |
1007 void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, | 1054 void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, |
1008 id dictionary) { | 1055 id dictionary) { |
1009 #if DEBUG | 1056 #if defined(DEBUG) && DEBUG |
1010 if (field.fieldType != GPBFieldTypeMap) { | 1057 if (field.fieldType != GPBFieldTypeMap) { |
1011 [NSException raise:NSInvalidArgumentException | 1058 [NSException raise:NSInvalidArgumentException |
1012 format:@"%@.%@ is not a map<> field.", | 1059 format:@"%@.%@ is not a map<> field.", |
1013 [self class], field.name]; | 1060 [self class], field.name]; |
1014 } | 1061 } |
1015 if (dictionary) { | 1062 if (dictionary) { |
1016 GPBDataType keyDataType = field.mapKeyDataType; | 1063 GPBDataType keyDataType = field.mapKeyDataType; |
1017 GPBDataType valueDataType = GPBGetFieldDataType(field); | 1064 GPBDataType valueDataType = GPBGetFieldDataType(field); |
1018 NSString *keyStr = TypeToStr(keyDataType); | 1065 NSString *keyStr = TypeToStr(keyDataType); |
1019 NSString *valueStr = TypeToStr(valueDataType); | 1066 NSString *valueStr = TypeToStr(valueDataType); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1059 for (NSUInteger i = 0; i < len; ++i) { | 1106 for (NSUInteger i = 0; i < len; ++i) { |
1060 unichar aChar = [toPrint characterAtIndex:i]; | 1107 unichar aChar = [toPrint characterAtIndex:i]; |
1061 switch (aChar) { | 1108 switch (aChar) { |
1062 case '\n': [destStr appendString:@"\\n"]; break; | 1109 case '\n': [destStr appendString:@"\\n"]; break; |
1063 case '\r': [destStr appendString:@"\\r"]; break; | 1110 case '\r': [destStr appendString:@"\\r"]; break; |
1064 case '\t': [destStr appendString:@"\\t"]; break; | 1111 case '\t': [destStr appendString:@"\\t"]; break; |
1065 case '\"': [destStr appendString:@"\\\""]; break; | 1112 case '\"': [destStr appendString:@"\\\""]; break; |
1066 case '\'': [destStr appendString:@"\\\'"]; break; | 1113 case '\'': [destStr appendString:@"\\\'"]; break; |
1067 case '\\': [destStr appendString:@"\\\\"]; break; | 1114 case '\\': [destStr appendString:@"\\\\"]; break; |
1068 default: | 1115 default: |
1069 [destStr appendFormat:@"%C", aChar]; | 1116 // This differs slightly from the C++ code in that the C++ doesn't |
| 1117 // generate UTF8; it looks at the string in UTF8, but escapes every |
| 1118 // byte > 0x7E. |
| 1119 if (aChar < 0x20) { |
| 1120 [destStr appendFormat:@"\\%d%d%d", |
| 1121 (aChar / 64), ((aChar % 64) / 8), (aChar % 8)]; |
| 1122 } else { |
| 1123 [destStr appendFormat:@"%C", aChar]; |
| 1124 } |
1070 break; | 1125 break; |
1071 } | 1126 } |
1072 } | 1127 } |
1073 [destStr appendString:@"\""]; | 1128 [destStr appendString:@"\""]; |
1074 } | 1129 } |
1075 | 1130 |
1076 static void AppendBufferAsString(NSData *buffer, NSMutableString *destStr) { | 1131 static void AppendBufferAsString(NSData *buffer, NSMutableString *destStr) { |
1077 const char *src = (const char *)[buffer bytes]; | 1132 const char *src = (const char *)[buffer bytes]; |
1078 size_t srcLen = [buffer length]; | 1133 size_t srcLen = [buffer length]; |
1079 [destStr appendString:@"\""]; | 1134 [destStr appendString:@"\""]; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *sto
p) { | 1181 [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *sto
p) { |
1127 #pragma unused(stop) | 1182 #pragma unused(stop) |
1128 [toStr appendString:(isFirst ? msgStartFirst : msgStart)]; | 1183 [toStr appendString:(isFirst ? msgStartFirst : msgStart)]; |
1129 isFirst = NO; | 1184 isFirst = NO; |
1130 | 1185 |
1131 [toStr appendString:keyLine]; | 1186 [toStr appendString:keyLine]; |
1132 AppendStringEscaped(key, toStr); | 1187 AppendStringEscaped(key, toStr); |
1133 [toStr appendString:@"\n"]; | 1188 [toStr appendString:@"\n"]; |
1134 | 1189 |
1135 [toStr appendString:valueLine]; | 1190 [toStr appendString:valueLine]; |
| 1191 #pragma clang diagnostic push |
| 1192 #pragma clang diagnostic ignored "-Wswitch-enum" |
1136 switch (valueDataType) { | 1193 switch (valueDataType) { |
1137 case GPBDataTypeString: | 1194 case GPBDataTypeString: |
1138 AppendStringEscaped(value, toStr); | 1195 AppendStringEscaped(value, toStr); |
1139 break; | 1196 break; |
1140 | 1197 |
1141 case GPBDataTypeBytes: | 1198 case GPBDataTypeBytes: |
1142 AppendBufferAsString(value, toStr); | 1199 AppendBufferAsString(value, toStr); |
1143 break; | 1200 break; |
1144 | 1201 |
1145 case GPBDataTypeMessage: | 1202 case GPBDataTypeMessage: |
1146 [toStr appendString:@"{\n"]; | 1203 [toStr appendString:@"{\n"]; |
1147 NSString *subIndent = [lineIndent stringByAppendingString:@" "]; | 1204 NSString *subIndent = [lineIndent stringByAppendingString:@" "]; |
1148 AppendTextFormatForMessage(value, toStr, subIndent); | 1205 AppendTextFormatForMessage(value, toStr, subIndent); |
1149 [toStr appendFormat:@"%@ }", lineIndent]; | 1206 [toStr appendFormat:@"%@ }", lineIndent]; |
1150 break; | 1207 break; |
1151 | 1208 |
1152 default: | 1209 default: |
1153 NSCAssert(NO, @"Can't happen"); | 1210 NSCAssert(NO, @"Can't happen"); |
1154 break; | 1211 break; |
1155 } | 1212 } |
| 1213 #pragma clang diagnostic pop |
1156 [toStr appendString:@"\n"]; | 1214 [toStr appendString:@"\n"]; |
1157 | 1215 |
1158 [toStr appendString:msgEnd]; | 1216 [toStr appendString:msgEnd]; |
1159 }]; | 1217 }]; |
1160 } else { | 1218 } else { |
1161 // map is one of the GPB*Dictionary classes, type doesn't matter. | 1219 // map is one of the GPB*Dictionary classes, type doesn't matter. |
1162 GPBInt32Int32Dictionary *dict = map; | 1220 GPBInt32Int32Dictionary *dict = map; |
1163 [dict enumerateForTextFormat:^(id keyObj, id valueObj) { | 1221 [dict enumerateForTextFormat:^(id keyObj, id valueObj) { |
1164 [toStr appendString:(isFirst ? msgStartFirst : msgStart)]; | 1222 [toStr appendString:(isFirst ? msgStartFirst : msgStart)]; |
1165 isFirst = NO; | 1223 isFirst = NO; |
1166 | 1224 |
1167 // Key always is a NSString. | 1225 // Key always is a NSString. |
1168 if (keyDataType == GPBDataTypeString) { | 1226 if (keyDataType == GPBDataTypeString) { |
1169 [toStr appendString:keyLine]; | 1227 [toStr appendString:keyLine]; |
1170 AppendStringEscaped(keyObj, toStr); | 1228 AppendStringEscaped(keyObj, toStr); |
1171 [toStr appendString:@"\n"]; | 1229 [toStr appendString:@"\n"]; |
1172 } else { | 1230 } else { |
1173 [toStr appendFormat:@"%@%@\n", keyLine, keyObj]; | 1231 [toStr appendFormat:@"%@%@\n", keyLine, keyObj]; |
1174 } | 1232 } |
1175 | 1233 |
1176 [toStr appendString:valueLine]; | 1234 [toStr appendString:valueLine]; |
| 1235 #pragma clang diagnostic push |
| 1236 #pragma clang diagnostic ignored "-Wswitch-enum" |
1177 switch (valueDataType) { | 1237 switch (valueDataType) { |
1178 case GPBDataTypeString: | 1238 case GPBDataTypeString: |
1179 AppendStringEscaped(valueObj, toStr); | 1239 AppendStringEscaped(valueObj, toStr); |
1180 break; | 1240 break; |
1181 | 1241 |
1182 case GPBDataTypeBytes: | 1242 case GPBDataTypeBytes: |
1183 AppendBufferAsString(valueObj, toStr); | 1243 AppendBufferAsString(valueObj, toStr); |
1184 break; | 1244 break; |
1185 | 1245 |
1186 case GPBDataTypeMessage: | 1246 case GPBDataTypeMessage: |
(...skipping 17 matching lines...) Expand all Loading... |
1204 } | 1264 } |
1205 break; | 1265 break; |
1206 } | 1266 } |
1207 | 1267 |
1208 default: | 1268 default: |
1209 NSCAssert(valueDataType != GPBDataTypeGroup, @"Can't happen"); | 1269 NSCAssert(valueDataType != GPBDataTypeGroup, @"Can't happen"); |
1210 // Everything else is a NSString. | 1270 // Everything else is a NSString. |
1211 [toStr appendString:valueObj]; | 1271 [toStr appendString:valueObj]; |
1212 break; | 1272 break; |
1213 } | 1273 } |
| 1274 #pragma clang diagnostic pop |
1214 [toStr appendString:@"\n"]; | 1275 [toStr appendString:@"\n"]; |
1215 | 1276 |
1216 [toStr appendString:msgEnd]; | 1277 [toStr appendString:msgEnd]; |
1217 }]; | 1278 }]; |
1218 } | 1279 } |
1219 } | 1280 } |
1220 | 1281 |
1221 static void AppendTextFormatForMessageField(GPBMessage *message, | 1282 static void AppendTextFormatForMessageField(GPBMessage *message, |
1222 GPBFieldDescriptor *field, | 1283 GPBFieldDescriptor *field, |
1223 NSMutableString *toStr, | 1284 NSMutableString *toStr, |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1473 } | 1534 } |
1474 | 1535 |
1475 static void AppendTextFormatForMessage(GPBMessage *message, | 1536 static void AppendTextFormatForMessage(GPBMessage *message, |
1476 NSMutableString *toStr, | 1537 NSMutableString *toStr, |
1477 NSString *lineIndent) { | 1538 NSString *lineIndent) { |
1478 GPBDescriptor *descriptor = [message descriptor]; | 1539 GPBDescriptor *descriptor = [message descriptor]; |
1479 NSArray *fieldsArray = descriptor->fields_; | 1540 NSArray *fieldsArray = descriptor->fields_; |
1480 NSUInteger fieldCount = fieldsArray.count; | 1541 NSUInteger fieldCount = fieldsArray.count; |
1481 const GPBExtensionRange *extensionRanges = descriptor.extensionRanges; | 1542 const GPBExtensionRange *extensionRanges = descriptor.extensionRanges; |
1482 NSUInteger extensionRangesCount = descriptor.extensionRangesCount; | 1543 NSUInteger extensionRangesCount = descriptor.extensionRangesCount; |
1483 NSArray *activeExtensions = [message sortedExtensionsInUse]; | 1544 NSArray *activeExtensions = [[message extensionsCurrentlySet] |
| 1545 sortedArrayUsingSelector:@selector(compareByFieldNumber:)]; |
1484 for (NSUInteger i = 0, j = 0; i < fieldCount || j < extensionRangesCount;) { | 1546 for (NSUInteger i = 0, j = 0; i < fieldCount || j < extensionRangesCount;) { |
1485 if (i == fieldCount) { | 1547 if (i == fieldCount) { |
1486 AppendTextFormatForMessageExtensionRange( | 1548 AppendTextFormatForMessageExtensionRange( |
1487 message, activeExtensions, extensionRanges[j++], toStr, lineIndent); | 1549 message, activeExtensions, extensionRanges[j++], toStr, lineIndent); |
1488 } else if (j == extensionRangesCount || | 1550 } else if (j == extensionRangesCount || |
1489 GPBFieldNumber(fieldsArray[i]) < extensionRanges[j].start) { | 1551 GPBFieldNumber(fieldsArray[i]) < extensionRanges[j].start) { |
1490 AppendTextFormatForMessageField(message, fieldsArray[i++], toStr, | 1552 AppendTextFormatForMessageField(message, fieldsArray[i++], toStr, |
1491 lineIndent); | 1553 lineIndent); |
1492 } else { | 1554 } else { |
1493 AppendTextFormatForMessageExtensionRange( | 1555 AppendTextFormatForMessageExtensionRange( |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1699 } else { | 1761 } else { |
1700 [result appendFormat:@"%C", c]; | 1762 [result appendFormat:@"%C", c]; |
1701 } | 1763 } |
1702 } | 1764 } |
1703 i += segmentLen; | 1765 i += segmentLen; |
1704 } | 1766 } |
1705 | 1767 |
1706 return result; | 1768 return result; |
1707 } | 1769 } |
1708 | 1770 |
| 1771 #pragma clang diagnostic pop |
| 1772 |
1709 #pragma mark - GPBMessageSignatureProtocol | 1773 #pragma mark - GPBMessageSignatureProtocol |
1710 | 1774 |
1711 // A series of selectors that are used solely to get @encoding values | 1775 // A series of selectors that are used solely to get @encoding values |
1712 // for them by the dynamic protobuf runtime code. An object using the protocol | 1776 // for them by the dynamic protobuf runtime code. An object using the protocol |
1713 // needs to be declared for the protocol to be valid at runtime. | 1777 // needs to be declared for the protocol to be valid at runtime. |
1714 @interface GPBMessageSignatureProtocol : NSObject<GPBMessageSignatureProtocol> | 1778 @interface GPBMessageSignatureProtocol : NSObject<GPBMessageSignatureProtocol> |
1715 @end | 1779 @end |
1716 @implementation GPBMessageSignatureProtocol | 1780 @implementation GPBMessageSignatureProtocol |
1717 @end | 1781 @end |
OLD | NEW |