diff options
author | David Robillard <d@drobilla.net> | 2009-10-15 15:26:49 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-10-15 15:26:49 +0000 |
commit | 6942e2f4c1fec87a152eeefa0ed85e169760fa77 (patch) | |
tree | 2ca737bd894d86023904b607f1b8a9136299d84a /src/tuplr.hpp | |
parent | 81df782cba422300b4034ccd5e48145c09cd0f69 (diff) | |
download | resp-6942e2f4c1fec87a152eeefa0ed85e169760fa77.tar.gz resp-6942e2f4c1fec87a152eeefa0ed85e169760fa77.tar.bz2 resp-6942e2f4c1fec87a152eeefa0ed85e169760fa77.zip |
Make TEnv purely a type environment.
git-svn-id: http://svn.drobilla.net/resp/tuplr@222 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'src/tuplr.hpp')
-rw-r--r-- | src/tuplr.hpp | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/src/tuplr.hpp b/src/tuplr.hpp index f69252a..947a62c 100644 --- a/src/tuplr.hpp +++ b/src/tuplr.hpp @@ -539,15 +539,15 @@ inline ostream& operator<<(ostream& out, const Constraints& c) { } /// Type-Time Environment -struct TEnv : public Env< const ASymbol*, pair<AST*, AType*> > { +struct TEnv : public Env<const ASymbol*, AType*> { TEnv(PEnv& p) : penv(p), varID(1) {} AType* fresh(const ASymbol* sym) { - return def(sym, make_pair((AST*)NULL, new AType(sym->loc, varID++))).second; + return def(sym, new AType(sym->loc, varID++)); } AType* var(const AST* ast=0) { const ASymbol* sym = ast->to<const ASymbol*>(); if (sym) - return ref(sym)->second; + return *ref(sym); Vars::iterator v = vars.find(ast); if (v != vars.end()) @@ -560,16 +560,7 @@ struct TEnv : public Env< const ASymbol*, pair<AST*, AType*> > { return ret; } AType* named(const string& name) { - return ref(penv.sym(name))->second; - } - AST* resolve(AST* ast) { - const ASymbol* sym = ast->to<const ASymbol*>(); - const pair<AST*, AType*>* rec = ref(sym); - return rec ? rec->first : ast; - } - const AST* resolve(const AST* ast) { - const ASymbol* sym = ast->to<const ASymbol*>(); - return sym ? ref(sym)->first : ast; + return *ref(penv.sym(name)); } static Subst buildSubst(AType* fnT, const AType& argsT); @@ -623,19 +614,25 @@ struct CEnv { typedef Env<const ASymbol*, CVal> Vals; Engine* engine() { return _engine; } - void push() { tenv.push(); vals.push(); } - void pop() { tenv.pop(); vals.pop(); } + void push() { code.push(); tenv.push(); vals.push(); } + void pop() { code.pop(); tenv.pop(); vals.pop(); } void lock(AST* ast) { Object::pool.addRoot(ast); Object::pool.addRoot(type(ast)); } AType* type(AST* ast, const Subst& subst = Subst()) const { ASymbol* sym = ast->to<ASymbol*>(); if (sym) - return tenv.ref(sym)->second; + return *tenv.ref(sym); return tsubst.apply(subst.apply(tenv.vars[ast]))->to<AType*>(); } void def(const ASymbol* sym, AST* c, AType* t, CVal v) { - tenv.def(sym, make_pair(c, t)); + code.def(sym, c); + tenv.def(sym, t); vals.def(sym, v); } + AST* resolve(AST* ast) { + const ASymbol* sym = ast->to<const ASymbol*>(); + AST** rec = code.ref(sym); + return rec ? *rec : ast; + } ostream& out; ostream& err; @@ -644,6 +641,8 @@ struct CEnv { Vals vals; Subst tsubst; + Env<const ASymbol*, AST*> code; + map<string,string> args; private: |