Index: BasicCompiler32/Compile_CallProc.cpp
===================================================================
--- BasicCompiler32/Compile_CallProc.cpp	(revision 73)
+++ BasicCompiler32/Compile_CallProc.cpp	(revision 75)
@@ -8,5 +8,5 @@
 void Call_DebugSys_SaveContext(){
 	//call _System_GetEip
-	extern SubInfo *pSub_System_GetEip;
+	extern UserProc *pSub_System_GetEip;
 	op_call(pSub_System_GetEip);
 
@@ -18,5 +18,5 @@
 
 	//call _DebugSys_SaveContext
-	extern SubInfo *pSub_DebugSys_SaveContext;
+	extern UserProc *pSub_DebugSys_SaveContext;
 	op_call(pSub_DebugSys_SaveContext);
 }
@@ -32,5 +32,5 @@
 
 
-int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex){
+int Opcode_CallProcPtr(char *variable,char *Parameter,ProcPointer *pProcPointer,LONG_PTR *plpIndex){
 	extern HANDLE hHeap;
 	int i;
@@ -52,14 +52,14 @@
 
 	//エラーチェック
-	if( !pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum) ){
+	if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return pi->ReturnType;
+		return pProcPointer->ReturnType().GetBasicType();
 	}
 
 	//一時オブジェクトを生成
-	pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum );
+	pobj_parameter->NewTempParameters( variable,pProcPointer->Params() );
 
 	//レジスタ、スタックフレームにセット
-	pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
+	pobj_parameter->SetParameter(variable,pProcPointer->Params() );
 
 
@@ -89,22 +89,22 @@
 	delete pobj_parameter;
 
-	if(plpIndex) *plpIndex=pi->u.ReturnIndex;
-
-	return pi->ReturnType;
+	if(plpIndex) *plpIndex=pProcPointer->ReturnType().GetIndex();
+
+	return pProcPointer->ReturnType().GetBasicType();
 }
 
