charmxi: distinguish correctly between "fake" reference and actual pass-by-reference
authorJonathan Lifflander <avunda@mobile-254-234.near.uiuc.edu>
Wed, 24 Oct 2012 20:48:05 +0000 (15:48 -0500)
committerJonathan Lifflander <avunda@mobile-254-234.near.uiuc.edu>
Wed, 24 Oct 2012 20:48:05 +0000 (15:48 -0500)
src/xlat-i/sdag/CEntry.C
src/xlat-i/sdag/CStateVar.h
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index 2d818631ef7ff2b8c6290978214f5403bb184181..6b504f767ed8e5183875dfe029ebff0bf9f7142a 100644 (file)
@@ -39,7 +39,7 @@ void CEntry::generateCode(XStr& decls, XStr& defs)
        signature << sv->type << " ";
        if (sv->arrayLength != 0)
          signature << "*";
        signature << sv->type << " ";
        if (sv->arrayLength != 0)
          signature << "*";
-       else if (sv->byRef != 0) {
+       else if (sv->declaredRef) {
          signature <<"&";
        }
        if (sv->numPtrs != 0) {
          signature <<"&";
        }
        if (sv->numPtrs != 0) {
index 42dddf47b3cc2eb9168cdf1b001241b0de4d32fb..75413eaf51e410d6112f7a38c402b670246895b1 100644 (file)
@@ -13,7 +13,7 @@ struct CStateVar {
     XStr *type;
     int numPtrs;
     XStr *name;
     XStr *type;
     int numPtrs;
     XStr *name;
-    XStr *byRef;
+    XStr *byRef, *declaredRef;
     bool byConst;
     XStr *arrayLength;
     int isMsg;
     bool byConst;
     XStr *arrayLength;
     int isMsg;
@@ -34,6 +34,7 @@ CStateVar(ParamList *pl)
       , numPtrs(0)
       , name(new XStr(pl->getGivenName()))
       , byRef(pl->isReference() ? new XStr("&") : NULL)
       , numPtrs(0)
       , name(new XStr(pl->getGivenName()))
       , byRef(pl->isReference() ? new XStr("&") : NULL)
+      , declaredRef(pl->declaredReference() ? new XStr("&") : NULL)
       , byConst(pl->isConst())
       , arrayLength(pl->isArray() ? new XStr(pl->getArrayLen()) : NULL)
       , isMsg(pl->isMessage())
       , byConst(pl->isConst())
       , arrayLength(pl->isArray() ? new XStr(pl->getArrayLen()) : NULL)
       , isMsg(pl->isMessage())
index fdffa3964293dd391ee0ecd85080ffada32772c1..de539fbb0b1d8c8854be62232635bedf37bf8c8a 100644 (file)
@@ -4878,6 +4878,7 @@ Parameter::Parameter(int Nline,Type *Ntype,const char *Nname,
                sprintf((char *)name,"impl_noname_%x",unnamedCount++);
        }
        byReference=false;
                sprintf((char *)name,"impl_noname_%x",unnamedCount++);
        }
        byReference=false;
+        declaredReference = false;
        if ((arrLen==NULL)&&(val==NULL))
        { /* Consider passing type by reference: */
                if (type->isNamed())
        if ((arrLen==NULL)&&(val==NULL))
        { /* Consider passing type by reference: */
                if (type->isNamed())
@@ -4886,6 +4887,7 @@ Parameter::Parameter(int Nline,Type *Ntype,const char *Nname,
                }
                if (type->isReference()) {
                        byReference=true;
                }
                if (type->isReference()) {
                        byReference=true;
+                        declaredReference = true;
                        /* Clip off the ampersand--we'll add
                           it back ourselves in Parameter::print. */
                        type=type->deref();
                        /* Clip off the ampersand--we'll add
                           it back ourselves in Parameter::print. */
                        type=type->deref();
index adbdfe4b93d13f762ca377a20e3a39644ee63896..c74ecb7d66195738123ce9318969bc1e2e7915fe 100644 (file)
@@ -283,6 +283,7 @@ class Parameter {
     Value *val; /*Initial value, if any*/
     int line;
     int byReference; //Fake a pass-by-reference (for efficiency)
     Value *val; /*Initial value, if any*/
     int line;
     int byReference; //Fake a pass-by-reference (for efficiency)
+    bool declaredReference; // Actually was declared a reference
     int conditional; //If the parameter is conditionally packed
     bool byConst;
 
     int conditional; //If the parameter is conditionally packed
     bool byConst;
 
@@ -370,6 +371,7 @@ class ParamList {
     const char *getArrayLen(void) const {return param->getArrayLen();}
     int isArray(void) const {return param->isArray();}
     int isReference(void) const {return param->type->isReference() || param->byReference;}
     const char *getArrayLen(void) const {return param->getArrayLen();}
     int isArray(void) const {return param->isArray();}
     int isReference(void) const {return param->type->isReference() || param->byReference;}
+    int declaredReference(void) const {return param->type->isReference() || param->declaredReference; }
     bool isConst(void) const {return param->type->isConst() || param->byConst;}
     int isVoid(void) const {
        return (next==NULL) && param->isVoid();
     bool isConst(void) const {return param->type->isConst() || param->byConst;}
     int isVoid(void) const {
        return (next==NULL) && param->isVoid();