Changes in src/SymTab/Autogen.cc [39f84a4:4e06c1e]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Autogen.cc
r39f84a4 r4e06c1e 26 26 27 27 namespace SymTab { 28 Type * SizeType = 0;29 30 28 class AutogenerateRoutines : public Visitor { 31 29 public: … … 61 59 bool isUnnamedBitfield( ObjectDecl * obj ) { 62 60 return obj != NULL && obj->get_name() == "" && obj->get_bitfieldWidth() != NULL; 61 } 62 63 template< typename OutputIterator > 64 void makeScalarFunction( Expression *src, ObjectDecl *dstParam, DeclarationWithType *member, std::string fname, OutputIterator out ) { 65 ObjectDecl *obj = dynamic_cast<ObjectDecl *>( member ); 66 // unnamed bit fields are not copied as they cannot be accessed 67 if ( isUnnamedBitfield( obj ) ) return; 68 69 // want to be able to generate assignment, ctor, and dtor generically, 70 // so fname is either ?=?, ?{}, or ^?{} 71 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) ); 72 73 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 74 derefExpr->get_args().push_back( new VariableExpr( dstParam ) ); 75 76 // do something special for unnamed members 77 Expression *dstselect = new AddressExpr( new MemberExpr( member, derefExpr ) ); 78 fExpr->get_args().push_back( dstselect ); 79 80 if ( src ) { 81 fExpr->get_args().push_back( src ); 82 } 83 84 *out++ = new ExprStmt( noLabels, fExpr ); 63 85 } 64 86 … … 189 211 } 190 212 191 InitTweak::InitExpander srcParam( src );192 193 213 // assign to destination (and return value if generic) 194 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 195 derefExpr->get_args().push_back( new VariableExpr( dstParam ) ); 196 Expression *dstselect = new MemberExpr( field, derefExpr ); 197 genImplicitCall( srcParam, dstselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward ); 198 199 if ( isGeneric && returnVal ) { 200 UntypedExpr *derefRet = new UntypedExpr( new NameExpr( "*?" ) ); 201 derefRet->get_args().push_back( new VariableExpr( returnVal ) ); 202 Expression *retselect = new MemberExpr( field, derefRet ); 203 genImplicitCall( srcParam, retselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward ); 214 if ( ArrayType *array = dynamic_cast< ArrayType * >( field->get_type() ) ) { 215 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 216 derefExpr->get_args().push_back( new VariableExpr( dstParam ) ); 217 Expression *dstselect = new MemberExpr( field, derefExpr ); 218 219 makeArrayFunction( src, dstselect, array, func->get_name(), back_inserter( func->get_statements()->get_kids() ), forward ); 220 if ( isGeneric && returnVal ) { 221 UntypedExpr *derefRet = new UntypedExpr( new NameExpr( "*?" ) ); 222 derefRet->get_args().push_back( new VariableExpr( returnVal ) ); 223 Expression *retselect = new MemberExpr( field, derefRet ); 224 225 makeArrayFunction( src, retselect, array, func->get_name(), back_inserter( func->get_statements()->get_kids() ), forward ); 226 } 227 } else { 228 makeScalarFunction( src, dstParam, field, func->get_name(), back_inserter( func->get_statements()->get_kids() ) ); 229 if ( isGeneric && returnVal ) makeScalarFunction( src, returnVal, field, func->get_name(), back_inserter( func->get_statements()->get_kids() ) ); 204 230 } // if 205 231 } … … 216 242 } 217 243 218 if ( type->get_qualifiers().isConst && func->get_name() == "?=?") {219 // don't assign const members , but do construct/destruct244 if ( type->get_qualifiers().isConst ) { 245 // don't assign const members 220 246 continue; 221 247 }
Note:
See TracChangeset
for help on using the changeset viewer.