Index: trunk/abdev/BasicCompiler32/Compile_Statement.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Statement.cpp	(revision 236)
+++ trunk/abdev/BasicCompiler32/Compile_Statement.cpp	(revision 241)
@@ -126,5 +126,5 @@
 
 void OpcodeIf(char *Parameter){
-	int i,i2,i3,i4;
+	int i,i2;
 	Type tempType;
 
@@ -140,7 +140,7 @@
 	}
 
+	CodeGenerator::PertialSchedule *pIfPertialSchedule = NULL;
 	if( !NumOpe(Parameter,Type(),tempType) ){
 		//NumOpe内でエラー
-		i3=-1;	//ダミー
 	}
 	else if( tempType.IsDouble() ){
@@ -167,10 +167,5 @@
 
 		//jne (endif、または else まで)
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-
-		//jneの番地
-		i3=obp;
+		pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
 	}
 	else if( tempType.IsSingle() ){
@@ -197,10 +192,5 @@
 
 		//jne (endif、または else まで)
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-
-		//jneの番地
-		i3=obp;
+		pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
 	}
 	else if( tempType.Is64() ){
@@ -217,9 +207,5 @@
 
 		//jne
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-		i3=obp;
-
+		CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
 
 		//cmp ebx,0
@@ -227,20 +213,11 @@
 
 		//jne
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-		i4=obp;
-
-
+		CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
 
 		//jmp (endif、または else までジャンプ)
-		OpBuffer[obp++]=(char)0xE9;
-		obp+=sizeof(long);
-
-		*((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
-		*((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
-
-		//jmpの番地
-		i3=obp;
+		pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
 	}
 	else{
@@ -254,10 +231,5 @@
 
 		//je (endif、または else まで条件ジャンプ)
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x84;
-		obp+=sizeof(long);
-
-		//jeの番地
-		i3=obp;
+		pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
 	}
 
@@ -276,14 +248,11 @@
 
 
-	if(i3==-1) return;
+	if( pIfPertialSchedule == NULL ) return;
 
 	if(i2==ESC_ELSE){
 		//jmp (endifまで)
-		OpBuffer[obp++]=(char)0xE9;
-		obp+=sizeof(long);
-
-		*((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;	//ifからelseへのジャンプ先のオフセット値
-
-		i3=obp;
+		CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
 
 
@@ -301,8 +270,8 @@
 
 
-		*((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;	//jmpジャンプ先のオフセット値
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
 	}
 	else{
-		*((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;	//jeジャンプ先のオフセット値
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
 	}
 }
@@ -371,19 +340,14 @@
 void OpcodeWhile(char *Parameter){
 	extern HANDLE hHeap;
-	int i2,i3 = 0;
 
 	//Continueアドレスのバックアップとセット
-	extern DWORD dwContinueAddress;
-	DWORD dwTempContinue;
-	dwTempContinue=dwContinueAddress;
-	dwContinueAddress=obp;
+	compiler.codeGenerator.ContinueAreaBegin();
 
 	if(!Parameter[0]) SetError(10,"While",cp);
 
-	int je_schedule;
+	CodeGenerator::PertialSchedule *pWhilePertialSchedule = NULL;
 	Type tempType;
 	if( !NumOpe(Parameter,Type(),tempType) ){
 		//ダミー
-		i3=-1;
 	}
 	else if( tempType.IsDouble() ){
@@ -410,10 +374,5 @@
 
 		//jne (Wend まで)
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-
-		//jeの番地
-		je_schedule=obp;
+		pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
 	}
 	else if( tempType.IsSingle() ){
@@ -436,14 +395,9 @@
 		compiler.codeGenerator.op_fnstsw_ax();
 
-		//test ah,40
+		//test ah,40h
 		compiler.codeGenerator.op_test_ah( (char)0x40 );
 
 		//jne (Wend まで)
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-
-		//jeの番地
-		je_schedule=obp;
+		pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
 	}
 	else if( tempType.Is64() ){
@@ -460,9 +414,5 @@
 
 		//jne
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-		i2=obp;
-
+		CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
 
 		//cmp ebx,0
@@ -470,19 +420,11 @@
 
 		//jne
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x85;
-		obp+=sizeof(long);
-		i3=obp;
-
-
-		//jmp (endif、または else までジャンプ)
-		OpBuffer[obp++]=(char)0xE9;
-		obp+=sizeof(long);
-
-		*((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
-		*((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
-
-		//jmpの番地
-		je_schedule=obp;
+		CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+		//jmp (Wendまでジャンプ)
+		pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
 	}
 	else{
@@ -496,10 +438,5 @@
 
 		//je (Wend まで)
-		OpBuffer[obp++]=(char)0x0F;
-		OpBuffer[obp++]=(char)0x84;
-		obp+=sizeof(long);
-
-		//実行中の番地
-		je_schedule=obp;
+		pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
 	}
 
@@ -512,20 +449,16 @@
 	GetLexicalScopes().CallDestructorsOfScopeEnd();
 
-	if( i3 == -1 ){
-		return;
-	}
-
 	//jmp ...
-	OpBuffer[obp++]=(char)0xE9;
-	*((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
-	obp+=sizeof(long);
+	compiler.codeGenerator.op_jmp_continue();
 
 	//レキシカルスコープをレベルダウン
 	GetLexicalScopes().End();
 
-	*((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule;	//jeジャンプ先のオフセット値
-
-	//Continueアドレスを復元
-	dwContinueAddress=dwTempContinue;
+	if( pWhilePertialSchedule )
+	{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pWhilePertialSchedule );
+	}
+
+	compiler.codeGenerator.ContinueAreaEnd();
 }
 
@@ -533,5 +466,5 @@
 void OpcodeFor(char *Parameter){
 	extern HANDLE hHeap;
-	int i,i2,i3;
+	int i,i2;
 	char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
 
@@ -559,13 +492,8 @@
 
 	//jmp ...
-	OpBuffer[obp++]=(char)0xE9;
-	i2=obp;
-	obp+=sizeof(long);
+	CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
 
 	//Continueアドレスのバックアップとセット
-	extern DWORD dwContinueAddress;
-	DWORD dwTempContinue;
-	dwTempContinue=dwContinueAddress;
-	dwContinueAddress=obp;
+	compiler.codeGenerator.ContinueAreaBegin();
 
 	//第２パラメータを取得（to～）
@@ -583,5 +511,5 @@
 	OpcodeCalc(temporary);
 
-	*((long *)(OpBuffer+i2))=obp-(i2+sizeof(long));
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
 
 	//増加か減少かを区別する
@@ -596,8 +524,5 @@
 
 	//je [カウンタ減少の場合の判定]
-	OpBuffer[obp++]=(char)0x0F;
-	OpBuffer[obp++]=(char)0x84;
-	i2=obp;
-	obp+=sizeof(long);
+	pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
 
 	//判定（カウンタ増加の場合）
@@ -609,9 +534,8 @@
 
 	//jmp [カウンタ減少の場合の判定を飛び越す]
-	OpBuffer[obp++]=(char)0xE9;
-	i3=obp;
-	obp+=sizeof(long);
-
-	*((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
+	CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
 
 	//判定（カウンタ減少の場合）
@@ -622,5 +546,6 @@
 	compiler.codeGenerator.op_pop(REG_EAX);
 
-	*((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
+	//jmpジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
 
 	//cmp eax,0
@@ -630,8 +555,5 @@
 
 	//je ...
-	OpBuffer[obp++]=(char)0x0F;
-	OpBuffer[obp++]=(char)0x84;
-	int je_schedule=obp;
-	obp+=sizeof(long);
+	pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
 
 	//レキシカルスコープをレベルアップ
@@ -650,15 +572,14 @@
 
 	//jmp ...
-	OpBuffer[obp++]=(char)0xE9;
-	*((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
-	obp+=sizeof(long);
+	compiler.codeGenerator.op_jmp_continue();
 
 	//レキシカルスコープをレベルダウン
 	GetLexicalScopes().End();
 
-	*((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
 
 	//Continueアドレスを復元
-	dwContinueAddress=dwTempContinue;
+	compiler.codeGenerator.ContinueAreaEnd();
 }
 
@@ -670,8 +591,5 @@
 
 	//Continueアドレスのバックアップとセット
-	extern DWORD dwContinueAddress;
-	DWORD dwTempContinue;
-	dwTempContinue=dwContinueAddress;
-	dwContinueAddress=obp;
+	compiler.codeGenerator.ContinueAreaBegin();
 
 	//レキシカルスコープをレベルアップ
@@ -682,4 +600,6 @@
 
 	GetLexicalScopes().CallDestructorsOfScopeEnd();
+
+	CodeGenerator::PertialSchedule *pDoPertialSchedule = NULL;
 
 	extern char *basbuf;
@@ -731,6 +651,5 @@
 
 					//jne 5（ループ終了）
-					OpBuffer[obp++]=(char)0x75;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
 				}
 				else if(basbuf[i3]=='1'){
@@ -738,6 +657,5 @@
 
 					//je 5（ループ終了）
-					OpBuffer[obp++]=(char)0x74;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
 				}
 			}
@@ -768,6 +686,5 @@
 
 					//jne 5（ループ終了）
-					OpBuffer[obp++]=(char)0x75;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
 				}
 				else if(basbuf[i3]=='1'){
@@ -775,6 +692,5 @@
 
 					//je 5（ループ終了）
-					OpBuffer[obp++]=(char)0x74;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
 				}
 			}
@@ -812,6 +728,5 @@
 
 					//jmp 5（ループ終了）
-					OpBuffer[obp++]=(char)0xEB;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
 
 					*((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
@@ -829,6 +744,5 @@
 
 					//jmp 5（ループ終了）
-					OpBuffer[obp++]=(char)0xEB;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
 				}
 			}
@@ -844,6 +758,5 @@
 
 					//je 5（ループ終了）
-					OpBuffer[obp++]=(char)0x74;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
 				}
 				else if(basbuf[i3]=='1'){
@@ -851,6 +764,5 @@
 
 					//jne 5（ループ終了）
-					OpBuffer[obp++]=(char)0x75;
-					OpBuffer[obp++]=(char)0x05;
+					pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
 				}
 			}
@@ -860,7 +772,10 @@
 
 	//jmp ...
-	OpBuffer[obp++]=(char)0xE9;
-	*((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
-	obp+=sizeof(long);
+	compiler.codeGenerator.op_jmp_continue();
+
+	if( pDoPertialSchedule )
+	{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pDoPertialSchedule );
+	}
 
 	//jmp ...
@@ -876,19 +791,9 @@
 
 	//Continueアドレスを復元
-	dwContinueAddress=dwTempContinue;
+	compiler.codeGenerator.ContinueAreaEnd();
 }
 void OpcodeContinue(void){
-	extern DWORD dwContinueAddress;
-
-	if(dwContinueAddress==-1){
-		SetError(12,"Continue",cp);
-		return;
-	}
-
 	//jmp ...(Continue addr)
-	OpBuffer[obp++]=(char)0xE9;
-
-	*((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
-	obp+=sizeof(long);
+	compiler.codeGenerator.op_jmp_continue();
 }
 
