Skip to content

Commit c9f9d90

Browse files
committed
[interop][SwiftToCxx] fix offset computation for 32 bit platforms for vtable dispatch
1 parent 540202f commit c9f9d90

File tree

5 files changed

+43
-43
lines changed

5 files changed

+43
-43
lines changed

Diff for: include/swift/IRGen/IRABIDetailsProvider.h

+14-14
Original file line numberDiff line numberDiff line change
@@ -271,15 +271,15 @@ class IRABIDetailsProvider {
271271
}
272272

273273
static MethodDispatchInfo indirectVTableStaticOffset(
274-
size_t bitOffset, Optional<PointerAuthDiscriminator> discriminator) {
275-
return MethodDispatchInfo(Kind::IndirectVTableStaticOffset, bitOffset, "",
274+
size_t offset, Optional<PointerAuthDiscriminator> discriminator) {
275+
return MethodDispatchInfo(Kind::IndirectVTableStaticOffset, offset, "",
276276
discriminator);
277277
}
278278

279279
static MethodDispatchInfo indirectVTableRelativeOffset(
280-
size_t bitOffset, std::string symbolName,
280+
size_t offset, std::string symbolName,
281281
Optional<PointerAuthDiscriminator> discriminator) {
282-
return MethodDispatchInfo(Kind::IndirectVTableRelativeOffset, bitOffset,
282+
return MethodDispatchInfo(Kind::IndirectVTableRelativeOffset, offset,
283283
symbolName, discriminator);
284284
}
285285

@@ -289,11 +289,11 @@ class IRABIDetailsProvider {
289289

290290
Kind getKind() const { return kind; }
291291

292-
/// Return the bit offset into the vtable from which the method pointer
292+
/// Return the byte offset into the vtable from which the method pointer
293293
/// should be loaded.
294-
size_t getStaticBitOffset() const {
294+
size_t getStaticOffset() const {
295295
assert(kind == Kind::IndirectVTableStaticOffset);
296-
return bitOffset;
296+
return offset;
297297
}
298298
Optional<PointerAuthDiscriminator> getPointerAuthDiscriminator() const {
299299
assert(kind == Kind::IndirectVTableStaticOffset ||
@@ -305,11 +305,11 @@ class IRABIDetailsProvider {
305305
return symbolName;
306306
}
307307

308-
/// Return the bit offset relative to base offset value into the vtable from
309-
/// which the method pointer should be loaded.
310-
size_t getRelativeBitOffset() const {
308+
/// Return the byte offset relative to base offset value into the vtable
309+
/// from which the method pointer should be loaded.
310+
size_t getRelativeOffset() const {
311311
assert(kind == Kind::IndirectVTableRelativeOffset);
312-
return bitOffset;
312+
return offset;
313313
}
314314

315315
/// Return the external symbol from which the relative base offset should be
@@ -320,13 +320,13 @@ class IRABIDetailsProvider {
320320
}
321321

322322
private:
323-
MethodDispatchInfo(Kind kind, size_t bitOffset, std::string symbolName = "",
323+
MethodDispatchInfo(Kind kind, size_t offset, std::string symbolName = "",
324324
Optional<PointerAuthDiscriminator> discriminator = None)
325-
: kind(kind), bitOffset(bitOffset), symbolName(symbolName),
325+
: kind(kind), offset(offset), symbolName(symbolName),
326326
discriminator(discriminator) {}
327327

328328
Kind kind;
329-
size_t bitOffset;
329+
size_t offset;
330330
std::string symbolName;
331331
Optional<PointerAuthDiscriminator> discriminator;
332332
};

Diff for: lib/IRGen/IRABIDetailsProvider.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,13 @@ class IRABIDetailsProviderImpl {
253253
case ClassMetadataLayout::MethodInfo::Kind::Offset:
254254
if (mi->TheOffset.isStatic()) {
255255
return MethodDispatchInfo::indirectVTableStaticOffset(
256-
/*bitOffset=*/mi->TheOffset.getStaticOffset().getValue(),
256+
/*offset=*/mi->TheOffset.getStaticOffset().getValue(),
257257
getMethodPointerAuthInfo(funcDecl, silDecl));
258258
}
259259
assert(mi->TheOffset.isDynamic());
260260
return MethodDispatchInfo::indirectVTableRelativeOffset(
261-
mi->TheOffset.getRelativeOffset().getValue(),
261+
/*offset=*/mi->TheOffset.getRelativeOffset().getValue(),
262+
/*symbolName=*/
262263
LinkEntity::forClassMetadataBaseOffset(parentClass).mangleAsString(),
263264
getMethodPointerAuthInfo(funcDecl, silDecl));
264265
}

Diff for: lib/PrintAsClang/PrintClangFunction.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -1129,13 +1129,12 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
11291129
os << "FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ "
11301130
"+ ";
11311131
if (dispatchInfo->getKind() == DispatchKindTy::IndirectVTableStaticOffset)
1132-
os << (dispatchInfo->getStaticBitOffset() / 8);
1132+
os << dispatchInfo->getStaticOffset();
11331133
else
11341134
os << '(' << cxx_synthesis::getCxxImplNamespaceName()
1135-
<< "::" << dispatchInfo->getBaseOffsetSymbolName()
1136-
<< " / sizeof(void *)) + "
1137-
<< (dispatchInfo->getRelativeBitOffset() / 8);
1138-
os << ");\n";
1135+
<< "::" << dispatchInfo->getBaseOffsetSymbolName() << " + "
1136+
<< dispatchInfo->getRelativeOffset() << ')';
1137+
os << " / sizeof(void *));\n";
11391138
indirectFunctionVar = StringRef("fptrptr_->func");
11401139
break;
11411140
case DispatchKindTy::Thunk:

Diff for: test/Interop/SwiftToCxx/class/swift-class-virtual-method-dispatch.swift

+17-17
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
124124
// CHECK-NEXT: struct FTypeAddress {
125125
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C13virtualMethodyyF) * func;
126126
// CHECK-NEXT: };
127-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1:]]);
127+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1:]] / sizeof(void *));
128128
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
129129
// CHECK-NEXT: }
130130

