@@ -236,8 +236,8 @@ void SourceToHeaderMatchCallback::generateInternal(const VarDecl *decl) const {
236
236
policy.SuppressInitializers = 1 ;
237
237
238
238
/*
239
- * extern "C" (*var_wrapper );
240
- * &DECL = *var_wrapper ;
239
+ * extern "C" (*get_var_wrapper );
240
+ * &DECL = *get_var_wrapper() ;
241
241
*/
242
242
243
243
std::string name = decl->getNameAsString ();
@@ -252,9 +252,13 @@ void SourceToHeaderMatchCallback::generateInternal(const VarDecl *decl) const {
252
252
std::string wrapperPointerDecl =
253
253
getRenamedDeclarationAsString (decl, policy, wrapperPointerName);
254
254
std::string refDecl = getRenamedDeclarationAsString (decl, policy, refName);
255
+ PrinterUtils::removeThreadLocalQualifiers (refDecl);
255
256
256
- *internalStream << " extern \" C\" " << wrapperPointerDecl << " ;\n " ;
257
- *internalStream << refDecl << " = " << wrapperPointerName << " ;\n " ;
257
+ std::string returnTypeName = PrinterUtils::getPointerMangledName (name);
258
+ std::string getterName = PrinterUtils::getterName (wrapperName);
259
+ *internalStream << generateTypedefForGetterReturnType (decl, policy, returnTypeName);
260
+ *internalStream << " extern \" C\" " << PrinterUtils::getterDecl (returnTypeName, wrapperName) << " ;\n " ;
261
+ *internalStream << stringFormat (" %s = *%s();\n " , refDecl, getterName);
258
262
}
259
263
260
264
void SourceToHeaderMatchCallback::generateWrapper (const FunctionDecl *decl) const {
@@ -295,15 +299,18 @@ void SourceToHeaderMatchCallback::generateWrapper(const VarDecl *decl) const {
295
299
policy.SuppressInitializers = 1 ;
296
300
297
301
/*
298
- * (*var_wrapper) = &var;
302
+ * get_var_wrapper {
303
+ * return &var;
304
+ * }
299
305
*/
300
306
301
307
std::string name = decl->getNameAsString ();
302
308
std::string wrapperName = PrinterUtils::wrapperName (name, projectContext, sourceFilePath);
303
- std::string wrapperPointerName = stringFormat (" (*%s)" , wrapperName);
304
- std::string wrapperPointerDecl =
305
- getRenamedDeclarationAsString (decl, policy, wrapperPointerName);
306
- *wrapperStream << wrapperPointerDecl << " = &" << name << " ;\n " ;
309
+ std::string returnTypeName = PrinterUtils::getPointerMangledName (name);
310
+ *wrapperStream << generateTypedefForGetterReturnType (decl, policy, returnTypeName);
311
+ *wrapperStream << PrinterUtils::getterDecl (returnTypeName, wrapperName) << " {\n " ;
312
+ *wrapperStream << stringFormat (" return &%s;\n " , name);
313
+ *wrapperStream << " }\n " ;
307
314
}
308
315
309
316
void SourceToHeaderMatchCallback::generateUnnamedTypeDecls (const clang::RecordDecl *decl) const {
@@ -411,6 +418,16 @@ SourceToHeaderMatchCallback::getDefaultPrintingPolicy(const Decl *decl,
411
418
return policy;
412
419
}
413
420
421
+ std::string
422
+ SourceToHeaderMatchCallback::generateTypedefForGetterReturnType (const clang::VarDecl *decl,
423
+ const clang::PrintingPolicy &policy,
424
+ const std::string &returnTypeName) const {
425
+ std::string wrapperPointerName = stringFormat (" (*%s)" , returnTypeName);
426
+ std::string wrapperPointerDecl = getRenamedDeclarationAsString (decl, policy, wrapperPointerName);
427
+ PrinterUtils::removeThreadLocalQualifiers (wrapperPointerDecl);
428
+ return " typedef " + wrapperPointerDecl + " ;\n " ;
429
+ }
430
+
414
431
std::string
415
432
SourceToHeaderMatchCallback::getRenamedDeclarationAsString (const clang::NamedDecl *decl,
416
433
clang::PrintingPolicy const &policy,
0 commit comments