예제 #1
0
//--------------------------------------------------------- 
void unrollRecordAssigns(StmtEditor& editor, Stmt* S)
{    
  const RecordType *RT;
  for (stmt_iterator<BinaryOperator> i = stmt_ibegin(S), 
       e = stmt_iend(S); i != e;)
  {
    BinaryOperator* BO = *i;
    if (BO->getOpcode() == BO_Assign && 
        (RT = BO->getType()->getAsStructureType()) != 0 && 
        editor.getStatementOfExpression(BO) == BO)  // ensures top level assign
    {
      CompoundStmt* CS = editor.ensureCompoundParent(BO);
      std::vector<Stmt*> compoundStmts(CS->child_begin(), CS->child_end());
      std::vector<Stmt*>::iterator insertPos = 
        std::find(compoundStmts.begin(), compoundStmts.end(), BO);
      assert(insertPos != compoundStmts.end());
      insertPos = compoundStmts.erase(insertPos);
      RecordAssignUnroller unroller(editor, RT->getDecl(), BO);
      compoundStmts.insert(insertPos, 
        unroller.compoundStmts.begin(), unroller.compoundStmts.end());
      editor.replaceStmts(CS, &compoundStmts[0], compoundStmts.size());
      i = stmt_ibegin(S);
    }
    else
    {
      ++i;
    }
  }
}
예제 #2
0
//--------------------------------------------------------- 
void removeInnerAssigns(StmtEditor& editor, Stmt* S)
{    
  for (stmt_iterator<BinaryOperator> i = stmt_ibegin(S), 
       e = stmt_iend(S); i != e;)
  {
    if (i->getOpcode() == BO_Assign && 
        isa<Expr>(editor.getParent(*i)))
    {
      Stmt* exprStmt = editor.getStatementOfExpression(*i);
      CompoundStmt* CS = editor.ensureCompoundParent(exprStmt);
      std::vector<Stmt*> compoundStmts(CS->child_begin(), CS->child_end());
      std::vector<Stmt*>::iterator insertPos = 
        std::find(compoundStmts.begin(), compoundStmts.end(), exprStmt);
      assert(insertPos != compoundStmts.end());
      compoundStmts.insert(insertPos, *i);
      editor.replaceStatement(*i, selectInnerAssignResult(*i));
      editor.replaceStmts(CS, &compoundStmts[0], compoundStmts.size());
      i = stmt_ibegin(S);
    }
    else
    {
      ++i;
    }
  }
}