Ronald Aigner wrote on 14.02.2007 18:44 this:
please find attached a diff for a work around. Sorry, wrong order. Now, please find attached a patch for a work around.
HTH, Ron. -- Mit freundlichen Gruessen / with regards ra3 @ inf.tu-dresden.de http://os.inf.tu-dresden.de/~ra3/ Index: BEMsgBufferType.cpp =================================================================== --- BEMsgBufferType.cpp (.../tags/public/dice/3.1.1/src/be/BEMsgBufferType.cpp) (revision 27752) +++ BEMsgBufferType.cpp (.../trunk/dice/src/be/BEMsgBufferType.cpp) (revision 27752) @@ -569,12 +569,6 @@ __func__, pParameter->m_Declarators.First()->GetName().c_str(), pStruct); - // check out if the parent of the message buffer (a function) is at the - // client or server side. At the server side this message buffer is - // probably global (exceptions to this rule have to be handled when they - // arise). - CBEFunction *pFunc = GetSpecificParent<CBEFunction>(); - bool bGlobal = (pFunc) ? pFunc->IsComponentSide() : true; CBEDeclarator *pDecl = pParameter->m_Declarators.First(); @@ -693,57 +687,71 @@ // // If no stars but array bounds, rely on those and get the hell outa // here - if ((pParameter->m_Attributes.Find(ATTR_SIZE_IS) || - pParameter->m_Attributes.Find(ATTR_LENGTH_IS)) && - !pParameter->m_Attributes.Find(ATTR_OUT) && - !((pDecl->GetStars() == 0) && - (pDecl->GetArrayDimensionCount() > nEmptyBounds)) && - !bGlobal) - { - CCompiler::Verbose(PROGRAM_VERBOSE_NORMAL, - "CBEMsgBufferType::%s param has unbound array dimensions\n", - __func__); - // check for stars that have to be removed - if (pDecl->GetStars() > 0) - pDecl->IncStars(-1); - // add size_is parameter as array bound - CBEAttribute *pAttr = pParameter->m_Attributes.Find(ATTR_SIZE_IS); - if (!pAttr) - pAttr = pParameter->m_Attributes.Find(ATTR_LENGTH_IS); - CBEExpression *pExpr = pCF->GetNewExpression(); - if (pAttr->IsOfType(ATTR_CLASS_INT)) - { - pExpr->CreateBackEnd(pAttr->GetIntValue()); - } - else if (pAttr->IsOfType(ATTR_CLASS_IS)) - { - CBEDeclarator *pIsDecl = pAttr->m_Parameters.First(); - pExpr->CreateBackEnd(pIsDecl->GetName()); - } - else - pExpr->CreateBackEnd(0); - // look for empty bound and remove it (it will be replaced by new - // boundary - if (nEmptyBounds > 0) - { - for (iterB = pDecl->m_Bounds.begin(); - iterB != pDecl->m_Bounds.end(); - iterB++) - { - if ((*iterB)->GetIntValue() == 0) - { - pDecl->RemoveArrayBound(*iterB); - break; - } - } - } - pDecl->AddArrayBound(pExpr); - - // return here - CCompiler::VerboseD(PROGRAM_VERBOSE_NORMAL, - "CBEMsgBufferType::%s array fixed, returns\n", __func__); - return; - } + // + // \todo: variable sized arrays should be placed into a byte array and + // be marshalled/unmarshalled with offset variables. + // Because this is not done yet, the size_is size of the array cannot + // be applied if two variable sized arrays are used: the second starts + // at the sender's side right behind the size of the first, but on the + // receiver's side, the max-is size is used for the first array. + // + // check out if the parent of the message buffer (a function) is at the + // client or server side. At the server side this message buffer is + // probably global (exceptions to this rule have to be handled when they + // arise). +// CBEFunction *pFunc = GetSpecificParent<CBEFunction>(); +// bool bGlobal = (pFunc) ? pFunc->IsComponentSide() : true; +// if ((pParameter->m_Attributes.Find(ATTR_SIZE_IS) || +// pParameter->m_Attributes.Find(ATTR_LENGTH_IS)) && +// !pParameter->m_Attributes.Find(ATTR_OUT) && +// !((pDecl->GetStars() == 0) && +// (pDecl->GetArrayDimensionCount() > nEmptyBounds)) && +// !bGlobal) +// { +// CCompiler::Verbose(PROGRAM_VERBOSE_NORMAL, +// "CBEMsgBufferType::%s param has unbound array dimensions\n", +// __func__); +// // check for stars that have to be removed +// if (pDecl->GetStars() > 0) +// pDecl->IncStars(-1); +// // add size_is parameter as array bound +// CBEAttribute *pAttr = pParameter->m_Attributes.Find(ATTR_SIZE_IS); +// if (!pAttr) +// pAttr = pParameter->m_Attributes.Find(ATTR_LENGTH_IS); +// CBEExpression *pExpr = pCF->GetNewExpression(); +// if (pAttr->IsOfType(ATTR_CLASS_INT)) +// { +// pExpr->CreateBackEnd(pAttr->GetIntValue()); +// } +// else if (pAttr->IsOfType(ATTR_CLASS_IS)) +// { +// CBEDeclarator *pIsDecl = pAttr->m_Parameters.First(); +// pExpr->CreateBackEnd(pIsDecl->GetName()); +// } +// else +// pExpr->CreateBackEnd(0); +// // look for empty bound and remove it (it will be replaced by new +// // boundary +// if (nEmptyBounds > 0) +// { +// for (iterB = pDecl->m_Bounds.begin(); +// iterB != pDecl->m_Bounds.end(); +// iterB++) +// { +// if ((*iterB)->GetIntValue() == 0) +// { +// pDecl->RemoveArrayBound(*iterB); +// break; +// } +// } +// } +// pDecl->AddArrayBound(pExpr); +// +// // return here +// CCompiler::VerboseD(PROGRAM_VERBOSE_NORMAL, +// "CBEMsgBufferType::%s array fixed, returns\n", __func__); +// return; +// } // handle arrays: if we have a max_is and no array bounds, we add the // max_is as array bound.