Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/StatementNode.cc

    r7f5566b r1db21619  
    1010// Created On       : Sat May 16 14:59:41 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 30 14:39:39 2015
    13 // Update Count     : 130
     12// Last Modified On : Thu Jul 16 16:20:24 2015
     13// Update Count     : 30
    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() {
     
    110113        if ( control && e )
    111114                control->add_to_list( e ); // xxx - check this
     115
    112116        return this;
    113117}
     
    138142
    139143void StatementNode::print( std::ostream &os, int indent ) const {
    140         if ( ! labels.empty() ) {
     144        if ( ! labels.empty()) {
    141145                std::list<std::string>::const_iterator i;
    142146
     
    164168                        if ( decl ) {
    165169                                os << string( indent + ParseNode::indent_by, ' ' ) << "Declaration: " << endl;
    166                                 decl->print( os, indent + 2 * ParseNode::indent_by );
     170                                decl->print( os, indent + 2*ParseNode::indent_by );
    167171                        } else if ( isCatchRest ) {
    168172                                os << string( indent + ParseNode::indent_by, ' ' ) << "Catches the rest " << endl;
     
    172176                } // if
    173177                if ( control ) {
    174                         os << string( indent + ParseNode::indent_by, ' ' ) << "Control: " << endl;
    175                         control->printList( os, indent + 2 * ParseNode::indent_by );
     178                        os << string( indent + ParseNode::indent_by, ' ' ) << "Expression: " << endl;
     179                        control->printList( os, indent + 2*ParseNode::indent_by );
    176180                } // if
    177181                if ( block ) {
    178182                        os << string( indent + ParseNode::indent_by, ' ' ) << "Branches of execution: " << endl;
    179                         block->printList( os, indent + 2 * ParseNode::indent_by ); 
     183                        block->printList( os, indent + 2*ParseNode::indent_by ); 
    180184                } // if
    181185                if ( target ) {
     
    307311                        return new FinallyStmt( labs, block );
    308312                }
    309           case Asm:
    310                 assert( false );
    311313          default:
    312314                // shouldn't be here
     
    314316        } // switch
    315317}
    316 
    317318
    318319CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {}
     
    359360}
    360361
    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 
    423 
    424362void NullStmtNode::print( ostream &os, int indent ) const {
    425363        os << string( indent, ' ' ) << "Null Statement:" << endl;
Note: See TracChangeset for help on using the changeset viewer.