aboutsummaryrefslogtreecommitdiff
path: root/include/cps/CodeGen.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cps/CodeGen.h')
-rw-r--r--include/cps/CodeGen.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h
index 283c4b1..124ead1 100644
--- a/include/cps/CodeGen.h
+++ b/include/cps/CodeGen.h
@@ -35,9 +35,30 @@ class CodeGen {
const std::vector<SourceUnit> *Units = nullptr;
size_t CurrentUnit = 0;
size_t MainUnit = 0;
+ std::optional<size_t> VisibilityUnit;
IdentifierMap<size_t> TypeOwners;
struct TemplateDefinition { TemplateDeclAST *Decl; size_t OwnerUnit; };
IdentifierMap<std::vector<TemplateDefinition>> Templates;
+ struct TemplateInstance {
+ TemplateDeclAST *Decl;
+ std::string Arguments;
+ std::unique_ptr<FunctionDefAST> Function;
+ const FuncSig *Signature;
+ size_t OwnerUnit;
+ size_t RequesterUnit;
+ unsigned Depth;
+ };
+ std::vector<TemplateInstance> TemplateInstances;
+ std::map<const TemplateDeclAST *, IdentifierMap<SymbolInfo>> TemplateSymbols;
+ size_t NextTemplateBody = 0;
+ unsigned TemplateDepth = 0;
+ bool hasCallable(const std::string &Name) const;
+ bool hasFunctionTemplate(const std::string &Name) const;
+ void validateTemplates();
+ void captureTemplateSymbols();
+ const FuncSig *instantiateFunction(const TemplateDefinition &Definition,
+ const IdentifierMap<std::vector<std::string>> &Bindings);
+ void drainTemplateBodies();
std::vector<IdentifierMap<SymbolInfo>> Exports;
bool isVisible(size_t Owner) const;
void selectUnit(size_t Unit);