# HG changeset patch # User lindquist # Date 1210615372 -7200 # Node ID bfcb657756f6b3418096e9543ba81ff942734b92 # Parent 48bebfd701a5273304ba8751502a0ae0180d716d [svn r213] Fixed: foreach on an object seems to have been broken, the issue was that DMD generates an implicit delegate with conflicting types for 'this'. Fixed: string switch runtime support had wrong param types. Fixed: string switch on a temporary slice was broken. diff -r 48bebfd701a5 -r bfcb657756f6 gen/runtime.cpp --- a/gen/runtime.cpp Mon May 12 19:10:41 2008 +0200 +++ b/gen/runtime.cpp Mon May 12 20:02:52 2008 +0200 @@ -145,6 +145,14 @@ return rt_ptr(llvm::StructType::get(t)); } +static const llvm::Type* rt_array2(const llvm::Type* elemty) +{ + std::vector t; + t.push_back(DtoSize_t()); + t.push_back(rt_ptr(elemty)); + return llvm::StructType::get(t); +} + static const llvm::Type* rt_dg1() { std::vector types; @@ -705,7 +713,7 @@ { std::string fname("_d_switch_string"); std::vector types; - types.push_back(rt_array(stringTy)); + types.push_back(rt_array(rt_array2(byteTy))); types.push_back(stringTy); const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); @@ -715,7 +723,7 @@ { std::string fname("_d_switch_ustring"); std::vector types; - types.push_back(rt_array(wstringTy)); + types.push_back(rt_array(rt_array2(shortTy))); types.push_back(wstringTy); const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); @@ -725,7 +733,7 @@ { std::string fname("_d_switch_dstring"); std::vector types; - types.push_back(rt_array(dstringTy)); + types.push_back(rt_array(rt_array2(intTy))); types.push_back(dstringTy); const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); diff -r 48bebfd701a5 -r bfcb657756f6 gen/statements.cpp --- a/gen/statements.cpp Mon May 12 19:10:41 2008 +0200 +++ b/gen/statements.cpp Mon May 12 20:02:52 2008 +0200 @@ -602,8 +602,27 @@ llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); std::vector args; + Logger::cout() << *table->getType() << '\n'; + Logger::cout() << *fn->getFunctionType()->getParamType(0) << '\n'; + assert(table->getType() == fn->getFunctionType()->getParamType(0)); args.push_back(table); - args.push_back(e->toElem(gIR)->getRVal()); + + DValue* val = e->toElem(gIR); + llvm::Value* llval; + if (DSliceValue* sval = val->isSlice()) + { + // give storage + llval = new llvm::AllocaInst(DtoType(e->type), "tmp", gIR->topallocapoint()); + DVarValue* vv = new DVarValue(e->type, llval, true); + DtoAssign(vv, val); + } + else + { + llval = val->getRVal(); + } + assert(llval->getType() == fn->getFunctionType()->getParamType(1)); + args.push_back(llval); + return gIR->ir->CreateCall(fn, args.begin(), args.end(), "tmp"); } diff -r 48bebfd701a5 -r bfcb657756f6 gen/toir.cpp --- a/gen/toir.cpp Mon May 12 19:10:41 2008 +0200 +++ b/gen/toir.cpp Mon May 12 20:02:52 2008 +0200 @@ -1510,6 +1510,9 @@ v = p->func()->decl->ir.irFunc->thisVar; if (llvm::isa(v)) v = new llvm::LoadInst(v, "tmp", p->scopebb()); + const llvm::Type* t = DtoType(type); + if (v->getType() != t) + v = DtoBitCast(v, t, "tmp"); return new DThisValue(vd, v); } @@ -1680,7 +1683,7 @@ Type* t = DtoDType(e1->type); Type* e2t = DtoDType(e2->type); - assert(t == e2t); + assert(DtoType(t) == DtoType(e2t)); llvm::Value* eval = 0;