aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-21 05:54:26 +0000
committer_ov4 <ov4@ov4.org>2026-10-21 05:54:26 +0000
commitc56877035d6600b463a9cbf0e339f7548c0b46fd (patch)
tree5b2af13b7f8f097d8de5436a729b39e85427b9f0 /include
parentdd5bbae055fd34ce2e12ef63f8a261c6b15dc83e (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.h21
-rw-r--r--include/cps/FunctionGen.h6
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;