diff options
author | David Robillard <d@drobilla.net> | 2009-03-15 17:52:16 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-03-15 17:52:16 +0000 |
commit | 454e8908d51d2bb8c83af69f69b2c72e9606967d (patch) | |
tree | d25228cc8ae94a208c195db7de3421e701eb4bcf | |
parent | 26890bcd5b910603f1955ba125b1602fbc2bfa9d (diff) | |
download | resp-454e8908d51d2bb8c83af69f69b2c72e9606967d.tar.gz resp-454e8908d51d2bb8c83af69f69b2c72e9606967d.tar.bz2 resp-454e8908d51d2bb8c83af69f69b2c72e9606967d.zip |
Fix functions with several expressions in their body.
git-svn-id: http://svn.drobilla.net/resp/tuplr@108 ad02d1e2-f140-0410-9f75-f8b11f17cedd
-rw-r--r-- | llvm.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -255,8 +255,9 @@ AClosure::liftCall(CEnv& cenv, const vector<AType*>& argsT) // Define value first for recursion cenv.precompile(this, f); funcs.push_back(make_pair(thisType, f)); - - CValue retVal = cenv.compile(at(2)); + CValue retVal = NULL; + for (size_t i = 2; i < size(); ++i) + retVal = cenv.compile(at(i)); llengine(cenv)->builder.CreateRet(LLVal(retVal)); // Finish function cenv.optimise(LLFunc(f)); } catch (Error& e) { @@ -310,7 +311,7 @@ ACall::compile(CEnv& cenv) TEnv::GenericTypes::const_iterator gt = cenv.tenv.genericTypes.find(c); assert(gt != cenv.tenv.genericTypes.end()); const AType* polyT = gt->second; - AType* fnT = new AType(loc, cenv.penv.sym("Fn"), protT, polyT->at(2), 0); + AType* fnT = new AType(loc, cenv.penv.sym("Fn"), protT, polyT->at(polyT->size()-1), 0); Function* f = (Function*)c->funcs.find(fnT); if (!f) throw Error("callee failed to compile", loc); @@ -326,10 +327,10 @@ void ADefinition::lift(CEnv& cenv) { // Define stub first for recursion - cenv.def(at(1)->as<ASymbol*>(), at(2), cenv.type(at(2)), NULL); + cenv.def(sym(), at(2), cenv.type(at(2)), NULL); AClosure* c = at(2)->to<AClosure*>(); if (c) - c->name = at(1)->str(); + c->name = sym()->str(); at(2)->lift(cenv); } @@ -337,9 +338,9 @@ CValue ADefinition::compile(CEnv& cenv) { // Define stub first for recursion - cenv.def(at(1)->as<ASymbol*>(), at(2), cenv.type(at(2)), NULL); - CValue val = cenv.compile(at(2)); - cenv.vals.def(at(1)->as<ASymbol*>(), val); + cenv.def(sym(), at(2), cenv.type(at(2)), NULL); + CValue val = cenv.compile(at(size() - 1)); + cenv.vals.def(sym(), val); return val; } |