diff options
author | David Robillard <d@drobilla.net> | 2009-03-05 07:22:32 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-03-05 07:22:32 +0000 |
commit | 3877bf43aa958817812759d8973ccc4a8523a88a (patch) | |
tree | 9b3a42ea60639411f8564294bf17eabc344be064 /tuplr.cpp | |
parent | 54bb98ea98aea60ef951ab73987128a78f5cd9aa (diff) | |
download | resp-3877bf43aa958817812759d8973ccc4a8523a88a.tar.gz resp-3877bf43aa958817812759d8973ccc4a8523a88a.tar.bz2 resp-3877bf43aa958817812759d8973ccc4a8523a88a.zip |
Don't lift variable typed closures (but don't die).
Add some test programs.
git-svn-id: http://svn.drobilla.net/resp/tuplr@42 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'tuplr.cpp')
-rw-r--r-- | tuplr.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
@@ -811,12 +811,10 @@ ASTSymbol::compile(CEnv& cenv) void ASTClosure::lift(CEnv& cenv) { - if (cenv.tenv.type(at(2))->var) - throw Error("Closure with untyped body lifted"); - for (size_t i = 0; i < prot->size(); ++i) - if (cenv.tenv.type(prot->at(i))->var) - throw Error("Closure with untyped parameter lifted"); - + if (cenv.tenv.type(at(2))->var || !cenv.tenv.type(prot)->concrete()) { + std::cerr << "Closure has variable type, not lifting" << endl; + return; + } assert(!func); cenv.push(); @@ -851,8 +849,7 @@ ASTClosure::lift(CEnv& cenv) Value* ASTClosure::compile(CEnv& cenv) { - assert(func); - return func; // Function was already compiled in the lifting pass + return func; } void @@ -1139,6 +1136,7 @@ eval(CEnv& cenv, ExecutionEngine* engine, const string& name, istream& is) // Create function for top-level of program ASTTuple prot; const Type* ctype = resultType->type(); + assert(ctype); Function* f = compileFunction(cenv, cenv.gensym("input"), ctype, prot); BasicBlock* bb = BasicBlock::Create("entry", f); cenv.builder.SetInsertPoint(bb); |