// // DrawSelf // // Draw the control using currently registered callbacks // void ICGrid::DrawSelf(PaintInfo &pi) { // Draw a frame DrawCtrlFrame(pi); // Do we have a cell iteration callback if (cellFunc) { // Window top left pixel position U32 xp1 = pi.client.p0.x; U32 yp1 = pi.client.p0.y; // Initial pixel positions for each axis (changes for flipping) U32 xip = xFlip ? xp1 + gridSize.x * cellSize.x - cellSize.x : xp1; U32 yip = yFlip ? yp1 + gridSize.y * cellSize.y - cellSize.y : yp1; // Draw the grid for (U32 x = 0, px = xip; x < gridSize.x; x++, px = xFlip ? (px - cellSize.x) : (px + cellSize.x)) { for (U32 y = 0, py = yip; y < gridSize.y; y++, py = yFlip ? (py - cellSize.y) : (py + cellSize.y)) { // Get the color from the callback Color color = cellFunc(context, x, y); // And paint this cell IFace::RenderRectangle(ClipRect(px, py, px + cellSize.x, py + cellSize.y), color); } } // Do we have a post-iteration callback if (postFunc) { // Setup paint info postPaintInfo = π // Trigger the callback postFunc(this); // Clear data postPaintInfo = NULL; } // Hackville if (displaySelected) { U32 x = selected.x; U32 y = selected.y; if (xFlip) { x = gridSize.x - x - 1; } if (yFlip) { y = gridSize.y - y - 1; } U32 xPos = pi.client.p0.x + (x * cellSize.x) + (cellSize.x / 4); U32 yPos = pi.client.p0.y + (y * cellSize.y) + (cellSize.y / 4); IFace::RenderRectangle(ClipRect(xPos, yPos, xPos + cellSize.x / 2, yPos + cellSize.y / 2), Color(1.0F, 1.0F, 1.0F, 0.5F)); } } }
ASTNode * WalkAST(ASTNode *node, ASTPreCallBackFunc preFunc, ASTPostCallBackFunc postFunc, void *data) { if (node == NULL) return node; // Call the callback function if (preFunc != NULL) { if (preFunc(node, data) == false) // The function asked us to not continue recursively, so stop. return node; } //////////////////////////////////////////////////////////////////////////// // Handle Statements if (llvm::dyn_cast<Stmt>(node) != NULL) { ExprStmt *es; DeclStmt *ds; IfStmt *is; DoStmt *dos; ForStmt *fs; ForeachStmt *fes; ForeachActiveStmt *fas; ForeachUniqueStmt *fus; CaseStmt *cs; DefaultStmt *defs; SwitchStmt *ss; ReturnStmt *rs; LabeledStmt *ls; StmtList *sl; PrintStmt *ps; AssertStmt *as; DeleteStmt *dels; UnmaskedStmt *ums; if ((es = llvm::dyn_cast<ExprStmt>(node)) != NULL) es->expr = (Expr *)WalkAST(es->expr, preFunc, postFunc, data); else if ((ds = llvm::dyn_cast<DeclStmt>(node)) != NULL) { for (unsigned int i = 0; i < ds->vars.size(); ++i) ds->vars[i].init = (Expr *)WalkAST(ds->vars[i].init, preFunc, postFunc, data); } else if ((is = llvm::dyn_cast<IfStmt>(node)) != NULL) { is->test = (Expr *)WalkAST(is->test, preFunc, postFunc, data); is->trueStmts = (Stmt *)WalkAST(is->trueStmts, preFunc, postFunc, data); is->falseStmts = (Stmt *)WalkAST(is->falseStmts, preFunc, postFunc, data); } else if ((dos = llvm::dyn_cast<DoStmt>(node)) != NULL) { dos->testExpr = (Expr *)WalkAST(dos->testExpr, preFunc, postFunc, data); dos->bodyStmts = (Stmt *)WalkAST(dos->bodyStmts, preFunc, postFunc, data); } else if ((fs = llvm::dyn_cast<ForStmt>(node)) != NULL) { fs->init = (Stmt *)WalkAST(fs->init, preFunc, postFunc, data); fs->test = (Expr *)WalkAST(fs->test, preFunc, postFunc, data); fs->step = (Stmt *)WalkAST(fs->step, preFunc, postFunc, data); fs->stmts = (Stmt *)WalkAST(fs->stmts, preFunc, postFunc, data); } else if ((fes = llvm::dyn_cast<ForeachStmt>(node)) != NULL) { for (unsigned int i = 0; i < fes->startExprs.size(); ++i) fes->startExprs[i] = (Expr *)WalkAST(fes->startExprs[i], preFunc, postFunc, data); for (unsigned int i = 0; i < fes->endExprs.size(); ++i) fes->endExprs[i] = (Expr *)WalkAST(fes->endExprs[i], preFunc, postFunc, data); fes->stmts = (Stmt *)WalkAST(fes->stmts, preFunc, postFunc, data); } else if ((fas = llvm::dyn_cast<ForeachActiveStmt>(node)) != NULL) { fas->stmts = (Stmt *)WalkAST(fas->stmts, preFunc, postFunc, data); } else if ((fus = llvm::dyn_cast<ForeachUniqueStmt>(node)) != NULL) { fus->expr = (Expr *)WalkAST(fus->expr, preFunc, postFunc, data); fus->stmts = (Stmt *)WalkAST(fus->stmts, preFunc, postFunc, data); } else if ((cs = llvm::dyn_cast<CaseStmt>(node)) != NULL) cs->stmts = (Stmt *)WalkAST(cs->stmts, preFunc, postFunc, data); else if ((defs = llvm::dyn_cast<DefaultStmt>(node)) != NULL) defs->stmts = (Stmt *)WalkAST(defs->stmts, preFunc, postFunc, data); else if ((ss = llvm::dyn_cast<SwitchStmt>(node)) != NULL) { ss->expr = (Expr *)WalkAST(ss->expr, preFunc, postFunc, data); ss->stmts = (Stmt *)WalkAST(ss->stmts, preFunc, postFunc, data); } else if (llvm::dyn_cast<BreakStmt>(node) != NULL || llvm::dyn_cast<ContinueStmt>(node) != NULL || llvm::dyn_cast<GotoStmt>(node) != NULL) { // nothing } else if ((ls = llvm::dyn_cast<LabeledStmt>(node)) != NULL) ls->stmt = (Stmt *)WalkAST(ls->stmt, preFunc, postFunc, data); else if ((rs = llvm::dyn_cast<ReturnStmt>(node)) != NULL) rs->expr = (Expr *)WalkAST(rs->expr, preFunc, postFunc, data); else if ((sl = llvm::dyn_cast<StmtList>(node)) != NULL) { std::vector<Stmt *> &sls = sl->stmts; for (unsigned int i = 0; i < sls.size(); ++i) sls[i] = (Stmt *)WalkAST(sls[i], preFunc, postFunc, data); } else if ((ps = llvm::dyn_cast<PrintStmt>(node)) != NULL) ps->values = (Expr *)WalkAST(ps->values, preFunc, postFunc, data); else if ((as = llvm::dyn_cast<AssertStmt>(node)) != NULL) as->expr = (Expr *)WalkAST(as->expr, preFunc, postFunc, data); else if ((dels = llvm::dyn_cast<DeleteStmt>(node)) != NULL) dels->expr = (Expr *)WalkAST(dels->expr, preFunc, postFunc, data); else if ((ums = llvm::dyn_cast<UnmaskedStmt>(node)) != NULL) ums->stmts = (Stmt *)WalkAST(ums->stmts, preFunc, postFunc, data); else FATAL("Unhandled statement type in WalkAST()"); } else { /////////////////////////////////////////////////////////////////////////// // Handle expressions Assert(llvm::dyn_cast<Expr>(node) != NULL); UnaryExpr *ue; BinaryExpr *be; AssignExpr *ae; SelectExpr *se; ExprList *el; FunctionCallExpr *fce; IndexExpr *ie; MemberExpr *me; TypeCastExpr *tce; ReferenceExpr *re; PtrDerefExpr *ptrderef; RefDerefExpr *refderef; SizeOfExpr *soe; AddressOfExpr *aoe; NewExpr *newe; if ((ue = llvm::dyn_cast<UnaryExpr>(node)) != NULL) ue->expr = (Expr *)WalkAST(ue->expr, preFunc, postFunc, data); else if ((be = llvm::dyn_cast<BinaryExpr>(node)) != NULL) { be->arg0 = (Expr *)WalkAST(be->arg0, preFunc, postFunc, data); be->arg1 = (Expr *)WalkAST(be->arg1, preFunc, postFunc, data); } else if ((ae = llvm::dyn_cast<AssignExpr>(node)) != NULL) { ae->lvalue = (Expr *)WalkAST(ae->lvalue, preFunc, postFunc, data); ae->rvalue = (Expr *)WalkAST(ae->rvalue, preFunc, postFunc, data); } else if ((se = llvm::dyn_cast<SelectExpr>(node)) != NULL) { se->test = (Expr *)WalkAST(se->test, preFunc, postFunc, data); se->expr1 = (Expr *)WalkAST(se->expr1, preFunc, postFunc, data); se->expr2 = (Expr *)WalkAST(se->expr2, preFunc, postFunc, data); } else if ((el = llvm::dyn_cast<ExprList>(node)) != NULL) { for (unsigned int i = 0; i < el->exprs.size(); ++i) el->exprs[i] = (Expr *)WalkAST(el->exprs[i], preFunc, postFunc, data); } else if ((fce = llvm::dyn_cast<FunctionCallExpr>(node)) != NULL) { fce->func = (Expr *)WalkAST(fce->func, preFunc, postFunc, data); fce->args = (ExprList *)WalkAST(fce->args, preFunc, postFunc, data); for (int k = 0; k < 3; k++) fce->launchCountExpr[0] = (Expr *)WalkAST(fce->launchCountExpr[0], preFunc, postFunc, data); } else if ((ie = llvm::dyn_cast<IndexExpr>(node)) != NULL) { ie->baseExpr = (Expr *)WalkAST(ie->baseExpr, preFunc, postFunc, data); ie->index = (Expr *)WalkAST(ie->index, preFunc, postFunc, data); } else if ((me = llvm::dyn_cast<MemberExpr>(node)) != NULL) me->expr = (Expr *)WalkAST(me->expr, preFunc, postFunc, data); else if ((tce = llvm::dyn_cast<TypeCastExpr>(node)) != NULL) tce->expr = (Expr *)WalkAST(tce->expr, preFunc, postFunc, data); else if ((re = llvm::dyn_cast<ReferenceExpr>(node)) != NULL) re->expr = (Expr *)WalkAST(re->expr, preFunc, postFunc, data); else if ((ptrderef = llvm::dyn_cast<PtrDerefExpr>(node)) != NULL) ptrderef->expr = (Expr *)WalkAST(ptrderef->expr, preFunc, postFunc, data); else if ((refderef = llvm::dyn_cast<RefDerefExpr>(node)) != NULL) refderef->expr = (Expr *)WalkAST(refderef->expr, preFunc, postFunc, data); else if ((soe = llvm::dyn_cast<SizeOfExpr>(node)) != NULL) soe->expr = (Expr *)WalkAST(soe->expr, preFunc, postFunc, data); else if ((aoe = llvm::dyn_cast<AddressOfExpr>(node)) != NULL) aoe->expr = (Expr *)WalkAST(aoe->expr, preFunc, postFunc, data); else if ((newe = llvm::dyn_cast<NewExpr>(node)) != NULL) { newe->countExpr = (Expr *)WalkAST(newe->countExpr, preFunc, postFunc, data); newe->initExpr = (Expr *)WalkAST(newe->initExpr, preFunc, postFunc, data); } else if (llvm::dyn_cast<SymbolExpr>(node) != NULL || llvm::dyn_cast<ConstExpr>(node) != NULL || llvm::dyn_cast<FunctionSymbolExpr>(node) != NULL || llvm::dyn_cast<SyncExpr>(node) != NULL || llvm::dyn_cast<NullPointerExpr>(node) != NULL) { // nothing to do } else FATAL("Unhandled expression type in WalkAST()."); } // Call the callback function if (postFunc != NULL) return postFunc(node, data); else return node; }