Index: BasicCompiler32/CParameter.cpp
===================================================================
--- BasicCompiler32/CParameter.cpp	(revision 63)
+++ BasicCompiler32/CParameter.cpp	(revision 64)
@@ -2,13 +2,12 @@
 #include "opcode.h"
 
-void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
+int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
 	///////////////////////////////////////////////////////
 	// 一時オブジェクトをあらかじめスタックに積んでおく
 	///////////////////////////////////////////////////////
-	//TODO: 64ビットコードのままなので、32ビット用に書き換える
 
 	useTempObject = false;
 
-	//一時オブジェクトの数
+	//一時参照の数
 	nCountOfTempObjects = 0;
 
@@ -64,4 +63,15 @@
 				int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
 				//↑ここでスタックに積む
+
+				nCountOfTempObjects++;
+
+				if( type == DEF_OBJECT ){
+					//一時参照を作成
+
+					//push esp
+					op_push( REG_ESP );
+
+					nCountOfTempObjects++;
+				}
 
 				bool result = CheckDifferentType(
@@ -80,54 +90,41 @@
 					types[i2].u.lpIndex = lpVarIndex;
 				}
-
-				nCountOfTempObjects++;
-			}
-		}
-	}
+			}
+		}
+	}
+
+	return nCountOfTempObjects * PTR_SIZE;
 }
+
 void CParameter::DeleteTempParameters(){
 	///////////////////////////////////////////////////////
 	// 一時オブジェクトを破棄
 	///////////////////////////////////////////////////////
-	//TODO: 64ビットコードのままなので、32ビット用に書き換える
-
 	if( !useTempObject ) return;
 
 	for(int i2=ParmsNum-1;i2>=0;i2--){
 		if( useTempParameters[i2] ){
-			//スタックフレームから取得
-			// ※関数呼び出し時も値が普遍のebxを利用する
-			op_pop(REG_EBX);
-
-
-			///////////////////////////
-			// デストラクタを呼び出す
-			///////////////////////////
-
-			//push ebx
-			op_push(REG_EBX);
-
-			//call destructor
-			CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod();
-			if( method ){
-				op_call( method->psi );
-			}
-
-
-			/////////////////////////
-			// メモリを解放する
-			/////////////////////////
-
-			//push ebx
-			op_push(REG_EBX);
-
-			//call free
-			extern SUBINFO *pSub_free;
-			op_call(pSub_free);
+			if( types[i2].type == DEF_STRUCT ){
+				// 構造体の一時メモリ
+
+				//メモリを解放する
+
+				//call free
+				extern SUBINFO *pSub_free;
+				op_call(pSub_free);
+			}
+			else if( types[i2].type == DEF_OBJECT ){
+				op_pop( REG_NON );
+				op_pop( REG_NON );
+			}
+			else{
+				SetError(300,NULL,cp);
+			}
+
 		}
 	}
 }
 
-void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){
+void CParameter::SetStructParameter(CClass *pobj_Class,LPSTR Parameter){
 	int object_size = pobj_Class->GetSize();
 
@@ -143,8 +140,10 @@
 
 
-	TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
+	TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
 	TYPEINFO CalcType;
 	CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
 
+	/*
+	TODO: 消す
 	if( pobj_Class->GetCopyConstructorMethod()
 		&& CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
@@ -185,9 +184,12 @@
 		}
 	}
-	else{
+	else{*/
+
+
 		//push eax
 		op_push(REG_EAX);
 
-
+/*
+			TODO: 消す
 			if( pobj_Class->GetConstructorMethod() ){
 				////////////////////////////////
@@ -201,14 +203,13 @@
 				op_call(pobj_Class->GetConstructorMethod()->psi);
 			}
-
-
-			TYPEINFO CalcType;
+*/
+
 			BOOL bUseHeap;
-			CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
-
-
-
-		SetObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
-	}
+			CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
+
+
+
+		SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
+	//}
 }
 
@@ -280,6 +281,6 @@
 			}
 
-			if(DummyTypeInfo.type==DEF_OBJECT){
-				SetObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
+			if(DummyTypeInfo.type==DEF_STRUCT){
+				SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
 				goto next;
 			}
@@ -299,6 +300,11 @@
 
 			if(CalcType==DEF_OBJECT){
-				//キャスト演算子のオーバーロードに対応する
-				CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+				if( DummyTypeInfo.type != DEF_OBJECT
+					||
+					DummyTypeInfo.type == DEF_OBJECT &&
+					!DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
+						//キャスト演算子のオーバーロードに対応する
+						CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+				}
 			}
 
@@ -328,5 +334,5 @@
 				ParmSize+=sizeof(long)*2;
 			}
-			else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||
+			else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||
 				(IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
 				ChangeTypeToLong(CalcType);
@@ -354,39 +360,13 @@
 			}
 			else{
-				//変数のアドレスを取得
-				int VarType;
-				LONG_PTR lpVarIndex;
-				if(GetVarOffset(
-					false,
-					false,
-					Parms[i2],
-					&VarType,
-					&RelativeVar,
-					&lpVarIndex)){
-						if(DummyTypeInfo.type!=DEF_ANY){
-							//型チェックを行う
-							if(DummyTypeInfo.type==VarType){
-								if(DummyTypeInfo.type==DEF_OBJECT){
-									if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
-										SetError(11,Parms[i2],cp);
-									}
-								}
-							}
-							else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
-								//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
-							}
-							else{
-								SetError(11,Parms[i2],cp);
-							}
-						}
-
-						//変数アドレスをレジスタにセット
-						SetVarPtrToEax(&RelativeVar);
-
-						//push eax
-						op_push(REG_EAX);
-				}
-				else{
+				if( useTempParameters[i2] ){
 					//一時オブジェクトをコピー
+
+					if( types[i2].type == DEF_OBJECT ){
+						// 一時参照のための領域を考慮する
+						nCountOfNowTempObjects++;
+					}
+
+					nCountOfNowTempObjects++;
 
 					//mov eax, dword ptr[esp+offset]
@@ -395,13 +375,49 @@
 						REG_EAX,
 						REG_ESP,
-						( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE,
+						( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,
 						MOD_BASE_DISP32 );
-
-					nCountOfNowTempObjects++;
 
 					//push eax
 					op_push(REG_EAX);
-
-					//VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
+				}
+				else{
+					//変数のアドレスを取得
+					int VarType;
+					LONG_PTR lpVarIndex;
+					if(GetVarOffset(
+						false,
+						false,
+						Parms[i2],
+						&VarType,
+						&RelativeVar,
+						&lpVarIndex)){
+							if(DummyTypeInfo.type!=DEF_ANY){
+								//型チェックを行う
+								if(DummyTypeInfo.type==VarType){
+									if(DummyTypeInfo.type==DEF_OBJECT){
+										if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
+											SetError(11,Parms[i2],cp);
+										}
+									}
+									else if(DummyTypeInfo.type==DEF_STRUCT){
+										if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
+											SetError(11,Parms[i2],cp);
+										}
+									}
+								}
+								else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
+									//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
+								}
+								else{
+									SetError(11,Parms[i2],cp);
+								}
+							}
+
+							//変数アドレスをレジスタにセット
+							SetVarPtrToEax(&RelativeVar);
+
+							//push eax
+							op_push(REG_EAX);
+					}
 				}
 			}
