Index: BasicCompiler32/CParameter.cpp
===================================================================
--- BasicCompiler32/CParameter.cpp	(revision 11)
+++ BasicCompiler32/CParameter.cpp	(revision 20)
@@ -331,4 +331,119 @@
 }
 
+void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
+	///////////////////////////////////////////////////////
+	// 一時オブジェクトをあらかじめスタックに積んでおく
+	///////////////////////////////////////////////////////
+	//TODO: 64ビットコードのままなので、32ビット用に書き換える
+
+	useTempObject = false;
+
+	//一時オブジェクトの数
+	nCountOfTempObjects = 0;
+
+	BOOL bEllipse;
+	if(pi_num){
+		if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
+		else bEllipse=0;
+	}
+	else bEllipse=0;
+
+	for(int i2=ParmsNum-1;i2>=0;i2--){
+		useTempParameters[i2] = false;
+
+		if(bEllipse&&i2<=pi_num-2) bEllipse=0;
+
+		if(i2==0&&ppi[i2].name){
+			if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
+				//オブジェクトメンバの第一パラメータのThisポインタ
+				continue;
+			}
+		}
+		if((i2==0||i2==1)&&ppi[i2].name){
+			if(lstrcmp(ppi[i2].name,FuncName)==0){
+				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+				continue;
+			}
+		}
+
+		TYPEINFO DummyTypeInfo;
+		BOOL bByVal;
+		if(bEllipse){
+			DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+			bByVal=1;
+		}
+		else{
+			DummyTypeInfo.type=ppi[i2].type;
+			DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
+			bByVal=ppi[i2].bByVal;
+		}
+
+
+		if( !bByVal ){
+			//ポインタ参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				//ポインタ指定
+				continue;
+			}
+
+			LONG_PTR lpVarIndex;
+			if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
+				//変数ではないとき
+				int reg = REG_RAX;
+				int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
+				//↑ここでスタックに積む
+
+				useTempParameters[i2] = true;
+				useTempObject = true;
+
+				types[i2].type = type;
+				types[i2].u.lpIndex = lpVarIndex;
+
+				nCountOfTempObjects++;
+			}
+		}
+	}
+}
+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
+			int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex;
+			op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi );
+
+
+			/////////////////////////
+			// メモリを解放する
+			/////////////////////////
+
+			//push ebx
+			op_push(REG_EBX);
+
+			//call free
+			extern SUBINFO *pSub_free;
+			op_call(pSub_free);
+		}
+	}
+}
+
 void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){
 	int object_size;
@@ -441,4 +556,5 @@
 	int ParmSize=0;
 	RELATIVE_VAR RelativeVar;
+	int nCountOfNowTempObjects = 0;
 	for(i2=ParmsNum-1;i2>=0;i2--){
 		if(bEllipse&&i2<=pi_num-2) bEllipse=0;
@@ -556,28 +672,52 @@
 				int VarType;
 				LONG_PTR lpVarIndex;
-				if(!GetVarOffsetReadOnly(Parms[i2],&VarType,&RelativeVar,&lpVarIndex)) continue;
-
-				if(DummyTypeInfo.type!=DEF_ANY){
-					//型チェックを行う
-					if(DummyTypeInfo.type==VarType){
-						if(DummyTypeInfo.type==DEF_OBJECT){
-							if(DummyTypeInfo.u.lpIndex!=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.lpIndex!=lpVarIndex){
+										SetError(11,Parms[i2],cp);
+									}
+								}
+							}
+							else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
+								//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
+							}
+							else{
 								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);
 				}
-
-				//変数アドレスをレジスタにセット
-				SetVarPtrToEax(&RelativeVar);
-
-				//push eax
-				op_push(REG_EAX);
+				else{
+					//一時オブジェクトをコピー
+
+					//mov eax, dword ptr[esp+offset]
+					op_mov_RM(
+						sizeof(long),
+						REG_EAX,
+						REG_ESP,
+						( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE,
+						MOD_BASE_DISP32 );
+
+					nCountOfNowTempObjects++;
+
+					//push eax
+					op_push(REG_EAX);
+
+					//VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
+				}
 			}
 
