Changeset 75 in dev for BasicCompiler_Common/LexicalScoping.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/LexicalScoping.cpp
r73 r75 85 85 CallDestructorsOfScopeEnd(); 86 86 87 extern BOOL bCompilingGlobal; 88 VARIABLE *pVar; 89 int num; 90 if(bCompilingGlobal){ 91 //グローバル領域をコンパイルしているとき 92 extern VARIABLE *GlobalVar; 93 extern int MaxGlobalVarNum; 94 pVar=GlobalVar; 95 num=MaxGlobalVarNum; 96 } 97 else{ 98 //ローカル領域をコンパイルしているとき 99 extern VARIABLE *LocalVar; 100 extern int MaxLocalVarNum; 101 pVar=LocalVar; 102 num=MaxLocalVarNum; 103 } 87 Variables &vars = UserProc::IsGlobalAreaCompiling()? 88 globalVars : 89 UserProc::CompilingUserProc().localVars; 104 90 105 91 //使用済みローカル変数の生存チェックを外す 106 for (int i=0;i<num;i++){107 if(pVar [i].bLiving&&pVar[i].ScopeLevel==level){108 pVar [i].bLiving=0;92 foreach( Variable *pVar, vars ){ 93 if(pVar->bLiving&&pVar->ScopeLevel==level){ 94 pVar->bLiving=0; 109 95 extern int obp; 110 pVar [i].ScopeEndAddress=obp;96 pVar->ScopeEndAddress=obp; 111 97 } 112 98 } … … 163 149 // スコープ終了時のデストラクタ呼び出し 164 150 void CLexicalScopes::CallDestructorsOfScopeEnd(){ 165 extern BOOL bCompilingGlobal; 166 VARIABLE *pVar; 167 int num; 168 if(bCompilingGlobal){ 169 //グローバルオブジェクトの解放処理 170 extern VARIABLE *GlobalVar; 171 extern int MaxGlobalVarNum; 172 pVar=GlobalVar; 173 num=MaxGlobalVarNum; 174 } 175 else{ 176 //ローカルオブジェクトの解放処理 177 extern VARIABLE *LocalVar; 178 extern int MaxLocalVarNum; 179 pVar=LocalVar; 180 num=MaxLocalVarNum; 181 } 151 152 Variables &vars = UserProc::IsGlobalAreaCompiling()? 153 globalVars : 154 UserProc::CompilingUserProc().localVars; 182 155 183 156 184 157 int i3; 185 158 int indexSystemGC=-1; 186 for( i3 = num - 1; i3 >= 0; i3-- ){ //確保したのと逆順序で解放するため、バックサーチにする 187 188 if( bCompilingGlobal && GetNowLevel() == 0 ){ 189 if(lstrcmp(pVar[i3].name,"_System_GC")==0){ 159 for( i3 = (int)vars.size() - 1; i3 >= 0; i3-- ){ //確保したのと逆順序で解放するため、バックサーチにする 160 161 Variable *pVar = vars[i3]; 162 163 if( UserProc::IsGlobalAreaCompiling() && GetNowLevel() == 0 ){ 164 if( pVar->GetName() == "_System_GC" ){ 190 165 indexSystemGC=i3; 191 166 continue; … … 194 169 195 170 //同一レベルのレキシカルスコープのみを検知 196 if(!pVar [i3].bLiving) continue;197 if( pVar [i3].ScopeLevel != GetNowLevel() ) continue;198 199 if( pVar[i3].type==DEF_STRUCT&&pVar[i3].fRef&OBJECT_PARAMETER){171 if(!pVar->bLiving) continue; 172 if( pVar->ScopeLevel != GetNowLevel() ) continue; 173 174 if( pVar->IsStruct() && pVar->IsParameter() ){ 200 175 //構造体パラメータを持つとき 201 176 … … 207 182 //mov rcx,qword ptr[rsp+offset] 208 183 op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP, 209 -pVar [i3].offset,184 -pVar->offset, 210 185 MOD_BASE_DISP32); 211 186 obp-=sizeof(long); … … 216 191 217 192 //mov ecx,dword ptr[ebp+offset] 218 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar [i3].offset,MOD_BASE_DISP32);193 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->offset,MOD_BASE_DISP32); 219 194 obp-=sizeof(long); 220 195 AddLocalVarAddrSchedule(); … … 226 201 227 202 //call free 228 extern SubInfo*pSub_free;203 extern UserProc *pSub_free; 229 204 op_call(pSub_free); 230 205 231 206 232 if( bCompilingGlobal){207 if( UserProc::IsGlobalAreaCompiling() ){ 233 208 //ここには来ないハズ 234 209 SetError(300,NULL,cp); 235 210 } 236 211 } 237 238 /*239 TODO: 消す240 else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){241 //デストラクタの呼び出し242 CMethod *method = pVar[i3].u.pobj_c->GetDestructorMethod();243 if( method ){244 int ss[MAX_ARRAYDIM];245 memset(ss,0,MAX_ARRAYDIM*sizeof(int));246 if(pVar[i3].SubScripts[0]!=-1){247 while(1){248 for(i4=0;;i4++){249 if(pVar[i3].SubScripts[i4]==-1) break;250 251 if(ss[i4]>pVar[i3].SubScripts[i4]){252 ss[i4]=0;253 ss[i4+1]++;254 }255 else break;256 }257 if(pVar[i3].SubScripts[i4]==-1) break;258 char temporary[VN_SIZE];259 sprintf(temporary,"%s[%d",pVar[i3].name,ss[0]);260 for(i4=1;;i4++){261 if(pVar[i3].SubScripts[i4]==-1) break;262 263 sprintf(temporary+lstrlen(temporary),",%d",ss[i4]);264 }265 lstrcat(temporary,"]");266 Opcode_CallProc("",method->psi,0,temporary,DEF_OBJECT);267 268 ss[0]++;269 270 271 //ネイティブコードバッファの再確保272 extern int obp_AllocSize;273 if(obp_AllocSize<obp+8192){274 obp_AllocSize+=8192;275 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea276 }277 }278 }279 else{280 Opcode_CallProc("",method->psi,0,pVar[i3].name,DEF_OBJECT);281 }282 }283 }284 */285 212 } 286 213 287 214 if(indexSystemGC!=-1){ 288 215 //_System_GCオブジェクトのデストラクタの呼び出し処理 289 CMethod *method = pVar[indexSystemGC].u.pobj_c->GetDestructorMethod();216 CMethod *method = vars[indexSystemGC]->GetClass().GetDestructorMethod(); 290 217 if( method ){ 291 Opcode_CallProc("",method->p si,0,pVar[indexSystemGC].name,DEF_OBJECT);218 Opcode_CallProc("",method->pUserProc,0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT); 292 219 } 293 220 }
Note:
See TracChangeset
for help on using the changeset viewer.