source: src/SynTree/TupleExpr.cc @ 0873968c

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since 0873968c was bf4b4cf, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Remove argName from Expression.

If named arguments are ever considered again, they should be added in UntypedExpr? (and maybe also ApplicationExpr?) to avoid unnecessary fields in every Expression. Like designators on initializers, it should be much easier to work with argument names at the call expression level.

  • Property mode set to 100644
File size: 4.3 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// TupleExpr.cc --
8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Fri Mar 17 09:42:29 2017
13// Update Count     : 3
14//
15
16#include <cassert>              // for assert, strict_dynamic_cast, assertf
17#include <iterator>             // for next
18#include <list>                 // for list, _List_iterator
19#include <ostream>              // for ostream, operator<<, basic_ostream, endl
20#include <string>               // for operator<<, string, char_traits
21
22#include "Common/utility.h"     // for cloneAll, deleteAll, printAll, toString
23#include "Declaration.h"        // for ObjectDecl
24#include "Expression.h"         // for Expression, TupleExpr, TupleIndexExpr
25#include "SynTree/Label.h"      // for Label, noLabels
26#include "SynTree/Statement.h"  // for CompoundStmt, DeclStmt, ExprStmt, Sta...
27#include "Tuples/Tuples.h"      // for makeTupleType
28#include "Type.h"               // for TupleType, Type
29
30UntypedTupleExpr::UntypedTupleExpr( const std::list< Expression * > & exprs ) : Expression(), exprs( exprs ) {
31}
32
33UntypedTupleExpr::UntypedTupleExpr( const UntypedTupleExpr &other ) : Expression( other ) {
34        cloneAll( other.exprs, exprs );
35}
36
37UntypedTupleExpr::~UntypedTupleExpr() {
38        deleteAll( exprs );
39}
40
41void UntypedTupleExpr::print( std::ostream &os, Indenter indent ) const {
42        os << "Untyped Tuple:" << std::endl;
43        printAll( exprs, os, indent+1 );
44        Expression::print( os, indent );
45}
46
47TupleExpr::TupleExpr( const std::list< Expression * > & exprs ) : Expression(), exprs( exprs ) {
48        set_result( Tuples::makeTupleType( exprs ) );
49}
50
51TupleExpr::TupleExpr( const TupleExpr &other ) : Expression( other ) {
52        cloneAll( other.exprs, exprs );
53}
54
55TupleExpr::~TupleExpr() {
56        deleteAll( exprs );
57}
58
59void TupleExpr::print( std::ostream &os, Indenter indent ) const {
60        os << "Tuple:" << std::endl;
61        printAll( exprs, os, indent+1 );
62        Expression::print( os, indent );
63}
64
65TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index )  {
66        TupleType * type = strict_dynamic_cast< TupleType * >( tuple->get_result() );
67        assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d in expr %s", type->size(), index, toString( tuple ).c_str() );
68        set_result( (*std::next( type->get_types().begin(), index ))->clone() );
69        // like MemberExpr, TupleIndexExpr is always an lvalue
70        get_result()->set_lvalue( true );
71}
72
73TupleIndexExpr::TupleIndexExpr( const TupleIndexExpr &other ) : Expression( other ), tuple( other.tuple->clone() ), index( other.index ) {
74}
75
76TupleIndexExpr::~TupleIndexExpr() {
77        delete tuple;
78}
79
80void TupleIndexExpr::print( std::ostream &os, Indenter indent ) const {
81        os << "Tuple Index Expression, with tuple:" << std::endl;
82        os << indent+1;
83        tuple->print( os, indent+1 );
84        os << indent+1 << "with index: " << index << std::endl;
85        Expression::print( os, indent );
86}
87
88TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls ) : Expression() {
89        // convert internally into a StmtExpr which contains the declarations and produces the tuple of the assignments
90        set_result( Tuples::makeTupleType( assigns ) );
91        CompoundStmt * compoundStmt = new CompoundStmt( noLabels );
92        std::list< Statement * > & stmts = compoundStmt->get_kids();
93        for ( ObjectDecl * obj : tempDecls ) {
94                stmts.push_back( new DeclStmt( noLabels, obj ) );
95        }
96        TupleExpr * tupleExpr = new TupleExpr( assigns );
97        assert( tupleExpr->get_result() );
98        stmts.push_back( new ExprStmt( noLabels, tupleExpr ) );
99        stmtExpr = new StmtExpr( compoundStmt );
100}
101
102TupleAssignExpr::TupleAssignExpr( const TupleAssignExpr &other ) : Expression( other ) {
103        assert( other.stmtExpr );
104        stmtExpr = other.stmtExpr->clone();
105}
106
107TupleAssignExpr::~TupleAssignExpr() {
108        delete stmtExpr;
109}
110
111void TupleAssignExpr::print( std::ostream &os, Indenter indent ) const {
112        os << "Tuple Assignment Expression, with stmt expr:" << std::endl;
113        os << indent+1;
114        stmtExpr->print( os, indent+1 );
115        Expression::print( os, indent );
116}
117
118
119
120// Local Variables: //
121// tab-width: 4 //
122// mode: c++ //
123// compile-command: "make install" //
124// End: //
Note: See TracBrowser for help on using the repository browser.