diff options
-rw-r--r-- | llvm.cpp | 8 | ||||
-rw-r--r-- | tuplr.hpp | 2 | ||||
-rw-r--r-- | typing.cpp | 2 |
3 files changed, 6 insertions, 6 deletions
@@ -325,7 +325,7 @@ ACall::compile(CEnv& cenv) void ADefinition::lift(CEnv& cenv) { - // Define first for recursion + // Define stub first for recursion cenv.def(at(1)->as<ASymbol*>(), at(2), cenv.type(at(2)), NULL); AClosure* c = at(2)->to<AClosure*>(); if (c) @@ -336,9 +336,11 @@ ADefinition::lift(CEnv& cenv) CValue ADefinition::compile(CEnv& cenv) { - // Define first for recursion + // Define stub first for recursion cenv.def(at(1)->as<ASymbol*>(), at(2), cenv.type(at(2)), NULL); - return cenv.compile(at(2)); + CValue val = cenv.compile(at(2)); + cenv.vals.def(at(1)->as<ASymbol*>(), val); + return val; } CValue @@ -483,7 +483,7 @@ struct TEnv : public Env< const ASymbol*, pair<AST*, AType*> > { } AST* resolve(AST* ast) { ASymbol* sym = ast->to<ASymbol*>(); - return sym ? ref(sym)->first : ast; + return (sym && sym->addr) ? ref(sym)->first : ast; } static Subst unify(const Constraints& c); @@ -156,8 +156,6 @@ ADefinition::constrain(TEnv& tenv, Constraints& c) const const ASymbol* sym = at(1)->to<const ASymbol*>(); if (!sym) throw Error("`def' name is not a symbol", loc); - if (tenv.lookup(sym)) - throw Error(string("`") + at(1)->str() + "' redefined", loc); AType* tvar = tenv.var(at(2)); tenv.def(sym, make_pair(at(2), tvar)); at(2)->constrain(tenv, c); |