Changes in src/GenPoly/ScrubTyVars.cc [c6b4432:2f61765]
- File:
-
- 1 edited
-
src/GenPoly/ScrubTyVars.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/ScrubTyVars.cc
rc6b4432 r2f61765 21 21 #include "ScrubTyVars.h" 22 22 #include "SymTab/Mangler.h" // for mangleType 23 #include "SynTree/Declaration.h" // for TypeDecl, TypeDecl::Data, Typ... 24 #include "SynTree/Expression.h" // for Expression (ptr only), NameExpr 25 #include "SynTree/Mutator.h" // for Mutator 26 #include "SynTree/Type.h" // for PointerType, TypeInstType, Type 23 27 24 28 namespace GenPoly { 29 Type * ScrubTyVars::postmutate( TypeInstType * typeInst ) { 30 if ( ! tyVars ) { 31 if ( typeInst->get_isFtype() ) { 32 delete typeInst; 33 return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ); 34 } else { 35 PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) ); 36 delete typeInst; 37 return ret; 38 } 39 } 40 41 TyVarMap::const_iterator tyVar = tyVars->find( typeInst->name ); 42 if ( tyVar != tyVars->end() ) { 43 switch ( tyVar->second.kind ) { 44 case TypeDecl::Dtype: 45 case TypeDecl::Ttype: 46 { 47 PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) ); 48 delete typeInst; 49 return ret; 50 } 51 case TypeDecl::Ftype: 52 delete typeInst; 53 return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ); 54 default: 55 assertf(false, "Unhandled tyvar kind: %d", tyVar->second.kind); 56 } // switch 57 } // if 58 return typeInst; 59 } 60 61 Type * ScrubTyVars::mutateAggregateType( Type * ty ) { 62 if ( shouldScrub( ty ) ) { 63 PointerType * ret = new PointerType( Type::Qualifiers(), new VoidType( ty->get_qualifiers() ) ); 64 delete ty; 65 return ret; 66 } 67 return ty; 68 } 69 70 Type * ScrubTyVars::postmutate( StructInstType * structInst ) { 71 return mutateAggregateType( structInst ); 72 } 73 74 Type * ScrubTyVars::postmutate( UnionInstType * unionInst ) { 75 return mutateAggregateType( unionInst ); 76 } 77 78 void ScrubTyVars::primeBaseScrub( Type * type ) { 79 // need to determine whether type needs to be scrubbed to determine whether 80 // automatic recursion is necessary 81 if ( Type * t = shouldScrub( type ) ) { 82 visit_children = false; 83 GuardValue( dynType ); 84 dynType = t; 85 } 86 } 87 88 Expression * ScrubTyVars::postmutate( SizeofExpr * szeof ) { 89 // sizeof( T ) => _sizeof_T parameter, which is the size of T 90 if ( dynType ) { 91 Expression *expr = new NameExpr( sizeofName( mangleType( dynType ) ) ); 92 return expr; 93 } // if 94 return szeof; 95 } 96 97 Expression * ScrubTyVars::postmutate( AlignofExpr * algnof ) { 98 // alignof( T ) => _alignof_T parameter, which is the alignment of T 99 if ( dynType ) { 100 Expression *expr = new NameExpr( alignofName( mangleType( dynType ) ) ); 101 return expr; 102 } // if 103 return algnof; 104 } 105 106 Type * ScrubTyVars::postmutate( PointerType * pointer ) { 107 if ( dynType ) { 108 Type * ret = dynType->acceptMutator( *visitor ); 109 ret->get_qualifiers() |= pointer->get_qualifiers(); 110 pointer->base = nullptr; 111 delete pointer; 112 return ret; 113 } 114 return pointer; 115 } 25 116 26 117 namespace {
Note:
See TracChangeset
for help on using the changeset viewer.