diff gen/statements.cpp @ 271:1e6e2b5d5bfe trunk

[svn r292] Fixed: string switch was broken in several ways. Fixed: TypeInfo_Typedef.next was incorrect (return base of base instead of just base). Fixed: ClassInfo offset type info (offTi) had invalid offsets.
author lindquist
date Wed, 18 Jun 2008 21:31:05 +0200
parents d9d5d59873d8
children 3b8ada4c9f8b
line wrap: on
line diff
--- a/gen/statements.cpp	Mon Jun 16 16:01:19 2008 +0200
+++ b/gen/statements.cpp	Wed Jun 18 21:31:05 2008 +0200
@@ -681,7 +681,14 @@
     }
     assert(llval->getType() == fn->getFunctionType()->getParamType(1));
 
-    return gIR->ir->CreateCall2(fn, table, llval, "tmp");
+    llvm::CallInst* call = gIR->ir->CreateCall2(fn, table, llval, "tmp");
+
+    llvm::PAListPtr palist;
+    palist = palist.addAttr(1, llvm::ParamAttr::ByVal);
+    palist = palist.addAttr(2, llvm::ParamAttr::ByVal);
+    call->setParamAttrs(palist);
+
+    return call;
 }
 
 void SwitchStatement::toIR(IRState* p)
@@ -709,6 +716,7 @@
     {
         Logger::println("is string switch");
         // build array of the stringexpS
+        caseArray.reserve(cases->dim);
         for (int i=0; i<cases->dim; ++i)
         {
             CaseStatement* cs = (CaseStatement*)cases->data[i];
@@ -719,13 +727,13 @@
         // first sort it
         caseArray.sort();
         // iterate and add indices to cases
-        std::vector<LLConstant*> inits;
+        std::vector<LLConstant*> inits(caseArray.dim);
         for (size_t i=0; i<caseArray.dim; ++i)
         {
-            CaseStatement* cs = (CaseStatement*)cases->data[i];
+            Case* c = (Case*)caseArray.data[i];
+            CaseStatement* cs = (CaseStatement*)cases->data[c->index];
             cs->llvmIdx = DtoConstUint(i);
-            Case* c = (Case*)caseArray.data[i];
-            inits.push_back(c->str->toConstElem(p));
+            inits[i] = c->str->toConstElem(p);
         }
         // build static array for ptr or final array
         const LLType* elemTy = DtoType(condition->type);
@@ -811,13 +819,10 @@
     }
     bodyBB = nbb;
 
-    if (exp->type->isintegral()) {
+    if (llvmIdx == NULL) {
         LLConstant* c = exp->toConstElem(p);
         llvmIdx = isaConstantInt(c);
     }
-    else {
-        assert(llvmIdx);
-    }
 
     if (!p->scopereturned())
         llvm::BranchInst::Create(bodyBB, p->scopebb());