@@ -138,7 +138,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
138138
// CHECK-NEXT: struct FTypeAddress {
139139
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C016virtualMethodIntE0yS2iF) * func;
140140
// CHECK-NEXT: };
141-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 1]]);
141+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM2:]] / sizeof(void *));
142142
// CHECK-NEXT: return (* fptrptr_->func)(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
143143
// CHECK-NEXT: }
144144

@@ -156,7 +156,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
156156
// CHECK-NEXT: struct FTypeAddress {
157157
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C19virtualComputedPropSivg) * func;
158158
// CHECK-NEXT: };
159-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 2]]);
159+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM3:]] / sizeof(void *));
160160
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
161161
// CHECK-NEXT: }
162162

@@ -170,7 +170,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
170170
// CHECK-NEXT: struct FTypeAddress {
171171
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64Vvg) * func;
172172
// CHECK-NEXT: };
173-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 3]]);
173+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM4:]] / sizeof(void *));
174174
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
175175
// CHECK-NEXT: }
176176

@@ -184,7 +184,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
184184
// CHECK-NEXT: struct FTypeAddress {
185185
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C21virtualComputedGetSets5Int64Vvs) * func;
186186
// CHECK-NEXT: };
187-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 4]]);
187+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM5:]] / sizeof(void *));
188188
// CHECK-NEXT: return (* fptrptr_->func)(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
189189
// CHECK-NEXT: }
190190

@@ -198,7 +198,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
198198
// CHECK-NEXT: struct FTypeAddress {
199199
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C10storedPropSivg) * func;
200200
// CHECK-NEXT: };
201-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 6]]);
201+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM7:]] / sizeof(void *));
202202
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
203203
// CHECK-NEXT: }
204204

@@ -212,7 +212,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
212212
// CHECK-NEXT: struct FTypeAddress {
213213
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0C10storedPropSivs) * func;
214214
// CHECK-NEXT: };
215-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 7]]);
215+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM8:]] / sizeof(void *));
216216
// CHECK-NEXT: return (* fptrptr_->func)(value, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
217217
// CHECK-NEXT: }
218218

@@ -226,7 +226,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
226226
// CHECK-NEXT: struct FTypeAddress {
227227
// CHECK-NEXT: decltype(_impl::$s5Class04BaseA0CyS2icig) * func;
228228
// CHECK-NEXT: };
229-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 9]]);
229+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM10:]] / sizeof(void *));
230230
// CHECK-NEXT: return (* fptrptr_->func)(i, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
231231
// CHECK-NEXT: }
232232

@@ -240,7 +240,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
240240
// CHECK-NEXT: struct FTypeAddress {
241241
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C13virtualMethodyyF) * func;
242242
// CHECK-NEXT: };
243-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1]]);
243+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1]] / sizeof(void *));
244244
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
245245
// CHECK-NEXT: }
246246

@@ -254,7 +254,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
254254
// CHECK-NEXT: struct FTypeAddress {
255255
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C016virtualMethodIntE0yS2iF) * func;
256256
// CHECK-NEXT: };
257-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 1]]);
257+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM2]] / sizeof(void *));
258258
// CHECK-NEXT: return (* fptrptr_->func)(x, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
259259
// CHECK-NEXT: }
260260

