Index: BasicCompiler64/BasicCompiler.vcproj
===================================================================
--- BasicCompiler64/BasicCompiler.vcproj	(revision 31)
+++ BasicCompiler64/BasicCompiler.vcproj	(revision 34)
@@ -1482,5 +1482,13 @@
 					</File>
 					<File
-						RelativePath="..\BasicCompiler_Common\schedule.h"
+						RelativePath="..\BasicCompiler_Common\PESchedule.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Schedule.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Schedule.h"
 						>
 					</File>
Index: BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- BasicCompiler64/Compile_ProcOp.cpp	(revision 31)
+++ BasicCompiler64/Compile_ProcOp.cpp	(revision 34)
@@ -109,5 +109,5 @@
 		bCompilingGlobal=1;
 
-		CallDestrouctorsOfScope();
+		obj_LexScopes.CallDestructorsOfScopeEnd();
 
 		bCompilingGlobal=bBackCompilingGlobal;
@@ -700,16 +700,4 @@
 	}
 
-	//プロシージャ抜け出しスケジュール（Exit Sub/Function）
-	for(i3=0;i3<ExitSubScheduleNum;i3++){
-		*((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
-	}
-	HeapDefaultFree(pExitSubSchedule);
-
-	if(bDebugCompile&&bDebugSupportProc==0){
-		//call _DebugSys_EndProc
-		extern SUBINFO *pSub_DebugSys_EndProc;
-		op_call(pSub_DebugSys_EndProc);
-	}
-
 	//ラベル用のメモリを解放
 	for(i3=0;i3<MaxLabelNum;i3++){
@@ -744,5 +732,17 @@
 
 	//ローカルオブジェクト（レキシカルスコープレベル=0）の解放処理
-	CallDestrouctorsOfScope();
+	obj_LexScopes.CallDestructorsOfScopeEnd();
+
+	//プロシージャ抜け出しスケジュール（Exit Sub/Function）
+	for(i3=0;i3<ExitSubScheduleNum;i3++){
+		*((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));
+	}
+	HeapDefaultFree(pExitSubSchedule);
+
+	if(bDebugCompile&&bDebugSupportProc==0){
+		//call _DebugSys_EndProc
+		extern SUBINFO *pSub_DebugSys_EndProc;
+		op_call(pSub_DebugSys_EndProc);
+	}
 
 	if(psi->ReturnType!=-1){
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{
Index: BasicCompiler64/Compile_Var.cpp
===================================================================
--- BasicCompiler64/Compile_Var.cpp	(revision 31)
+++ BasicCompiler64/Compile_Var.cpp	(revision 34)
@@ -408,6 +408,8 @@
 
 		for(i=MaxLocalVarNum-1;i>=0;i--){	//レキシカルスコープを考慮してバックサーチ
-			if(LocalVar[i].bLiving){
-				if(lstrcmp(VarName,LocalVar[i].name)==0) break;
+			if( LocalVar[i].bLiving											//現在のスコープで有効なもの
+				&& LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()	//現在のスコープレベルを超さないもの（Returnによる解放処理中を考慮）
+				){
+					if(lstrcmp(VarName,LocalVar[i].name)==0) break;
 			}
 		}
@@ -564,6 +566,8 @@
 
 	for(i=MaxGlobalVarNum-1;i>=0;i--){	//レキシカルスコープを考慮してバックサーチ
-		if(GlobalVar[i].bLiving){
-			if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
+		if( GlobalVar[i].bLiving										//現在のスコープで有効なもの
+			&& GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()	//現在のスコープレベルを超さないもの（Returnによる解放処理中を考慮）
+			){
+				if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
 		}
 	}
Index: BasicCompiler64/Opcode.h
===================================================================
--- BasicCompiler64/Opcode.h	(revision 31)
+++ BasicCompiler64/Opcode.h	(revision 34)
@@ -411,9 +411,6 @@
 void OpcodeGoto(char *Parameter);
 void OpcodeWhile(char *Parameter);
-void OpcodeExitWhile(void);
 void OpcodeFor(char *Parameter);
-void OpcodeExitFor(void);
 void OpcodeDo(char *Parameter);
-void OpcodeExitDo(void);
 void OpcodeContinue(void);
 void OpcodeExitSub(void);
