Index: BasicCompiler32/Compile_Statement.cpp
===================================================================
--- BasicCompiler32/Compile_Statement.cpp	(revision 31)
+++ BasicCompiler32/Compile_Statement.cpp	(revision 34)
@@ -299,10 +299,10 @@
 
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
 
 	i2=CompileBuffer(ESC_ENDIF,0);
 
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 
@@ -325,10 +325,10 @@
 
 		//レキシカルスコープをレベルアップ
-		obj_LexScopes.LevelUp(obp);
+		obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
 
 		CompileBuffer(ESC_ENDIF,0);
 
 		//レキシカルスコープをレベルダウン
-		obj_LexScopes.LevelDown();
+		obj_LexScopes.End();
 
 
@@ -402,10 +402,6 @@
 }
 void OpcodeWhile(char *Parameter){
-	extern DWORD *pExitWhileSchedule;
-	extern int ExitWhileScheduleNum;
 	extern HANDLE hHeap;
 	int i2,i3,type;
-	DWORD *lpdwTemp;
-	int TempNum;
 
 	//Continueアドレスのバックアップとセット
@@ -550,17 +546,11 @@
 	}
 
-	//ExitWhileスケジュールの準備
-	lpdwTemp=pExitWhileSchedule;
-	TempNum=ExitWhileScheduleNum;
-	pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
-	ExitWhileScheduleNum=0;
-
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_WHILE );
 
 	//While内をコンパイル
 	CompileBuffer(0,COM_WEND);
 
-	CallDestrouctorsOfScope();
+	obj_LexScopes.CallDestructorsOfScopeEnd();
 
 	//jmp ...
@@ -569,14 +559,6 @@
 	obp+=sizeof(long);
 
-	//ExitWhileスケジュール
-	for(i2=0;i2<ExitWhileScheduleNum;i2++){
-		*((long *)(OpBuffer+pExitWhileSchedule[i2]))=obp-(pExitWhileSchedule[i2]+sizeof(long));
-	}
-	HeapDefaultFree(pExitWhileSchedule);
-	pExitWhileSchedule=lpdwTemp;
-	ExitWhileScheduleNum=TempNum;
-
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 	*((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule;	//jeジャンプ先のオフセット値
@@ -585,30 +567,8 @@
 	dwContinueAddress=dwTempContinue;
 }
-void OpcodeExitWhile(void){
-	extern DWORD *pExitWhileSchedule;
-	extern int ExitWhileScheduleNum;
-	extern HANDLE hHeap;
-
-	if(!pExitWhileSchedule){
-		SetError(12,"Exit While",cp);
-		return;
-	}
-
-	//jmp ...(Wend addr)
-	OpBuffer[obp++]=(char)0xE9;
-
-	pExitWhileSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitWhileSchedule,(ExitWhileScheduleNum+1)*sizeof(DWORD));
-	pExitWhileSchedule[ExitWhileScheduleNum]=obp;
-	ExitWhileScheduleNum++;
-
-	obp+=sizeof(long);
-}
+
 char szNextVariable[VN_SIZE];
 void OpcodeFor(char *Parameter){
-	extern DWORD *pExitForSchedule;
-	extern int ExitForScheduleNum;
 	extern HANDLE hHeap;
-	DWORD *lpdwTemp;
-	int TempNum;
 	int i,i2,i3;
 	char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
@@ -717,17 +677,11 @@
 	obp+=sizeof(long);
 
-	//ExitForスケジュールの準備
-	lpdwTemp=pExitForSchedule;
-	TempNum=ExitForScheduleNum;
-	pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
-	ExitForScheduleNum=0;
-
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_FOR );
 
 	//For内をコンパイル
 	CompileBuffer(0,COM_NEXT);
 
