Skip to content

Commit db86a4a

Browse files
stefanhausteincopybara-github
authored andcommitted
Use the containing class name instead of the class object to improve robustness for linker dead code removal with extension registration and extension lookup in different frameworks (where the class could be removed in the registering framework)
PiperOrigin-RevId: 862228896
1 parent 185a8ac commit db86a4a

4 files changed

Lines changed: 15 additions & 16 deletions

File tree

protobuf/runtime/src/com/google/protobuf/Descriptors.m

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
// Hand written counterpart of com.google.protobuf.Descriptors.
3232

33+
#import <Foundation/Foundation.h>
3334
#import "com/google/protobuf/Descriptors_PackagePrivate.h"
3435

3536
#import "IOSClass.h"
@@ -90,8 +91,9 @@ size_t CGPGetTypeSize(CGPFieldJavaType type) {
9091
type:ComGoogleProtobufDescriptors_FieldDescriptor_class_()];
9192
CGPFieldDescriptor **fieldsBuf = fields->buffer_;
9293
for (jint i = 0; i < fieldCount; i++) {
93-
fieldsBuf[i] = [[CGPFieldDescriptor alloc] initWithData:&fieldData[i]
94-
containingType:containingType];
94+
fieldsBuf[i] =
95+
[[CGPFieldDescriptor alloc] initWithData:&fieldData[i]
96+
containingType:NSStringFromClass([containingType class])];
9597
}
9698
return fields;
9799
}
@@ -354,8 +356,7 @@ static void CGPFieldFixDefaultValue(CGPFieldDescriptor *descriptor) {
354356
}
355357
}
356358

357-
- (instancetype)initWithData:(CGPFieldData *)data
358-
containingType:(CGPDescriptor *)containingType {
359+
- (instancetype)initWithData:(CGPFieldData *)data containingType:(NSString *)containingType {
359360
if (self = [self init]) {
360361
data_ = data;
361362
tag_ = TagFromData(data);

protobuf/runtime/src/com/google/protobuf/Descriptors_PackagePrivate.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,11 @@ typedef struct CGPOneofData {
122122
// Either nil, a Descriptor or a EnumDescriptor depending on the field type.
123123
id valueType_;
124124
ComGoogleProtobufDescriptorProtos_FieldOptions *fieldOptions_;
125-
CGPDescriptor *containingType_;
125+
NSString *containingType_;
126126
CGPOneofDescriptor *containingOneof_;
127127
}
128128

129-
- (instancetype)initWithData:(CGPFieldData *)data
130-
containingType:(CGPDescriptor *)containingType;
129+
- (instancetype)initWithData:(CGPFieldData *)data containingType:(NSString *)containingType;
131130

132131
@end
133132

protobuf/runtime/src/com/google/protobuf/ExtensionLite.m

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,9 @@ - (CGPFieldDescriptor *)getDescriptor {
5959
void ComGoogleProtobufExtensionLite_initWithFieldData_(CGPExtensionLite *self,
6060
struct CGPFieldData *data) {
6161
NSObject_init(self);
62-
Class msgClass = objc_getClass(data->containingType);
63-
NSCAssert(msgClass != nil, @"Containing message type not found.");
64-
CGPDescriptor *containingType = [msgClass performSelector:@selector(getDescriptor)];
65-
self->fieldDescriptor_ =
66-
[[CGPFieldDescriptor alloc] initWithData:data containingType:containingType];
62+
self->fieldDescriptor_ = [[CGPFieldDescriptor alloc]
63+
initWithData:data
64+
containingType:[NSString stringWithUTF8String:data->containingType]];
6765
}
6866

6967
J2OBJC_CLASS_TYPE_LITERAL_SOURCE(ComGoogleProtobufExtensionLite)

protobuf/runtime/src/com/google/protobuf/ExtensionRegistryLite.mm

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
#include "J2ObjC_source.h"
3939

40-
typedef std::pair<const CGPDescriptor *, jint> ExtensionRegistryKey;
40+
typedef std::pair<std::string, jint> ExtensionRegistryKey;
4141
typedef std::map<ExtensionRegistryKey, CGPFieldDescriptor *> ExtensionRegistryMap;
4242

4343
@interface ComGoogleProtobufExtensionRegistryLite () {
@@ -90,8 +90,8 @@ + (void)initialize {
9090

9191
void CGPExtensionRegistryAdd(CGPExtensionRegistryLite *registry, CGPExtensionLite *extension) {
9292
CGPFieldDescriptor *field = extension->fieldDescriptor_;
93-
CGPDescriptor *containingType = field->containingType_;
94-
registry->map_[ExtensionRegistryKey(containingType, CGPFieldGetNumber(field))] = field;
93+
registry->map_[ExtensionRegistryKey(std::string(field->containingType_.UTF8String),
94+
CGPFieldGetNumber(field))] = field;
9595
}
9696

9797
void ComGoogleProtobufExtensionRegistryLite_initWithBoolean_(
@@ -109,7 +109,8 @@ void ComGoogleProtobufExtensionRegistryLite_initWithBoolean_(
109109
CGPFieldDescriptor *CGPExtensionRegistryFind(
110110
CGPExtensionRegistryLite *registry, CGPDescriptor *descriptor, jint fieldNumber) {
111111
ExtensionRegistryMap *map = &registry->map_;
112-
ExtensionRegistryMap::iterator it = map->find(ExtensionRegistryKey(descriptor, fieldNumber));
112+
ExtensionRegistryMap::iterator it = map->find(ExtensionRegistryKey(
113+
std::string(NSStringFromClass([descriptor->messageClass_ class]).UTF8String), fieldNumber));
113114
if (it != map->end()) {
114115
return it->second;
115116
}

0 commit comments

Comments
 (0)