Changes in / [ef5ef56:893e106]


Ignore:
Location:
src
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Expr.cpp

    ref5ef56 r893e106  
    2020#include <vector>
    2121
     22#include "GenericSubstitution.hpp"
    2223#include "Stmt.hpp"
    2324#include "Type.hpp"
     25#include "TypeSubstitution.hpp"
    2426#include "Common/utility.h"
    2527#include "Common/SemanticError.h"
     
    157159        assert( aggregate->result );
    158160
     161<<<<<<< HEAD
     162        // #warning Needs GenericSubsitution.cpp building to work correctly
     163        // result.set_and_mutate( mem->get_type() )->qualifiers |= aggregate->result->qualifiers | CV::Lvalue;  // FIXME temporary patch
     164
     165        // take ownership of member type
     166        result = mem->get_type();
     167        // substitute aggregate generic parameters into member type
     168        genericSubsitution( aggregate->result ).apply( result );
     169        // ensure lvalue and appropriate restrictions from aggregate type
     170        result.get_and_mutate()->qualifiers |= aggregate->result->qualifiers | CV::Lvalue;
     171=======
    159172//      assert(!"unimplemented; need TypeSubstitution, genericSubstitution");
     173>>>>>>> ef5ef56042ce2b547da955746d9986e26cf628ca
    160174}
    161175
  • src/AST/Node.cpp

    ref5ef56 r893e106  
    3535void ast::ptr_base<node_t, ref_t>::_dec( const node_t * node ) { node->decrement(ref_t); }
    3636
    37 /// Sets this pointer to a mutated version of a pointer (possibly) owned elsehere.
    38 /// Returns a mutable version of the pointer in this node.
    39 template< typename node_t, enum ast::Node::ref_type ref_t >
    40 node_t * ast::ptr_base<node_t, ref_t>::set_and_mutate( const node_t * n ) {
    41         // ensure ownership of `n` by this node to avoid spurious single-owner mutates
    42         assign( n );
     37template< typename node_t, enum ast::Node::ref_type ref_t >
     38node_t * ast::ptr_base<node_t, ref_t>::get_and_mutate() {
    4339        // get mutable version of `n`
    4440        auto r = mutate( node );
     
    4642        assign( r );
    4743        return r;
     44}
     45
     46template< typename node_t, enum ast::Node::ref_type ref_t >
     47node_t * ast::ptr_base<node_t, ref_t>::set_and_mutate( const node_t * n ) {
     48        // ensure ownership of `n` by this node to avoid spurious single-owner mutates
     49        assign( n );
     50        // return mutable version
     51        return get_and_mutate();
    4852}
    4953
  • src/AST/Node.hpp

    ref5ef56 r893e106  
    9494std::ostream& operator<< ( std::ostream& out, const Node * node );
    9595
     96/// Call a visitor on a possibly-null node
     97template<typename node_t>
     98auto maybe_accept( const node_t * n, Visitor & v ) -> decltype( n->accept(v) ) {
     99        return n ? n->accept( v ) : nullptr;
     100}
     101
    96102/// Base class for the smart pointer types
    97103/// should never really be used.
     
    141147        const o_node_t * as() const { return dynamic_cast<const o_node_t *>(node); }
    142148
     149        /// Returns a mutable version of the pointer in this node.
     150        node_t * get_and_mutate();
     151
    143152        /// Sets this pointer to a mutated version of a pointer (possibly) owned elsehere.
    144153        /// Returns a mutable version of the pointer in this node.
  • src/AST/Pass.hpp

    ref5ef56 r893e106  
    223223};
    224224
     225/// Apply a pass to an entire translation unit
    225226template<typename pass_t>
    226227void accept_all( std::list< ast::ptr<ast::Decl> > &, ast::Pass<pass_t> & visitor );
  • src/AST/Print.cpp

    ref5ef56 r893e106  
    495495
    496496        virtual const ast::TypeSubstitution * visit( const ast::TypeSubstitution     * node ) {
     497                os << indent << "Types:" << std::endl;
     498                for ( const auto& i : *node ) {
     499                        os << indent+1 << i.first << " -> ";
     500                        indent += 2;
     501                        i.second->accept( *this );
     502                        indent -= 2;
     503                        os << std::endl;
     504                }
     505                os << indent << "Non-types:" << std::endl;
     506                for ( auto i = node->beginVar(); i != node->endVar(); ++i ) {
     507                        os << indent+1 << i->first << " -> ";
     508                        indent += 2;
     509                        i->second->accept( *this );
     510                        indent -= 2;
     511                        os << std::endl;
     512                }
    497513                return node;
    498514        }
  • src/AST/Type.hpp

    ref5ef56 r893e106  
    4747        bool is_atomic() const { return qualifiers.is_atomic; }
    4848
    49         void set_const( bool v ) { qualifiers.is_const = v; }
    50         void set_restrict( bool v ) { qualifiers.is_restrict = v; }
    51         void set_lvalue( bool v ) { qualifiers.is_lvalue = v; }
    52         void set_mutex( bool v ) { qualifiers.is_mutex = v; }
    53         void set_atomic( bool v ) { qualifiers.is_atomic = v; }
     49        Type * set_const( bool v ) { qualifiers.is_const = v; return this; }
     50        Type * set_restrict( bool v ) { qualifiers.is_restrict = v; return this; }
     51        Type * set_lvalue( bool v ) { qualifiers.is_lvalue = v; return this; }
     52        Type * set_mutex( bool v ) { qualifiers.is_mutex = v; return this; }
     53        Type * set_atomic( bool v ) { qualifiers.is_atomic = v; return this; }
    5454
    5555        /// How many elemental types are represented by this type
  • src/AST/TypeSubstitution.hpp

    ref5ef56 r893e106  
    2525#include "Fwd.hpp"        // for UniqueId
    2626#include "ParseNode.hpp"
    27 #include "Type.hpp"       // for ptr<Type>
     27#include "Type.hpp"       
    2828#include "Common/SemanticError.h"  // for SemanticError
    2929#include "Visitor.hpp"
    3030#include "Decl.hpp"
    3131#include "Expr.hpp"
     32#include "Node.hpp"
    3233
    3334namespace ast {
     
    4344        TypeSubstitution &operator=( const TypeSubstitution &other );
    4445
    45         template< typename SynTreeClass > int apply( SynTreeClass *&input ) const;
    46         template< typename SynTreeClass > int applyFree( SynTreeClass *&input ) const;
     46        template< typename SynTreeClass > int apply( const SynTreeClass *& input ) const;
     47        template< typename SynTreeClass > int applyFree( const SynTreeClass *& input ) const;
     48
     49        template< typename node_t, enum Node::ref_type ref_t >
     50        int apply( ptr_base< node_t, ref_t > & input ) const {
     51                const node_t * p = input.get();
     52                int ret = apply(p);
     53                input = p;
     54                return ret;
     55        }
     56
     57        template< typename node_t, enum Node::ref_type ref_t >
     58        int applyFree( ptr_base< node_t, ref_t > & input ) const {
     59                const node_t * p = input.get();
     60                int ret = applyFree(p);
     61                input = p;
     62                return ret;
     63        }
    4764
    4865        void add( std::string formalType, const Type *actualType );
     
    162179
    163180template< typename SynTreeClass >
    164 int TypeSubstitution::apply( SynTreeClass *&input ) const {
     181int TypeSubstitution::apply( const SynTreeClass *& input ) const {
    165182        assert( input );
    166183        Pass<Substituter> sub( *this, false );
    167         input = dynamic_cast< SynTreeClass * >( input->acceptMutator( sub ) );
    168         assert( input );
     184        input = strict_dynamic_cast< const SynTreeClass * >( input->accept( sub ) );
    169185///     std::cerr << "substitution result is: ";
    170186///     newType->print( std::cerr );
     
    174190
    175191template< typename SynTreeClass >
    176 int TypeSubstitution::applyFree( SynTreeClass *&input ) const {
     192int TypeSubstitution::applyFree( const SynTreeClass *& input ) const {
    177193        assert( input );
    178194        Pass<Substituter> sub( *this, true );
    179         input = dynamic_cast< SynTreeClass * >( input->acceptMutator( sub ) );
    180         assert( input );
     195        input = strict_dynamic_cast< const SynTreeClass * >( input->accept( sub ) );
    181196///     std::cerr << "substitution result is: ";
    182197///     newType->print( std::cerr );
  • src/AST/module.mk

    ref5ef56 r893e106  
    2121        AST/DeclReplacer.cpp \
    2222        AST/Expr.cpp \
     23        AST/GenericSubstitution.cpp \
    2324        AST/Init.cpp \
    2425        AST/LinkageSpec.cpp \
  • src/AST/porting.md

    ref5ef56 r893e106  
    3838
    3939`N->print(std::ostream&)` is a visitor now, port these methods to `ast::Print` class
    40 * **TODO** write this visitor
    41 * **TODO** write `std::ostream& operator<< ( std::ostream& out, const Node* node )` in `Node.hpp` in terms of `ast::Print`
    42 * `Declaration::printShort` should also be integrated
     40* **TODO** `Declaration::printShort` should also be integrated
    4341
    4442`clone` is private to `Node` now
     
    208206
    209207`CompoundStmt`
    210 * **TODO** port copy operator
    211   * Needs to be an almost-shallow clone, where the declarations are cloned only if needed
    212   * **TODO** port `DeclReplacer`
    213208* Still a `std::list` for children, rather than `std::vector`
    214209  * allows more-efficient splicing for purposes of later code generation
     
    229224  * `getAggr()` => `aggr()`
    230225    * also now returns `const AggregateDecl *`
    231 * `genericSubstitution()` moved to own visitor in `AST/GenericSubstitution.hpp` **TODO** write
     226* `genericSubstitution()` moved to own visitor in `AST/GenericSubstitution.hpp`
    232227
    233228`BasicType`
  • src/Makefile.in

    ref5ef56 r893e106  
    167167am__objects_1 = AST/Attribute.$(OBJEXT) AST/Convert.$(OBJEXT) \
    168168        AST/Decl.$(OBJEXT) AST/DeclReplacer.$(OBJEXT) \
    169         AST/Expr.$(OBJEXT) AST/Init.$(OBJEXT) \
    170         AST/LinkageSpec.$(OBJEXT) AST/Node.$(OBJEXT) \
    171         AST/Pass.$(OBJEXT) AST/Print.$(OBJEXT) AST/Stmt.$(OBJEXT) \
    172         AST/Type.$(OBJEXT) AST/TypeSubstitution.$(OBJEXT)
     169        AST/Expr.$(OBJEXT) AST/GenericSubstitution.$(OBJEXT) \
     170        AST/Init.$(OBJEXT) AST/LinkageSpec.$(OBJEXT) \
     171        AST/Node.$(OBJEXT) AST/Pass.$(OBJEXT) AST/Print.$(OBJEXT) \
     172        AST/Stmt.$(OBJEXT) AST/Type.$(OBJEXT) \
     173        AST/TypeSubstitution.$(OBJEXT)
    173174am__objects_2 = CodeGen/CodeGenerator.$(OBJEXT) \
    174175        CodeGen/FixMain.$(OBJEXT) CodeGen/GenType.$(OBJEXT) \
     
    574575        AST/DeclReplacer.cpp \
    575576        AST/Expr.cpp \
     577        AST/GenericSubstitution.cpp \
    576578        AST/Init.cpp \
    577579        AST/LinkageSpec.cpp \
     
    739741        AST/$(DEPDIR)/$(am__dirstamp)
    740742AST/Expr.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp)
     743AST/GenericSubstitution.$(OBJEXT): AST/$(am__dirstamp) \
     744        AST/$(DEPDIR)/$(am__dirstamp)
    741745AST/Init.$(OBJEXT): AST/$(am__dirstamp) AST/$(DEPDIR)/$(am__dirstamp)
    742746AST/LinkageSpec.$(OBJEXT): AST/$(am__dirstamp) \
     
    11731177@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/DeclReplacer.Po@am__quote@
    11741178@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/Expr.Po@am__quote@
     1179@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/GenericSubstitution.Po@am__quote@
    11751180@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/Init.Po@am__quote@
    11761181@AMDEP_TRUE@@am__include@ @am__quote@AST/$(DEPDIR)/LinkageSpec.Po@am__quote@
Note: See TracChangeset for help on using the changeset viewer.