Skip to content

Commit eae690b

Browse files
Dave MacLachlancopybara-github
authored andcommitted
Move to using objc_externally_retained to elide unneeded calls to retain/release in j2objc protobuf code.
I believe all of the C code that is wrapped in these blocks can assume that the objects being passed in are going to be held externally and will live for the lifetime of the call. https://clang.llvm.org/docs/AutomaticReferenceCounting.html#externally-retained-variables PiperOrigin-RevId: 841790480
1 parent 92244d9 commit eae690b

File tree

5 files changed

+20
-0
lines changed

5 files changed

+20
-0
lines changed

jre_emul/Classes/J2ObjC_common.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ __attribute__((always_inline)) inline id JreRetainedAutoreleasedReturnValue(id v
127127
# define WEAK_ __unsafe_unretained
128128
#endif
129129

130+
#ifndef J2OBJC_EXTERNALLY_RETAINED
131+
#if __has_feature(objc_arc) && __has_attribute(objc_externally_retained)
132+
# define J2OBJC_EXTERNALLY_RETAINED __attribute__((objc_externally_retained))
133+
# define J2OBJC_ASSUME_EXTERNALLY_RETAINED_BEGIN _Pragma("clang attribute J2OBJC_ASSUME_EXTERNALLY_RETAINED.push(__attribute__((objc_externally_retained)), apply_to=any(function, block, objc_method))")
134+
# define J2OBJC_ASSUME_EXTERNALLY_RETAINED_END _Pragma("clang attribute J2OBJC_ASSUME_EXTERNALLY_RETAINED.pop")
135+
#else // __OBJC__ && objc_arc && objc_externally_retained
136+
# define J2OBJC_EXTERNALLY_RETAINED
137+
# define J2OBJC_ASSUME_EXTERNALLY_RETAINED_BEGIN
138+
# define J2OBJC_ASSUME_EXTERNALLY_RETAINED_END
139+
#endif // __OBJC__ && objc_arc && objc_externally_retained
140+
#endif // !J2OBJC_EXTERNALLY_RETAINED
141+
130142
CF_EXTERN_C_BEGIN
131143

132144
id JreThrowNullPointerException(void) __attribute__((noreturn));

protobuf/compiler/src/google/protobuf/compiler/j2objc/j2objc_enum.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ void EnumGenerator::GenerateSource(io::Printer* printer) {
398398
"\n"
399399
"@end\n"
400400
"\n"
401+
"J2OBJC_ASSUME_EXTERNALLY_RETAINED_BEGIN\n"
401402
"J2OBJC_CLASS_TYPE_LITERAL_SOURCE($classname$)\n"
402403
"\n"
403404
"IOSObjectArray *$classname$_values(void) {\n"
@@ -471,6 +472,7 @@ void EnumGenerator::GenerateSource(io::Printer* printer) {
471472
"}\n",
472473
"classname", ClassName(descriptor_), "name", "UNRECOGNIZED");
473474
}
475+
printer->Print("\nJ2OBJC_ASSUME_EXTERNALLY_RETAINED_END\n");
474476
}
475477

476478
} // namespace j2objc

protobuf/compiler/src/google/protobuf/compiler/j2objc/j2objc_message.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
518518
"\n"
519519
"@end\n"
520520
"\n"
521+
"J2OBJC_ASSUME_EXTERNALLY_RETAINED_BEGIN\n"
521522
"J2OBJC_CLASS_TYPE_LITERAL_SOURCE($classname$)\n"
522523
"\n"
523524
"$classname$ * _Nonnull $classname$_getDefaultInstance(void) {\n"
@@ -575,6 +576,7 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
575576
"$classname$_descriptor_, input, registry);\n"
576577
"}\n",
577578
"classname", ClassName(descriptor_));
579+
printer->Print("\nJ2OBJC_ASSUME_EXTERNALLY_RETAINED_END\n");
578580

579581
for (int i = 0; i < descriptor_->real_oneof_decl_count(); i++) {
580582
OneofGenerator(descriptor_->oneof_decl(i)).GenerateSource(printer);

protobuf/compiler/src/google/protobuf/compiler/j2objc/j2objc_message_lite.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ void MessageLiteGenerator::GenerateSource(io::Printer* printer) {
398398
"\n"
399399
"@end\n"
400400
"\n"
401+
"J2OBJC_ASSUME_EXTERNALLY_RETAINED_BEGIN\n"
401402
"J2OBJC_CLASS_TYPE_LITERAL_SOURCE($classname$)\n"
402403
"\n"
403404
"$classname$ * _Nonnull $classname$_getDefaultInstance(void) {\n"
@@ -455,6 +456,7 @@ void MessageLiteGenerator::GenerateSource(io::Printer* printer) {
455456
"$classname$_descriptor_, input, registry);\n"
456457
"}\n",
457458
"classname", ClassName(descriptor_));
459+
printer->Print("\nJ2OBJC_ASSUME_EXTERNALLY_RETAINED_END\n");
458460

459461
for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
460462
OneofGenerator(descriptor_->oneof_decl(i)).GenerateSource(printer);

protobuf/compiler/src/google/protobuf/compiler/j2objc/j2objc_oneof.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ void OneofGenerator::GenerateSource(io::Printer* printer) {
326326
"\n"
327327
"@end\n"
328328
"\n"
329+
"J2OBJC_ASSUME_EXTERNALLY_RETAINED_BEGIN\n"
329330
"J2OBJC_CLASS_TYPE_LITERAL_SOURCE($classname$)\n"
330331
"\n"
331332
"IOSObjectArray *$classname$_values(void) {\n"
@@ -379,6 +380,7 @@ void OneofGenerator::GenerateSource(io::Printer* printer) {
379380
"classname", CaseClassName(descriptor_),
380381
"name", CaseValueName(descriptor_->field(i)));
381382
}
383+
printer->Print("\nJ2OBJC_ASSUME_EXTERNALLY_RETAINED_END\n");
382384
}
383385

384386
void OneofGenerator::GenerateMessageOrBuilder(io::Printer* printer) {

0 commit comments

Comments
 (0)