source: src/ResolvExpr/FindOpenVars.cc@ 09a767e

Last change on this file since 09a767e was 46da46b, checked in by Fangren Yu <f37yu@…>, 2 years ago

current progress

  • Property mode set to 100644
File size: 5.9 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// FindOpenVars.cc --
8//
9// Author : Richard C. Bilson
10// Created On : Sun May 17 09:42:48 2015
11// Last Modified By : Andrew
12// Last Modified On : Fri Jul 12 14:18:00 2019
13// Update Count : 4
14//
15
16#include "FindOpenVars.h"
17
18#include <list> // for _List_const_iterator, list<>::const...
19#include <map> // for map<>::mapped_type
20
21#include "AST/Pass.hpp"
22#include "AST/Type.hpp"
23#include "AST/TypeEnvironment.hpp"
24#include "Common/PassVisitor.h"
25#include "SynTree/Declaration.h" // for TypeDecl, DeclarationWithType (ptr ...
26#include "SynTree/Type.h" // for Type, Type::ForallList, ArrayType
27
28#include <iostream>
29
30namespace ResolvExpr {
31 struct FindOpenVars_old : public WithGuards {
32 FindOpenVars_old( OpenVarSet &openVars, OpenVarSet &closedVars, AssertionSet &needAssertions, AssertionSet &haveAssertions, bool firstIsOpen );
33
34 void previsit( const PointerType * pointerType );
35 void previsit( const ArrayType * arrayType );
36 void previsit( const FunctionType * functionType );
37 void previsit( const TupleType * tupleType );
38
39 void common_action( const Type *type );
40
41 OpenVarSet &openVars, &closedVars;
42 AssertionSet &needAssertions, &haveAssertions;
43 bool nextIsOpen;
44 };
45
46 void findOpenVars( const Type *type, OpenVarSet &openVars, OpenVarSet &closedVars, AssertionSet &needAssertions, AssertionSet &haveAssertions, bool firstIsOpen ) {
47 PassVisitor<FindOpenVars_old> finder( openVars, closedVars, needAssertions, haveAssertions, firstIsOpen );
48 type->accept( finder );
49 }
50
51 FindOpenVars_old::FindOpenVars_old( OpenVarSet &openVars, OpenVarSet &closedVars, AssertionSet &needAssertions, AssertionSet &haveAssertions, bool firstIsOpen )
52 : openVars( openVars ), closedVars( closedVars ), needAssertions( needAssertions ), haveAssertions( haveAssertions ), nextIsOpen( firstIsOpen ) {
53 }
54
55 void FindOpenVars_old::common_action( const Type * type ) {
56 if ( nextIsOpen ) {
57 for ( Type::ForallList::const_iterator i = type->forall.begin(); i != type->forall.end(); ++i ) {
58 openVars[ (*i)->get_name() ] = TypeDecl::Data{ (*i) };
59 for ( std::list< DeclarationWithType* >::const_iterator assert = (*i)->get_assertions().begin(); assert != (*i)->get_assertions().end(); ++assert ) {
60 needAssertions[ *assert ].isUsed = false;
61 }
62/// cloneAll( (*i)->get_assertions(), needAssertions );
63/// needAssertions.insert( needAssertions.end(), (*i)->get_assertions().begin(), (*i)->get_assertions().end() );
64 }
65 } else {
66 for ( Type::ForallList::const_iterator i = type->forall.begin(); i != type->forall.end(); ++i ) {
67 closedVars[ (*i)->get_name() ] = TypeDecl::Data{ (*i) };
68 for ( std::list< DeclarationWithType* >::const_iterator assert = (*i)->get_assertions().begin(); assert != (*i)->get_assertions().end(); ++assert ) {
69 haveAssertions[ *assert ].isUsed = false;
70 }
71/// cloneAll( (*i)->get_assertions(), haveAssertions );
72/// haveAssertions.insert( haveAssertions.end(), (*i)->get_assertions().begin(), (*i)->get_assertions().end() );
73 } // for
74 } // if
75/// std::cerr << "type is ";
76/// type->print( std::cerr );
77/// std::cerr << std::endl << "need is" << std::endl;
78/// printAssertionSet( needAssertions, std::cerr );
79/// std::cerr << std::endl << "have is" << std::endl;
80/// printAssertionSet( haveAssertions, std::cerr );
81 }
82
83 void FindOpenVars_old::previsit(const PointerType * pointerType) {
84 common_action( pointerType );
85 }
86
87 void FindOpenVars_old::previsit(const ArrayType * arrayType) {
88 common_action( arrayType );
89 }
90
91 void FindOpenVars_old::previsit(const FunctionType * functionType) {
92 common_action( functionType );
93 nextIsOpen = ! nextIsOpen;
94 GuardAction( [this](){ nextIsOpen = ! nextIsOpen; } );
95 }
96
97 void FindOpenVars_old::previsit(const TupleType * tupleType) {
98 common_action( tupleType );
99 }
100
101 namespace {
102 struct FindOpenVars_new final : public ast::WithGuards {
103 ast::OpenVarSet & open;
104 ast::OpenVarSet & closed;
105 ast::AssertionSet & need;
106 ast::AssertionSet & have;
107 ast::TypeEnvironment & env;
108 bool nextIsOpen;
109
110 FindOpenVars_new(
111 ast::OpenVarSet & o, ast::OpenVarSet & c, ast::AssertionSet & n,
112 ast::AssertionSet & h, ast::TypeEnvironment & env, FirstMode firstIsOpen )
113 : open( o ), closed( c ), need( n ), have( h ), env (env), nextIsOpen( firstIsOpen ) {}
114
115 void previsit( const ast::FunctionType * type ) {
116 // mark open/closed variables
117 if ( nextIsOpen ) {
118 // trying to remove this from resolver.
119 // occasionally used in other parts so not deleting right now.
120
121 // insert open variables unbound to environment.
122 env.add(type->forall);
123
124 for ( auto & decl : type->forall ) {
125 open[ *decl ] = ast::TypeData{ decl->base };
126 }
127 for ( auto & assert : type->assertions ) {
128 need[ assert ].isUsed = false;
129 }
130 } else {
131 for ( auto & decl : type->forall ) {
132 closed[ *decl ] = ast::TypeData{ decl->base };
133 }
134 for ( auto & assert : type->assertions ) {
135 have[ assert ].isUsed = false;
136 }
137 }
138
139 // flip open variables for contained function types
140 nextIsOpen = ! nextIsOpen;
141 GuardAction( [this](){ nextIsOpen = ! nextIsOpen; } );
142 }
143
144 };
145 }
146
147 void findOpenVars(
148 const ast::Type * type, ast::OpenVarSet & open, ast::OpenVarSet & closed,
149 ast::AssertionSet & need, ast::AssertionSet & have, ast::TypeEnvironment & env, FirstMode firstIsOpen ) {
150 ast::Pass< FindOpenVars_new > finder{ open, closed, need, have, env, firstIsOpen };
151 type->accept( finder );
152
153 if (!closed.empty()) {
154 std::cerr << "closed: ";
155 for (auto& i : closed) {
156 std::cerr << i.first.base->location << ":" << i.first.base->name << ' ';
157 }
158 std::cerr << std::endl;
159 }
160 }
161} // namespace ResolvExpr
162
163// Local Variables: //
164// tab-width: 4 //
165// mode: c++ //
166// compile-command: "make install" //
167// End: //
Note: See TracBrowser for help on using the repository browser.