Changes in / [208e5be:1ce2189]
- Location:
- src
- Files:
-
- 2 deleted
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r208e5be r1ce2189 66 66 } // extension 67 67 68 ostream & CodeGenerator::Indenter::operator()( ostream & output ) const { 69 return output << string( cg.cur_indent, ' ' ); 70 } 71 72 ostream & operator<<( ostream & output, const CodeGenerator::Indenter &indent ) { 73 return indent( output ); 74 } 75 68 76 CodeGenerator::LabelPrinter & CodeGenerator::LabelPrinter::operator()( std::list< Label > & l ) { 69 77 labels = &l; … … 103 111 } 104 112 105 CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( CodeGenerator::tabsize), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}113 CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {} 106 114 107 115 string CodeGenerator::mangleName( DeclarationWithType * decl ) { … … 194 202 output << " {" << endl; 195 203 196 ++indent;204 cur_indent += CodeGenerator::tabsize; 197 205 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++ ) { 198 206 output << lineDirective( *i ) << indent; … … 201 209 } // for 202 210 203 --indent;211 cur_indent -= CodeGenerator::tabsize; 204 212 205 213 output << indent << "}"; … … 231 239 output << " {" << endl; 232 240 233 ++indent;241 cur_indent += CodeGenerator::tabsize; 234 242 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 235 243 ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i ); … … 243 251 } // for 244 252 245 --indent;253 cur_indent -= CodeGenerator::tabsize; 246 254 247 255 output << indent << "}"; … … 747 755 std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids(); 748 756 output << lineDirective( stmtExpr) << "({" << std::endl; 749 ++indent;757 cur_indent += CodeGenerator::tabsize; 750 758 unsigned int numStmts = stmts.size(); 751 759 unsigned int i = 0; … … 770 778 ++i; 771 779 } 772 --indent;780 cur_indent -= CodeGenerator::tabsize; 773 781 output << indent << "})"; 774 782 } … … 779 787 output << "{" << endl; 780 788 781 ++indent;789 cur_indent += CodeGenerator::tabsize; 782 790 783 791 for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end(); i++ ) { … … 790 798 } // if 791 799 } // for 792 --indent;800 cur_indent -= CodeGenerator::tabsize; 793 801 794 802 output << indent << "}"; … … 858 866 859 867 output << "{" << std::endl; 860 ++indent;868 cur_indent += CodeGenerator::tabsize; 861 869 acceptAll( switchStmt->get_statements(), *this ); 862 --indent;870 cur_indent -= CodeGenerator::tabsize; 863 871 output << indent << "}"; 864 872 } … … 877 885 std::list<Statement *> sts = caseStmt->get_statements(); 878 886 879 ++indent;887 cur_indent += CodeGenerator::tabsize; 880 888 for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end(); i++) { 881 889 output << indent << printLabels( (*i)->get_labels() ) ; … … 883 891 output << endl; 884 892 } // for 885 --indent;893 cur_indent -= CodeGenerator::tabsize; 886 894 } 887 895 -
src/CodeGen/CodeGenerator.h
r208e5be r1ce2189 25 25 #include "SymTab/Indexer.h" 26 26 27 #include "Common/Indenter.h"28 27 #include "Common/utility.h" 29 28 … … 103 102 template< class Iterator > void genCommaList( Iterator begin, Iterator end ); 104 103 104 struct Indenter { 105 Indenter(CodeGenerator &cg) : cg(cg) {} 106 CodeGenerator & cg; 107 std::ostream& operator()(std::ostream & os) const; 108 }; 109 105 110 struct LabelPrinter { 106 111 LabelPrinter(CodeGenerator &cg) : cg(cg), labels( 0 ) {} … … 125 130 private: 126 131 Indenter indent; 132 int cur_indent; 127 133 bool insideFunction; 128 134 std::ostream &output; -
src/CodeGen/GenType.cc
r208e5be r1ce2189 37 37 virtual void visit( PointerType *pointerType ); 38 38 virtual void visit( ArrayType *arrayType ); 39 virtual void visit( ReferenceType *refType );40 39 virtual void visit( StructInstType *structInst ); 41 40 virtual void visit( UnionInstType *unionInst ); … … 148 147 } 149 148 150 void GenType::visit( ReferenceType *refType ) {151 assert( refType->get_base() != 0);152 assertf( ! genC, "Reference types should not reach code generation." );153 handleQualifiers( refType );154 typeString = "&" + typeString;155 refType->get_base()->accept( *this );156 }157 158 149 void GenType::visit( FunctionType *funcType ) { 159 150 std::ostringstream os; -
src/Concurrency/Keywords.cc
r208e5be r1ce2189 322 322 if( needs_main ) { 323 323 FunctionType * main_type = new FunctionType( noQualifiers, false ); 324 324 325 325 main_type->get_parameters().push_back( this_decl->clone() ); 326 326 … … 361 361 void ConcurrentSueKeyword::addRoutines( ObjectDecl * field, FunctionDecl * func ) { 362 362 CompoundStmt * statement = new CompoundStmt( noLabels ); 363 statement->push_back( 363 statement->push_back( 364 364 new ReturnStmt( 365 365 noLabels, … … 386 386 //============================================================================================= 387 387 void MutexKeyword::visit(FunctionDecl* decl) { 388 Visitor::visit(decl); 388 Visitor::visit(decl); 389 389 390 390 std::list<DeclarationWithType*> mutexArgs = findMutexArgs( decl ); … … 510 510 void ThreadStarter::visit(FunctionDecl * decl) { 511 511 Visitor::visit(decl); 512 512 513 513 if( ! InitTweak::isConstructor(decl->get_name()) ) return; 514 514 515 515 DeclarationWithType * param = decl->get_functionType()->get_parameters().front(); 516 auto type = dynamic_cast< StructInstType * >( InitTweak::getPointerBase( param->get_type() ) ); 516 auto ptr = dynamic_cast< PointerType * >( param->get_type() ); 517 // if( ptr ) std::cerr << "FRED1" << std::endl; 518 auto type = dynamic_cast< StructInstType * >( ptr->get_base() ); 517 519 // if( type ) std::cerr << "FRED2" << std::endl; 518 520 if( type && type->get_baseStruct()->is_thread() ) { … … 526 528 if( ! stmt ) return; 527 529 528 stmt->push_back( 530 stmt->push_back( 529 531 new ExprStmt( 530 532 noLabels, -
src/GenPoly/Lvalue.cc
r208e5be r1ce2189 32 32 #include "Common/UniqueName.h" 33 33 #include "Common/utility.h" 34 #include "InitTweak/InitTweak.h"35 34 36 35 namespace GenPoly { … … 39 38 class Pass1 : public Mutator { 40 39 public: 41 typedef Mutator Parent;42 40 Pass1(); 43 41 44 // xxx - should this happen to every expression with reference result type? probably just appexpr and varexpr?45 virtual Type *mutate( ReferenceType * refType );46 virtual Expression *mutate( VariableExpr *varExpr );47 42 virtual Expression *mutate( ApplicationExpr *appExpr ); 48 43 virtual Statement *mutate( ReturnStmt *appExpr ); … … 110 105 } 111 106 112 Type * Pass1::mutate( ReferenceType * refType ) {113 Type * base = refType->get_base();114 refType->set_base( nullptr );115 delete refType;116 return new PointerType( Type::Qualifiers(), base );117 }118 119 Expression * Pass1::mutate( VariableExpr *varExpr ) {120 if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( varExpr->get_result() ) ) {121 varExpr->set_result( refType->acceptMutator( *this ) );122 return UntypedExpr::createDeref( varExpr );123 }124 return Parent::mutate( varExpr );125 }126 127 107 Expression * Pass1::mutate( ApplicationExpr *appExpr ) { 128 108 appExpr->get_function()->acceptMutator( *this ); … … 183 163 } 184 164 185 bool isDeref( Expression * expr ) {186 if ( UntypedExpr * untyped = dynamic_cast< UntypedExpr * >( expr ) ) {187 return InitTweak::getFunctionName( untyped ) == "*?";188 } else if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * > ( expr ) ) {189 return InitTweak::getFunctionName( appExpr ) == "*?";190 } else {191 return false;192 }193 }194 195 165 Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) { 196 166 addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) ); … … 206 176 delete addrExpr; 207 177 return new ConditionalExpr( arg1, new AddressExpr( arg2 ), new AddressExpr( arg3 ) ); 208 } else if ( isDeref( addrExpr->get_arg() ) ) {209 // xxx - this doesn't belong here -- move it somewhere else210 Expression *& arg = InitTweak::getCallArg( addrExpr->get_arg(), 0 );211 Expression * inner = arg;212 arg = nullptr;213 delete addrExpr;214 return inner;215 178 } 216 179 return addrExpr; -
src/InitTweak/FixInit.cc
r208e5be r1ce2189 401 401 402 402 bool ResolveCopyCtors::skipCopyConstruct( Type * type ) { 403 return dynamic_cast< VarArgsType * >( type ) || dynamic_cast< ReferenceType * >( type ) ||GenPoly::getFunctionType( type ) || Tuples::isTtype( type );403 return dynamic_cast< VarArgsType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type ); 404 404 } 405 405 -
src/InitTweak/GenInit.cc
r208e5be r1ce2189 239 239 std::list< DeclarationWithType * > & params = GenPoly::getFunctionType( dwt->get_type() )->get_parameters(); 240 240 assert( ! params.empty() ); 241 Type * type = InitTweak::getPointerBase( params.front()->get_type() ); 242 assert( type ); 243 managedTypes.insert( SymTab::Mangler::mangle( type ) ); 241 PointerType * type = safe_dynamic_cast< PointerType * >( params.front()->get_type() ); 242 managedTypes.insert( SymTab::Mangler::mangle( type->get_base() ) ); 244 243 } 245 244 } -
src/InitTweak/InitTweak.cc
r208e5be r1ce2189 458 458 } else if ( ArrayType * arrayType = dynamic_cast< ArrayType * >( type ) ) { 459 459 return arrayType->get_base(); 460 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( type ) ) {461 return refType->get_base();462 460 } else { 463 461 return NULL; … … 545 543 if ( ftype->get_parameters().size() != 2 ) return 0; 546 544 547 Type * t1 = getPointerBase( ftype->get_parameters().front()->get_type());545 Type * t1 = ftype->get_parameters().front()->get_type(); 548 546 Type * t2 = ftype->get_parameters().back()->get_type(); 549 assert( t1 ); 550 551 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( t1, t2, SymTab::Indexer() ) ) { 547 PointerType * ptrType = dynamic_cast< PointerType * > ( t1 ); 548 assert( ptrType ); 549 550 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) { 552 551 return function; 553 552 } else { -
src/Parser/DeclarationNode.cc
r208e5be r1ce2189 329 329 } // DeclarationNode::newTypeDecl 330 330 331 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers , OperKinds kind) {332 DeclarationNode * newnode = new DeclarationNode; 333 newnode->type = new TypeData( kind == OperKinds::PointTo ? TypeData::Pointer : TypeData::Reference);331 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers ) { 332 DeclarationNode * newnode = new DeclarationNode; 333 newnode->type = new TypeData( TypeData::Pointer ); 334 334 if ( qualifiers ) { 335 335 return newnode->addQualifiers( qualifiers ); … … 748 748 DeclarationNode * DeclarationNode::addPointer( DeclarationNode * p ) { 749 749 if ( p ) { 750 assert( p->type->kind == TypeData::Pointer || TypeData::Reference);750 assert( p->type->kind == TypeData::Pointer ); 751 751 setBase( p->type ); 752 752 p->type = nullptr; -
src/Parser/ParseNode.h
r208e5be r1ce2189 237 237 static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params ); 238 238 static DeclarationNode * newTypeDecl( std::string * name, DeclarationNode * typeParams ); 239 static DeclarationNode * newPointer( DeclarationNode * qualifiers , OperKinds kind);239 static DeclarationNode * newPointer( DeclarationNode * qualifiers ); 240 240 static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic ); 241 241 static DeclarationNode * newVarArray( DeclarationNode * qualifiers ); -
src/Parser/TypeData.cc
r208e5be r1ce2189 30 30 case Unknown: 31 31 case Pointer: 32 case Reference:33 32 case EnumConstant: 34 33 // nothing else to initialize … … 100 99 case Unknown: 101 100 case Pointer: 102 case Reference:103 101 case EnumConstant: 104 102 // nothing to destroy … … 167 165 case EnumConstant: 168 166 case Pointer: 169 case Reference:170 167 // nothing else to copy 171 168 break; … … 437 434 case TypeData::Array: 438 435 return buildArray( td ); 439 case TypeData::Reference:440 return buildReference( td );441 436 case TypeData::Function: 442 437 return buildFunction( td ); … … 617 612 buildForall( td->forall, at->get_forall() ); 618 613 return at; 619 } // buildArray 620 621 ReferenceType * buildReference( const TypeData * td ) { 622 ReferenceType * rt; 623 if ( td->base ) { 624 rt = new ReferenceType( buildQualifiers( td ), typebuild( td->base ) ); 625 } else { 626 rt = new ReferenceType( buildQualifiers( td ), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 627 } // if 628 buildForall( td->forall, rt->get_forall() ); 629 return rt; 630 } // buildReference 614 } // buildPointer 631 615 632 616 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { -
src/Parser/TypeData.h
r208e5be r1ce2189 21 21 22 22 struct TypeData { 23 enum Kind { Basic, Pointer, Array, Reference,Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,23 enum Kind { Basic, Pointer, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic, 24 24 SymbolicInst, Tuple, Typeof, Builtin, Unknown }; 25 25 … … 101 101 PointerType * buildPointer( const TypeData * ); 102 102 ArrayType * buildArray( const TypeData * ); 103 ReferenceType * buildReference( const TypeData * );104 103 AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > ); 105 104 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ); -
src/Parser/parser.yy
r208e5be r1ce2189 2387 2387 variable_ptr: 2388 2388 ptrref_operator variable_declarator 2389 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2389 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2390 2390 | ptrref_operator type_qualifier_list variable_declarator 2391 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2391 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2392 2392 | '(' variable_ptr ')' attribute_list_opt 2393 2393 { $$ = $2->addQualifiers( $4 ); } // redundant parenthesis … … 2435 2435 function_ptr: 2436 2436 ptrref_operator function_declarator 2437 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2437 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2438 2438 | ptrref_operator type_qualifier_list function_declarator 2439 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2439 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2440 2440 | '(' function_ptr ')' 2441 2441 { $$ = $2; } … … 2475 2475 KR_function_ptr: 2476 2476 ptrref_operator KR_function_declarator 2477 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2477 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2478 2478 | ptrref_operator type_qualifier_list KR_function_declarator 2479 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2479 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2480 2480 | '(' KR_function_ptr ')' 2481 2481 { $$ = $2; } … … 2519 2519 type_ptr: 2520 2520 ptrref_operator variable_type_redeclarator 2521 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2521 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2522 2522 | ptrref_operator type_qualifier_list variable_type_redeclarator 2523 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2523 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2524 2524 | '(' type_ptr ')' attribute_list_opt 2525 2525 { $$ = $2->addQualifiers( $4 ); } … … 2563 2563 identifier_parameter_ptr: 2564 2564 ptrref_operator identifier_parameter_declarator 2565 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2565 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2566 2566 | ptrref_operator type_qualifier_list identifier_parameter_declarator 2567 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2567 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2568 2568 | '(' identifier_parameter_ptr ')' attribute_list_opt 2569 2569 { $$ = $2->addQualifiers( $4 ); } … … 2623 2623 type_parameter_ptr: 2624 2624 ptrref_operator type_parameter_redeclarator 2625 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2625 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2626 2626 | ptrref_operator type_qualifier_list type_parameter_redeclarator 2627 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2627 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2628 2628 | '(' type_parameter_ptr ')' attribute_list_opt 2629 2629 { $$ = $2->addQualifiers( $4 ); } … … 2666 2666 abstract_ptr: 2667 2667 ptrref_operator 2668 { $$ = DeclarationNode::newPointer( 0 , $1); }2668 { $$ = DeclarationNode::newPointer( 0 ); } 2669 2669 | ptrref_operator type_qualifier_list 2670 { $$ = DeclarationNode::newPointer( $2 , $1); }2670 { $$ = DeclarationNode::newPointer( $2 ); } 2671 2671 | ptrref_operator abstract_declarator 2672 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2672 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2673 2673 | ptrref_operator type_qualifier_list abstract_declarator 2674 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2674 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2675 2675 | '(' abstract_ptr ')' attribute_list_opt 2676 2676 { $$ = $2->addQualifiers( $4 ); } … … 2755 2755 abstract_parameter_ptr: 2756 2756 ptrref_operator 2757 { $$ = DeclarationNode::newPointer( nullptr , $1); }2757 { $$ = DeclarationNode::newPointer( nullptr ); } 2758 2758 | ptrref_operator type_qualifier_list 2759 { $$ = DeclarationNode::newPointer( $2 , $1); }2759 { $$ = DeclarationNode::newPointer( $2 ); } 2760 2760 | ptrref_operator abstract_parameter_declarator 2761 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr , $1) ); }2761 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); } 2762 2762 | ptrref_operator type_qualifier_list abstract_parameter_declarator 2763 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2763 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2764 2764 | '(' abstract_parameter_ptr ')' attribute_list_opt 2765 2765 { $$ = $2->addQualifiers( $4 ); } … … 2834 2834 variable_abstract_ptr: 2835 2835 ptrref_operator 2836 { $$ = DeclarationNode::newPointer( 0 , $1); }2836 { $$ = DeclarationNode::newPointer( 0 ); } 2837 2837 | ptrref_operator type_qualifier_list 2838 { $$ = DeclarationNode::newPointer( $2 , $1); }2838 { $$ = DeclarationNode::newPointer( $2 ); } 2839 2839 | ptrref_operator variable_abstract_declarator 2840 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 , $1) ); }2840 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); } 2841 2841 | ptrref_operator type_qualifier_list variable_abstract_declarator 2842 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 , $1) ); }2842 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); } 2843 2843 | '(' variable_abstract_ptr ')' attribute_list_opt 2844 2844 { $$ = $2->addQualifiers( $4 ); } … … 2880 2880 // No SUE declaration in parameter list. 2881 2881 ptrref_operator type_specifier_nobody 2882 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 , $1) ); }2882 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 2883 2883 | type_qualifier_list ptrref_operator type_specifier_nobody 2884 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 , $2) ); }2884 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); } 2885 2885 | ptrref_operator cfa_abstract_function 2886 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 , $1) ); }2886 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 2887 2887 | type_qualifier_list ptrref_operator cfa_abstract_function 2888 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 , $2) ); }2888 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); } 2889 2889 | ptrref_operator cfa_identifier_parameter_declarator_tuple 2890 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 , $1) ); }2890 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 2891 2891 | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple 2892 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 , $2) ); }2892 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); } 2893 2893 ; 2894 2894 … … 2968 2968 cfa_abstract_ptr: // CFA 2969 2969 ptrref_operator type_specifier 2970 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 , $1) ); }2970 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 2971 2971 | type_qualifier_list ptrref_operator type_specifier 2972 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 , $2) ); }2972 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); } 2973 2973 | ptrref_operator cfa_abstract_function 2974 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 , $1) ); }2974 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 2975 2975 | type_qualifier_list ptrref_operator cfa_abstract_function 2976 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 , $2) ); }2976 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); } 2977 2977 | ptrref_operator cfa_abstract_declarator_tuple 2978 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 , $1) ); }2978 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 2979 2979 | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple 2980 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 , $2) ); }2980 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); } 2981 2981 ; 2982 2982 -
src/ResolvExpr/CurrentObject.cc
r208e5be r1ce2189 19 19 #include "CurrentObject.h" 20 20 21 #include "Common/Indenter.h"22 23 21 #include "SynTree/Declaration.h" 24 22 #include "SynTree/Initializer.h" … … 47 45 assertf( false, "unhandled type on getConstValue %s", toString( constExpr->get_result() ).c_str() ); // xxx - might be semantic error 48 46 } 47 } 48 49 struct Indenter { 50 static const int amt = 2; 51 unsigned int indent = 0; 52 53 Indenter & operator+=(int nlevels) { indent += amt*nlevels; return *this; } 54 Indenter & operator-=(int nlevels) { indent -= amt*nlevels; return *this; } 55 Indenter operator+(int nlevels) { Indenter indenter = *this; return indenter += nlevels; } 56 Indenter operator-(int nlevels) { Indenter indenter = *this; return indenter -= nlevels; } 57 Indenter & operator++() { return *this += 1; } 58 Indenter & operator--() { return *this -= 1; } 59 }; 60 std::ostream & operator<<( std::ostream & out, Indenter & indent ) { 61 return out << std::string(indent.indent, ' '); 49 62 } 50 63 -
src/ResolvExpr/CurrentObject.h
r208e5be r1ce2189 25 25 class MemberIterator; 26 26 27 // TODO: memory management of MemberIterators28 27 class CurrentObject { 29 28 public: -
src/ResolvExpr/Unify.cc
r208e5be r1ce2189 42 42 virtual void visit(PointerType *pointerType); 43 43 virtual void visit(ArrayType *arrayType); 44 virtual void visit(ReferenceType *refType);45 44 virtual void visit(FunctionType *functionType); 46 45 virtual void visit(StructInstType *aggregateUseType); … … 429 428 } 430 429 431 void Unify::visit(ReferenceType *refType) {432 if ( ReferenceType *otherRef = dynamic_cast< ReferenceType* >( type2 ) ) {433 result = unifyExact( refType->get_base(), otherRef->get_base(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );434 markAssertions( haveAssertions, needAssertions, refType );435 markAssertions( haveAssertions, needAssertions, otherRef );436 } // if437 }438 439 430 void Unify::visit(ArrayType *arrayType) { 440 431 ArrayType *otherArray = dynamic_cast< ArrayType* >( type2 ); -
src/SymTab/Autogen.cc
r208e5be r1ce2189 176 176 FunctionType * ftype = funcDecl->get_functionType(); 177 177 assert( ! ftype->get_parameters().empty() ); 178 Type * t = InitTweak::getPointerBase( ftype->get_parameters().front()->get_type() ); 179 assert( t ); 178 Type * t = safe_dynamic_cast< PointerType * >( ftype->get_parameters().front()->get_type() )->get_base(); 180 179 map.insert( Mangler::mangleType( t ), true ); 181 180 } -
src/SymTab/Indexer.cc
r208e5be r1ce2189 158 158 assert( ! params.empty() ); 159 159 // use base type of pointer, so that qualifiers on the pointer type aren't considered. 160 Type * base = InitTweak::getPointerBase( params.front()->get_type() ); 161 assert( base ); 160 Type * base = safe_dynamic_cast< PointerType * >( params.front()->get_type() )->get_base(); 162 161 funcMap[ Mangler::mangle( base ) ] += function; 163 162 } else { -
src/SymTab/Validate.cc
r208e5be r1ce2189 824 824 } 825 825 PointerType * ptrType = dynamic_cast< PointerType * >( params.front()->get_type() ); 826 ReferenceType * refType = dynamic_cast< ReferenceType * >( params.front()->get_type() ); 827 if ( ( ! ptrType && ! refType ) || ( ptrType && ptrType->is_array() ) ) { 826 if ( ! ptrType || ptrType->is_array() ) { 828 827 throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a pointer ", funcDecl ); 829 828 } -
src/SynTree/AddressExpr.cc
r208e5be r1ce2189 20 20 AddressExpr::AddressExpr( Expression *arg, Expression *_aname ) : Expression( _aname ), arg( arg ) { 21 21 if ( arg->has_result() ) { 22 if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( arg->get_result() ) ) { 23 // xxx - very temporary, make &ref look like ** 24 set_result( new PointerType( Type::Qualifiers( Type::Lvalue ), refType->get_base()->clone() ) ); 25 } else { 26 set_result( new PointerType( Type::Qualifiers(), arg->get_result()->clone() ) ); 27 } 22 set_result( new PointerType( Type::Qualifiers(), arg->get_result()->clone() ) ); 28 23 } 29 24 } -
src/SynTree/Mutator.cc
r208e5be r1ce2189 473 473 } 474 474 475 Type *Mutator::mutate( ReferenceType *refType ) {476 mutateAll( refType->get_forall(), *this );477 refType->set_base( maybeMutate( refType->get_base(), *this ) );478 return refType;479 }480 481 475 Type *Mutator::mutate( FunctionType *functionType ) { 482 476 mutateAll( functionType->get_forall(), *this ); -
src/SynTree/Mutator.h
r208e5be r1ce2189 92 92 virtual Type* mutate( PointerType *pointerType ); 93 93 virtual Type* mutate( ArrayType *arrayType ); 94 virtual Type* mutate( ReferenceType *refType );95 94 virtual Type* mutate( FunctionType *functionType ); 96 95 virtual Type* mutate( StructInstType *aggregateUseType ); -
src/SynTree/SynTree.h
r208e5be r1ce2189 101 101 class PointerType; 102 102 class ArrayType; 103 class ReferenceType;104 103 class FunctionType; 105 104 class ReferenceToType; -
src/SynTree/Type.h
r208e5be r1ce2189 249 249 bool is_array() const { return isStatic || isVarLen || dimension; } 250 250 251 virtual bool isComplete() const { return ! isVarLen; }252 253 251 virtual PointerType *clone() const { return new PointerType( *this ); } 254 252 virtual void accept( Visitor & v ) { v.visit( this ); } … … 292 290 }; 293 291 294 class ReferenceType : public Type {295 public:296 ReferenceType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );297 ReferenceType( const ReferenceType & );298 virtual ~ReferenceType();299 300 Type *get_base() { return base; }301 void set_base( Type *newValue ) { base = newValue; }302 303 virtual ReferenceType *clone() const { return new ReferenceType( *this ); }304 virtual void accept( Visitor & v ) { v.visit( this ); }305 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }306 virtual void print( std::ostream & os, int indent = 0 ) const;307 private:308 Type *base;309 };310 311 292 class FunctionType : public Type { 312 293 public: -
src/SynTree/Visitor.cc
r208e5be r1ce2189 363 363 void Visitor::visit( PointerType *pointerType ) { 364 364 acceptAll( pointerType->get_forall(), *this ); 365 // xxx - should PointerType visit/mutate dimension?366 365 maybeAccept( pointerType->get_base(), *this ); 367 366 } … … 371 370 maybeAccept( arrayType->get_dimension(), *this ); 372 371 maybeAccept( arrayType->get_base(), *this ); 373 }374 375 void Visitor::visit( ReferenceType *refType ) {376 acceptAll( refType->get_forall(), *this );377 maybeAccept( refType->get_base(), *this );378 372 } 379 373 -
src/SynTree/Visitor.h
r208e5be r1ce2189 95 95 virtual void visit( PointerType *pointerType ); 96 96 virtual void visit( ArrayType *arrayType ); 97 virtual void visit( ReferenceType *refType );98 97 virtual void visit( FunctionType *functionType ); 99 98 virtual void visit( StructInstType *aggregateUseType ); -
src/SynTree/module.mk
r208e5be r1ce2189 20 20 SynTree/PointerType.cc \ 21 21 SynTree/ArrayType.cc \ 22 SynTree/ReferenceType.cc \23 22 SynTree/FunctionType.cc \ 24 23 SynTree/ReferenceToType.cc \
Note:
See TracChangeset
for help on using the changeset viewer.