Generate overloaded function definitions
This commit is contained in:
33
module.cpp
33
module.cpp
@@ -1977,6 +1977,27 @@ lPrintFunctionDeclarations(FILE *file, const std::vector<Symbol *> &funcs,
|
||||
// fprintf(file, "#ifdef __cplusplus\n} /* end extern C */\n#endif // __cplusplus\n");
|
||||
}
|
||||
|
||||
static void
|
||||
lPrintPolyFunctionWrappers(FILE *file, const std::vector<std::string> &funcs) {
|
||||
fprintf(file, "#if defined(__cplusplus)\n");
|
||||
|
||||
for (size_t i=0; i<funcs.size(); i++) {
|
||||
std::vector<Symbol *> poly = m->symbolTable->LookupPolyFunction(funcs[i].c_str());
|
||||
|
||||
for (size_t j=0; j<poly.size(); j++) {
|
||||
const FunctionType *ftype = CastType<FunctionType>(poly[j]->type);
|
||||
Assert(ftype);
|
||||
std::string decl = ftype->GetCDeclaration(funcs[i]);
|
||||
fprintf(file, " %s {\n", decl.c_str());
|
||||
|
||||
std::string call = ftype->GetCCall(poly[j]->name);
|
||||
fprintf(file, " return %s;\n }\n", call.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(file, "#endif // __cplusplus\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2353,8 +2374,10 @@ Module::writeHeader(const char *fn) {
|
||||
// Collect single linear arrays of the exported and extern "C"
|
||||
// functions
|
||||
std::vector<Symbol *> exportedFuncs, externCFuncs;
|
||||
std::vector<std::string> polyFuncs;
|
||||
m->symbolTable->GetMatchingFunctions(lIsExported, &exportedFuncs);
|
||||
m->symbolTable->GetMatchingFunctions(lIsExternC, &externCFuncs);
|
||||
m->symbolTable->GetPolyFunctions(&polyFuncs);
|
||||
|
||||
// Get all of the struct, vector, and enumerant types used as function
|
||||
// parameters. These vectors may have repeats.
|
||||
@@ -2391,6 +2414,16 @@ Module::writeHeader(const char *fn) {
|
||||
fprintf(f, "///////////////////////////////////////////////////////////////////////////\n");
|
||||
lPrintFunctionDeclarations(f, exportedFuncs);
|
||||
}
|
||||
|
||||
// emit wrappers for polymorphic functions
|
||||
if (polyFuncs.size() > 0) {
|
||||
fprintf(f, "\n");
|
||||
fprintf(f, "///////////////////////////////////////////////////////////////////////////\n");
|
||||
fprintf(f, "// Polymorphic function wrappers\n");
|
||||
fprintf(f, "///////////////////////////////////////////////////////////////////////////\n");
|
||||
lPrintPolyFunctionWrappers(f, polyFuncs);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (externCFuncs.size() > 0) {
|
||||
fprintf(f, "\n");
|
||||
|
||||
Reference in New Issue
Block a user