00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SAIL_VARIABLE_H_
00009 #define SAIL_VARIABLE_H_
00010
00011 #include "Symbol.h"
00012 #include <string>
00013 #include<map>
00014 using namespace std;
00015 #include "../il/variable.h"
00016 #include "../il/namespace_context.h"
00017
00018 #include <boost/serialization/vector.hpp>
00019 #include <boost/serialization/map.hpp>
00020 #include <boost/serialization/list.hpp>
00021 #include <boost/serialization/string.hpp>
00022 #include <boost/serialization/set.hpp>
00023 #include <boost/serialization/version.hpp>
00024 #include <boost/serialization/split_member.hpp>
00025 #include <boost/serialization/shared_ptr.hpp>
00026 #include <boost/serialization/base_object.hpp>
00027 #include <boost/serialization/export.hpp>
00028
00029 namespace il{
00030 class node;
00031 class variable_expression;
00032 class block;
00033 }
00034
00035
00036
00037 namespace sail {
00038
00044 class Variable:public Symbol {
00045 private:
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 il::node* original;
00061
00062
00063
00064
00065
00066 string name;
00067
00068 il::namespace_context ns;
00069
00073 string alias_name;
00074
00075 bool isTemp;
00076
00077 bool isRemovableTemp;
00078
00079
00080
00081
00082
00083 bool is_loop_exit;
00084
00085
00086
00087
00088
00089
00090 bool is_retvar;
00091
00092 il::type* var_type;
00093
00094 bool local;
00095 bool arg;
00096 int arg_num;
00097 bool global;
00098 bool is_static_var;
00099
00100
00101
00102 friend class boost::serialization::access;
00103 template<class Archive>
00104 void save(Archive & ar, const unsigned int version) const
00105 {
00106 ar & boost::serialization::base_object<sail::Symbol>(*this);
00107 ar & name;
00108 ar & ns;
00109 ar & alias_name;
00110 ar & isTemp;
00111 ar & isRemovableTemp;
00112 ar & is_loop_exit;
00113 ar & is_retvar;
00114 ar & var_type;
00115 ar & local;
00116 ar & arg;
00117 ar & arg_num;
00118 ar & global;
00119 ar & is_static_var;
00120 ar & original;
00121
00122 }
00123 template<class Archive>
00124 void load(Archive & ar, const unsigned int version)
00125 {
00126 ar & boost::serialization::base_object<sail::Symbol>(*this);
00127 ar & name;
00128 ar & ns;
00129 ar & alias_name;
00130 ar & isTemp;
00131 ar & isRemovableTemp;
00132 ar & is_loop_exit;
00133 ar & is_retvar;
00134 ar & var_type;
00135 il::type::register_loaded_typeref(&var_type);
00136 ar & local;
00137 ar & arg;
00138 ar & arg_num;
00139 ar & global;
00140 ar & is_static_var;
00141 ar & original;
00142
00143 }
00144 BOOST_SERIALIZATION_SPLIT_MEMBER()
00145
00146
00147
00148
00149
00150
00151
00152 public:
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 Variable(il::node* original, il::type* t);
00173
00174
00175
00176
00177
00178
00179 Variable(il::node* original, string alias_name, il::type* t);
00180
00181
00182
00183
00184
00185 Variable(string alias_name, il::type* t);
00186
00187
00188
00189
00190
00191 Variable(string special_temp_name, il::type* var_type, bool unused);
00192 Variable(){};
00193
00194 Variable* clone();
00195
00196 void set_alias_name(string alias_name);
00197
00198
00199 static Variable* get_return_variable(il::type* t);
00200 virtual string to_string() const;
00201 virtual string to_string(bool pretty_print) const;
00202 virtual il::node* get_original_node();
00203
00204
00205
00206
00207
00208 string get_unique_id();
00209
00210
00214
00215
00216
00217 virtual bool is_temp();
00218
00222 virtual bool is_removable_temp();
00223 virtual void set_removable(bool removable);
00224
00229 bool is_loop_exit_var();
00230
00234 virtual bool is_constant();
00238 virtual bool is_variable();
00239 virtual ~Variable();
00240 static string get_temp_name();
00241 static void clear_maps();
00242 il::type* get_type();
00243
00247 bool is_anonymous();
00248
00252 bool is_local();
00253
00257 bool is_argument();
00258
00262 int get_arg_number();
00263
00267 bool is_global();
00268
00273 bool is_return_variable();
00274
00278 string get_var_name();
00279
00283 const il::namespace_context& get_namespace() const;
00284
00285 void set_original(il::node* orig);
00286 bool operator==(const sail::Variable& other);
00287
00288 il::variable_declaration* get_declaration();
00289
00290 bool is_static();
00291
00295 bool is_synthesised_var();
00296
00297 protected:
00298
00299
00300
00301 Variable(il::type* t);
00302
00303 private:
00304 string get_name(string orig_name, il::block* b, il::scope_type st);
00305 void add_block(il::block* b);
00306 void initialize(il::node* original, il::type* t);
00307 void set_local_status();
00308 void set_arg_status();
00309 void set_global_status();
00310 void set_is_static();
00311 };
00312
00313 }
00314
00315 #endif