Index: BasicCompiler_Common/LexicalScoping.cpp
===================================================================
--- BasicCompiler_Common/LexicalScoping.cpp	(revision 73)
+++ BasicCompiler_Common/LexicalScoping.cpp	(revision 75)
@@ -85,28 +85,14 @@
 	CallDestructorsOfScopeEnd();
 
-	extern BOOL bCompilingGlobal;
-	VARIABLE *pVar;
-	int num;
-	if(bCompilingGlobal){
-		//グローバル領域をコンパイルしているとき
-		extern VARIABLE *GlobalVar;
-		extern int MaxGlobalVarNum;
-		pVar=GlobalVar;
-		num=MaxGlobalVarNum;
-	}
-	else{
-		//ローカル領域をコンパイルしているとき
-		extern VARIABLE *LocalVar;
-		extern int MaxLocalVarNum;
-		pVar=LocalVar;
-		num=MaxLocalVarNum;
-	}
+	Variables &vars = UserProc::IsGlobalAreaCompiling()?
+		globalVars :
+		UserProc::CompilingUserProc().localVars;
 
 	//使用済みローカル変数の生存チェックを外す
-	for(int i=0;i<num;i++){
-		if(pVar[i].bLiving&&pVar[i].ScopeLevel==level){
-			pVar[i].bLiving=0;
+	foreach( Variable *pVar, vars ){
+		if(pVar->bLiving&&pVar->ScopeLevel==level){
+			pVar->bLiving=0;
 			extern int obp;
-			pVar[i].ScopeEndAddress=obp;
+			pVar->ScopeEndAddress=obp;
 		}
 	}
@@ -163,29 +149,18 @@
 // スコープ終了時のデストラクタ呼び出し
 void CLexicalScopes::CallDestructorsOfScopeEnd(){
-	extern BOOL bCompilingGlobal;
-	VARIABLE *pVar;
-	int num;
-	if(bCompilingGlobal){
-		//グローバルオブジェクトの解放処理
-		extern VARIABLE *GlobalVar;
-		extern int MaxGlobalVarNum;
-		pVar=GlobalVar;
-		num=MaxGlobalVarNum;
-	}
-	else{
-		//ローカルオブジェクトの解放処理
-		extern VARIABLE *LocalVar;
-		extern int MaxLocalVarNum;
-		pVar=LocalVar;
-		num=MaxLocalVarNum;
-	}
+
+	Variables &vars = UserProc::IsGlobalAreaCompiling()?
+		globalVars :
+		UserProc::CompilingUserProc().localVars;
 
 
 	int i3;
 	int indexSystemGC=-1;
-	for( i3 = num - 1; i3 >= 0; i3-- ){		//確保したのと逆順序で解放するため、バックサーチにする
-
-		if( bCompilingGlobal && GetNowLevel() == 0 ){
-			if(lstrcmp(pVar[i3].name,"_System_GC")==0){
+	for( i3 = (int)vars.size() - 1; i3 >= 0; i3-- ){		//確保したのと逆順序で解放するため、バックサーチにする
+
+		Variable *pVar = vars[i3];
+
+		if( UserProc::IsGlobalAreaCompiling() && GetNowLevel() == 0 ){
+			if( pVar->GetName() == "_System_GC" ){
 				indexSystemGC=i3;
 				continue;
@@ -194,8 +169,8 @@
 
 		//同一レベルのレキシカルスコープのみを検知
-		if(!pVar[i3].bLiving) continue;
-		if( pVar[i3].ScopeLevel != GetNowLevel() ) continue;
-
-		if(pVar[i3].type==DEF_STRUCT&&pVar[i3].fRef&OBJECT_PARAMETER){
+		if(!pVar->bLiving) continue;
+		if( pVar->ScopeLevel != GetNowLevel() ) continue;
+
+		if( pVar->IsStruct() && pVar->IsParameter() ){
 			//構造体パラメータを持つとき
 
@@ -207,5 +182,5 @@
 			//mov rcx,qword ptr[rsp+offset]
 			op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,
-				-pVar[i3].offset,
+				-pVar->offset,
 				MOD_BASE_DISP32);
 			obp-=sizeof(long);
@@ -216,5 +191,5 @@
 
 			//mov ecx,dword ptr[ebp+offset]
-			op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar[i3].offset,MOD_BASE_DISP32);
+			op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->offset,MOD_BASE_DISP32);
 			obp-=sizeof(long);
 			AddLocalVarAddrSchedule();
@@ -226,68 +201,20 @@
 
 			//call free
-			extern SubInfo *pSub_free;
+			extern UserProc *pSub_free;
 			op_call(pSub_free);
 
 
-			if(bCompilingGlobal){
+			if( UserProc::IsGlobalAreaCompiling() ){
 				//ここには来ないハズ
 				SetError(300,NULL,cp);
 			}
 		}
-
-		/*
-		TODO: 消す
-		else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
-			//デストラクタの呼び出し
-			CMethod *method = pVar[i3].u.pobj_c->GetDestructorMethod();
-			if( method ){
-				int ss[MAX_ARRAYDIM];
-				memset(ss,0,MAX_ARRAYDIM*sizeof(int));
-				if(pVar[i3].SubScripts[0]!=-1){
-					while(1){
-						for(i4=0;;i4++){
-							if(pVar[i3].SubScripts[i4]==-1) break;
-
-							if(ss[i4]>pVar[i3].SubScripts[i4]){
-								ss[i4]=0;
-								ss[i4+1]++;
-							}
-							else break;
-						}
-						if(pVar[i3].SubScripts[i4]==-1) break;
-						char temporary[VN_SIZE];
-						sprintf(temporary,"%s[%d",pVar[i3].name,ss[0]);
-						for(i4=1;;i4++){
-							if(pVar[i3].SubScripts[i4]==-1) break;
-
-							sprintf(temporary+lstrlen(temporary),",%d",ss[i4]);
-						}
-						lstrcat(temporary,"]");
-						Opcode_CallProc("",method->psi,0,temporary,DEF_OBJECT);
-
-						ss[0]++;
-
-
-						//ネイティブコードバッファの再確保
-						extern int obp_AllocSize;
-						if(obp_AllocSize<obp+8192){
-							obp_AllocSize+=8192;
-							OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
-						}
-					}
-				}
-				else{
-					Opcode_CallProc("",method->psi,0,pVar[i3].name,DEF_OBJECT);
-				}
-			}
-		}
-		*/
 	}
 
 	if(indexSystemGC!=-1){
 		//_System_GCオブジェクトのデストラクタの呼び出し処理
-		CMethod *method = pVar[indexSystemGC].u.pobj_c->GetDestructorMethod();
+		CMethod *method = vars[indexSystemGC]->GetClass().GetDestructorMethod();
 		if( method ){
-			Opcode_CallProc("",method->psi,0,pVar[indexSystemGC].name,DEF_OBJECT);
+			Opcode_CallProc("",method->pUserProc,0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
 		}
 	}