-	CallDestrouctorsOfScope();
+	obj_LexScopes.CallDestructorsOfScopeEnd();
 
 	if(szNextVariable[0]){
@@ -742,14 +696,6 @@
 	obp+=sizeof(long);
 
-	//ExitForスケジュール
-	for(i=0;i<ExitForScheduleNum;i++){
-		*((long *)(OpBuffer+pExitForSchedule[i]))=obp-(pExitForSchedule[i]+sizeof(long));
-	}
-	HeapDefaultFree(pExitForSchedule);
-	pExitForSchedule=lpdwTemp;
-	ExitForScheduleNum=TempNum;
-
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 	*((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
@@ -758,39 +704,10 @@
 	dwContinueAddress=dwTempContinue;
 }
-void OpcodeExitFor(void){
-	extern DWORD *pExitForSchedule;
-	extern int ExitForScheduleNum;
-	extern HANDLE hHeap;
-
-	if(!pExitForSchedule){
-		SetError(12,"Exit For",cp);
-		return;
-	}
-
-	//jmp ...(Next addr)
-	OpBuffer[obp++]=(char)0xE9;
-
-	pExitForSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitForSchedule,(ExitForScheduleNum+1)*sizeof(DWORD));
-	pExitForSchedule[ExitForScheduleNum]=obp;
-	ExitForScheduleNum++;
-
-	obp+=sizeof(long);
-}
 
 void OpcodeDo(char *Parameter){
-	extern DWORD *pExitDoSchedule;
-	extern int ExitDoScheduleNum;
 	extern HANDLE hHeap;
 	int i,i2,i3,i4,type;
-	DWORD *lpdwTemp;
-	int TempNum;
 
 	if(Parameter[0]) SetError(10,"Do",cp);
-
-	//ExitDoスケジュールの準備
-	lpdwTemp=pExitDoSchedule;
-	TempNum=ExitDoScheduleNum;
-	pExitDoSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
-	ExitDoScheduleNum=0;
 
 	//Continueアドレスのバックアップとセット
@@ -801,10 +718,10 @@
 
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_DO );
 
 	//Do内をコンパイル
 	CompileBuffer(0,COM_LOOP);
 
-	CallDestrouctorsOfScope();
+	obj_LexScopes.CallDestructorsOfScopeEnd();
 
 	extern char *basbuf;
@@ -1007,14 +924,6 @@
 	obp+=sizeof(long);
 
-	//ExitDoスケジュール
-	for(i=0;i<ExitDoScheduleNum;i++){
-		*((long *)(OpBuffer+pExitDoSchedule[i]))=obp-(pExitDoSchedule[i]+sizeof(long));
-	}
-	HeapDefaultFree(pExitDoSchedule);
-	pExitDoSchedule=lpdwTemp;
-	ExitDoScheduleNum=TempNum;
-
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 	*((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値
@@ -1023,23 +932,4 @@
 	//Continueアドレスを復元
 	dwContinueAddress=dwTempContinue;
-}
-void OpcodeExitDo(void){
-	extern HANDLE hHeap;
-	extern DWORD *pExitDoSchedule;
-	extern int ExitDoScheduleNum;
-
-	if(!pExitDoSchedule){
-		SetError(12,"Exit Do",cp);
-		return;
-	}
-
-	//jmp ...(Loop addr)
-	OpBuffer[obp++]=(char)0xE9;
-
-	pExitDoSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitDoSchedule,(ExitDoScheduleNum+1)*sizeof(DWORD));
-	pExitDoSchedule[ExitDoScheduleNum]=obp;
-	ExitDoScheduleNum++;
-
-	obp+=sizeof(long);
 }
 void OpcodeContinue(void){
@@ -1068,4 +958,7 @@
 		return;
 	}
+
+	//未解放のローカルオブジェクトのデストラクタを呼び出す
+	obj_LexScopes.CallDestructorsOfReturn();
 
 	//jmp ...(End Sub/Function)
@@ -1354,5 +1247,5 @@
 
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT );
 
 	//Select Case内をコンパイル
@@ -1371,5 +1264,5 @@
 
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 	pCaseSchedule=temp_pCaseSchedule;
