Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/StatementNode.cc

    r145f1fc r7f5566b  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 14:59:41 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Jul 14 12:20:44 2015
    13 // Update Count     : 21
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 30 14:39:39 2015
     13// Update Count     : 130
    1414//
    1515
     
    3636StatementNode::StatementNode() : ParseNode(), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
    3737
    38 StatementNode::StatementNode( const string *name_ ) : ParseNode( name_ ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
     38StatementNode::StatementNode( const string *name ) : ParseNode( name ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
    3939
    4040StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), isCatchRest ( false ) {
     
    6060}
    6161
    62 StatementNode::StatementNode( Type t, ExpressionNode *ctrl_label, StatementNode *block_ ) :
    63                 type( t ), control( ctrl_label ), block( block_), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {
    64         if ( t == Default )
    65                 control = 0;
     62StatementNode::StatementNode( Type t, ExpressionNode *ctrl_label, StatementNode *block ) : type( t ), control( ctrl_label ), block( block ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {
     63        this->control = ( t == Default ) ? 0 : control;
    6664}
    6765
    68 StatementNode::StatementNode( Type t, string *_target ) :
    69                 type( t ), control( 0 ), block( 0 ), labels( 0 ), target(_target ), decl( 0 ), isCatchRest ( false ) {}
     66StatementNode::StatementNode( Type t, string *target ) : type( t ), control( 0 ), block( 0 ), labels( 0 ), target( target ), decl( 0 ), isCatchRest ( false ) {}
    7067
    7168StatementNode::~StatementNode() {
    7269        delete control;
    7370        delete block;
    74         delete labels;
    7571        delete target;
    7672        delete decl;
     
    10399}
    104100
    105 void StatementNode::set_control( ExpressionNode *c ) {
    106         control = c;
    107 }
    108 
    109 StatementNode * StatementNode::set_block( StatementNode *b ) {
    110         block = b;
    111 
    112         return this;
    113 }
    114 
    115 ExpressionNode *StatementNode::get_control() const {
    116         return control;
    117 }
    118 
    119 StatementNode *StatementNode::get_block() const {
    120         return block;
    121 }
    122 
    123 StatementNode::Type StatementNode::get_type() const {
    124         return type;
    125 }
    126 
    127101StatementNode *StatementNode::add_label( const std::string *l ) {
    128102        if ( l != 0 ) {
    129                 if ( labels == 0 )
    130                         labels = new std::list<std::string>();
    131 
    132                 labels->push_front(*l );
     103                labels.push_front( *l );
    133104                delete l;
    134105        } // if
    135106        return this;
    136107}
    137 
    138 std::list<std::string> *StatementNode::get_labels() const { return labels; }
    139108
    140109StatementNode *StatementNode::add_controlexp( ExpressionNode *e ) {
    141110        if ( control && e )
    142111                control->add_to_list( e ); // xxx - check this
    143 
    144112        return this;
    145113}
     
    170138
    171139void StatementNode::print( std::ostream &os, int indent ) const {
    172         if ( labels != 0 ) {
    173                 if ( ! labels->empty()) {
    174                         std::list<std::string>::const_iterator i;
    175 
    176                         os << string( indent, ' ' );
    177                         for ( i = labels->begin(); i != labels->end(); i++ )
    178                                 os << *i << ":";
    179                         os << endl;
    180                 } // if
     140        if ( ! labels.empty() ) {
     141                std::list<std::string>::const_iterator i;
     142
     143                os << string( indent, ' ' );
     144                for ( i = labels.begin(); i != labels.end(); i++ )
     145                        os << *i << ":";
     146                os << endl;
    181147        } // if
    182148
     
    198164                        if ( decl ) {
    199165                                os << string( indent + ParseNode::indent_by, ' ' ) << "Declaration: " << endl;
    200                                 decl->print( os, indent + 2*ParseNode::indent_by );
     166                                decl->print( os, indent + 2 * ParseNode::indent_by );
    201167                        } else if ( isCatchRest ) {
    202168                                os << string( indent + ParseNode::indent_by, ' ' ) << "Catches the rest " << endl;
     
    206172                } // if
    207173                if ( control ) {
    208                         os << string( indent + ParseNode::indent_by, ' ' ) << "Expression: " << endl;
    209                         control->printList( os, indent + 2*ParseNode::indent_by );
     174                        os << string( indent + ParseNode::indent_by, ' ' ) << "Control: " << endl;
     175                        control->printList( os, indent + 2 * ParseNode::indent_by );
    210176                } // if
    211177                if ( block ) {
    212178                        os << string( indent + ParseNode::indent_by, ' ' ) << "Branches of execution: " << endl;
    213                         block->printList( os, indent + 2*ParseNode::indent_by ); 
     179                        block->printList( os, indent + 2 * ParseNode::indent_by ); 
    214180                } // if
    215181                if ( target ) {
     
    225191        std::list<Label> labs;
    226192
    227         if ( labels != 0 ) {
     193        if ( ! labels.empty() ) {
    228194                std::back_insert_iterator< std::list<Label> > lab_it( labs );
    229                 copy( labels->begin(), labels->end(), lab_it );
     195                copy( labels.begin(), labels.end(), lab_it );
    230196        } // if
    231197
     
    274240                        if ( ctl->get_init() != 0 ) {
    275241                                buildList( ctl->get_init(), init );
    276                         }
     242                        } // if
    277243
    278244                        Expression *cond = 0;
     
    341307                        return new FinallyStmt( labs, block );
    342308                }
     309          case Asm:
     310                assert( false );
    343311          default:
    344312                // shouldn't be here
     
    346314        } // switch
    347315}
     316
    348317
    349318CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {}
     
    378347Statement *CompoundStmtNode::build() const {
    379348        std::list<Label> labs;
    380         std::list<std::string> *labels = get_labels();
    381 
    382         if ( labels != 0 ) {
     349        const std::list<std::string> &labels = get_labels();
     350
     351        if ( ! labels.empty() ) {
    383352                std::back_insert_iterator< std::list<Label> > lab_it( labs );
    384                 copy( labels->begin(), labels->end(), lab_it );
     353                copy( labels.begin(), labels.end(), lab_it );
    385354        } // if
    386355
     
    389358        return cs;
    390359}
     360
     361
     362AsmStmtNode::AsmStmtNode( Type t, bool voltile, ConstantNode *instruction, ExpressionNode *output, ExpressionNode *input, ConstantNode *clobber, LabelNode *gotolabels ) :
     363        StatementNode( t ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ) {
     364        if ( gotolabels ) {
     365                this->gotolabels = gotolabels->get_labels();
     366                delete gotolabels;
     367        } // if
     368}
     369
     370AsmStmtNode::~AsmStmtNode() {
     371        delete instruction; delete output; delete input; delete clobber;
     372}
     373
     374void AsmStmtNode::print( std::ostream &os, int indent ) const {
     375        StatementNode::print( os, indent );                                     // print statement labels
     376        os << string( indent + ParseNode::indent_by, ' ' ) << "volatile:" << voltile << endl;
     377        if ( instruction ) {
     378                os << string( indent + ParseNode::indent_by, ' ' ) << "Instruction:" << endl;
     379                instruction->printList( os, indent + 2 * ParseNode::indent_by );
     380        } // if
     381        if ( output ) {
     382                os << string( indent + ParseNode::indent_by, ' ' ) << "Output:" << endl;
     383                output->printList( os, indent + 2 * ParseNode::indent_by );
     384        } // if
     385        if ( input ) {
     386                os << string( indent + ParseNode::indent_by, ' ' ) << "Input:" << endl;
     387                input->printList( os, indent + 2 * ParseNode::indent_by );
     388        } // if
     389        if ( clobber ) {
     390                os << string( indent + ParseNode::indent_by, ' ' ) << "Clobber:" << endl;
     391                clobber->printList( os, indent + 2 * ParseNode::indent_by );
     392        } // if
     393        if ( ! gotolabels.empty() ) {
     394                os << string( indent + ParseNode::indent_by, ' ' ) << "Goto Labels:" << endl;
     395                os << string( indent + 2 * ParseNode::indent_by, ' ' );
     396                for ( std::list<std::string>::const_iterator i = gotolabels.begin();; ) {
     397                        os << *i;
     398                        i++;
     399                  if ( i == gotolabels.end() ) break;
     400                        os << ", ";
     401                }
     402                os << endl;
     403        } // if
     404}
     405
     406Statement *AsmStmtNode::build() const {
     407        std::list<Label> labs;
     408
     409        if ( ! get_labels().empty() ) {
     410                std::back_insert_iterator< std::list<Label> > lab_it( labs );
     411                copy( get_labels().begin(), get_labels().end(), lab_it );
     412        } // if
     413
     414        std::list< Expression * > out, in;
     415        std::list< ConstantExpr * > clob;
     416        buildList( output, out );
     417        buildList( input, in );
     418        buildList( clobber, clob );
     419        std::list< Label > gotolabs = gotolabels;
     420        return new AsmStmt( labs, voltile, (ConstantExpr *)maybeBuild< Expression >( instruction ), out, in, clob, gotolabs );
     421}
     422
    391423
    392424void NullStmtNode::print( ostream &os, int indent ) const {
Note: See TracChangeset for help on using the changeset viewer.