C-Breeze
C Compiler Infrastructure

[ Project home page]
Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

attribnode.cc

Go to the documentation of this file.
00001 // $Id: attribnode.cc,v 1.3 2003/08/07 23:12:56 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 attribNode::attribNode(const char * name, exprNode * arg, const Coord coord)
00045   : stmtNode(Attrib, coord),
00046     _arg(arg),
00047     _name(string(name))
00048 {}
00049 
00050 //    Was ConvertIdToAttrib in ast.c
00051 
00052 attribNode::attribNode(idNode * id, exprNode * arg)
00053   : stmtNode(Attrib, id->coord()),
00054     _arg(arg),
00055     _name(id->name())
00056 {
00057   //delete id;
00058 }
00059 
00060 // ------------------------------------------------------------
00061 //  Walker
00062 // ------------------------------------------------------------
00063 
00064 void attribNode::visit(Visitor * the_visitor) 
00065 {
00066   the_visitor->at_attrib(this);
00067 }
00068 
00069 void attribNode::walk(Walker & the_walker)
00070 {
00071   Walker::Order ord = the_walker.order(); 
00072 
00073   if (ord == Walker::Preorder || ord == Walker::Both)
00074     the_walker.at_attrib(this, Walker::Preorder);
00075 
00076   if (the_walker.depth() == Walker::Subtree) {
00077     // -- Visit the children 
00078 
00079     if (arg())
00080       arg()->walk(the_walker);
00081   }
00082 
00083   if (ord == Walker::Postorder || ord == Walker::Both)
00084     the_walker.at_attrib(this, Walker::Postorder);
00085 }
00086 
00087 // ------------------------------------------------------------
00088 // Output
00089 // ------------------------------------------------------------
00090 
00091 void attribNode::output_stmt(output_context & ct, Node * parent)
00092 {
00093 }
00094 
00095 // ------------------------------------------------------------
00096 //  Changer
00097 // ------------------------------------------------------------
00098 
00099 Node * attribNode::change(Changer & the_changer, bool redispatch)
00100 {
00101   Changer::Order ord = the_changer.order(); 
00102   attribNode * the_attrib = this;
00103 
00104   if ((ord == Changer::Preorder || ord == Changer::Both) && ! redispatch)
00105     the_attrib = (attribNode *) the_changer.at_attrib(the_attrib, Changer::Preorder);
00106 
00107   if (the_attrib) {
00108 
00109     if (the_attrib != this)
00110       return the_attrib->change(the_changer, true);
00111 
00112     exprNode * old_arg = the_attrib->arg();
00113     if (old_arg) {
00114       exprNode * new_arg = (exprNode *) old_arg->change(the_changer);
00115       if (old_arg != new_arg) {
00116         //if (the_changer.delete_old())
00117          // delete old_arg;
00118         the_attrib->arg(new_arg);
00119       }
00120     }
00121 
00122   }
00123 
00124   if ((ord == Changer::Postorder || ord == Changer::Both) && ! redispatch)
00125     the_attrib = (attribNode *) the_changer.at_attrib(the_attrib, Changer::Postorder);
00126 
00127   return the_attrib;
00128 }
00129 
00130 
00131 // ------------------------------------------------------------
00132 // Destructor
00133 // ------------------------------------------------------------
00134 
00135 attribNode::~attribNode()
00136 {
00137   //delete _arg;
00138 }

Generated on August 27, 2003
Back to the C-Breeze home page