aboutsummaryrefslogtreecommitdiffstats
path: root/llvm.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-03-31 00:51:31 +0000
committerDavid Robillard <d@drobilla.net>2009-03-31 00:51:31 +0000
commit9dc74f15acec8daac019f21ec0834827a5c5fd51 (patch)
tree25c10e3b925c4ae124875621dff236d56c3efbb0 /llvm.cpp
parent14b989aaf2c11710cef316a3ba20a947777cca08 (diff)
downloadresp-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.cpp10
1 files changed, 4 insertions, 6 deletions
diff --git a/llvm.cpp b/llvm.cpp
index 7786bf5..4585a7c 100644
--- a/llvm.cpp
+++ b/llvm.cpp
@@ -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)