Changeset 1cdfa82 for src/GenPoly/Box.cc


Ignore:
Timestamp:
Apr 25, 2018, 4:55:53 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env, with_gc
Children:
42107b4
Parents:
2efe4b8 (diff), 9d5fb67 (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.
Message:

Merge remote-tracking branch 'origin/master' into with_gc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r2efe4b8 r1cdfa82  
    184184                        /// change the type of generic aggregate members to char[]
    185185                        void mutateMembers( AggregateDecl * aggrDecl );
     186                        /// returns the calculated sizeof expression for ty, or nullptr for use C sizeof()
     187                        Expression* genSizeof( Type* ty );
    186188
    187189                        /// Enters a new scope for type-variables, adding the type variables from ty
     
    383385                unsigned long n_members = 0;
    384386                bool firstMember = true;
    385                 for ( std::list< Declaration* >::const_iterator member = structDecl->get_members().begin(); member != structDecl->get_members().end(); ++member ) {
    386                         DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member );
     387                for ( Declaration* member : structDecl->get_members() ) {
     388                        DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( member );
    387389                        assert( dwt );
    388390                        Type *memberType = dwt->get_type();
     
    17371739                }
    17381740
     1741                Expression * PolyGenericCalculator::genSizeof( Type* ty ) {
     1742                        if ( ArrayType * aty = dynamic_cast<ArrayType *>(ty) ) {
     1743                                // generate calculated size for possibly generic array
     1744                                Expression * sizeofBase = genSizeof( aty->get_base() );
     1745                                if ( ! sizeofBase ) return nullptr;
     1746                                Expression * dim = aty->get_dimension();
     1747                                aty->set_dimension( nullptr );
     1748                                return makeOp( "?*?", sizeofBase, dim );
     1749                        } else if ( findGeneric( ty ) ) {
     1750                                // generate calculated size for generic type
     1751                                return new NameExpr( sizeofName( mangleType( ty ) ) );
     1752                        } else return nullptr;
     1753                }
     1754
    17391755                Expression *PolyGenericCalculator::postmutate( SizeofExpr *sizeofExpr ) {
    1740                         Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result();
    1741                         if ( findGeneric( ty ) ) {
    1742                                 return new NameExpr( sizeofName( mangleType( ty ) ) );
    1743                         }
    1744                         return sizeofExpr;
     1756                        Type *ty = sizeofExpr->get_isType() ?
     1757                                sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result();
     1758                       
     1759                        Expression * gen = genSizeof( ty );
     1760                        return gen ? gen : sizeofExpr;
    17451761                }
    17461762
Note: See TracChangeset for help on using the changeset viewer.