source: dev/BasicCompiler_Common/Variable.h@ 82

Last change on this file since 82 was 75, checked in by dai_9181, 18 years ago

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File size: 3.5 KB
Line 
1
2class Variable : public Type
3{
4 string name;
5 bool isConst;
6 bool isRef;
7 bool isArray;
8 int subScripts[MAX_ARRAYDIM];
9
10 bool isParameter;
11
12public:
13 Variable( const string &name, const Type &type, bool isConst = false, bool isRef = false ):
14 Type( type ),
15 name( name ),
16 isConst( isConst ),
17 isRef( isRef ),
18 isArray( false ),
19 isParameter( false)
20 {
21 subScripts[0] = -1;
22 }
23 Variable( const Variable &var ):
24 Type( var ),
25 name( var.name ),
26 isConst( var.isConst ),
27 isRef( var.isRef ),
28 isArray( false ),
29 isParameter( false )
30 {
31 subScripts[0] = -1;
32 if( var.isArray ){
33 SetArray( var.subScripts );
34 }
35 }
36 ~Variable(){}
37
38 void SetArray( const int *pSubScripts ){
39 isArray = true;
40 memcpy( this->subScripts, pSubScripts, sizeof(int) * MAX_ARRAYDIM );
41 }
42
43 const string &GetName() const
44 {
45 return name;
46 }
47
48 void ConstOff(){
49 isConst = false;
50 }
51 void ConstOn(){
52 isConst = true;
53 }
54 bool IsConst() const
55 {
56 return isConst;
57 }
58 bool IsRef() const
59 {
60 return isRef;
61 }
62 bool IsArray()const
63 {
64 return isArray;
65 }
66 const int *GetSubScriptsPtr() const
67 {
68 return subScripts;
69 }
70
71 void ThisIsParameter(){
72 isParameter = true;
73 }
74 bool IsParameter() const
75 {
76 return isParameter;
77 }
78
79
80 int GetMemorySize() const
81 {
82 if( isRef || isParameter ){
83 return PTR_SIZE;
84 }
85
86 int size = Type::GetSize();
87
88 if( isArray ){
89 int num = 1;
90 for( int i=0; i<MAX_ARRAYDIM; i++){
91 if(subScripts[i]==-1) break;
92 num *= subScripts[i]+1;
93 }
94 size *= num;
95 }
96
97 if( size % PTR_SIZE ){
98 size += PTR_SIZE-(size%PTR_SIZE);
99 }
100
101 return size;
102 }
103
104
105 /* --- オフセット ---
106
107 ※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
108 初期バッファの有無が識別される。
109 (その後、スケジュール実行により、実際の配置に並び替えられる)*/
110 int offset;
111
112 //コンストラクタ用パラメータ
113 string paramStrForConstructor;
114
115 //レキシカルスコープ用
116 int ScopeStartAddress;
117 int ScopeEndAddress;
118 int ScopeLevel;
119 BOOL bLiving;
120
121
122 int source_code_address;
123};
124
125class Variables : public vector<Variable *>
126{
127public:
128 Variables(){}
129 ~Variables(){
130 clear();
131 }
132
133 void clear(){
134 for( int i=0; i<(int)this->size(); i++ ){
135 delete (*this)[i];
136 }
137
138 vector<Variable *>::clear();
139 }
140
141 bool DuplicateCheck( const string &varName ) const
142 {
143 //レキシカルスコープを考慮して重複判定
144 for( int i=(int)this->size()-1; i>=0 ; i-- ){
145 Variable &var = *(*this)[i];
146 if( var.bLiving //現在のスコープで有効なもの
147 && var.ScopeLevel == obj_LexScopes.GetNowLevel() //現在のスコープと同一レベル
148 ){
149 if( var.GetName() == varName ){
150 return true;
151 }
152 }
153 }
154 return false;
155 }
156
157 const Variable *BackSearch( const string &varName ) const
158 {
159 //レキシカルスコープを考慮してバックサーチ
160 for( int i=(int)this->size()-1; i>=0 ; i-- ){
161 Variable &var = *(*this)[i];
162 if( var.bLiving //現在のスコープで有効なもの
163 && var.ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
164 ){
165 if( var.GetName() == varName ){
166 return &var;
167 }
168 }
169 }
170 return NULL;
171 }
172
173 const Variable *Find( const string &varName )const
174 {
175 int max = (int)this->size();
176 for( int i=0; i<max; i++ ){
177 Variable *pVar = (*this)[i];
178 if( pVar->GetName() == varName ){
179 return pVar;
180 }
181 }
182 return NULL;
183 }
184};
185
186extern Variables globalVars;
187
188
Note: See TracBrowser for help on using the repository browser.