aboutsummaryrefslogtreecommitdiffstats
path: root/src/tuplr.hpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-15 15:26:49 +0000
committerDavid Robillard <d@drobilla.net>2009-10-15 15:26:49 +0000
commit6942e2f4c1fec87a152eeefa0ed85e169760fa77 (patch)
tree2ca737bd894d86023904b607f1b8a9136299d84a /src/tuplr.hpp
parent81df782cba422300b4034ccd5e48145c09cd0f69 (diff)
downloadresp-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.hpp33
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: