00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "c_breeze.h"
00039
00040
00041
00042
00043
00044 exprstmtNode::exprstmtNode(exprNode * expr)
00045 : stmtNode(Expr, Coord::Unknown),
00046 _expr(expr)
00047 {
00048 if (expr)
00049 coord(expr->coord());
00050 }
00051
00052
00053
00054
00055
00056 typeNode * exprstmtNode::base_type(bool TdefIndir) const
00057 {
00058 return expr()->base_type(TdefIndir);
00059 }
00060
00061
00062
00063
00064
00065 void exprstmtNode::visit(Visitor * the_visitor)
00066 {
00067 the_visitor->at_exprstmt(this);
00068 }
00069
00070 void exprstmtNode::walk(Walker & the_walker)
00071 {
00072 Walker::Order ord = the_walker.order();
00073
00074 if (ord == Walker::Preorder || ord == Walker::Both)
00075 the_walker.at_exprstmt(this, Walker::Preorder);
00076
00077 if (the_walker.depth() == Walker::Subtree) {
00078
00079
00080 if (expr())
00081 expr()->walk(the_walker);
00082 }
00083
00084 if (ord == Walker::Postorder || ord == Walker::Both)
00085 the_walker.at_exprstmt(this, Walker::Postorder);
00086 }
00087
00088
00089
00090
00091
00092 void exprstmtNode::dataflow(FlowVal * v, FlowProblem & fp)
00093 {
00094 if (fp.forward()) {
00095 fp.flow_exprstmt(v, this, FlowProblem::Entry);
00096
00097 if (expr())
00098 if (fp.basicblocks()) {
00099 fp.flow_basicblock(v, expr(), FlowProblem::Entry);
00100 fp.flow_basicblock(v, expr(), FlowProblem::Exit);
00101 }
00102 else
00103 expr()->dataflow(v, fp);
00104
00105 fp.flow_exprstmt(v, this, FlowProblem::Exit);
00106 }
00107 else {
00108 fp.flow_exprstmt(v, this, FlowProblem::Exit);
00109
00110 if (expr())
00111 if (fp.basicblocks()) {
00112 fp.flow_basicblock(v, expr(), FlowProblem::Exit);
00113 fp.flow_basicblock(v, expr(), FlowProblem::Entry);
00114 }
00115 else
00116 expr()->dataflow(v, fp);
00117
00118 fp.flow_exprstmt(v, this, FlowProblem::Entry);
00119 }
00120 }
00121
00122
00123
00124
00125
00126 void exprstmtNode::output_stmt(output_context & ct, Node * parent)
00127 {
00128 if (expr())
00129 expr()->output(ct, this);
00130
00131 ct << ';' ;
00132 }
00133
00134
00135
00136
00137
00138 Node * exprstmtNode::change(Changer & the_changer, bool redispatch)
00139 {
00140 Changer::Order ord = the_changer.order();
00141 exprstmtNode * the_exprstmt = this;
00142
00143 if ((ord == Changer::Preorder || ord == Changer::Both) && ! redispatch)
00144 the_exprstmt = (exprstmtNode *) the_changer.at_exprstmt(the_exprstmt, Changer::Preorder);
00145
00146 if (the_exprstmt) {
00147
00148 if (the_exprstmt != this)
00149 return the_exprstmt->change(the_changer, true);
00150
00151 exprNode * old_expr = the_exprstmt->expr();
00152 if (old_expr) {
00153 exprNode * new_expr = (exprNode *) old_expr->change(the_changer);
00154 if (old_expr != new_expr) {
00155
00156
00157 the_exprstmt->expr(new_expr);
00158 }
00159 }
00160
00161 }
00162
00163 if ((ord == Changer::Postorder || ord == Changer::Both) && ! redispatch)
00164 the_exprstmt = (exprstmtNode *) the_changer.at_exprstmt(the_exprstmt, Changer::Postorder);
00165
00166 return the_exprstmt;
00167 }
00168
00169
00170
00171
00172
00173
00174 exprstmtNode::~exprstmtNode()
00175 {
00176
00177 }