Changeset b7b8674


Ignore:
Timestamp:
Feb 8, 2017, 5:04:20 PM (5 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
aa9ee19
Parents:
52c14b3
Message:

make Tuples::maybeImpure slightly more precise

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/FixInit.cc

    r52c14b3 rb7b8674  
    11161116                        // xxx - is the size check necessary?
    11171117                        assert( ctorExpr->has_result() && ctorExpr->get_result()->size() == 1 );
     1118
     1119                        // xxx - ideally we would reuse the temporary generated from the copy constructor passes from within firstArg if it exists and not generate a temporary if it's unnecessary.
    11181120                        ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_result()->clone(), nullptr );
    11191121                        addDeclaration( tmp );
  • src/InitTweak/InitTweak.cc

    r52c14b3 rb7b8674  
    332332                        return nullptr;
    333333                }
     334        }
     335
     336        DeclarationWithType * getFunction( Expression * expr ) {
     337                if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ) ) {
     338                        return getCalledFunction( appExpr->get_function() );
     339                } else if ( UntypedExpr * untyped = dynamic_cast< UntypedExpr * > ( expr ) ) {
     340                        return getCalledFunction( untyped->get_function() );
     341                }
     342                assertf( false, "getFunction received unknown expression: %s", toString( expr ).c_str() );
    334343        }
    335344
  • src/InitTweak/InitTweak.h

    r52c14b3 rb7b8674  
    5151        bool checkInitDepth( ObjectDecl * objDecl );
    5252
    53   /// Non-Null if expr is a call expression whose target function is intrinsic
    54   ApplicationExpr * isIntrinsicCallExpr( Expression * expr );
     53        /// returns the declaration of the function called by the expr (must be ApplicationExpr or UntypedExpr)
     54        DeclarationWithType * getFunction( Expression * expr );
     55
     56        /// Non-Null if expr is a call expression whose target function is intrinsic
     57        ApplicationExpr * isIntrinsicCallExpr( Expression * expr );
    5558
    5659        /// True if stmt is a call statement where the function called is intrinsic and takes one parameter.
  • src/Tuples/TupleExpansion.cc

    r52c14b3 rb7b8674  
    2929#include "ResolvExpr/typeops.h"
    3030#include "InitTweak/GenInit.h"
     31#include "InitTweak/InitTweak.h"
    3132
    3233namespace Tuples {
     
    337338                public:
    338339                        typedef Visitor Parent;
    339                         virtual void visit( ApplicationExpr * appExpr ) { maybeImpure = true;   }
     340                        virtual void visit( ApplicationExpr * appExpr ) {
     341                                if ( DeclarationWithType * function = InitTweak::getFunction( appExpr ) ) {
     342                                        if ( function->get_linkage() == LinkageSpec::Intrinsic ) {
     343                                                if ( function->get_name() == "*?" || function->get_name() == "?[?]" ) {
     344                                                        // intrinsic dereference, subscript are pure, but need to recursively look for impurity
     345                                                        Parent::visit( appExpr );
     346                                                        return;
     347                                                }
     348                                        }
     349                                }
     350                                maybeImpure = true;
     351                        }
    340352                        virtual void visit( UntypedExpr * untypedExpr ) { maybeImpure = true; }
    341353                        bool maybeImpure = false;
Note: See TracChangeset for help on using the changeset viewer.