|
||
breaknode.ccGo to the documentation of this file.00001 // $Id: breaknode.cc,v 1.3 2003/08/07 23:13:00 pnav Exp $ 00002 // ---------------------------------------------------------------------- 00003 // 00004 // C-Breeze 00005 // C Compiler Framework 00006 // 00007 // Copyright (c) 2000 University of Texas at Austin 00008 // 00009 // Samuel Z. Guyer 00010 // Daniel A. Jimenez 00011 // Calvin Lin 00012 // 00013 // Permission is hereby granted, free of charge, to any person 00014 // obtaining a copy of this software and associated documentation 00015 // files (the "Software"), to deal in the Software without 00016 // restriction, including without limitation the rights to use, copy, 00017 // modify, merge, publish, distribute, sublicense, and/or sell copies 00018 // of the Software, and to permit persons to whom the Software is 00019 // furnished to do so, subject to the following conditions: 00020 // 00021 // The above copyright notice and this permission notice shall be 00022 // included in all copies or substantial portions of the Software. 00023 // 00024 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00025 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00026 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00027 // NONINFRINGEMENT. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT 00028 // AUSTIN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 00029 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 00030 // OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00031 // THE SOFTWARE. 00032 // 00033 // We acknowledge the C-to-C Translator from MIT Laboratory for 00034 // Computer Science for inspiring parts of the C-Breeze design. 00035 // 00036 // ---------------------------------------------------------------------- 00037 00038 #include "c_breeze.h" 00039 00040 // -------------------------------------------------------------------- 00041 // Constructors 00042 // -------------------------------------------------------------------- 00043 00044 breakNode::breakNode(stmtNode * container, const Coord coord) 00045 : jumpNode(Break, coord), 00046 _container(container) 00047 {} 00048 00049 breakNode::breakNode(const Coord the_coord) 00050 : jumpNode(Break, the_coord), 00051 _container(0) 00052 {} 00053 00054 // ------------------------------------------------------------ 00055 // Walker 00056 // ------------------------------------------------------------ 00057 00058 void breakNode::visit(Visitor * the_visitor) 00059 { 00060 the_visitor->at_break(this); 00061 } 00062 00063 void breakNode::walk(Walker & the_walker) 00064 { 00065 Walker::Order ord = the_walker.order(); 00066 00067 if (ord == Walker::Preorder || ord == Walker::Both) 00068 the_walker.at_break(this, Walker::Preorder); 00069 00070 if (ord == Walker::Postorder || ord == Walker::Both) 00071 the_walker.at_break(this, Walker::Postorder); 00072 } 00073 00074 // ------------------------------------------------------------ 00075 // Dataflow 00076 // ------------------------------------------------------------ 00077 00078 void breakNode::dataflow(FlowVal * v, FlowProblem & fp) 00079 { 00080 if (fp.forward()) { 00081 fp.flow_break(v, this, FlowProblem::Entry); 00082 00083 // -- Push values to the exit and set to "top" 00084 00085 if (container()) 00086 container()->at_exit()->meet_and_diff(v, fp); 00087 00088 v->to_top(); 00089 00090 fp.flow_break(v, this, FlowProblem::Exit); 00091 } 00092 else { 00093 fp.flow_break(v, this, FlowProblem::Exit); 00094 00095 // -- Get values from the exit 00096 00097 v->to_top(); 00098 00099 if (container()) 00100 v->meet(container()->at_exit()); 00101 00102 fp.flow_break(v, this, FlowProblem::Entry); 00103 } 00104 } 00105 00106 // ------------------------------------------------------------ 00107 // Output 00108 // ------------------------------------------------------------ 00109 00110 void breakNode::output_stmt(output_context & ct, Node * parent) 00111 { 00112 ct << "break" << ';' ; 00113 } 00114 00115 // ------------------------------------------------------------ 00116 // Changer 00117 // ------------------------------------------------------------ 00118 00119 Node * breakNode::change(Changer & the_changer, bool redispatch) 00120 { 00121 Changer::Order ord = the_changer.order(); 00122 breakNode * the_break = this; 00123 00124 if ((ord == Changer::Preorder || ord == Changer::Both) && ! redispatch) 00125 the_break = (breakNode *) the_changer.at_break(the_break, Changer::Preorder); 00126 00127 if (the_break) { 00128 00129 if (the_break != this) 00130 return the_break->change(the_changer, true); 00131 00132 } 00133 00134 if ((ord == Changer::Postorder || ord == Changer::Both) && ! redispatch) 00135 the_break = (breakNode *) the_changer.at_break(the_break, Changer::Postorder); 00136 00137 return the_break; 00138 } 00139 00140 00141 // ------------------------------------------------------------ 00142 // Destructor 00143 // ------------------------------------------------------------ 00144 00145 breakNode::~breakNode() 00146 { 00147 } |
Generated on August 27, 2003
Back to the C-Breeze home page