Index: trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp
===================================================================
--- trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp	(revision 537)
+++ trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp	(revision 676)
@@ -136,95 +136,104 @@
 
 	const PertialSchedule *pIfPertialSchedule = NULL;
-	if( !NumOpe(Parameter,Type(DEF_BOOLEAN),tempType) ){
-		//NumOpe内でエラー
-	}
-	else if( tempType.IsDouble() ){
-		//fld qword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
-
-		//push 0
-		compiler.codeGenerator.op_push_V(0);
-
-		//fild dword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
-
-		//add esp,sizeof(double)+sizeof(long)
-		compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
-
-		//fcompp
-		compiler.codeGenerator.op_fcompp();
-
-		//fnstsw ax
-		compiler.codeGenerator.op_fnstsw_ax();
-
-		//test ah,40
-		compiler.codeGenerator.op_test_ah( (char)0x40 );
-
-		//jne (endif、または else まで)
-		pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
-	}
-	else if( tempType.IsSingle() ){
-		//fld dword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
-
-		//push 0
-		compiler.codeGenerator.op_push_V(0);
-
-		//fild dword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
-
-		//add esp,sizeof(float)+sizeof(long)
-		compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
-
-		//fcompp
-		compiler.codeGenerator.op_fcompp();
-
-		//fnstsw ax
-		compiler.codeGenerator.op_fnstsw_ax();
-
-		//test ah,40
-		compiler.codeGenerator.op_test_ah( (char)0x40 );
-
-		//jne (endif、または else まで)
-		pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
-	}
-	else if( tempType.Is64() ){
-		//64ビット型
-
-		//pop eax
-		compiler.codeGenerator.op_pop(REG_EAX);
-
-		//pop ebx
-		compiler.codeGenerator.op_pop(REG_EBX);
-
-		//cmp eax,0
-		compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
-
-		//jne
-		const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
-
-		//cmp ebx,0
-		compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
-
-		//jne
-		const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
-
-		//jmp (endif、または else までジャンプ)
-		pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
-
-		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
-		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
-	}
-	else{
-		//32ビット型
-
-		//pop eax
-		compiler.codeGenerator.op_pop(REG_EAX);
-
-		//cmp eax,0
-		compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
-
-		//je (endif、または else まで条件ジャンプ)
-		pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+	bool isNeedHeapFreeStructure;
+	if( NumOpe( Parameter, Type(DEF_BOOLEAN), tempType, &isNeedHeapFreeStructure ) )
+	{
+		if( tempType.IsObject() )
+		{
+			// Boolean型にキャストする
+			Type booleanType( DEF_BOOLEAN );
+			CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
+			tempType = booleanType;
+		}
+
+		if( tempType.IsDouble() ){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(double)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (endif、または else まで)
+			pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.IsSingle() ){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(float)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (endif、または else まで)
+			pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.Is64() ){
+			//64ビット型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//cmp ebx,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//jmp (endif、または else までジャンプ)
+			pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+		}
+		else{
+			//32ビット型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//je (endif、または else まで条件ジャンプ)
+			pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+		}
 	}
 
@@ -359,95 +368,104 @@
 	const PertialSchedule *pWhilePertialSchedule = NULL;
 	Type tempType;
-	if( !NumOpe(Parameter,Type(),tempType) ){
-		//ダミー
-	}
-	else if( tempType.IsDouble() ){
-		//fld qword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
-
-		//push 0
-		compiler.codeGenerator.op_push_V(0);
-
-		//fild dword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
-
-		//add esp,sizeof(double)+sizeof(long)
-		compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
-
-		//fcompp
-		compiler.codeGenerator.op_fcompp();
-
-		//fnstsw ax
-		compiler.codeGenerator.op_fnstsw_ax();
-
-		//test ah,40
-		compiler.codeGenerator.op_test_ah( (char)0x40 );
-
-		//jne (Wend まで)
-		pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
-	}
-	else if( tempType.IsSingle() ){
-		//fld dword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
-
-		//push 0
-		compiler.codeGenerator.op_push_V(0);
-
-		//fild dword ptr[esp]
-		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
-
-		//add esp,sizeof(float)+sizeof(long)
-		compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
-
-		//fcompp
-		compiler.codeGenerator.op_fcompp();
-
-		//fnstsw ax
-		compiler.codeGenerator.op_fnstsw_ax();
-
-		//test ah,40h
-		compiler.codeGenerator.op_test_ah( (char)0x40 );
-
-		//jne (Wend まで)
-		pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
-	}
-	else if( tempType.Is64() ){
-		//64ビット型
-
-		//pop eax
-		compiler.codeGenerator.op_pop(REG_EAX);
-
-		//pop ebx
-		compiler.codeGenerator.op_pop(REG_EBX);
-
-		//cmp eax,0
-		compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
-
-		//jne
-		const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
-
-		//cmp ebx,0
-		compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
-
-		//jne
-		const 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{
-		//その他整数型
-
-		//pop eax
-		compiler.codeGenerator.op_pop(REG_EAX);
-
-		//cmp eax,0
-		compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
-
-		//je (Wend まで)
-		pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+	bool isNeedHeapFreeStructure;
+	if( NumOpe( Parameter, Type(), tempType, &isNeedHeapFreeStructure ) )
+	{
+		if( tempType.IsObject() )
+		{
+			// Boolean型にキャストする
+			Type booleanType( DEF_BOOLEAN );
+			CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
+			tempType = booleanType;
+		}
+
+		if( tempType.IsDouble() ){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(double)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (Wend まで)
+			pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.IsSingle() ){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(float)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40h
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (Wend まで)
+			pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.Is64() ){
+			//64ビット型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//cmp ebx,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
+
+			//jne
+			const 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{
+			//その他整数型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//je (Wend まで)
+			pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+		}
 	}
 
@@ -726,5 +744,14 @@
 
 			Type tempType;
-			NumOpe(temporary,Type(),tempType);
+			bool isNeedHeapFreeStructure;
+			NumOpe( temporary, Type(), tempType, &isNeedHeapFreeStructure );
+
+			if( tempType.IsObject() )
+			{
+				// Boolean型にキャストする
+				Type booleanType( DEF_BOOLEAN );
+				CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
+				tempType = booleanType;
+			}
 
 			if( tempType.IsDouble() ){
