Changes in / [1ce2189:208e5be]
- Location:
- src
- Files:
-
- 2 added
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r1ce2189 r208e5be 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 76 68 CodeGenerator::LabelPrinter & CodeGenerator::LabelPrinter::operator()( std::list< Label > & l ) { 77 69 labels = &l; … … 111 103 } 112 104 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 ) {}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 ) {} 114 106 115 107 string CodeGenerator::mangleName( DeclarationWithType * decl ) { … … 202 194 output << " {" << endl; 203 195 204 cur_indent += CodeGenerator::tabsize;196 ++indent; 205 197 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++ ) { 206 198 output << lineDirective( *i ) << indent; … … 209 201 } // for 210 202 211 cur_indent -= CodeGenerator::tabsize;203 --indent; 212 204 213 205 output << indent << "}"; … … 239 231 output << " {" << endl; 240 232 241 cur_indent += CodeGenerator::tabsize;233 ++indent; 242 234 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 243 235 ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i ); … … 251 243 } // for 252 244 253 cur_indent -= CodeGenerator::tabsize;245 --indent; 254 246 255 247 output << indent << "}"; … … 755 747 std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids(); 756 748 output << lineDirective( stmtExpr) << "({" << std::endl; 757 cur_indent += CodeGenerator::tabsize;749 ++indent; 758 750 unsigned int numStmts = stmts.size(); 759 751 unsigned int i = 0; … … 778 770 ++i; 779 771 } 780 cur_indent -= CodeGenerator::tabsize;772 --indent; 781 773 output << indent << "})"; 782 774 } … … 787 779 output << "{" << endl; 788 780 789 cur_indent += CodeGenerator::tabsize;781 ++indent; 790 782 791 783 for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end(); i++ ) { … … 798 790 } // if 799 791 } // for 800 cur_indent -= CodeGenerator::tabsize;792 --indent; 801 793 802 794 output << indent << "}"; … … 866 858 867 859 output << "{" << std::endl; 868 cur_indent += CodeGenerator::tabsize;860 ++indent; 869 861 acceptAll( switchStmt->get_statements(), *this ); 870 cur_indent -= CodeGenerator::tabsize;862 --indent; 871 863 output << indent << "}"; 872 864 } … … 885 877 std::list<Statement *> sts = caseStmt->get_statements(); 886 878 887 cur_indent += CodeGenerator::tabsize;879 ++indent; 888 880 for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end(); i++) { 889 881 output << indent << printLabels( (*i)->get_labels() ) ; … … 891 883 output << endl; 892 884 } // for 893 cur_indent -= CodeGenerator::tabsize;885 --indent; 894 886 } 895 887 -
src/CodeGen/CodeGenerator.h
r1ce2189 r208e5be 25 25 #include "SymTab/Indexer.h" 26 26 27 #include "Common/Indenter.h" 27 28 #include "Common/utility.h" 28 29 … … 102 103 template< class Iterator > void genCommaList( Iterator begin, Iterator end ); 103 104 104 struct Indenter {105 Indenter(CodeGenerator &cg) : cg(cg) {}106 CodeGenerator & cg;107 std::ostream& operator()(std::ostream & os) const;108 };109 110 105 struct LabelPrinter { 111 106 LabelPrinter(CodeGenerator &cg) : cg(cg), labels( 0 ) {} … … 130 125 private: 131 126 Indenter indent; 132 int cur_indent;133 127 bool insideFunction; 134 128 std::ostream &output; -
src/CodeGen/GenType.cc
r1ce2189 r208e5be 37 37 virtual void visit( PointerType *pointerType ); 38 38 virtual void visit( ArrayType *arrayType ); 39 virtual void visit( ReferenceType *refType ); 39 40 virtual void visit( StructInstType *structInst ); 40 41 virtual void visit( UnionInstType *unionInst ); … … 147 148 } 148 149 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 149 158 void GenType::visit( FunctionType *funcType ) { 150 159 std::ostringstream os; -
src/Concurrency/Keywords.cc
r1ce2189 r208e5be 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 ptr = dynamic_cast< PointerType * >( param->get_type() ); 517 // if( ptr ) std::cerr << "FRED1" << std::endl; 518 auto type = dynamic_cast< StructInstType * >( ptr->get_base() ); 516 auto type = dynamic_cast< StructInstType * >( InitTweak::getPointerBase( param->get_type() ) ); 519 517 // if( type ) std::cerr << "FRED2" << std::endl; 520 518 if( type && type->get_baseStruct()->is_thread() ) { … … 528 526 if( ! stmt ) return; 529 527 530 stmt->push_back( 528 stmt->push_back( 531 529 new ExprStmt( 532 530 noLabels, -
src/GenPoly/Lvalue.cc
r1ce2189 r208e5be 32 32 #include "Common/UniqueName.h" 33 33 #include "Common/utility.h" 34 #include "InitTweak/InitTweak.h" 34 35 35 36 namespace GenPoly { … … 38 39 class Pass1 : public Mutator { 39 40 public: 41 typedef Mutator Parent; 40 42 Pass1(); 41 43 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 ); 42 47 virtual Expression *mutate( ApplicationExpr *appExpr ); 43 48 virtual Statement *mutate( ReturnStmt *appExpr ); … … 103 108 } // if 104 109 return funcDecl; 110 } 111 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 ); 105 125 } 106 126 … … 163 183 } 164 184 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 165 195 Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) { 166 196 addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) ); … … 176 206 delete addrExpr; 177 207 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 else 210 Expression *& arg = InitTweak::getCallArg( addrExpr->get_arg(), 0 ); 211 Expression * inner = arg; 212 arg = nullptr; 213 delete addrExpr; 214 return inner; 178 215 } 179 216 return addrExpr; -
src/InitTweak/FixInit.cc
r1ce2189 r208e5be 401 401 402 402 bool ResolveCopyCtors::skipCopyConstruct( Type * type ) { 403 return dynamic_cast< VarArgsType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type );403 return dynamic_cast< VarArgsType * >( type ) || dynamic_cast< ReferenceType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type ); 404 404 } 405 405 -
src/InitTweak/GenInit.cc
r1ce2189 r208e5be 239 239 std::list< DeclarationWithType * > & params = GenPoly::getFunctionType( dwt->get_type() )->get_parameters(); 240 240 assert( ! params.empty() ); 241 PointerType * type = safe_dynamic_cast< PointerType * >( params.front()->get_type() ); 242 managedTypes.insert( SymTab::Mangler::mangle( type->get_base() ) ); 241 Type * type = InitTweak::getPointerBase( params.front()->get_type() ); 242 assert( type ); 243 managedTypes.insert( SymTab::Mangler::mangle( type ) ); 243 244 } 244 245 } -
src/InitTweak/InitTweak.cc
r1ce2189 r208e5be 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(); 460 462 } else { 461 463 return NULL; … … 543 545 if ( ftype->get_parameters().size() != 2 ) return 0; 544 546 545 Type * t1 = ftype->get_parameters().front()->get_type();547 Type * t1 = getPointerBase( ftype->get_parameters().front()->get_type() ); 546 548 Type * t2 = ftype->get_parameters().back()->get_type(); 547 PointerType * ptrType = dynamic_cast< PointerType * > ( t1 ); 548 assert( ptrType ); 549 550 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) { 549 assert( t1 ); 550 551 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( t1, t2, SymTab::Indexer() ) ) { 551 552 return function; 552 553 } else { -
src/Parser/DeclarationNode.cc
r1ce2189 r208e5be 329 329 } // DeclarationNode::newTypeDecl 330 330 331 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers ) {332 DeclarationNode * newnode = new DeclarationNode; 333 newnode->type = new TypeData( TypeData::Pointer);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 ); 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 );750 assert( p->type->kind == TypeData::Pointer || TypeData::Reference ); 751 751 setBase( p->type ); 752 752 p->type = nullptr; -
src/Parser/ParseNode.h
r1ce2189 r208e5be 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 );239 static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind ); 240 240 static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic ); 241 241 static DeclarationNode * newVarArray( DeclarationNode * qualifiers ); -
src/Parser/TypeData.cc
r1ce2189 r208e5be 30 30 case Unknown: 31 31 case Pointer: 32 case Reference: 32 33 case EnumConstant: 33 34 // nothing else to initialize … … 99 100 case Unknown: 100 101 case Pointer: 102 case Reference: 101 103 case EnumConstant: 102 104 // nothing to destroy … … 165 167 case EnumConstant: 166 168 case Pointer: 169 case Reference: 167 170 // nothing else to copy 168 171 break; … … 434 437 case TypeData::Array: 435 438 return buildArray( td ); 439 case TypeData::Reference: 440 return buildReference( td ); 436 441 case TypeData::Function: 437 442 return buildFunction( td ); … … 612 617 buildForall( td->forall, at->get_forall() ); 613 618 return at; 614 } // buildPointer 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 615 631 616 632 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { -
src/Parser/TypeData.h
r1ce2189 r208e5be 21 21 22 22 struct TypeData { 23 enum Kind { Basic, Pointer, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,23 enum Kind { Basic, Pointer, Array, Reference, 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 * ); 103 104 AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > ); 104 105 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ); -
src/Parser/parser.yy
r1ce2189 r208e5be 2387 2387 variable_ptr: 2388 2388 ptrref_operator variable_declarator 2389 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2389 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2390 2390 | ptrref_operator type_qualifier_list variable_declarator 2391 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2391 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ) ); }2437 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2438 2438 | ptrref_operator type_qualifier_list function_declarator 2439 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2439 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ) ); }2477 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2478 2478 | ptrref_operator type_qualifier_list KR_function_declarator 2479 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2479 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ) ); }2521 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2522 2522 | ptrref_operator type_qualifier_list variable_type_redeclarator 2523 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2523 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ) ); }2565 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2566 2566 | ptrref_operator type_qualifier_list identifier_parameter_declarator 2567 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2567 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ) ); }2625 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2626 2626 | ptrref_operator type_qualifier_list type_parameter_redeclarator 2627 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2627 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ); }2668 { $$ = DeclarationNode::newPointer( 0, $1 ); } 2669 2669 | ptrref_operator type_qualifier_list 2670 { $$ = DeclarationNode::newPointer( $2 ); }2670 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2671 2671 | ptrref_operator abstract_declarator 2672 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2672 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2673 2673 | ptrref_operator type_qualifier_list abstract_declarator 2674 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2674 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ); }2757 { $$ = DeclarationNode::newPointer( nullptr, $1 ); } 2758 2758 | ptrref_operator type_qualifier_list 2759 { $$ = DeclarationNode::newPointer( $2 ); }2759 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2760 2760 | ptrref_operator abstract_parameter_declarator 2761 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }2761 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); } 2762 2762 | ptrref_operator type_qualifier_list abstract_parameter_declarator 2763 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2763 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ); }2836 { $$ = DeclarationNode::newPointer( 0, $1 ); } 2837 2837 | ptrref_operator type_qualifier_list 2838 { $$ = DeclarationNode::newPointer( $2 ); }2838 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2839 2839 | ptrref_operator variable_abstract_declarator 2840 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2840 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2841 2841 | ptrref_operator type_qualifier_list variable_abstract_declarator 2842 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2842 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 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 ) ); }2882 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2883 2883 | type_qualifier_list ptrref_operator type_specifier_nobody 2884 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2884 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2885 2885 | ptrref_operator cfa_abstract_function 2886 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2886 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2887 2887 | type_qualifier_list ptrref_operator cfa_abstract_function 2888 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2888 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2889 2889 | ptrref_operator cfa_identifier_parameter_declarator_tuple 2890 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2890 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2891 2891 | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple 2892 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2892 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2893 2893 ; 2894 2894 … … 2968 2968 cfa_abstract_ptr: // CFA 2969 2969 ptrref_operator type_specifier 2970 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2970 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2971 2971 | type_qualifier_list ptrref_operator type_specifier 2972 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2972 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2973 2973 | ptrref_operator cfa_abstract_function 2974 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2974 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2975 2975 | type_qualifier_list ptrref_operator cfa_abstract_function 2976 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2976 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2977 2977 | ptrref_operator cfa_abstract_declarator_tuple 2978 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2978 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2979 2979 | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple 2980 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2980 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2981 2981 ; 2982 2982 -
src/ResolvExpr/CurrentObject.cc
r1ce2189 r208e5be 19 19 #include "CurrentObject.h" 20 20 21 #include "Common/Indenter.h" 22 21 23 #include "SynTree/Declaration.h" 22 24 #include "SynTree/Initializer.h" … … 45 47 assertf( false, "unhandled type on getConstValue %s", toString( constExpr->get_result() ).c_str() ); // xxx - might be semantic error 46 48 } 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, ' ');62 49 } 63 50 -
src/ResolvExpr/CurrentObject.h
r1ce2189 r208e5be 25 25 class MemberIterator; 26 26 27 // TODO: memory management of MemberIterators 27 28 class CurrentObject { 28 29 public: -
src/ResolvExpr/Unify.cc
r1ce2189 r208e5be 42 42 virtual void visit(PointerType *pointerType); 43 43 virtual void visit(ArrayType *arrayType); 44 virtual void visit(ReferenceType *refType); 44 45 virtual void visit(FunctionType *functionType); 45 46 virtual void visit(StructInstType *aggregateUseType); … … 428 429 } 429 430 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 } // if 437 } 438 430 439 void Unify::visit(ArrayType *arrayType) { 431 440 ArrayType *otherArray = dynamic_cast< ArrayType* >( type2 ); -
src/SymTab/Autogen.cc
r1ce2189 r208e5be 176 176 FunctionType * ftype = funcDecl->get_functionType(); 177 177 assert( ! ftype->get_parameters().empty() ); 178 Type * t = safe_dynamic_cast< PointerType * >( ftype->get_parameters().front()->get_type() )->get_base(); 178 Type * t = InitTweak::getPointerBase( ftype->get_parameters().front()->get_type() ); 179 assert( t ); 179 180 map.insert( Mangler::mangleType( t ), true ); 180 181 } -
src/SymTab/Indexer.cc
r1ce2189 r208e5be 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 = safe_dynamic_cast< PointerType * >( params.front()->get_type() )->get_base(); 160 Type * base = InitTweak::getPointerBase( params.front()->get_type() ); 161 assert( base ); 161 162 funcMap[ Mangler::mangle( base ) ] += function; 162 163 } else { -
src/SymTab/Validate.cc
r1ce2189 r208e5be 824 824 } 825 825 PointerType * ptrType = dynamic_cast< PointerType * >( params.front()->get_type() ); 826 if ( ! ptrType || ptrType->is_array() ) { 826 ReferenceType * refType = dynamic_cast< ReferenceType * >( params.front()->get_type() ); 827 if ( ( ! ptrType && ! refType ) || ( ptrType && ptrType->is_array() ) ) { 827 828 throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a pointer ", funcDecl ); 828 829 } -
src/SynTree/AddressExpr.cc
r1ce2189 r208e5be 20 20 AddressExpr::AddressExpr( Expression *arg, Expression *_aname ) : Expression( _aname ), arg( arg ) { 21 21 if ( arg->has_result() ) { 22 set_result( new PointerType( Type::Qualifiers(), arg->get_result()->clone() ) ); 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 } 23 28 } 24 29 } -
src/SynTree/Mutator.cc
r1ce2189 r208e5be 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 475 481 Type *Mutator::mutate( FunctionType *functionType ) { 476 482 mutateAll( functionType->get_forall(), *this ); -
src/SynTree/Mutator.h
r1ce2189 r208e5be 92 92 virtual Type* mutate( PointerType *pointerType ); 93 93 virtual Type* mutate( ArrayType *arrayType ); 94 virtual Type* mutate( ReferenceType *refType ); 94 95 virtual Type* mutate( FunctionType *functionType ); 95 96 virtual Type* mutate( StructInstType *aggregateUseType ); -
src/SynTree/SynTree.h
r1ce2189 r208e5be 101 101 class PointerType; 102 102 class ArrayType; 103 class ReferenceType; 103 104 class FunctionType; 104 105 class ReferenceToType; -
src/SynTree/Type.h
r1ce2189 r208e5be 249 249 bool is_array() const { return isStatic || isVarLen || dimension; } 250 250 251 virtual bool isComplete() const { return ! isVarLen; } 252 251 253 virtual PointerType *clone() const { return new PointerType( *this ); } 252 254 virtual void accept( Visitor & v ) { v.visit( this ); } … … 290 292 }; 291 293 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 292 311 class FunctionType : public Type { 293 312 public: -
src/SynTree/Visitor.cc
r1ce2189 r208e5be 363 363 void Visitor::visit( PointerType *pointerType ) { 364 364 acceptAll( pointerType->get_forall(), *this ); 365 // xxx - should PointerType visit/mutate dimension? 365 366 maybeAccept( pointerType->get_base(), *this ); 366 367 } … … 370 371 maybeAccept( arrayType->get_dimension(), *this ); 371 372 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 ); 372 378 } 373 379 -
src/SynTree/Visitor.h
r1ce2189 r208e5be 95 95 virtual void visit( PointerType *pointerType ); 96 96 virtual void visit( ArrayType *arrayType ); 97 virtual void visit( ReferenceType *refType ); 97 98 virtual void visit( FunctionType *functionType ); 98 99 virtual void visit( StructInstType *aggregateUseType ); -
src/SynTree/module.mk
r1ce2189 r208e5be 20 20 SynTree/PointerType.cc \ 21 21 SynTree/ArrayType.cc \ 22 SynTree/ReferenceType.cc \ 22 23 SynTree/FunctionType.cc \ 23 24 SynTree/ReferenceToType.cc \
Note:
See TracChangeset
for help on using the changeset viewer.