-void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
+void Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,char *ObjectName,int RefType){
 	int i2;
 
-	if(psi->dwType==SUBTYPE_MACRO){
-		if(lstrcmpi(psi->name,"Print")==0){
+	if( pUserProc->IsMacro() ){
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
 			Opcode_Print(Parameter,0);
 			return;
 		}
-		if(lstrcmpi(psi->name,"Input")==0){
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
 			Opcode_Input(Parameter);
 			return;
 		}
-		if(lstrcmpi(psi->name,"Write")==0){
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
 			Opcode_Print(Parameter,1);
 			return;
@@ -112,10 +112,10 @@
 	}
 
-	psi->bUse=1;
+	pUserProc->Using();
 
 	bool isStatic = false;
 	CClass *pobj_c = NULL;
 	CMethod *pMethod = NULL;
-	if(psi->pobj_ParentClass){
+	if( pUserProc->GetParentClassPtr() ){
 		//クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
 		if(ObjectName[0]){
@@ -141,5 +141,5 @@
 			if(dwFlags&PROCFLAG_NEW){
 				//New演算子によるコンストラクタ呼び出し
-				pobj_c=psi->pobj_ParentClass;
+				pobj_c=pUserProc->GetParentClassPtr();
 			}
 			else{
@@ -154,8 +154,8 @@
 		/////////////////////////////////
 		pMethod = NULL;
-		if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( psi );
+		if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( pUserProc );
 		if( ! pMethod ){
 			//動的メソッドが取得できなかったときは静的メソッドを当たる
-			pMethod = pobj_c->GetStaticMethodInfo( psi );
+			pMethod = pobj_c->GetStaticMethodInfo( pUserProc );
 			if( !pMethod ){
 				SetError(300,NULL,cp);
@@ -178,5 +178,5 @@
 				//同一クラスオブジェクトの場合はプライベートアクセスを容認する
 				if(dwAccess==ACCESS_NON){
-					SetError(109,psi->name,cp);
+					SetError(109,pUserProc->GetName(),cp);
 					return;
 				}
@@ -185,9 +185,9 @@
 				if(dwAccess==ACCESS_PRIVATE||
 					dwAccess==ACCESS_NON){
-					SetError(109,psi->name,cp);
+					SetError(109,pUserProc->GetName(),cp);
 					return;
 				}
 				if(dwAccess==ACCESS_PROTECTED){
-					SetError(110,psi->name,cp);
+					SetError(110,pUserProc->GetName(),cp);
 					return;
 				}
@@ -197,5 +197,5 @@
 			//クラス内部からの呼び出し（継承によるACCESS_NONのみをエラーとする）
 			if(dwAccess==ACCESS_NON){
-				SetError(109,psi->name,cp);
+				SetError(109,pUserProc->GetName(),cp);
 				return;
 			}
@@ -210,5 +210,5 @@
 
 	char temporary[VN_SIZE]={0};
-	if( psi->pobj_ParentClass && isStatic == false ){
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
 		//_System_LocalThis（第一パラメータ）のダミーを作成
 		lstrcpy(temporary,"0,");
@@ -230,22 +230,21 @@
 
 	//エラーチェック
-	if( !pobj_parameter->ErrorCheck(psi->name,psi->realParams,psi->SecondParmNum) ){
+	if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
 		//パラメータにエラーがあるときは処理を終える
 		return;
 	}
 
-	if(psi->dwType==SUBTYPE_MACRO){
+	if(pUserProc->IsMacro()){
 		//マクロ関数の場合は、パラメータ省略を考慮する
-		pobj_parameter->MacroParameterSupport( psi->realParams );
+		pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
 	}
 
 	//一時オブジェクトを生成
-	int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
+	int tempSize = pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
 
 	//レジスタ、スタックフレームにセット
-	int ParmSize;
-	ParmSize=pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
-
-	if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
+	int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
+
+	if(pUserProc->ReturnType().IsStruct() ){
 		//////////////////////////////////////////////////////
 		// 戻り値に構造体インスタンスを持つ場合
@@ -253,5 +252,5 @@
 		//////////////////////////////////////////////////////
 
-		int object_size = psi->u.Return_pobj_c->GetSize();
+		int object_size = pUserProc->ReturnType().GetClass().GetSize();
 
 		//push object_size
@@ -259,5 +258,5 @@
 
 		//call calloc
-		extern SubInfo *pSub_calloc;
+		extern UserProc *pSub_calloc;
 		op_call(pSub_calloc);
 
@@ -267,5 +266,5 @@
 
 
-	if( psi->pobj_ParentClass && isStatic == false ){
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
 		//////////////////////////////////////////////////////
 		// メンバ関数の場合
@@ -310,5 +309,5 @@
 	}
 
-	if(psi->bVirtual){
+	if( pUserProc->IsVirtual() ){
 		//仮想関数（オブジェクトメソッド）呼び出し
 		//pObj->func_table->func1
@@ -320,5 +319,5 @@
 		OpBuffer[obp++]=(char)0x11;
 
-		i2 = pobj_c->GetFuncNumInVtbl( psi );
+		i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
 
 		//call dword ptr[edx+func_index]
@@ -339,8 +338,8 @@
 
 		//call ProcAddr
-		op_call(psi);
-	}
-
-	if(psi->bCdecl){
+		op_call(pUserProc);
+	}
+
+	if(pUserProc->IsCdecl()){
 		//add esp,ParmSize
 		op_add_esp(ParmSize);
@@ -354,5 +353,5 @@
 }
 
-int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
+int Opcode_CallDllProc(char *Parameter,DllProc *pDllProc,LONG_PTR *plpIndex){
 	char *temporary;
 
@@ -361,8 +360,7 @@
 	extern BOOL bDebugCompile;
 	extern BOOL bDebugSupportProc;
-	if(bDebugCompile&&bDebugSupportProc==0&&lstrcmp(pdi->name,"DebugBreak")!=0)
+	if(bDebugCompile&&bDebugSupportProc==0&& pDllProc->GetName() != "DebugBreak" ){
 		Call_DebugSys_SaveContext();
-
-	pdi->bUse=1;
+	}
 
 
@@ -376,15 +374,14 @@
 
 	//エラーチェック
-	if( !pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){
+	if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return pdi->ReturnType;
+		return pDllProc->ReturnType().GetBasicType();
 	}
 
 	//一時オブジェクトを生成
-	pobj_parameter->NewTempParameters( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum );
+	pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
 
 	//レジスタ、スタックフレームにセット
-	int ParmSize;
-	ParmSize=pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
+	int ParmSize = pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
 
 
@@ -392,10 +389,11 @@
 
 	//call dword ptr[LookupTable]
+	pDllProc->Using();
 	OpBuffer[obp++]=(char)0xFF;
 	OpBuffer[obp++]=(char)0x15;
-	pobj_ImportAddrSchedule->add(pdi);
+	pobj_ImportAddrSchedule->add(pDllProc);
 	obp+=sizeof(long);
 
-	if(pdi->bCdecl){
+	if(pDllProc->IsCdecl()){
 		//add esp,ParmSize
 		op_add_esp(ParmSize);
@@ -408,8 +406,8 @@
 	delete pobj_parameter;
 
-	if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
+	if(plpIndex) *plpIndex=pDllProc->ReturnType().GetIndex();
 
 	HeapDefaultFree(temporary);
 
-	return pdi->ReturnType;
+	return pDllProc->ReturnType().GetBasicType();
 }
