charmxi: Support multi-dimensional arrays for readonly variables 80/380/4
authorPhil Miller <mille121@illinois.edu>
Tue, 30 Sep 2014 19:29:12 +0000 (14:29 -0500)
committerGerrit Code Review <gerrit2@charm.cs.uiuc.edu>
Tue, 7 Oct 2014 00:04:04 +0000 (19:04 -0500)
Change-Id: Ia43fc6e651674ed492e5e194618479fe17f9f996

src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h
tests/charm++/simplearrayhello/hello.C
tests/charm++/simplearrayhello/hello.ci

index 1075725329ec6eb30fea0c1ad97de237738e2875..f5bcd97752925c49dee5d6a5ccf2c63c64420ab0 100644 (file)
@@ -2660,9 +2660,9 @@ Readonly::genDefs(XStr& str)
     str <<    "(void *_impl_pup_er) {\n";
     str << "  PUP::er &_impl_p=*(PUP::er *)_impl_pup_er;\n";
     if(dims){
-           str << "  _impl_p("<<qName()<<","; dims->printValue(str); str<<");\n";
+      str << "  _impl_p(&" << qName(); dims->printZeros(str); str << ", ("; dims->printValueProduct(str); str<<") );\n";
     }else{
-           str << "  _impl_p|"<<qName()<<";\n";
+      str << "  _impl_p|"<<qName()<<";\n";
     }
     str << "}\n";
     templateGuardEnd(str);
index 5bf92bb233f9c07389a5f5731196156713831137..460967c46ea42f4cde166ff7dc00a1ed7f45f444 100644 (file)
@@ -96,10 +96,24 @@ class ValueList : public Printable {
         val->print(str);
       }
       if(next) {
-         std::cout << "Unsupported type\n";
-         abort();
+       die("Unsupported type");
       }
     }
+    void printValueProduct(XStr& str) {
+      if (!val)
+       die("Must have a value for an array dimension");
+
+      str << "("; val->print(str); str << ")";
+      if (next) {
+       str << " * ";
+       next->printValueProduct(str);
+      }
+    }
+    void printZeros(XStr& str) {
+      str << "[0]";
+      if (next)
+       next->printZeros(str);
+    }
 };
 
 class Module;
index 206aece0d6a0a754e81ba0e7cf454ac28f84e5ec..8923632ef3c04d49078b9cefd7d2d695a6eefe74 100644 (file)
@@ -4,6 +4,8 @@
 /*readonly*/ CProxy_Main mainProxy;
 /*readonly*/ int nElements;
 
+/* readonly */ float values[3][3];
+
 /*mainchare*/
 class Main : public CBase_Main
 {
@@ -22,6 +24,10 @@ public:
 
     CProxy_Hello arr = CProxy_Hello::ckNew(nElements);
 
+    for (int i = 0; i < 3; ++i)
+      for (int j = 0; j < 3; ++j)
+       values[i][j] = 3*i + j;
+
     arr[0].SayHi(17);
   };
 
@@ -45,6 +51,10 @@ public:
   
   void SayHi(int hiNo)
   {
+    for (int i = 0; i < 3; ++i)
+      for (int j = 0; j < 3; ++j)
+       CkAssert(values[i][j] == 3*i + j);
+
     CkPrintf("Hi[%d] from element %d\n",hiNo,thisIndex);
     if (thisIndex < nElements-1)
       //Pass the hello on:
index 312b25f57136167e87c1f182ff6d2e34c462e517..5dd3a18c4870fa9b2b939f6334816f58227e827d 100644 (file)
@@ -2,6 +2,8 @@ mainmodule hello {
   readonly CProxy_Main mainProxy;
   readonly int nElements;
 
+  readonly float values[3][3];
+
   mainchare Main {
     entry Main(CkArgMsg *m);
     entry void done(void);