Index: BasicCompiler64/Compile_Statement.cpp
===================================================================
--- BasicCompiler64/Compile_Statement.cpp	(revision 31)
+++ BasicCompiler64/Compile_Statement.cpp	(revision 34)
@@ -191,10 +191,10 @@
 
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
 
 	i2=CompileBuffer(ESC_ENDIF,0);
 
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 
@@ -215,10 +215,10 @@
 
 		//レキシカルスコープをレベルアップ
-		obj_LexScopes.LevelUp(obp);
+		obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
 
 		CompileBuffer(ESC_ENDIF,0);
 
 		//レキシカルスコープをレベルダウン
-		obj_LexScopes.LevelDown();
+		obj_LexScopes.End();
 
 
@@ -292,10 +292,6 @@
 }
 void OpcodeWhile(char *Parameter){
-	extern DWORD *pExitWhileSchedule;
-	extern int ExitWhileScheduleNum;
 	extern HANDLE hHeap;
 	int i2;
-	DWORD *lpdwTemp;
-	int TempNum;
 
 	//Continueアドレスのバックアップとセット
@@ -321,17 +317,11 @@
 	pobj_TempSchedule->lock(&je_schedule);
 
-	//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 ...
@@ -342,14 +332,6 @@
 	pobj_TempSchedule->unlock();
 
-	//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ジャンプ先のオフセット値
@@ -359,32 +341,11 @@
 	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];
+	bool isError = false;
 
 	//第１パラメータを取得
@@ -392,4 +353,5 @@
 	if(!Parameter[i]){
 		SetError(12,"For",cp);
+		isError = true;
 		goto ErrorStep;
 	}
@@ -405,4 +367,5 @@
 		if(temporary[i2]=='\0'){
 			SetError(12,"For",cp);
+			isError = true;
 			goto ErrorStep;
 		}
@@ -488,17 +451,11 @@
 	pobj_TempSchedule->lock(&je_schedule);
 
-	//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]){
@@ -512,17 +469,11 @@
 	*((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
 	obp+=sizeof(long);
-	pobj_TempSchedule->unlock();
-	pobj_TempSchedule->unlock();
-
-	//ExitForスケジュール
-	for(i=0;i<ExitForScheduleNum;i++){
-		*((long *)(OpBuffer+pExitForSchedule[i]))=obp-(pExitForSchedule[i]+sizeof(long));
-	}
-	HeapDefaultFree(pExitForSchedule);
-	pExitForSchedule=lpdwTemp;
-	ExitForScheduleNum=TempNum;
+	if( isError == false ){
+		pobj_TempSchedule->unlock();
+		pobj_TempSchedule->unlock();
+	}
 
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 	*((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
@@ -532,39 +483,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;
-	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アドレスのバックアップとセット
@@ -577,10 +499,10 @@
 
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_DO );
 
 	//Do内をコンパイル
 	CompileBuffer(0,COM_LOOP);
 
-	CallDestrouctorsOfScope();
+	obj_LexScopes.CallDestructorsOfScopeEnd();
 
 	extern char *basbuf;
@@ -637,14 +559,6 @@
 	pobj_TempSchedule->lock(&je_schedule);
 
-	//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ジャンプ先のオフセット値
@@ -653,23 +567,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){
@@ -698,4 +593,7 @@
 		return;
 	}
+
+	//未解放のローカルオブジェクトのデストラクタを呼び出す
+	obj_LexScopes.CallDestructorsOfReturn();
 
 	//jmp ...(End Sub/Function)
@@ -938,5 +836,5 @@
 
 	//レキシカルスコープをレベルアップ
-	obj_LexScopes.LevelUp(obp);
+	obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT );
 
 	//Select Case内をコンパイル
@@ -955,5 +853,5 @@
 
 	//レキシカルスコープをレベルダウン
-	obj_LexScopes.LevelDown();
+	obj_LexScopes.End();
 
 	pCaseSchedule=temp_pCaseSchedule;
@@ -1051,14 +949,5 @@
 	extern BOOL bCompilingGlobal;
 	if(bCompilingGlobal){
-		//Gosub～Returnとして扱う
-
-		//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
-		pobj_sf->push(REG_NON);
-		pobj_sf->ref(REG_RAX);
-		pobj_sf->pop(REG_NON);
-
-		//jmp rax
-		OpBuffer[obp++]=(char)0xFF;
-		OpBuffer[obp++]=(char)0xE0;
+		SetError(62,NULL,cp);
 	}
 	else{
