diff options
author | David Robillard <d@drobilla.net> | 2009-03-31 00:51:31 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-03-31 00:51:31 +0000 |
commit | 9dc74f15acec8daac019f21ec0834827a5c5fd51 (patch) | |
tree | 25c10e3b925c4ae124875621dff236d56c3efbb0 /llvm.cpp | |
parent | 14b989aaf2c11710cef316a3ba20a947777cca08 (diff) | |
download | resp-9dc74f15acec8daac019f21ec0834827a5c5fd51.tar.gz resp-9dc74f15acec8daac019f21ec0834827a5c5fd51.tar.bz2 resp-9dc74f15acec8daac019f21ec0834827a5c5fd51.zip |
Fix polymorphic functions (somewhat).
git-svn-id: http://svn.drobilla.net/resp/tuplr@112 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'llvm.cpp')
-rw-r--r-- | llvm.cpp | 10 |
1 files changed, 4 insertions, 6 deletions
@@ -220,7 +220,7 @@ AClosure::liftCall(CEnv& cenv, const vector<AType*>& argsT) assert(argsT.size() == prot()->size()); ATuple* genericProtT = genericType->at(1)->as<ATuple*>(); for (size_t i = 0; i < argsT.size(); ++i) - argsSubst[genericProtT->at(i)->to<AType*>()] = argsT.at(i)->to<AType*>(); + argsSubst[*genericProtT->at(i)->to<AType*>()] = argsT.at(i)->to<AType*>(); thisType = argsSubst.apply(genericType)->as<AType*>(); if (!thisType->concrete()) throw Error("unable to resolve concrete type for function", loc); @@ -310,11 +310,9 @@ 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(polyT->size()-1), 0); - - Function* f = (Function*)c->funcs.find(fnT); - if (!f) throw Error("callee failed to compile", loc); + AType* fnT = new AType(loc, cenv.penv.sym("Fn"), protT, cenv.type(this), 0); + Function* f = (Function*)c->funcs.find(fnT); + if (!f) throw Error((format("callee failed to compile for type %1%") % fnT->str()).str(), loc); vector<Value*> params(size() - 1); for (size_t i = 1; i < size(); ++i) |