Index: BasicCompiler64/CParameter.cpp
===================================================================
--- BasicCompiler64/CParameter.cpp	(revision 73)
+++ BasicCompiler64/CParameter.cpp	(revision 75)
@@ -2,5 +2,7 @@
 #include "opcode.h"
 
-int ParamImpl::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
+int ParamImpl::NewTempParameters( const string &procName, const Parameters &params, int SecondParmNum ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
 	///////////////////////////////////////////////////////
 	// 一時オブジェクトをあらかじめスタックに積んでおく
@@ -12,6 +14,6 @@
 
 	BOOL bEllipse;
-	if(pi_num){
-		if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
+	if(params.size()){
+		if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
 		else bEllipse=0;
 	}
@@ -21,14 +23,14 @@
 		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){
+		if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
+
+		if(i2==0){
+			if( params[i2]->GetVarName() == "_System_LocalThis" ){
 				//オブジェクトメンバの第一パラメータのThisポインタ
 				continue;
 			}
 		}
-		if((i2==0||i2==1)&&ppi[i2].name){
-			if(lstrcmp(ppi[i2].name,FuncName)==0){
+		if( i2==0||i2==1 ){
+			if( params[i2]->GetVarName() == procName ){
 				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
 				continue;
@@ -36,14 +38,13 @@
 		}
 
-		TYPEINFO DummyTypeInfo;
+		Type dummyType;
 		BOOL bByVal;
 		if(bEllipse){
-			DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
 			bByVal=1;
 		}
 		else{
-			DummyTypeInfo.type=ppi[i2].type;
-			DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
-			bByVal=ppi[i2].bByVal;
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
 		}
 
@@ -56,11 +57,11 @@
 			}
 
-			LONG_PTR lpVarIndex;
-			if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
+			if( !GetVarType( Parms[i2], Type(), FALSE ) ){
 				//変数ではないとき
 				int reg = REG_RAX;
-				int type = NumOpe( &reg, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
-
-				if( type != DEF_STRUCT ){
+				Type calcType;
+				NumOpe( &reg, Parms[i2], dummyType, calcType );
+
+				if( !calcType.IsStruct() ){
 					//一時参照を作成
 					pobj_sf->push( reg );
@@ -76,9 +77,7 @@
 
 				bool result = CheckDifferentType(
-					DummyTypeInfo.type,
-					DummyTypeInfo.u.lpIndex,
-					type,
-					lpVarIndex,
-					FuncName,
+					dummyType,
+					calcType,
+					procName.c_str(),
 					i2);
 
@@ -87,6 +86,5 @@
 					useTempObject = true;
 
-					types[i2].type = type;
-					types[i2].u.lpIndex = lpVarIndex;
+					types[i2] = calcType;
 				}
 			}
@@ -104,5 +102,5 @@
 	for(int i2=ParmsNum-1;i2>=0;i2--){
 		if( useTempParameters[i2] ){
-			if( types[i2].type == DEF_STRUCT ){
+			if( types[i2].IsStruct() ){
 				// 構造体の一時メモリ
 
@@ -112,5 +110,5 @@
 
 				//call free
-				extern SubInfo *pSub_free;
+				extern UserProc *pSub_free;
 				op_call(pSub_free);
 			}
@@ -123,5 +121,5 @@
 }
 
-void ParamImpl::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
+void ParamImpl::SetStructParameter( int reg, const Type &baseType, const char *expression ){
 	//////////////////////////////////////////////////////
 	/////    レジスタ資源のバックアップ
@@ -129,5 +127,5 @@
 	//////////////////////////////////////////////////////
 
-		int object_size = pobj_Class->GetSize();
+		int object_size = baseType.GetClass().GetSize();
 
 		//mov rcx,object_size
@@ -135,5 +133,5 @@
 
 		//call calloc
-		extern SubInfo *pSub_calloc;
+		extern UserProc *pSub_calloc;
 		op_call(pSub_calloc);
 
@@ -144,71 +142,29 @@
 		pobj_sf->push(REG_R11);
 
-		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){
-			////////////////////////////////////
-			// コピーコンストラクタを呼び出す
-			////////////////////////////////////
-
-			BOOL bUseHeap;
-			int temp_reg=REG_RDX;
-			CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
-
-			if(bUseHeap){
-				//mov r14,rdx
-				op_mov_RR(REG_R14,REG_RDX);
-			}
-
-			//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
-			pobj_sf->ref(REG_R11);
-
-			//mov rcx,this
-			op_mov_RR(REG_RCX,REG_R11);
-
-			//call constructor
-			op_call(pobj_Class->GetCopyConstructorMethod()->psi);
-
-
-			if(bUseHeap){
-				FreeTempObject(REG_R14,pobj_Class);
-			}
-		}
-		else{
-			if( pobj_Class->GetConstructorMethod() ){
-				////////////////////////////////
-				// コンストラクタを呼び出す
-				////////////////////////////////
-
-				//mov rcx,this
-				op_mov_RR(REG_RCX,REG_R11);
-
-				//call constructor
-				op_call(pobj_Class->GetConstructorMethod()->psi);
-			}
-			*/
-
-
-			BOOL bUseHeap;
-			int temp_reg=REG_RAX;
-			CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
-
-
-			//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
-			pobj_sf->ref(REG_R11);
-
-
-			RELATIVE_VAR RelativeVar;
-			RelativeVar.bOffsetOffset=0;
-			RelativeVar.offset=0;
-			RelativeVar.dwKind=VAR_DIRECTMEM;
-
-			SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
-
-		//}
+
+		Type calcType;
+		BOOL bUseHeap;
+		int temp_reg=REG_RAX;
+		NumOpe( &temp_reg,
+			expression,
+			baseType,
+			calcType,
+			&bUseHeap );
+
+
+		//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->ref(REG_R11);
+
+
+		RELATIVE_VAR RelativeVar;
+		RelativeVar.bOffsetOffset=0;
+		RelativeVar.offset=0;
+		RelativeVar.dwKind=VAR_DIRECTMEM;
+
+		SetStructVariableFromRax(
+			baseType,
+			calcType,
+			&RelativeVar,bUseHeap);
+
 
 		//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
@@ -225,5 +181,7 @@
 
 
-void ParamImpl::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+void ParamImpl::SetParameter( const string &procName, const Parameters &params, int SecondParmNum ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
 	///////////////////////////////////////////////////////////
 	// パラメータをレジスタ及びスタックフレームにセット
@@ -232,6 +190,6 @@
 
 	BOOL bEllipse;
-	if(pi_num){
-		if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
+	if( params.size() ){
+		if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
 		else bEllipse=0;
 	}
@@ -240,29 +198,27 @@
 	BOOL bHas_System_LocalThis=0;
 	if(ParmsNum>=1){
-		if(lstrcmp(ppi[0].name,"_System_LocalThis")==0)
+		if( params[0]->GetVarName() == "_System_LocalThis" ){
 			bHas_System_LocalThis=1;
+		}
 	}
 
 	//戻り値用の変数名を取得
-	const char *lpszVarNameToReturn = (FuncName[0]==1&&FuncName[1]==ESC_OPERATOR)?"_System_ReturnValue":FuncName;
+	const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str();
 
 	//パラメータをレジスタとスタックに格納
-	int CalcType;
-	LONG_PTR lpCalcIndex;
-	BOOL bCalcUseHeap;
 	int ParmSize=0;
 	int reg,temp_reg;
 	RELATIVE_VAR RelativeVar;
 	for(i2=ParmsNum-1;i2>=0;i2--){
-		if(bEllipse&&i2<=pi_num-2) bEllipse=0;
-
-		if(i2==0&&ppi[i2].name){
-			if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
+		if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
+
+		if(i2==0){
+			if( params[i2]->GetVarName() == "_System_LocalThis" ){
 				//オブジェクトメンバの第一パラメータのThisポインタ
 				continue;
 			}
 		}
-		if((i2==0||i2==1)&&ppi[i2].name){
-			if(lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){
+		if(i2==0||i2==1){
+			if( params[i2]->GetVarName() == lpszVarNameToReturn ){
 				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
 				continue;
@@ -270,18 +226,17 @@
 		}
 
-		TYPEINFO DummyTypeInfo;
+		Type dummyType;
 		BOOL bByVal;
 		if(bEllipse){
-			DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
 			bByVal=1;
 		}
 		else{
-			DummyTypeInfo.type=ppi[i2].type;
-			DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
-			bByVal=ppi[i2].bByVal;
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
 		}
 
 		int xmm_temp_sw=0;
-		if(IsRealNumberType(DummyTypeInfo.type)&&bByVal){
+		if(dummyType.IsReal()&&bByVal){
 			//実数型
 			if(i2==0) reg=REG_XMM0;
@@ -308,11 +263,11 @@
 			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
 				char temp2[255];
-				sprintf(temp2,"%s関数の第%dパラメータ",FuncName,i2+1);
+				sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);
 				SetError(19,temp2,cp);
 				continue;
 			}
 
-			if(DummyTypeInfo.type==DEF_STRUCT){
-				SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
+			if( dummyType.IsStruct() ){
+				SetStructParameter( reg, dummyType, Parms[i2] );
 				goto next;
 			}
@@ -321,22 +276,27 @@
 
 			extern LONG_PTR ProcPtr_BaseIndex;
-			LONG_PTR back_ProcPtr_BaseIndex;
-			back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
-			if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
-			else ProcPtr_BaseIndex=-1;
-
-			CalcType=NumOpe(&temp_reg,Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
+			LONG_PTR back_ProcPtr_BaseIndex = ProcPtr_BaseIndex;
+			if( dummyType.IsProcPtr() ){
+				ProcPtr_BaseIndex = dummyType.GetIndex();
+			}
+			else{
+				ProcPtr_BaseIndex=-1;
+			}
+
+			BOOL bCalcUseHeap;
+			Type calcType;
+			if( !NumOpe( &temp_reg, Parms[i2], dummyType, calcType, &bCalcUseHeap ) ){
+				break;
+			}
 
 			ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
 
-			if(CalcType==-1) break;
-
-			if(CalcType==DEF_OBJECT){
-				if( DummyTypeInfo.type != DEF_OBJECT
+			if( calcType.IsObject() ){
+				if( !dummyType.IsObject()
 					||
-					DummyTypeInfo.type == DEF_OBJECT &&
-					!DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
+					dummyType.IsObject() &&
+					!dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
 						//キャスト演算子のオーバーロードに対応する
-						CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+						CallCastOperatorProc( reg, calcType, bCalcUseHeap,dummyType );
 				}
 			}
@@ -344,5 +304,5 @@
 
 			if(bEllipse){
-				if(IsRealNumberType(CalcType)){
+				if( calcType.IsReal() ){
 					//整数レジスタへコピー
 					//※cdeclの拡張パラメータは実数の場合も汎用レジスタで引渡し
@@ -358,7 +318,7 @@
 					}
 				}
-				else if(IsWholeNumberType(CalcType)){
+				else if( calcType.IsWhole() ){
 					//整数型の場合は、64ビットへ拡張する
-					ExtendTypeTo64(CalcType,temp_reg);
+					ExtendTypeTo64( calcType.GetBasicType(), temp_reg );
 				}
 			}
@@ -369,23 +329,20 @@
 				else i3=i2;
 				CheckDifferentType(
-					DummyTypeInfo.type,
-					DummyTypeInfo.u.lpIndex,
-					CalcType,
-					lpCalcIndex,
-					FuncName,
+					dummyType,
+					calcType,
+					procName.c_str(),
 					i3);
 
-
-				if(DummyTypeInfo.type==DEF_DOUBLE){
+				if( dummyType.IsDouble() ){
 					//Double型へ変換
-					ChangeTypeToXmm_Double(CalcType,reg,temp_reg);
-				}
-				else if(DummyTypeInfo.type==DEF_SINGLE){
+					ChangeTypeToXmm_Double(calcType.GetBasicType(),reg,temp_reg);
+				}
+				else if( dummyType.IsSingle() ){
 					//Single型へ変換
-					ChangeTypeToXmm_Single(CalcType,reg,temp_reg);
-				}
-				else if(IsWholeNumberType(DummyTypeInfo.type)){
+					ChangeTypeToXmm_Single(calcType.GetBasicType(),reg,temp_reg);
+				}
+				else if( dummyType.IsWhole() ){
 					//実数型 → 整数型
-					ChangeTypeToWhole(CalcType,DummyTypeInfo.type,reg,temp_reg);
+					ChangeTypeToWhole(calcType.GetBasicType(),dummyType.GetBasicType(),reg,temp_reg);
 				}
 			}
@@ -397,9 +354,10 @@
 
 				temp_reg=reg;
-				CalcType=NumOpe(&temp_reg,Parms[i2]+2,0,0,&lpCalcIndex);
-				if(CalcType==-1) break;
-
-				int ptr_type;
-				ptr_type=GetPtrType(DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+				Type calcType;
+				if( !NumOpe(&temp_reg, Parms[i2]+2, dummyType, calcType) ){
+					break;
+				}
+
+				dummyType.PtrLevelUp();
 
 				//型チェック
@@ -407,14 +365,12 @@
 				else i3=i2;
 				CheckDifferentType(
-					ptr_type,
-					DummyTypeInfo.u.lpIndex,
-					CalcType,
-					lpCalcIndex,
-					FuncName,
+					dummyType,
+					calcType,
+					procName.c_str(),
 					i3);
 
-				if(IsRealNumberType(CalcType)){
+				if( calcType.IsReal() ){
 					//実数型 → 整数型
-					ChangeTypeToWhole(CalcType,DEF_QWORD,reg,temp_reg);
+					ChangeTypeToWhole( calcType.GetBasicType(), DEF_QWORD,reg,temp_reg);
 				}
 			}
@@ -428,29 +384,28 @@
 				else{
 					//変数のアドレスを取得
-					int VarType;
-					LONG_PTR lpVarIndex;
+					Type varType;
 					if(GetVarOffset(
 						false,
 						false,
 						Parms[i2],
-						&VarType,
 						&RelativeVar,
-						&lpVarIndex)){
-
-							if(DummyTypeInfo.type!=DEF_ANY){
+						varType)){
+
+							if( !dummyType.IsAny() ){
 								//型チェックを行う
-								if(DummyTypeInfo.type==VarType){
-									if(DummyTypeInfo.type==DEF_OBJECT){
-										if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
+								if( dummyType.GetBasicType() == varType.GetBasicType() ){
+									if( dummyType.IsObject() ){
+										if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){
 											SetError(11,Parms[i2],cp);
 										}
 									}
-									else if(DummyTypeInfo.type==DEF_STRUCT){
-										if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
+									else if( dummyType.IsStruct() ){
+										if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){
 											SetError(11,Parms[i2],cp);
 										}
 									}
 								}
-								else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
+								else if( (varType.GetBasicType()&FLAG_PTR)
+									&&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){
 									//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
 								}
@@ -494,5 +449,5 @@
 
 	//パラメータが収まるだけのスタックフレームを確保
-	pobj_sf->parameter_allocate(pi_num*sizeof(_int64)+   sizeof(_int64)/*ret用*/  );
+	pobj_sf->parameter_allocate((int)params.size()*sizeof(_int64)+   sizeof(_int64)/*ret用*/  );
 }
 void ParamImpl::BackupParameter(int pi_num){
