Skip to content

Commit 478987b

Browse files
committed
[interop][SwiftToCxx] expose getOpaquePointer class pointer accessors via swift helper class in shims header
1 parent e03903c commit 478987b

File tree

4 files changed

+22
-20
lines changed

4 files changed

+22
-20
lines changed

lib/PrintAsClang/PrintClangClassType.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void ClangClassTypePrinter::printClassTypeDecl(
3737
os << "class ";
3838
printer.printBaseName(typeDecl);
3939
// FIXME: Add support for inherintance.
40-
os << " final : " << baseClassQualifiedName;
40+
os << " final : public " << baseClassQualifiedName;
4141
os << " {\n";
4242
os << "public:\n";
4343

@@ -65,12 +65,6 @@ void ClangClassTypePrinter::printClassTypeDecl(
6565
os << " makeRetained(void * _Nonnull ptr) noexcept { return ";
6666
printer.printBaseName(typeDecl);
6767
os << "(ptr); }\n";
68-
os << "static inline void * _Nonnull getOpaquePointer(const ";
69-
printer.printBaseName(typeDecl);
70-
os << " &object) noexcept { return object._opaquePointer; }\n";
71-
os << "static inline void * _Nonnull &getOpaquePointerRef(";
72-
printer.printBaseName(typeDecl);
73-
os << " &object) noexcept { return object._opaquePointer; }\n";
7468
os << "};\n";
7569
});
7670
}
@@ -93,11 +87,9 @@ void ClangClassTypePrinter::printParameterCxxtoCUseScaffold(
9387
llvm::function_ref<void(void)> bodyPrinter, bool isInOut) {
9488
if (isInOut)
9589
os << '&';
96-
ClangSyntaxPrinter(os).printModuleNamespaceQualifiersIfNeeded(
97-
type->getModuleContext(), moduleContext);
98-
os << cxx_synthesis::getCxxImplNamespaceName() << "::";
99-
ClangValueTypePrinter::printCxxImplClassName(os, type);
100-
os << "::getOpaquePointer";
90+
os << "::swift::" << cxx_synthesis::getCxxImplNamespaceName()
91+
<< "::_impl_RefCountedClass"
92+
<< "::getOpaquePointer";
10193
if (isInOut)
10294
os << "Ref";
10395
os << '(';

stdlib/public/SwiftShims/_SwiftCxxInteroperability.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,19 @@ class RefCountedClass {
7373
protected:
7474
inline RefCountedClass(void *_Nonnull ptr) noexcept : _opaquePointer(ptr) {}
7575

76+
private:
7677
void *_Nonnull _opaquePointer;
78+
friend class _impl_RefCountedClass;
79+
};
80+
81+
class _impl_RefCountedClass {
82+
public:
83+
static inline void *_Nonnull getOpaquePointer(const RefCountedClass &object) {
84+
return object._opaquePointer;
85+
}
86+
static inline void *_Nonnull &getOpaquePointerRef(RefCountedClass &object) {
87+
return object._opaquePointer;
88+
}
7789
};
7890

7991
} // namespace _impl

test/Interop/SwiftToCxx/class/swift-class-execution.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
extern "C" size_t swift_retainCount(void * _Nonnull obj);
1818

1919
size_t getRetainCount(const Class::ClassWithIntField & swiftClass) {
20-
void *p = Class::_impl::_impl_ClassWithIntField::getOpaquePointer(swiftClass);
21-
return swift_retainCount(p);
20+
void *p = swift::_impl::_impl_RefCountedClass::getOpaquePointer(swiftClass);
21+
return swift_retainCount(p);
2222
}
2323

2424
int main() {

test/Interop/SwiftToCxx/class/swift-class-in-cxx.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public final class ClassWithIntField {
3131
// CHECK-EMPTY:
3232
// CHECK-NEXT: } // namespace _impl
3333
// CHECK-EMPTY:
34-
// CHECK-NEXT: class ClassWithIntField final : swift::_impl::RefCountedClass {
34+
// CHECK-NEXT: class ClassWithIntField final : public swift::_impl::RefCountedClass {
3535
// CHECK-NEXT: public:
3636
// CHECK-NEXT: using RefCountedClass::RefCountedClass;
3737
// CHECK-NEXT: using RefCountedClass::operator=;
@@ -46,19 +46,17 @@ public final class ClassWithIntField {
4646
// CHECK-NEXT:class _impl_ClassWithIntField {
4747
// CHECK-NEXT:public:
4848
// CHECK-NEXT:static inline ClassWithIntField makeRetained(void * _Nonnull ptr) noexcept { return ClassWithIntField(ptr); }
49-
// CHECK-NEXT:static inline void * _Nonnull getOpaquePointer(const ClassWithIntField &object) noexcept { return object._opaquePointer; }
50-
// CHECK-NEXT:static inline void * _Nonnull &getOpaquePointerRef(ClassWithIntField &object) noexcept { return object._opaquePointer; }
5149
// CHECK-NEXT:};
5250
// CHECK-EMPTY:
5351
// CHECK-NEXT:} // namespace _impl
5452

5553
// CHECK: inline ClassWithIntField passThroughClassWithIntField(const ClassWithIntField& x) noexcept SWIFT_WARN_UNUSED_RESULT {
56-
// CHECK-NEXT: return _impl::_impl_ClassWithIntField::makeRetained(_impl::$s5Class011passThroughA12WithIntFieldyAA0adeF0CADF(_impl::_impl_ClassWithIntField::getOpaquePointer(x)));
54+
// CHECK-NEXT: return _impl::_impl_ClassWithIntField::makeRetained(_impl::$s5Class011passThroughA12WithIntFieldyAA0adeF0CADF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x)));
5755
// CHECK-NEXT: }
5856

5957
public final class register { }
6058

61-
// CHECK: class register_ final : swift::_impl::RefCountedClass {
59+
// CHECK: class register_ final : public swift::_impl::RefCountedClass {
6260

6361
public func returnClassWithIntField() -> ClassWithIntField {
6462
return ClassWithIntField()
@@ -84,5 +82,5 @@ public func takeClassWithIntFieldInout(_ x: inout ClassWithIntField) {
8482
// CHECK-NEXT: }
8583

8684
// CHECK: inline void takeClassWithIntField(const ClassWithIntField& x) noexcept {
87-
// CHECK-NEXT: return _impl::$s5Class04takeA12WithIntFieldyyAA0acdE0CF(_impl::_impl_ClassWithIntField::getOpaquePointer(x));
85+
// CHECK-NEXT: return _impl::$s5Class04takeA12WithIntFieldyyAA0acdE0CF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x));
8886
// CHECK-NEXT: }

0 commit comments

Comments
 (0)