@@ -268,7 +268,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
268268
// CHECK-NEXT: struct FTypeAddress {
269269
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C015virtualMethodInB0yAA04BaseA0CAFF) * func;
270270
// CHECK-NEXT: };
271-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 10]]);
271+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM11:]] / sizeof(void *));
272272
// CHECK-NEXT: return _impl::_impl_BaseClass::makeRetained((* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(x), ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this)));
273273
// CHECK-NEXT: }
274274

@@ -282,7 +282,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
282282
// CHECK-NEXT: struct FTypeAddress {
283283
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C19virtualComputedPropSivg) * func;
284284
// CHECK-NEXT: };
285-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 2]]);
285+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM3]] / sizeof(void *));
286286
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
287287
// CHECK-NEXT: }
288288

@@ -296,7 +296,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
296296
// CHECK-NEXT: struct FTypeAddress {
297297
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C21virtualComputedGetSets5Int64Vvg) * func;
298298
// CHECK-NEXT: };
299-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 3]]);
299+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM4]] / sizeof(void *));
300300
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
301301
// CHECK-NEXT: }
302302

@@ -310,7 +310,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
310310
// CHECK-NEXT: struct FTypeAddress {
311311
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C21virtualComputedGetSets5Int64Vvs) * func;
312312
// CHECK-NEXT: };
313-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 4]]);
313+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM5]] / sizeof(void *));
314314
// CHECK-NEXT: return (* fptrptr_->func)(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
315315
// CHECK-NEXT: }
316316

@@ -324,7 +324,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
324324
// CHECK-NEXT: struct FTypeAddress {
325325
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C10storedPropSivg) * func;
326326
// CHECK-NEXT: };
327-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 6]]);
327+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM7]] / sizeof(void *));
328328
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
329329
// CHECK-NEXT: }
330330

@@ -338,7 +338,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
338338
// CHECK-NEXT: struct FTypeAddress {
339339
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0C10storedPropSivs) * func;
340340
// CHECK-NEXT: };
341-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 7]]);
341+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM8]] / sizeof(void *));
342342
// CHECK-NEXT: return (* fptrptr_->func)(newValue, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
343343
// CHECK-NEXT: }
344344

@@ -352,7 +352,7 @@ public func returnDerivedDerivedClass() -> DerivedDerivedClass {
352352
// CHECK-NEXT: struct FTypeAddress {
353353
// CHECK-NEXT: decltype(_impl::$s5Class07DerivedA0CyS2icig) * func;
354354
// CHECK-NEXT: };
355-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM1 + 9]]);
355+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + [[#VM10]] / sizeof(void *));
356356
// CHECK-NEXT: return (* fptrptr_->func)(i, ::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
357357

358358
// CHECK: void DerivedDerivedClass::virtualMethod() {

Diff for: test/Interop/SwiftToCxx/class/swift-subclass-of-resilient-class-virtual-method-dispatch.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,21 @@ public func createCrossModuleDerivedDerivedClass() -> CrossModuleDerivedDerivedC
9393
// CHECK-NEXT: struct FTypeAddress {
9494
// CHECK-NEXT: decltype(_impl::$s8UseClass018CrossModuleDerivedB0C015virtualMethodInE0yyF) * func;
9595
// CHECK-NEXT: };
96-
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 0);
96+
// CHECK-NEXT: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo + 0) / sizeof(void *));
9797
// CHECK-NEXT: return (* fptrptr_->func)(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));
9898
// CHECK-NEXT: }
9999

100100
// CHECK: swift::Int CrossModuleDerivedClass::getDerivedComputedProp() {
101-
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 1);
101+
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo + [[#VM1:]]) / sizeof(void *));
102102

103103
// CHECK: void CrossModuleDerivedClass::virtualMethod2InDerived() {
104-
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 2);
104+
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo + [[#VM2:]]) / sizeof(void *));
105105

106106
// CHECK: void CrossModuleDerivedDerivedClass::virtualMethodInDerived() {
107-
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 0);
107+
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo + 0) / sizeof(void *));
108108

109109
// CHECK: swift::Int CrossModuleDerivedDerivedClass::getDerivedComputedProp() {
110-
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo / sizeof(void *)) + 1);
110+
// CHECK: FTypeAddress *fptrptr_ = reinterpret_cast<FTypeAddress *>(vtable_ + (_impl::$s8UseClass018CrossModuleDerivedB0CMo + [[#VM1]]) / sizeof(void *));
111111

112112
// CHECK: void CrossModuleDerivedDerivedClass::virtualMethod2InDerived() {
113113
// CHECK-NEXT: return _impl::$s8UseClass018CrossModuleDerivedeB0C016virtualMethod2InE0yyF(::swift::_impl::_impl_RefCountedClass::getOpaquePointer(*this));

0 commit comments

Comments
 (0)