Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Autogen.cc

    r39f84a4 r4e06c1e  
    2626
    2727namespace SymTab {
    28         Type * SizeType = 0;
    29 
    3028        class AutogenerateRoutines : public Visitor {
    3129                public:
     
    6159        bool isUnnamedBitfield( ObjectDecl * obj ) {
    6260                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 );
    6385        }
    6486
     
    189211                }
    190212
    191                 InitTweak::InitExpander srcParam( src );
    192 
    193213                // 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() ) );
    204230                } // if
    205231        }
     
    216242                                }
    217243
    218                                 if ( type->get_qualifiers().isConst && func->get_name() == "?=?" ) {
    219                                         // don't assign const members, but do construct/destruct
     244                                if ( type->get_qualifiers().isConst ) {
     245                                        // don't assign const members
    220246                                        continue;
    221247                                }
Note: See TracChangeset for help on using the changeset viewer.