Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/StatementNode.cc

    r7f5566b r145f1fc  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 14:59:41 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 30 14:39:39 2015
    13 // Update Count     : 130
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jul 14 12:20:44 2015
     13// Update Count     : 21
    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 ) : type( t ), control( ctrl_label ), block( block ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {
    63         this->control = ( t == Default ) ? 0 : control;
     62StatementNode::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;
    6466}
    6567
    66 StatementNode::StatementNode( Type t, string *target ) : type( t ), control( 0 ), block( 0 ), labels( 0 ), target( target ), decl( 0 ), isCatchRest ( false ) {}
     68StatementNode::StatementNode( Type t, string *_target ) :
     69                type( t ), control( 0 ), block( 0 ), labels( 0 ), target(_target ), decl( 0 ), isCatchRest ( false ) {}
    6770
    6871StatementNode::~StatementNode() {
    6972        delete control;
    7073        delete block;
     74        delete labels;
    7175        delete target;
    7276        delete decl;
     
    99103}
    100104
     105void StatementNode::set_control( ExpressionNode *c ) {
     106        control = c;
     107}
     108
     109StatementNode * StatementNode::set_block( StatementNode *b ) {
     110        block = b;
     111
     112        return this;
     113}
     114
     115ExpressionNode *StatementNode::get_control() const {
     116        return control;
     117}
     118
     119StatementNode *StatementNode::get_block() const {
     120        return block;
     121}
     122
     123StatementNode::Type StatementNode::get_type() const {
     124        return type;
     125}
     126
    101127StatementNode *StatementNode::add_label( const std::string *l ) {
    102128        if ( l != 0 ) {
    103                 labels.push_front( *l );
     129                if ( labels == 0 )
     130                        labels = new std::list<std::string>();
     131
     132                labels->push_front(*l );
    104133                delete l;
    105134        } // if
    106135        return this;
    107136}
     137
     138std::list<std::string> *StatementNode::get_labels() const { return labels; }
    108139
    109140StatementNode *StatementNode::add_controlexp( ExpressionNode *e ) {
    110141        if ( control && e )
    111142                control->add_to_list( e ); // xxx - check this
     143
    112144        return this;
    113145}
     
    138170
    139171void StatementNode::print( std::ostream &os, int indent ) const {
    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;
     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
    147181        } // if
    148182
     
    164198                        if ( decl ) {
    165199                                os << string( indent + ParseNode::indent_by, ' ' ) << "Declaration: " << endl;
    166                                 decl->print( os, indent + 2 * ParseNode::indent_by );
     200                                decl->print( os, indent + 2*ParseNode::indent_by );
    167201                        } else if ( isCatchRest ) {
    168202                                os << string( indent + ParseNode::indent_by, ' ' ) << "Catches the rest " << endl;
     
    172206                } // if
    173207                if ( control ) {
    174                         os << string( indent + ParseNode::indent_by, ' ' ) << "Control: " << endl;
    175                         control->printList( os, indent + 2 * ParseNode::indent_by );
     208                        os << string( indent + ParseNode::indent_by, ' ' ) << "Expression: " << endl;
     209                        control->printList( os, indent + 2*ParseNode::indent_by );
    176210                } // if
    177211                if ( block ) {
    178212                        os << string( indent + ParseNode::indent_by, ' ' ) << "Branches of execution: " << endl;
    179                         block->printList( os, indent + 2 * ParseNode::indent_by ); 
     213                        block->printList( os, indent + 2*ParseNode::indent_by ); 
    180214                } // if
    181215                if ( target ) {
     
    191225        std::list<Label> labs;
    192226
    193         if ( ! labels.empty() ) {
     227        if ( labels != 0 ) {
    194228                std::back_insert_iterator< std::list<Label> > lab_it( labs );
    195                 copy( labels.begin(), labels.end(), lab_it );
     229                copy( labels->begin(), labels->end(), lab_it );
    196230        } // if
    197231
     
    240274                        if ( ctl->get_init() != 0 ) {
    241275                                buildList( ctl->get_init(), init );
    242                         } // if
     276                        }
    243277
    244278                        Expression *cond = 0;
     
    307341                        return new FinallyStmt( labs, block );
    308342                }
    309           case Asm:
    310                 assert( false );
    311343          default:
    312344                // shouldn't be here
     
    314346        } // switch
    315347}
    316 
    317348
    318349CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {}
     
    347378Statement *CompoundStmtNode::build() const {
    348379        std::list<Label> labs;
    349         const std::list<std::string> &labels = get_labels();
    350 
    351         if ( ! labels.empty() ) {
     380        std::list<std::string> *labels = get_labels();
     381
     382        if ( labels != 0 ) {
    352383                std::back_insert_iterator< std::list<Label> > lab_it( labs );
    353                 copy( labels.begin(), labels.end(), lab_it );
     384                copy( labels->begin(), labels->end(), lab_it );
    354385        } // if
    355386
     
    358389        return cs;
    359390}
    360 
    361 
    362 AsmStmtNode::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 
    370 AsmStmtNode::~AsmStmtNode() {
    371         delete instruction; delete output; delete input; delete clobber;
    372 }
    373 
    374 void 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 
    406 Statement *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 
    423391
    424392void NullStmtNode::print( ostream &os, int indent ) const {
Note: See TracChangeset for help on using the changeset viewer.