changeset 197:bfcb657756f6 trunk

[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.
author lindquist
date Mon, 12 May 2008 20:02:52 +0200
parents 48bebfd701a5
children 17dc52256c58
files gen/runtime.cpp gen/statements.cpp gen/toir.cpp
diffstat 3 files changed, 35 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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<const llvm::Type*> 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<const llvm::Type*> types;
@@ -705,7 +713,7 @@
     {
         std::string fname("_d_switch_string");
         std::vector<const llvm::Type*> 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<const llvm::Type*> 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<const llvm::Type*> 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);
--- 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<llvm::Value*> 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");
 }
 
--- 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<llvm::AllocaInst>(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;