Changeset ce8c12f for src/GenPoly


Ignore:
Timestamp:
May 15, 2017, 11:30:26 AM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
d36c117
Parents:
65aca88
Message:

initial work on references: reference types passed through the system, very simple examples work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cc

    r65aca88 rce8c12f  
    3232#include "Common/UniqueName.h"
    3333#include "Common/utility.h"
     34#include "InitTweak/InitTweak.h"
    3435
    3536namespace GenPoly {
     
    4041                class Pass1 : public Mutator {
    4142                  public:
     43                        typedef Mutator Parent;
    4244                        Pass1();
    4345
     46                        // xxx - should this happen to every expression with reference result type? probably just appexpr and varexpr?
     47                        virtual Type *mutate( ReferenceType * refType );
     48                        virtual Expression *mutate( VariableExpr *varExpr );
    4449                        virtual Expression *mutate( ApplicationExpr *appExpr );
    4550                        virtual Statement *mutate( ReturnStmt *appExpr );
     
    105110                        } // if
    106111                        return funcDecl;
     112                }
     113
     114                Type * Pass1::mutate( ReferenceType * refType ) {
     115                        Type * base = refType->get_base();
     116                        refType->set_base( nullptr );
     117                        delete refType;
     118                        return new PointerType( Type::Qualifiers(), base );
     119                }
     120
     121                Expression * Pass1::mutate( VariableExpr *varExpr ) {
     122                        if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( varExpr->get_result() ) ) {
     123                                varExpr->set_result( refType->acceptMutator( *this ) );
     124                                return UntypedExpr::createDeref( varExpr );
     125                        }
     126                        return Parent::mutate( varExpr );
    107127                }
    108128
     
    165185                }
    166186
     187                bool isDeref( Expression * expr ) {
     188                        if ( UntypedExpr * untyped = dynamic_cast< UntypedExpr * >( expr ) ) {
     189                                return InitTweak::getFunctionName( untyped ) == "*?";
     190                        } else if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * > ( expr ) ) {
     191                                return InitTweak::getFunctionName( appExpr ) == "*?";
     192                        } else {
     193                                return false;
     194                        }
     195                }
     196
    167197                Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) {
    168198                        addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) );
     
    178208                                delete addrExpr;
    179209                                return new ConditionalExpr( arg1, new AddressExpr( arg2 ), new AddressExpr( arg3 ) );
     210                        } else if ( isDeref( addrExpr->get_arg() ) ) {
     211                                // xxx - this doesn't belong here -- move it somewhere else
     212                                Expression *& arg = InitTweak::getCallArg( addrExpr->get_arg(), 0 );
     213                                Expression * inner = arg;
     214                                arg = nullptr;
     215                                delete addrExpr;
     216                                return inner;
    180217                        }
    181218                        return addrExpr;
Note: See TracChangeset for help on using the changeset viewer.