Changeset 7e23d0a
- Timestamp:
- Nov 25, 2015, 2:53:26 PM (7 years ago)
- Branches:
- aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 32d281d, 704c9dd
- Parents:
- 02ec390 (diff), 5189888 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 28 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T ue Aug 11 16:22:35201513 // Update Count : 8911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 19 17:40:51 2015 13 // Update Count : 133 14 14 // 15 15 … … 47 47 namespace { 48 48 const std::list<Label> noLabels; 49 50 FunctionType *makeAdapterType( FunctionType *adaptee, const TyVarMap &tyVars ); 49 51 50 52 class Pass1 : public PolyMutator { … … 78 80 ObjectDecl *makeTemporary( Type *type ); 79 81 80 typedef std::map< std::string, FunctionDecl*> AdapterMap;82 typedef std::map< std::string, DeclarationWithType *> AdapterMap; 81 83 std::map< std::string, DeclarationWithType *> assignOps; 82 84 std::stack< AdapterMap > adapters; … … 144 146 } 145 147 146 bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ) {147 bool doTransform = false;148 if ( ! function->get_returnVals().empty() ) {149 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( function->get_returnVals().front()->get_type() ) ) {150 151 // figure out if the return type is specified by a type parameter152 for ( std::list< TypeDecl *>::const_iterator tyVar = function->get_forall().begin(); tyVar != function->get_forall().end(); ++tyVar ) {153 if ( (*tyVar)->get_name() == typeInst->get_name() ) {154 doTransform = true;155 name = typeInst->get_name();156 break;157 } // if158 } // for159 if ( ! doTransform && otherTyVars.find( typeInst->get_name() ) != otherTyVars.end() ) {160 doTransform = true;161 } // if162 } // if163 } // if164 return doTransform;165 }166 167 bool isPolyRet( FunctionType *function, std::string &name ) {168 TyVarMap dummyTyVars;169 return isPolyRet( function, name, dummyTyVars );170 }171 172 bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ) {173 std::string dummyString;174 return isPolyRet( function, dummyString, otherTyVars );175 }176 177 148 Pass1::Pass1() 178 149 : useRetval( false ), tempNamer( "_temp" ) { 150 adapters.push(AdapterMap()); 179 151 } 180 152 … … 210 182 211 183 DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) { 212 if ( functionDecl->get_statements() ) { 184 if ( functionDecl->get_statements() ) { // empty routine body ? 185 doBeginScope(); 213 186 TyVarMap oldtyVars = scopeTyVars; 214 187 DeclarationWithType *oldRetval = retval; 215 188 bool oldUseRetval = useRetval; 216 189 190 // process polymorphic return value 217 191 retval = 0; 218 192 std::string typeName; … … 227 201 } // if 228 202 229 scopeTyVars.clear(); 230 /// std::cerr << "clear\n"; 203 FunctionType *functionType = functionDecl->get_functionType(); 231 204 makeTyVarMap( functionDecl->get_functionType(), scopeTyVars ); 232 205 findAssignOps( functionDecl->get_functionType()->get_forall() ); 206 207 std::list< DeclarationWithType *> ¶mList = functionType->get_parameters(); 208 std::list< FunctionType *> functions; 209 for ( std::list< TypeDecl *>::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) { 210 for ( std::list< DeclarationWithType *>::iterator assert = (*tyVar)->get_assertions().begin(); assert != (*tyVar)->get_assertions().end(); ++assert ) { 211 findFunction( (*assert)->get_type(), functions, scopeTyVars, needsAdapter ); 212 } // for 213 } // for 214 for ( std::list< DeclarationWithType *>::iterator arg = paramList.begin(); arg != paramList.end(); ++arg ) { 215 findFunction( (*arg)->get_type(), functions, scopeTyVars, needsAdapter ); 216 } // for 217 AdapterMap & adapters = Pass1::adapters.top(); 218 for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) { 219 std::string mangleName = SymTab::Mangler::mangle( *funType ); 220 if ( isPolyRet( *funType, scopeTyVars ) ) { 221 // if the return type involved polymorphic types, then the adapter will need to take those 222 // polymorphic types as pointers. Therefore, there can be two different functions with the same 223 // mangled name, so we need the mangled names to be different. 224 mangleName += "polyret_"; 225 } // if 226 if ( adapters.find( mangleName ) == adapters.end() ) { 227 std::string adapterName = makeAdapterName( mangleName ); 228 adapters.insert( std::pair< std::string, DeclarationWithType *>( mangleName, new ObjectDecl( adapterName, DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new PointerType( Type::Qualifiers(), makeAdapterType( *funType, scopeTyVars ) ), 0 ) ) ); 229 } // if 230 } // for 231 233 232 functionDecl->set_statements( functionDecl->get_statements()->acceptMutator( *this ) ); 234 233 235 234 scopeTyVars = oldtyVars; 236 ///std::cerr << "end FunctionDecl: ";237 ///for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) {238 ///std::cerr << i->first << " ";239 ///}240 ///std::cerr << "\n";235 // std::cerr << "end FunctionDecl: "; 236 // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) { 237 // std::cerr << i->first << " "; 238 // } 239 // std::cerr << "\n"; 241 240 retval = oldRetval; 242 241 useRetval = oldUseRetval; 243 //doEndScope();242 doEndScope(); 244 243 } // if 245 244 return functionDecl; … … 349 348 } // if 350 349 std::string mangleName = SymTab::Mangler::mangle( function ); 350 if ( isPolyRet( function, tyVars ) ) { 351 mangleName += "polyret_"; 352 } // if 351 353 std::string adapterName = makeAdapterName( mangleName ); 352 354 … … 457 459 /// return new CastExpr( new VariableExpr( param ), arg->get_type()->clone() ); 458 460 /// } else { 459 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 460 deref->get_args().push_back( new CastExpr( new VariableExpr( param ), new PointerType( Type::Qualifiers(), arg->get_type()->clone() ) ) ); 461 deref->get_results().push_back( arg->get_type()->clone() ); 462 return deref; 461 if ( dynamic_cast<TypeInstType *>(arg->get_type()) == NULL ) { 462 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 463 deref->get_args().push_back( new CastExpr( new VariableExpr( param ), new PointerType( Type::Qualifiers(), arg->get_type()->clone() ) ) ); 464 deref->get_results().push_back( arg->get_type()->clone() ); 465 return deref; 466 } // if 463 467 /// } 464 468 } // if … … 544 548 } // for 545 549 546 // parameter function types for which an appropriate adapter has been generated. 547 // we cannot use the types after applying substitutions, since two different 548 // parameter types may be unified to the same type 550 // parameter function types for which an appropriate adapter has been generated. we cannot use the types 551 // after applying substitutions, since two different parameter types may be unified to the same type 549 552 std::set< std::string > adaptersDone; 550 553 … … 554 557 std::string mangleName = SymTab::Mangler::mangle( realFunction ); 555 558 556 // only attempt to create an adapter or pass one as a parameter if we haven't 557 // already done so for thispre-substitution parameter function type.559 // only attempt to create an adapter or pass one as a parameter if we haven't already done so for this 560 // pre-substitution parameter function type. 558 561 if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) { 559 std::string mangleName = SymTab::Mangler::mangle( realFunction );560 562 adaptersDone.insert( adaptersDone.begin(), mangleName ); 561 563 562 // apply substitution to type variables to figure out what the 563 // adapter's type should look like 564 // apply substitution to type variables to figure out what the adapter's type should look like 564 565 assert( env ); 565 566 env->apply( realFunction ); 566 567 mangleName = SymTab::Mangler::mangle( realFunction ); 567 568 568 if ( needsAdapter( realFunction, exprTyVars, true ) ) { 569 // the function still contains type variables, which means we are in a polymorphic 570 // context and the adapter function is a parameter - call the parameter and don't 571 // create a new adapter. 572 appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) ); 573 } else { 574 if ( isPolyRet( originalFunction, exprTyVars ) ) { 575 // if the return type involved polymorphic types, then 576 // the adapter will need to take those polymorphic types 577 // as pointers. Therefore, there can be two different 578 // functions with the same mangled name, so we need two adapter map 579 // stacks and also we need the mangled names to be different. 580 mangleName += "polyret_"; 581 } 582 583 AdapterMap & adapters = Pass1::adapters.top(); 584 AdapterMap::iterator adapter = adapters.find( mangleName ); 585 if ( adapter == adapters.end() ) { 586 // adapter has not been created yet in the current scope, so define it 587 FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars ); 588 adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) ); 589 stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) ); 590 } // if 591 assert( adapter != adapters.end() ); 592 593 // add the appropriate adapter as a parameter 594 appExpr->get_args().push_front( new VariableExpr( adapter->second ) ); 595 } // if 569 if ( isPolyRet( originalFunction, exprTyVars ) ) { 570 mangleName += "polyret_"; 571 } // if 572 573 AdapterMap & adapters = Pass1::adapters.top(); 574 AdapterMap::iterator adapter = adapters.find( mangleName ); 575 if ( adapter == adapters.end() ) { 576 // adapter has not been created yet in the current scope, so define it 577 FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars ); 578 adapter = adapters.insert( adapters.begin(), std::pair< std::string, DeclarationWithType *>( mangleName, newAdapter ) ); 579 stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) ); 580 } // if 581 assert( adapter != adapters.end() ); 582 583 // add the appropriate adapter as a parameter 584 appExpr->get_args().push_front( new VariableExpr( adapter->second ) ); 596 585 } // if 597 586 } // for 598 } 587 } // passAdapters 599 588 600 589 TypeInstType *isPolyPtr( Type *type, const TypeSubstitution *env, const TyVarMap &tyVars ) { … … 769 758 770 759 Expression *Pass1::mutate( ApplicationExpr *appExpr ) { 771 ///std::cerr << "mutate appExpr: ";772 ///for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) {773 ///std::cerr << i->first << " ";774 ///}775 ///std::cerr << "\n";760 // std::cerr << "mutate appExpr: "; 761 // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) { 762 // std::cerr << i->first << " "; 763 // } 764 // std::cerr << "\n"; 776 765 bool oldUseRetval = useRetval; 777 766 useRetval = false; … … 799 788 ret = addPolyRetParam( appExpr, function, typeName, arg ); 800 789 } else if ( needsAdapter( function, scopeTyVars ) ) { 801 ///std::cerr << "needs adapter: ";802 ///for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) {803 ///std::cerr << i->first << " ";804 ///}805 ///std::cerr << "\n";790 // std::cerr << "needs adapter: "; 791 // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) { 792 // std::cerr << i->first << " "; 793 // } 794 // std::cerr << "\n"; 806 795 // change the application so it calls the adapter rather than the passed function 807 796 ret = applyAdapter( appExpr, function, arg, scopeTyVars ); … … 913 902 // actually, maybe this could (should?) push 914 903 // a copy of the current map 915 adapters.push( AdapterMap());904 adapters.push(adapters.top()); 916 905 } 917 906 … … 935 924 for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) { 936 925 std::string mangleName = SymTab::Mangler::mangle( *funType ); 926 if ( isPolyRet( *funType, scopeTyVars ) ) { 927 mangleName += "polyret_"; 928 } // if 937 929 if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) { 938 930 std::string adapterName = makeAdapterName( mangleName ); … … 1000 992 for ( std::list< TypeDecl *>::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) { 1001 993 ObjectDecl *thisParm; 994 // add all size parameters to parameter list 1002 995 if ( (*tyParm)->get_kind() == TypeDecl::Any ) { 1003 996 thisParm = newObj->clone(); … … 1006 999 ++last; 1007 1000 } 1001 // move all assertions into parameter list 1008 1002 for ( std::list< DeclarationWithType *>::iterator assert = (*tyParm)->get_assertions().begin(); assert != (*tyParm)->get_assertions().end(); ++assert ) { 1009 1003 /// *assert = (*assert)->acceptMutator( *this ); -
src/GenPoly/Box.h
r02ec390 r7e23d0a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue May 19 07:32:33201513 // Update Count : 212 // Last Modified On : Thu Nov 19 17:24:01 2015 13 // Update Count : 5 14 14 // 15 15 -
src/GenPoly/GenPoly.cc
r02ec390 r7e23d0a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue May 19 07:37:46201513 // Update Count : 1 12 // Last Modified On : Thu Nov 19 17:23:44 2015 13 // Update Count : 10 14 14 // 15 15 … … 21 21 22 22 namespace GenPoly { 23 // interface functions 24 bool isPolyVal( Type *type, const TyVarMap &tyVars ) { 25 return isPolyVal( type, tyVars, false ); 23 // A function needs an adapter if it returns a polymorphic value or if any of its 24 // parameters have polymorphic type 25 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 26 if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars ) ) { 27 return true; 28 } // if 29 for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) { 30 if ( isPolyVal( (*innerArg)->get_type(), tyVars ) ) { 31 return true; 32 } // if 33 } // for 34 return false; 26 35 } 27 36 28 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 29 return needsAdapter( adaptee, tyVars, false ); 37 bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ) { 38 bool doTransform = false; 39 if ( ! function->get_returnVals().empty() ) { 40 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( function->get_returnVals().front()->get_type() ) ) { 41 42 // figure out if the return type is specified by a type parameter 43 for ( std::list< TypeDecl *>::const_iterator tyVar = function->get_forall().begin(); tyVar != function->get_forall().end(); ++tyVar ) { 44 if ( (*tyVar)->get_name() == typeInst->get_name() ) { 45 doTransform = true; 46 name = typeInst->get_name(); 47 break; 48 } // if 49 } // for 50 if ( ! doTransform && otherTyVars.find( typeInst->get_name() ) != otherTyVars.end() ) { 51 doTransform = true; 52 } // if 53 } // if 54 } // if 55 return doTransform; 30 56 } 31 57 32 bool isPolyVal( Type *type, const TyVarMap &tyVars, bool considerAllTyVars ) { 33 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) { 58 bool isPolyRet( FunctionType *function, std::string &name ) { 59 TyVarMap dummyTyVars; 60 return isPolyRet( function, name, dummyTyVars ); 61 } 62 63 bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ) { 64 std::string dummyString; 65 return isPolyRet( function, dummyString, otherTyVars ); 66 } 67 68 bool isPolyVal( Type *type, const TyVarMap &tyVars ) { 69 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) { 34 70 if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) { 35 71 return true; 36 72 } // if 37 return considerAllTyVars;38 73 } // if 39 74 return false; 40 }41 42 // A function needs an adapter if it returns a polymorphic value or if any of its43 // parameters have polymorphic type44 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars, bool considerAllTyVars ) {45 bool needsAdapter = false;46 if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars, considerAllTyVars ) ) {47 needsAdapter = true;48 } // if49 for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); ! needsAdapter && innerArg != adaptee->get_parameters().end(); ++innerArg ) {50 if ( isPolyVal( (*innerArg)->get_type(), tyVars, considerAllTyVars ) ) {51 needsAdapter = true;52 } // if53 } // for54 return needsAdapter;55 75 } 56 76 -
src/GenPoly/GenPoly.h
r02ec390 r7e23d0a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue May 19 07:38:34201513 // Update Count : 112 // Last Modified On : Thu Nov 19 17:24:03 2015 13 // Update Count : 4 14 14 // 15 15 … … 25 25 typedef std::map< std::string, TypeDecl::Kind > TyVarMap; 26 26 27 // considerAllTyVars allows ignoring the contents of the TyVarMap parameter, for the situations where28 // it is important only that a TypeInstType node exists.29 30 27 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVarr ); 31 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars, bool considerAllTyVars ); 32 bool isPolyFun( FunctionType *fun, const TyVarMap &tyVars ); 28 bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ); 29 bool isPolyRet( FunctionType *function, std::string &name ); 30 bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ); 31 // bool isPolyFun( FunctionType *fun, const TyVarMap &tyVars ); 33 32 bool isPolyVal( Type *type, const TyVarMap &tyVars ); 34 bool isPolyVal( Type *type, const TyVarMap &tyVars, bool considerAllTyVars );35 33 void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ); 36 34 } // namespace GenPoly -
src/Parser/LinkageSpec.cc
r02ec390 r7e23d0a 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:22:09 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat May 16 13:23:21201513 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 19 15:53:05 2015 13 // Update Count : 5 14 14 // 15 15 … … 79 79 } 80 80 81 82 bool LinkageSpec::isOverridable( Type t ) { 83 switch ( t ) { 84 case Intrinsic: 85 case AutoGen: 86 return true; 87 case Cforall: 88 case C: 89 case Compiler: 90 return false; 91 } 92 assert( false ); 93 return false; 94 } 95 81 96 bool LinkageSpec::isBuiltin( Type t ) { 82 97 switch ( t ) { -
src/Parser/LinkageSpec.h
r02ec390 r7e23d0a 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:24:28 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat May 16 13:26:14201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Aug 18 14:11:55 2015 13 // Update Count : 5 14 14 // 15 15 … … 34 34 static bool isGeneratable( Type ); 35 35 static bool isOverloadable( Type ); 36 static bool isOverridable( Type ); 36 37 static bool isBuiltin( Type ); 37 38 }; -
src/ResolvExpr/CastCost.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 06:57:43 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 06:59:10201513 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Oct 05 14:48:45 2015 13 // Update Count : 5 14 14 // 15 15 … … 56 56 return Cost::infinity; 57 57 } else { 58 // xxx - why are we adding cost 0 here? 58 59 return converter.get_cost() + Cost( 0, 0, 0 ); 59 60 } // if … … 82 83 newEnv.add( pointerType->get_forall() ); 83 84 newEnv.add( pointerType->get_base()->get_forall() ); 84 int assignResult = ptrsCastable( pointerType->get_base(), destAsPtr->get_base(), newEnv, indexer );85 if ( assignResult > 0 ) {85 int castResult = ptrsCastable( pointerType->get_base(), destAsPtr->get_base(), newEnv, indexer ); 86 if ( castResult > 0 ) { 86 87 cost = Cost( 0, 0, 1 ); 87 } else if ( assignResult < 0 ) {88 } else if ( castResult < 0 ) { 88 89 cost = Cost( 1, 0, 0 ); 89 90 } // if -
src/ResolvExpr/PtrsAssignable.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 11:44:11 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 11:47:36201513 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Sep 21 14:34:58 2015 13 // Update Count : 7 14 14 // 15 15 … … 106 106 void PtrsAssignable::visit( TypeInstType *inst ) { 107 107 EqvClass eqvClass; 108 if ( env.lookup( inst->get_name(), eqvClass ) ) {108 if ( env.lookup( inst->get_name(), eqvClass ) && eqvClass.type ) { 109 109 result = ptrsAssignable( eqvClass.type, dest, env ); 110 110 } else { -
src/ResolvExpr/PtrsCastable.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 11:48:00 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 11:51:17201513 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Oct 05 14:49:12 2015 13 // Update Count : 7 14 14 // 15 15 … … 133 133 134 134 void PtrsCastable::visit(TypeInstType *inst) { 135 result = objectCast( inst, env, indexer ) && objectCast( dest, env, indexer )? 1 : -1;135 result = objectCast( inst, env, indexer ) > 0 && objectCast( dest, env, indexer ) > 0 ? 1 : -1; 136 136 } 137 137 -
src/ResolvExpr/Unify.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:27:10 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Jun 26 14:57:05201513 // Update Count : 711 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Sep 02 14:43:22 2015 13 // Update Count : 36 14 14 // 15 15 … … 28 28 29 29 30 // #define DEBUG30 // #define DEBUG 31 31 32 32 namespace ResolvExpr { … … 81 81 bool typesCompatible( Type *first, Type *second, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 82 82 TypeEnvironment newEnv; 83 OpenVarSet openVars ;83 OpenVarSet openVars, closedVars; // added closedVars 84 84 AssertionSet needAssertions, haveAssertions; 85 85 Type *newFirst = first->clone(), *newSecond = second->clone(); 86 86 env.apply( newFirst ); 87 87 env.apply( newSecond ); 88 89 // do we need to do this? Seems like we do, types should be able to be compatible if they 90 // have free variables that can unify 91 findOpenVars( newFirst, openVars, closedVars, needAssertions, haveAssertions, false ); 92 findOpenVars( newSecond, openVars, closedVars, needAssertions, haveAssertions, true ); 93 88 94 bool result = unifyExact( newFirst, newSecond, newEnv, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer ); 89 95 delete newFirst; … … 426 432 427 433 void Unify::visit(ArrayType *arrayType) { 428 // XXX -- compare array dimension429 434 ArrayType *otherArray = dynamic_cast< ArrayType* >( type2 ); 430 if ( otherArray && arrayType->get_isVarLen() == otherArray->get_isVarLen() ) { 435 // to unify, array types must both be VLA or both not VLA 436 // and must both have a dimension expression or not have a dimension 437 if ( otherArray && arrayType->get_isVarLen() == otherArray->get_isVarLen() 438 && ((arrayType->get_dimension() != 0 && otherArray->get_dimension() != 0) 439 || (arrayType->get_dimension() == 0 && otherArray->get_dimension() == 0))) { 440 441 // not positive this is correct in all cases, but it's needed for typedefs 442 if ( arrayType->get_isVarLen() || otherArray->get_isVarLen() ) { 443 return; 444 } 445 446 if ( ! arrayType->get_isVarLen() && ! otherArray->get_isVarLen() && 447 arrayType->get_dimension() != 0 && otherArray->get_dimension() != 0 ) { 448 ConstantExpr * ce1 = dynamic_cast< ConstantExpr * >( arrayType->get_dimension() ); 449 ConstantExpr * ce2 = dynamic_cast< ConstantExpr * >( otherArray->get_dimension() ); 450 assert(ce1 && ce2); 451 452 Constant * c1 = ce1->get_constant(); 453 Constant * c2 = ce2->get_constant(); 454 455 if ( c1->get_value() != c2->get_value() ) { 456 // does not unify if the dimension is different 457 return; 458 } 459 } 460 431 461 result = unifyExact( arrayType->get_base(), otherArray->get_base(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer ); 432 462 } // if … … 436 466 bool unifyDeclList( Iterator1 list1Begin, Iterator1 list1End, Iterator2 list2Begin, Iterator2 list2End, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, const SymTab::Indexer &indexer ) { 437 467 for ( ; list1Begin != list1End && list2Begin != list2End; ++list1Begin, ++list2Begin ) { 468 // Type * commonType; 469 // if ( ! unifyInexact( (*list1Begin)->get_type(), (*list2Begin)->get_type(), env, needAssertions, haveAssertions, openVars, WidenMode( true, true ), indexer, commonType ) ) { 438 470 if ( ! unifyExact( (*list1Begin)->get_type(), (*list2Begin)->get_type(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer ) ) { 439 471 return false; … … 450 482 FunctionType *otherFunction = dynamic_cast< FunctionType* >( type2 ); 451 483 if ( otherFunction && functionType->get_isVarArgs() == otherFunction->get_isVarArgs() ) { 452 484 453 485 if ( unifyDeclList( functionType->get_parameters().begin(), functionType->get_parameters().end(), otherFunction->get_parameters().begin(), otherFunction->get_parameters().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { 454 486 -
src/SymTab/IdTable.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 17:04:02 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 17:07:43 201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Oct 07 12:21:13 2015 13 // Update Count : 73 14 14 // 15 15 … … 37 37 for ( InnerTableType::iterator inner = outer->second.begin(); inner != outer->second.end(); ++inner ) { 38 38 std::stack< DeclEntry >& entry = inner->second; 39 // xxx - should be while? 39 40 if ( ! entry.empty() && entry.top().second == scopeLevel ) { 40 41 entry.pop(); … … 52 53 if ( decl->get_linkage() == LinkageSpec::C ) { 53 54 manglename = name; 55 } else if ( LinkageSpec::isOverridable( decl->get_linkage() ) ) { 56 // mangle the name without including the appropriate suffix 57 // this will make it so that overridable routines are placed 58 // into the same "bucket" as their user defined versions. 59 manglename = Mangler::mangle( decl, false ); 54 60 } else { 55 61 manglename = Mangler::mangle( decl ); … … 60 66 61 67 if ( it == declTable.end() ) { 68 // first time this name mangling has been defined 62 69 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 63 70 } else { 64 71 std::stack< DeclEntry >& entry = it->second; 65 72 if ( ! entry.empty() && entry.top().second == scopeLevel ) { 66 if ( decl->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( decl->get_type(), entry.top().first->get_type(), Indexer() ) ) { 73 // if we're giving the same name mangling to things of 74 // different types then there is something wrong 75 Declaration *old = entry.top().first; 76 assert( (dynamic_cast<ObjectDecl*>( decl ) && dynamic_cast<ObjectDecl*>( old ) ) 77 || (dynamic_cast<FunctionDecl*>( decl ) && dynamic_cast<FunctionDecl*>( old ) ) ); 78 79 if ( LinkageSpec::isOverridable( old->get_linkage() ) ) { 80 // new definition shadows the autogenerated one, even at the same scope 81 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 82 } else if ( decl->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( decl->get_type(), entry.top().first->get_type(), Indexer() ) ) { 83 // typesCompatible doesn't really do the right thing here. When checking compatibility of function types, 84 // we should ignore outermost pointer qualifiers, except _Atomic? 67 85 FunctionDecl *newentry = dynamic_cast< FunctionDecl* >( decl ); 68 FunctionDecl *old = dynamic_cast< FunctionDecl* >( entry.top().first ); 69 if ( newentry && old && newentry->get_statements() && old->get_statements() ) { 70 throw SemanticError( "duplicate function definition for ", decl ); 86 FunctionDecl *oldentry = dynamic_cast< FunctionDecl* >( old ); 87 if ( newentry && oldentry ) { 88 if ( newentry->get_statements() && oldentry->get_statements() ) { 89 throw SemanticError( "duplicate function definition for 1 ", decl ); 90 } // if 71 91 } else { 92 // two objects with the same mangled name defined in the same scope. 93 // both objects must be marked extern or both must be intrinsic for this to be okay 94 // xxx - perhaps it's actually if either is intrinsic then this is okay? 95 // might also need to be same storage class? 72 96 ObjectDecl *newobj = dynamic_cast< ObjectDecl* >( decl ); 73 ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( entry.top().first);74 if ( newobj && oldobj && newobj->get_init() && oldobj->get_init()) {75 throw SemanticError( "duplicate definition for ", decl );97 ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( old ); 98 if (newobj->get_storageClass() != DeclarationNode::Extern && oldobj->get_storageClass() != DeclarationNode::Extern ) { 99 throw SemanticError( "duplicate definition for 3 ", decl ); 76 100 } // if 77 101 } // if … … 80 104 } // if 81 105 } else { 106 // new scope level - shadow existing definition 82 107 declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) ); 83 108 } // if 84 109 } // if 85 // ensure the set of routines with C linkage cannot be overloaded110 // this ensures that no two declarations with the same unmangled name both have C linkage 86 111 for ( InnerTableType::iterator i = declTable.begin(); i != declTable.end(); ++i ) { 87 112 if ( ! i->second.empty() && i->second.top().first->get_linkage() == LinkageSpec::C && declTable.size() > 1 ) { -
src/SymTab/Mangler.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:40:29 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jun 8 15:12:12201513 // Update Count : 811 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 19 15:52:24 2015 13 // Update Count : 19 14 14 // 15 15 … … 30 30 31 31 namespace SymTab { 32 Mangler::Mangler( ) : nextVarNum( 0 ), isTopLevel( true ) {32 Mangler::Mangler( bool mangleOverridable ) : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ) { 33 33 } 34 34 … … 41 41 nextVarNum = rhs.nextVarNum; 42 42 isTopLevel = rhs.isTopLevel; 43 mangleOverridable = rhs.mangleOverridable; 43 44 } 44 45 … … 59 60 mangleName << "__"; 60 61 maybeAccept( declaration->get_type(), *this ); 62 if ( mangleOverridable && LinkageSpec::isOverridable( declaration->get_linkage() ) ) { 63 // want to be able to override autogenerated and intrinsic routines, 64 // so they need a different name mangling 65 if ( declaration->get_linkage() == LinkageSpec::AutoGen ) { 66 mangleName << "autogen__"; 67 } else if ( declaration->get_linkage() == LinkageSpec::Intrinsic ) { 68 mangleName << "intrinsic__"; 69 } else { 70 // if we add another kind of overridable function, this has to change 71 assert( false ); 72 } // if 73 } 61 74 isTopLevel = wasTopLevel; 62 75 } … … 214 227 varNums[ (*i )->get_name() ] = std::pair< int, int >( nextVarNum++, (int )(*i )->get_kind() ); 215 228 for ( std::list< DeclarationWithType* >::iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) { 216 Mangler sub_mangler ;229 Mangler sub_mangler( mangleOverridable ); 217 230 sub_mangler.nextVarNum = nextVarNum; 218 231 sub_mangler.isTopLevel = false; -
src/SymTab/Mangler.h
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:44:03 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jun 8 14:47:14201513 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 19 15:48:46 2015 13 // Update Count : 14 14 14 // 15 15 … … 25 25 public: 26 26 template< typename SynTreeClass > 27 static std::string mangle( SynTreeClass *decl ); // interface to clients27 static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true ); // interface to clients 28 28 29 29 /// using Visitor::visit; … … 50 50 int nextVarNum; 51 51 bool isTopLevel; 52 bool mangleOverridable; 52 53 53 Mangler( );54 Mangler( bool mangleOverridable ); 54 55 Mangler( const Mangler & ); 55 56 … … 61 62 62 63 template< typename SynTreeClass > 63 std::string Mangler::mangle( SynTreeClass *decl ) {64 Mangler mangler ;64 std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable ) { 65 Mangler mangler( mangleOverridable ); 65 66 maybeAccept( decl, mangler ); 66 67 return mangler.get_mangleName(); -
src/SymTab/Validate.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Aug 11 16:59:35201513 // Update Count : 19611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Nov 20 16:33:52 2015 13 // Update Count : 201 14 14 // 15 15 … … 54 54 #include "MakeLibCfa.h" 55 55 #include "TypeEquality.h" 56 #include "ResolvExpr/typeops.h" 56 57 57 58 #define debugPrint( x ) if ( doDebug ) { std::cout << x; } … … 125 126 }; 126 127 127 class A ddStructAssignment: public Visitor {128 class AutogenerateRoutines : public Visitor { 128 129 public: 129 130 /// Generates assignment operators for aggregate types as required 130 static void a ddStructAssignment( std::list< Declaration * > &translationUnit );131 static void autogenerateRoutines( std::list< Declaration * > &translationUnit ); 131 132 132 133 std::list< Declaration * > &get_declsToAdd() { return declsToAdd; } … … 151 152 virtual void visit( CatchStmt *catchStmt ); 152 153 153 A ddStructAssignment() : functionNesting( 0 ) {}154 AutogenerateRoutines() : functionNesting( 0 ) {} 154 155 private: 155 156 template< typename StmtClass > void visitStatement( StmtClass *stmt ); … … 195 196 acceptAll( translationUnit, pass1 ); 196 197 acceptAll( translationUnit, pass2 ); 197 // need to collect all of the assignment operators prior to 198 // this point and only generate assignment operators if one doesn't exist 199 AddStructAssignment::addStructAssignment( translationUnit ); 198 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 200 199 acceptAll( translationUnit, pass3 ); 201 200 } … … 501 500 static const std::list< std::string > noLabels; 502 501 503 void A ddStructAssignment::addStructAssignment( std::list< Declaration * > &translationUnit ) {504 A ddStructAssignmentvisitor;502 void AutogenerateRoutines::autogenerateRoutines( std::list< Declaration * > &translationUnit ) { 503 AutogenerateRoutines visitor; 505 504 acceptAndAdd( translationUnit, visitor, false ); 506 505 } … … 704 703 } 705 704 706 void A ddStructAssignment::visit( EnumDecl *enumDecl ) {705 void AutogenerateRoutines::visit( EnumDecl *enumDecl ) { 707 706 if ( ! enumDecl->get_members().empty() ) { 708 707 EnumInstType *enumInst = new EnumInstType( Type::Qualifiers(), enumDecl->get_name() ); … … 713 712 } 714 713 715 void A ddStructAssignment::visit( StructDecl *structDecl ) {714 void AutogenerateRoutines::visit( StructDecl *structDecl ) { 716 715 if ( ! structDecl->get_members().empty() && structsDone.find( structDecl->get_name() ) == structsDone.end() ) { 717 716 StructInstType *structInst = new StructInstType( Type::Qualifiers(), structDecl->get_name() ); … … 722 721 } 723 722 724 void A ddStructAssignment::visit( UnionDecl *unionDecl ) {723 void AutogenerateRoutines::visit( UnionDecl *unionDecl ) { 725 724 if ( ! unionDecl->get_members().empty() ) { 726 725 UnionInstType *unionInst = new UnionInstType( Type::Qualifiers(), unionDecl->get_name() ); … … 730 729 } 731 730 732 void A ddStructAssignment::visit( TypeDecl *typeDecl ) {731 void AutogenerateRoutines::visit( TypeDecl *typeDecl ) { 733 732 CompoundStmt *stmts = 0; 734 733 TypeInstType *typeInst = new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), false ); … … 758 757 } 759 758 760 void A ddStructAssignment::visit( FunctionType *) {759 void AutogenerateRoutines::visit( FunctionType *) { 761 760 // ensure that we don't add assignment ops for types defined as part of the function 762 761 } 763 762 764 void A ddStructAssignment::visit( PointerType *) {763 void AutogenerateRoutines::visit( PointerType *) { 765 764 // ensure that we don't add assignment ops for types defined as part of the pointer 766 765 } 767 766 768 void A ddStructAssignment::visit( ContextDecl *) {767 void AutogenerateRoutines::visit( ContextDecl *) { 769 768 // ensure that we don't add assignment ops for types defined as part of the context 770 769 } 771 770 772 771 template< typename StmtClass > 773 inline void A ddStructAssignment::visitStatement( StmtClass *stmt ) {772 inline void AutogenerateRoutines::visitStatement( StmtClass *stmt ) { 774 773 std::set< std::string > oldStructs = structsDone; 775 774 addVisit( stmt, *this ); … … 777 776 } 778 777 779 void A ddStructAssignment::visit( FunctionDecl *functionDecl ) {778 void AutogenerateRoutines::visit( FunctionDecl *functionDecl ) { 780 779 maybeAccept( functionDecl->get_functionType(), *this ); 781 780 acceptAll( functionDecl->get_oldDecls(), *this ); … … 785 784 } 786 785 787 void A ddStructAssignment::visit( CompoundStmt *compoundStmt ) {786 void AutogenerateRoutines::visit( CompoundStmt *compoundStmt ) { 788 787 visitStatement( compoundStmt ); 789 788 } 790 789 791 void A ddStructAssignment::visit( IfStmt *ifStmt ) {790 void AutogenerateRoutines::visit( IfStmt *ifStmt ) { 792 791 visitStatement( ifStmt ); 793 792 } 794 793 795 void A ddStructAssignment::visit( WhileStmt *whileStmt ) {794 void AutogenerateRoutines::visit( WhileStmt *whileStmt ) { 796 795 visitStatement( whileStmt ); 797 796 } 798 797 799 void A ddStructAssignment::visit( ForStmt *forStmt ) {798 void AutogenerateRoutines::visit( ForStmt *forStmt ) { 800 799 visitStatement( forStmt ); 801 800 } 802 801 803 void A ddStructAssignment::visit( SwitchStmt *switchStmt ) {802 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 804 803 visitStatement( switchStmt ); 805 804 } 806 805 807 void A ddStructAssignment::visit( ChooseStmt *switchStmt ) {806 void AutogenerateRoutines::visit( ChooseStmt *switchStmt ) { 808 807 visitStatement( switchStmt ); 809 808 } 810 809 811 void A ddStructAssignment::visit( CaseStmt *caseStmt ) {810 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 812 811 visitStatement( caseStmt ); 813 812 } 814 813 815 void A ddStructAssignment::visit( CatchStmt *cathStmt ) {814 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 816 815 visitStatement( cathStmt ); 817 816 } … … 857 856 Type * t1 = tyDecl->get_base(); 858 857 Type * t2 = typedefNames[ tyDecl->get_name() ].first->get_base(); 859 if ( ! typeEquals( t1, t2, true) ) {858 if ( ! ResolvExpr::typesCompatible( t1, t2, Indexer() ) ) { 860 859 throw SemanticError( "cannot redefine typedef: " + tyDecl->get_name() ); 861 860 } -
src/SynTree/Mutator.h
r02ec390 r7e23d0a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 23 23:24:18201513 // Update Count : 712 // Last Modified On : Thu Nov 19 22:26:16 2015 13 // Update Count : 8 14 14 // 15 15 #include <cassert> … … 103 103 inline TreeType *maybeMutate( TreeType *tree, MutatorType &mutator ) { 104 104 if ( tree ) { 105 TreeType *newnode = dynamic_cast< TreeType * >( tree->acceptMutator( mutator ) );105 TreeType *newnode = dynamic_cast< TreeType * >( tree->acceptMutator( mutator ) ); 106 106 assert( newnode ); 107 107 return newnode; -
src/SynTree/ObjectDecl.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jul 13 18:08:27201513 // Update Count : 1 611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Sep 29 14:13:01 2015 13 // Update Count : 18 14 14 // 15 15 … … 52 52 get_type()->print( os, indent ); 53 53 } else { 54 os << " untyped entity ";54 os << " untyped entity "; 55 55 } // if 56 56 57 57 if ( init ) { 58 os << " with initializer ";58 os << " with initializer "; 59 59 init->print( os, indent ); 60 60 } // if 61 61 62 62 if ( bitfieldWidth ) { 63 os << " with bitfield width ";63 os << " with bitfield width "; 64 64 bitfieldWidth->print( os ); 65 65 } // if -
src/SynTree/Type.h
r02ec390 r7e23d0a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 9 16:46:15201513 // Update Count : 1 412 // Last Modified On : Fri Nov 20 12:54:09 2015 13 // Update Count : 15 14 14 // 15 15 … … 201 201 std::list<DeclarationWithType*> parameters; 202 202 203 // does the function accept a variable number of arguments following the arguments204 // specified in the parameters list.This could be because of203 // Does the function accept a variable number of arguments following the arguments specified in the parameters list. 204 // This could be because of 205 205 // - an ellipsis in a prototype declaration 206 206 // - an unprototyped declaration … … 239 239 240 240 /// Accesses generic parameters of base struct (NULL if none such) 241 std::list<TypeDecl*> * get_baseParameters();241 std::list<TypeDecl*> * get_baseParameters(); 242 242 243 243 /// Looks up the members of this struct named "name" and places them into "foundDecls". … … 266 266 267 267 /// Accesses generic parameters of base union (NULL if none such) 268 std::list<TypeDecl*> * get_baseParameters();268 std::list<TypeDecl*> * get_baseParameters(); 269 269 270 270 /// looks up the members of this union named "name" and places them into "foundDecls" -
src/examples/Makefile.am
r02ec390 r7e23d0a 11 11 ## Created On : Sun May 31 09:08:15 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Thu Jun 4 23:13:10201514 ## Update Count : 2 213 ## Last Modified On : Fri Nov 20 16:03:46 2015 14 ## Update Count : 24 15 15 ############################################################################### 16 16 … … 19 19 CC = @CFA_BINDIR@/cfa 20 20 21 noinst_PROGRAMS = fstream_test vector_test 22 fstream_test_SOURCES = iostream.c fstream.c fstream_test.c 21 noinst_PROGRAMS = fstream_test vector_test # build but do not install 22 fstream_test_SOURCES = iostream.c fstream.c fstream_test.c iterator.c 23 23 vector_test_SOURCES = vector_int.c fstream.c iostream.c array.c iterator.c vector_test.c -
src/examples/Makefile.in
r02ec390 r7e23d0a 49 49 PROGRAMS = $(noinst_PROGRAMS) 50 50 am_fstream_test_OBJECTS = iostream.$(OBJEXT) fstream.$(OBJEXT) \ 51 fstream_test.$(OBJEXT) 51 fstream_test.$(OBJEXT) iterator.$(OBJEXT) 52 52 fstream_test_OBJECTS = $(am_fstream_test_OBJECTS) 53 53 fstream_test_LDADD = $(LDADD) … … 176 176 top_builddir = @top_builddir@ 177 177 top_srcdir = @top_srcdir@ 178 fstream_test_SOURCES = iostream.c fstream.c fstream_test.c 178 fstream_test_SOURCES = iostream.c fstream.c fstream_test.c iterator.c 179 179 vector_test_SOURCES = vector_int.c fstream.c iostream.c array.c iterator.c vector_test.c 180 180 all: all-am -
src/examples/fstream.c
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:12:33201513 // Update Count : 212 // Last Modified On : Thu Nov 19 22:43:31 2015 13 // Update Count : 4 14 14 // 15 15 … … 30 30 fwrite( data, size, 1, os->file ); 31 31 os->fail = ferror( os->file ); 32 } 32 } // if 33 33 return os; 34 } 34 } // write 35 35 36 36 int fail( ofstream *os ) { 37 37 return os->fail; 38 } 38 } // fail 39 39 40 40 static ofstream *make_ofstream() { … … 42 42 new_stream->fail = 0; 43 43 return new_stream; 44 } 44 } // make_ofstream 45 45 46 46 ofstream *ofstream_stdout() { … … 48 48 stdout_stream->file = stdout; 49 49 return stdout_stream; 50 } 50 } // ofstream_stdout 51 51 52 52 ofstream *ofstream_stderr() { … … 54 54 stderr_stream->file = stderr; 55 55 return stderr_stream; 56 } 56 } // ofstream_stderr 57 57 58 58 ofstream *ofstream_fromfile( const char *name ) { -
src/examples/hello.c
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:14:58201513 // Update Count : 112 // Last Modified On : Fri Nov 20 16:02:50 2015 13 // Update Count : 3 14 14 // 15 15 … … 28 28 // Local Variables: // 29 29 // tab-width: 4 // 30 // compile-command: "cfa hello.c fstream.o iostream.o " //30 // compile-command: "cfa hello.c fstream.o iostream.o iterator.o" // 31 31 // End: // -
src/examples/iostream.c
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:18:13201513 // Update Count : 212 // Last Modified On : Fri Nov 20 13:19:19 2015 13 // Update Count : 9 14 14 // 15 15 … … 17 17 extern "C" { 18 18 #include <stdio.h> 19 //#include <string.h> 20 //#include <ctype.h> 21 typedef long unsigned int size_t; 22 size_t strlen(const char *s); 19 #include <string.h> // strlen 23 20 } 24 21 … … 26 23 ostype * ?<<?( ostype *os, char c ) { 27 24 return write( os, &c, 1 ); 28 } 25 } // ?<<? 29 26 30 27 forall( dtype ostype | ostream( ostype ) ) 31 28 ostype * ?<<?( ostype *os, int i ) { 32 char buffer[ 20];// larger than the largest integer29 char buffer[32]; // larger than the largest integer 33 30 sprintf( buffer, "%d", i ); 34 31 return write( os, buffer, strlen( buffer ) ); 35 } 32 } // ?<<? 36 33 37 34 forall( dtype ostype | ostream( ostype ) ) 38 35 ostype * ?<<?( ostype *os, double d ) { 39 char buffer[32]; 36 char buffer[32]; // larger than the largest double 40 37 sprintf( buffer, "%g", d ); 41 38 return write( os, buffer, strlen( buffer ) ); 42 } 39 } // ?<<? 43 40 44 41 forall( dtype ostype | ostream( ostype ) ) 45 42 ostype * ?<<?( ostype *os, const char *cp ) { 46 43 return write( os, cp, strlen( cp ) ); 47 } 44 } // ?<<? 45 46 forall( dtype ostype | ostream( ostype ) ) 47 ostype * ?<<?( ostype *os, const void *p ) { 48 char buffer[32]; // larger than the largest pointer 49 sprintf( buffer, "%p", p ); 50 return write( os, buffer, strlen( buffer ) ); 51 } // ?<<? 52 53 forall( type elt_type | writeable( elt_type ), 54 type iterator_type | iterator( iterator_type, elt_type ), 55 dtype os_type | ostream( os_type ) ) 56 void write( iterator_type begin, iterator_type end, os_type *os ) { 57 void print( elt_type i ) { 58 os << i << ' '; 59 } 60 for_each( begin, end, print ); 61 } // ?<<? 62 63 forall( type elt_type | writeable( elt_type ), 64 type iterator_type | iterator( iterator_type, elt_type ), 65 dtype os_type | ostream( os_type ) ) 66 void write_reverse( iterator_type begin, iterator_type end, os_type *os ) { 67 void print( elt_type i ) { 68 os << i << ' '; 69 } 70 for_each_reverse( begin, end, print ); 71 } // ?<<? 72 48 73 49 74 forall( dtype istype | istream( istype ) ) 50 75 istype * ?>>?( istype *is, char *cp ) { 51 76 return read( is, cp, 1 ); 52 } 77 } // ?>>? 53 78 54 79 forall( dtype istype | istream( istype ) ) … … 72 97 unread( is, cur ); 73 98 return is; 74 } 99 } // ?>>? 75 100 76 101 // Local Variables: // -
src/examples/iostream.h
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:18:46201513 // Update Count : 112 // Last Modified On : Thu Nov 19 17:56:51 2015 13 // Update Count : 5 14 14 // 15 15 16 16 #ifndef IOSTREAM_H 17 17 #define IOSTREAM_H 18 19 #include "iterator.h" 18 20 19 21 typedef unsigned long streamsize_type; … … 34 36 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, double ); 35 37 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, const char * ); 38 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, void * ); 39 40 // writes the range [begin, end) to the given stream 41 forall( type elt_type | writeable( elt_type ), 42 type iterator_type | iterator( iterator_type, elt_type ), 43 dtype os_type | ostream( os_type ) ) 44 void write( iterator_type begin, iterator_type end, os_type *os ); 45 46 forall( type elt_type | writeable( elt_type ), 47 type iterator_type | iterator( iterator_type, elt_type ), 48 dtype os_type | ostream( os_type ) ) 49 void write_reverse( iterator_type begin, iterator_type end, os_type *os ); 36 50 37 51 -
src/examples/iterator.c
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:41:41201513 // Update Count : 312 // Last Modified On : Thu Nov 19 17:54:37 2015 13 // Update Count : 24 14 14 // 15 15 16 16 #include "iterator.h" 17 17 18 /// forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) ) 19 /// void 20 /// for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) 21 /// { 22 /// iterator_type i; 23 /// for ( i = begin; i != end; ++i ) { 24 /// func( *i ); 25 /// } 26 /// } 27 28 forall( type elt_type | writeable( elt_type ), 29 type iterator_type | iterator( iterator_type, elt_type ), 30 dtype os_type | ostream( os_type ) ) 31 void write_all( iterator_type begin, iterator_type end, os_type *os ) { 32 iterator_type i; 33 for ( i = begin; i != end; ++i ) { 34 os << *i << ' '; 18 forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) ) 19 void for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) { 20 for ( iterator_type i = begin; i != end; ++i ) { 21 func( *i ); 35 22 } 36 23 } 37 24 38 forall( type elt_type | writeable( elt_type ), 39 type iterator_type | iterator( iterator_type, elt_type ), 40 dtype os_type | ostream( os_type ) ) 41 void write_reverse( iterator_type begin, iterator_type end, os_type *os ) { 42 iterator_type i; // "= end;" does not work 43 i = end; 44 do { 25 forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) ) 26 void for_each_reverse( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) { 27 for ( iterator_type i = end; i != begin; ) { 45 28 --i; 46 os << *i << ' ';47 } while ( i != begin );29 func( *i ); 30 } 48 31 } 49 32 -
src/examples/iterator.h
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:41:57201513 // Update Count : 312 // Last Modified On : Thu Nov 19 17:58:28 2015 13 // Update Count : 6 14 14 // 15 15 16 16 #ifndef ITERATOR_H 17 17 #define ITERATOR_H 18 19 #include "iostream.h"20 18 21 19 // An iterator can be used to traverse a data structure. … … 34 32 }; 35 33 36 context iterator_for 34 context iterator_for( type iterator_type, type collection_type, type elt_type | iterator( iterator_type, elt_type ) ) { 37 35 // [ iterator_type begin, iterator_type end ] get_iterators( collection_type ); 38 36 iterator_type begin( collection_type ); … … 43 41 void for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) ); 44 42 45 // writes the range [begin, end) to the given stream 46 forall( type elt_type | writeable( elt_type ), 47 type iterator_type | iterator( iterator_type, elt_type ), 48 dtype os_type | ostream( os_type ) ) 49 void write_all( iterator_type begin, iterator_type end, os_type *os ); 50 51 forall( type elt_type | writeable( elt_type ), 52 type iterator_type | iterator( iterator_type, elt_type ), 53 dtype os_type | ostream( os_type ) ) 54 void write_reverse( iterator_type begin, iterator_type end, os_type *os ); 43 forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) ) 44 void for_each_reverse( iterator_type begin, iterator_type end, void (*func)( elt_type ) ); 55 45 56 46 #endif // ITERATOR_H -
src/examples/vector_test.c
r02ec390 r7e23d0a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:42:55201513 // Update Count : 212 // Last Modified On : Thu Nov 19 17:54:34 2015 13 // Update Count : 9 14 14 // 15 15 … … 29 29 sout << "enter N elements and C-d on a separate line:\n"; 30 30 for ( ;; ) { 31 sin >> #31 sin >> # 32 32 if ( fail( sin ) || eof( sin ) ) break; 33 append( &vec, num );33 append( &vec, num ); 34 34 } 35 35 // write out the numbers 36 36 37 37 sout << "Array elements:\n"; 38 // write_all( begin( vec ), end( vec ), sout ); 39 // sout << "\n"; 40 for ( int index = 0; index <= last( vec ); index += 1 ) { 41 sout << vec[ index ] << " "; 42 } 38 write( begin( vec ), end( vec ), sout ); 43 39 sout << "\n"; 44 #if 1 40 45 41 sout << "Array elements reversed:\n"; 46 42 write_reverse( begin( vec ), end( vec ), sout ); 47 43 sout << "\n"; 48 #endif49 44 } 50 51 // ../bin/cfa vector_test.c fstream.o iostream.o vector_int.o iterator.o array.o52 45 53 46 // Local Variables: // -
src/libcfa/prelude.cf
r02ec390 r7e23d0a 7 7 // Author : Glen Ditchfield 8 8 // Created On : Sat Nov 29 07:23:41 2014 9 // Last Modified By : Peter A. Buhr10 // Last Modified On : T ue Jun 9 14:43:47 201511 // Update Count : 7 59 // Last Modified By : Rob Schluntz 10 // Last Modified On : Thu Nov 19 11:09:47 2015 11 // Update Count : 76 12 12 // 13 13 -
src/main.cc
r02ec390 r7e23d0a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Fri May 15 23:12:02 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Thu Jul 30 16:08:18201513 // Update Count : 16 711 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 19 22:31:40 2015 13 // Update Count : 168 14 14 // 15 15 … … 227 227 } // if 228 228 229 // add the assignment statement after the 230 // initialization of a type parameter 229 // add the assignment statement after the initialization of a type parameter 231 230 OPTPRINT( "validate" ) 232 231 SymTab::validate( translationUnit, symtabp );
Note: See TracChangeset
for help on using the changeset viewer.