diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-21 05:54:26 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-21 05:54:26 +0000 |
| commit | c56877035d6600b463a9cbf0e339f7548c0b46fd (patch) | |
| tree | 5b2af13b7f8f097d8de5436a729b39e85427b9f0 /include | |
| parent | dd5bbae055fd34ce2e12ef63f8a261c6b15dc83e (diff) | |
feat(codegen): instantiate function templates by deduction
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/cps/CodeGen.h | 21 | ||||
| -rw-r--r-- | include/cps/FunctionGen.h | 6 |
2 files changed, 25 insertions, 2 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); diff --git a/include/cps/FunctionGen.h b/include/cps/FunctionGen.h index 57a27ff..a50e70b 100644 --- a/include/cps/FunctionGen.h +++ b/include/cps/FunctionGen.h @@ -5,6 +5,7 @@ #include "cps/FunctionAST.h" #include "cps/TypeSystem.h" #include <cstdint> +#include <deque> #include <map> #include <utility> #include <vector> @@ -73,7 +74,7 @@ private: int &DiagnosticLine; void reportError(const char *Fmt, ...); - IdentifierMap<std::vector<FuncSig>> Signatures; + IdentifierMap<std::deque<FuncSig>> Signatures; IdentifierMap<std::pair<std::string, size_t>> LinkIndex; std::map<const PrototypeAST *, std::string> PrototypeLinks; std::map<size_t, std::string> UnitPaths; @@ -106,7 +107,8 @@ public: void setCurrentUnit(size_t Unit, const std::string &Path) { CurrentUnit = Unit; UnitPaths[Unit] = Path; } void setCallHook(std::function<void(const FuncSig &)> Hook) { BeforeCall = std::move(Hook); } void setVisibility(std::function<bool(size_t)> Predicate) { Visible = std::move(Predicate); } - std::vector<const FuncSig *> getOverloads(const std::string &Name) const; + std::vector<const FuncSig *> getOverloads(const std::string &Name, bool AllUnits = false) const; + static bool isReservedRuntimeName(const std::string &Name); bool hasFunction(const std::string &Name) const { return !getOverloads(Name).empty(); } const FuncSig *getSignatureByLink(const std::string &Name) const; |
