mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[NFC] SILGen: Extract base class.
Add new SILGenVTableBase class as a parent of SILGenVTable in preparation to add another subclass.
This commit is contained in:
@@ -252,7 +252,10 @@ bool SILGenModule::requiresObjCMethodEntryPoint(ConstructorDecl *constructor) {
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
/// An ASTVisitor for populating SILVTable entries from ClassDecl members.
|
/// An ASTVisitor for populating SILVTable entries from ClassDecl members.
|
||||||
class SILGenVTable : public SILVTableVisitor<SILGenVTable> {
|
template <typename T>
|
||||||
|
class SILGenVTableBase : public SILVTableVisitor<T> {
|
||||||
|
T &asDerived() { return *static_cast<T *>(this); }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SILGenModule &SGM;
|
SILGenModule &SGM;
|
||||||
ClassDecl *theClass;
|
ClassDecl *theClass;
|
||||||
@@ -267,7 +270,7 @@ public:
|
|||||||
// For each base method, store the corresponding override.
|
// For each base method, store the corresponding override.
|
||||||
SmallVector<VTableMethod, 8> vtableMethods;
|
SmallVector<VTableMethod, 8> vtableMethods;
|
||||||
|
|
||||||
SILGenVTable(SILGenModule &SGM, ClassDecl *theClass)
|
SILGenVTableBase(SILGenModule &SGM, ClassDecl *theClass)
|
||||||
: SGM(SGM), theClass(theClass) {
|
: SGM(SGM), theClass(theClass) {
|
||||||
isResilient = theClass->isResilient();
|
isResilient = theClass->isResilient();
|
||||||
}
|
}
|
||||||
@@ -275,6 +278,53 @@ public:
|
|||||||
/// Populate our list of base methods and overrides.
|
/// Populate our list of base methods and overrides.
|
||||||
void collectMethods() { visitAncestor(theClass); }
|
void collectMethods() { visitAncestor(theClass); }
|
||||||
|
|
||||||
|
void visitAncestor(ClassDecl *ancestor) {
|
||||||
|
// Imported types don't have vtables right now.
|
||||||
|
if (ancestor->hasClangNode())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto *superDecl = ancestor->getSuperclassDecl();
|
||||||
|
if (superDecl)
|
||||||
|
visitAncestor(superDecl);
|
||||||
|
|
||||||
|
asDerived().addVTableEntries(ancestor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find an overridden entry.
|
||||||
|
void addMethodOverride(SILDeclRef baseRef, SILDeclRef declRef) {
|
||||||
|
auto found = baseToIndexMap.find(baseRef);
|
||||||
|
assert(found != baseToIndexMap.end());
|
||||||
|
auto &method = vtableMethods[found->second];
|
||||||
|
assert(method.first == baseRef);
|
||||||
|
method.second = declRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add an entry to the vtable.
|
||||||
|
void addMethod(SILDeclRef member) {
|
||||||
|
unsigned index = vtableMethods.size();
|
||||||
|
vtableMethods.push_back(std::make_pair(member, member));
|
||||||
|
auto result = baseToIndexMap.insert(std::make_pair(member, index));
|
||||||
|
assert(result.second);
|
||||||
|
(void)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addPlaceholder(MissingMemberDecl *m) {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
auto *classDecl = cast<ClassDecl>(m->getDeclContext());
|
||||||
|
bool isResilient = classDecl->isResilient(SGM.M.getSwiftModule(),
|
||||||
|
ResilienceExpansion::Maximal);
|
||||||
|
assert(isResilient ||
|
||||||
|
m->getNumberOfVTableEntries() == 0 &&
|
||||||
|
"Should not be emitting fragile class with missing members");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SILGenVTable : public SILGenVTableBase<SILGenVTable> {
|
||||||
|
public:
|
||||||
|
SILGenVTable(SILGenModule &SGM, ClassDecl *theClass)
|
||||||
|
: SILGenVTableBase(SGM, theClass) {}
|
||||||
|
|
||||||
void emitVTable() {
|
void emitVTable() {
|
||||||
PrettyStackTraceDecl("silgen emitVTable", theClass);
|
PrettyStackTraceDecl("silgen emitVTable", theClass);
|
||||||
|
|
||||||
@@ -326,49 +376,7 @@ public:
|
|||||||
// Finally, create the vtable.
|
// Finally, create the vtable.
|
||||||
SILVTable::create(SGM.M, theClass, serialized, vtableEntries);
|
SILVTable::create(SGM.M, theClass, serialized, vtableEntries);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visitAncestor(ClassDecl *ancestor) {
|
|
||||||
// Imported types don't have vtables right now.
|
|
||||||
if (ancestor->hasClangNode())
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto *superDecl = ancestor->getSuperclassDecl();
|
|
||||||
if (superDecl)
|
|
||||||
visitAncestor(superDecl);
|
|
||||||
|
|
||||||
addVTableEntries(ancestor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to find an overridden entry.
|
|
||||||
void addMethodOverride(SILDeclRef baseRef, SILDeclRef declRef) {
|
|
||||||
auto found = baseToIndexMap.find(baseRef);
|
|
||||||
assert(found != baseToIndexMap.end());
|
|
||||||
auto &method = vtableMethods[found->second];
|
|
||||||
assert(method.first == baseRef);
|
|
||||||
method.second = declRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an entry to the vtable.
|
|
||||||
void addMethod(SILDeclRef member) {
|
|
||||||
unsigned index = vtableMethods.size();
|
|
||||||
vtableMethods.push_back(std::make_pair(member, member));
|
|
||||||
auto result = baseToIndexMap.insert(std::make_pair(member, index));
|
|
||||||
assert(result.second);
|
|
||||||
(void) result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addPlaceholder(MissingMemberDecl *m) {
|
|
||||||
#ifndef NDEBUG
|
|
||||||
auto *classDecl = cast<ClassDecl>(m->getDeclContext());
|
|
||||||
bool isResilient =
|
|
||||||
classDecl->isResilient(SGM.M.getSwiftModule(),
|
|
||||||
ResilienceExpansion::Maximal);
|
|
||||||
assert(isResilient || m->getNumberOfVTableEntries() == 0 &&
|
|
||||||
"Should not be emitting fragile class with missing members");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
||||||
static void emitTypeMemberGlobalVariable(SILGenModule &SGM,
|
static void emitTypeMemberGlobalVariable(SILGenModule &SGM,
|
||||||
|
|||||||
Reference in New Issue
Block a user