Index: BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- BasicCompiler64/Compile_CallProc.cpp	(revision 73)
+++ BasicCompiler64/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,8 +32,5 @@
 
 
-int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex){
-	extern HANDLE hHeap;
-	int i;
-
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){
 
 	extern BOOL bDebugCompile;
@@ -49,26 +46,25 @@
 	//パラメータオブジェクトを生成
 	ParamImpl *pobj_parameter=0;
-	pobj_parameter=new ParamImpl(Parameter);
+	pobj_parameter=new ParamImpl(lpszParms);
 
 	//エラーチェック
-	if( !pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum) ){
+	if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return pi->ReturnType;
+		return false;
 	}
 
 	//スタックフレームに存在する既存のパラメータをバックアップ
-	pobj_parameter->BackupParameter(pi->ParmNum);
+	pobj_parameter->BackupParameter( (int)pProcPointer->Params().size() );
 
 	//一時オブジェクトを生成
-	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() );
 
 
 
 	RELATIVE_VAR RelativeVar;
-	LONG_PTR lp;
-	GetVarOffsetReadOnly(variable,&i,&RelativeVar,&lp);
+	GetVarOffsetReadOnly(variable,&RelativeVar,Type());
 	SetVarPtrToReg(REG_RAX,&RelativeVar);
 
@@ -88,36 +84,36 @@
 
 	//スタックフレームに存在する既存のパラメータを復元
-	pobj_parameter->RestoreParameter(pi->ParmNum);
+	pobj_parameter->RestoreParameter( (int)pProcPointer->Params().size() );
 
 	//パラメータオブジェクトを破棄
 	delete pobj_parameter;
 
-	return pi->ReturnType;
+	return true;
 }
 
-void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
+bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const 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){
+			return true;
+		}
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
 			Opcode_Input(Parameter);
-			return;
-		}
-		if(lstrcmpi(psi->name,"Write")==0){
+			return true;
+		}
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
 			Opcode_Print(Parameter,1);
-			return;
-		}
-	}
-
-	psi->bUse=1;
+			return true;
+		}
+	}
+
+	pUserProc->Using();
 
 	bool isStatic = false;
-	CClass *pobj_c = NULL;
+	const CClass *pobj_c = NULL;
 	CMethod *pMethod = NULL;
-	if(psi->pobj_ParentClass){
+	if( pUserProc->GetParentClassPtr() ){
 		//クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
 		if(ObjectName[0]){
@@ -128,6 +124,8 @@
 			else{
 				//"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
-				int type = GetVarType(ObjectName,(LONG_PTR *)&pobj_c,0);
-				if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
+				Type varType;
+				GetVarType( ObjectName, varType, false );
+				pobj_c = &varType.GetClass();
+				if( NATURAL_TYPE( varType.GetBasicType() ) != DEF_OBJECT ){
 					pobj_c=pobj_DBClass->check(ObjectName);
 					if( pobj_c ){
@@ -143,5 +141,5 @@
 			if(dwFlags&PROCFLAG_NEW){
 				//New演算子によるコンストラクタ呼び出し
-				pobj_c=psi->pobj_ParentClass;
+				pobj_c=pUserProc->GetParentClassPtr();
 			}
 			else{
@@ -156,11 +154,11 @@
 		/////////////////////////////////
 		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);
-				return;
+				return false;
 			}
 
@@ -180,6 +178,6 @@
 				//同一クラスオブジェクトの場合はプライベートアクセスを容認する
 				if(dwAccess==ACCESS_NON){
-					SetError(109,psi->name,cp);
-					return;
+					SetError(109,pUserProc->GetName(),cp);
+					return false;
 				}
 			}
@@ -187,10 +185,10 @@
 				if(dwAccess==ACCESS_PRIVATE||
 					dwAccess==ACCESS_NON){
-					SetError(109,psi->name,cp);
-					return;
+					SetError(109,pUserProc->GetName(),cp);
+					return false;
 				}
 				if(dwAccess==ACCESS_PROTECTED){
-					SetError(110,psi->name,cp);
-					return;
+					SetError(110,pUserProc->GetName(),cp);
+					return false;
 				}
 			}
@@ -199,6 +197,6 @@
 			//クラス内部からの呼び出し（継承によるACCESS_NONのみをエラーとする）
 			if(dwAccess==ACCESS_NON){
-				SetError(109,psi->name,cp);
-				return;
+				SetError(109,pUserProc->GetName(),cp);
+				return false;
 			}
 		}
@@ -211,5 +209,5 @@
 
 	char temporary[VN_SIZE]={0};
-	if( psi->pobj_ParentClass && isStatic == false ){
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
 		//_System_LocalThis（第一パラメータ）のダミーを作成
 		lstrcpy(temporary,"0,");
@@ -234,24 +232,24 @@
 
 	//エラーチェック
-	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){
+		return false;
+	}
+
+	if(pUserProc->IsMacro()){
 		//マクロ関数の場合は、パラメータ省略を考慮する
-		pobj_parameter->MacroParameterSupport(psi->realParams);
+		pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
 	}
 
 	//スタックフレームに存在する既存のパラメータをバックアップ
-	pobj_parameter->BackupParameter(psi->RealParmNum);
+	pobj_parameter->BackupParameter( (int)pUserProc->RealParams().size() );
 
 	//一時オブジェクトを生成
-	pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
+	pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
 
 	//レジスタ、スタックフレームにセット
-	pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
-
-	if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
+	pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
+
+	if(pUserProc->ReturnType().IsStruct() ){
 		//////////////////////////////////////////////////////
 		// 戻り値に構造体インスタンスを持つ場合
@@ -265,5 +263,5 @@
 		//////////////////////////////////////////////////////
 
-			int object_size = psi->u.Return_pobj_c->GetSize();
+			int object_size = pUserProc->ReturnType().GetClass().GetSize();
 
 			//mov rcx,object_size
@@ -271,5 +269,5 @@
 
 			//call calloc
-			extern SubInfo *pSub_calloc;
+			extern UserProc *pSub_calloc;
 			op_call(pSub_calloc);
 
@@ -282,5 +280,5 @@
 		}////////////////////////////////////////////
 
-		if( psi->pobj_ParentClass && isStatic == false ){
+		if( pUserProc->GetParentClassPtr() && isStatic == false ){
 			//mov rdx,r13
 			op_mov_RR(REG_RDX,REG_R13);
@@ -293,5 +291,5 @@
 
 
-	if( psi->pobj_ParentClass && isStatic == false ){
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
 		///////////////////////////////
 		// メンバ関数の場合
@@ -305,9 +303,13 @@
 				if( pMethod->isConst ){
 					//Constアクセスが可能なメソッドの場合
-					if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return;
+					if( !GetVarOffsetReadOnly( ObjectName, &RelativeVar, Type() ) ){
+						return false;
+					}
 				}
 				else{
 					//Constアクセスが不可能なメソッドの場合
-					if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return;
+					if( !GetVarOffsetReadWrite( ObjectName, &RelativeVar, Type() ) ){
+						return false;
+					}
 				}
 
@@ -334,5 +336,5 @@
 	}
 
-	if(psi->bVirtual){
+	if( pUserProc->IsVirtual() ){
 		//仮想関数（オブジェクトメソッド）呼び出し
 		//pObj->func_table->func1
@@ -343,5 +345,5 @@
 		op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
 
-		i2 = pobj_c->GetFuncNumInVtbl( psi );
+		i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
 
 		//call qword ptr[r11+func_index]
@@ -364,9 +366,9 @@
 
 		//call ProcAddr
-		op_call(psi);
+		op_call(pUserProc);
 	}
 
 	/* 64コンパイラでは不要
-	if(pdi->bCdecl){
+	if(pDllProc->bCdecl){
 		//add esp,ParmSize
 	}*/
@@ -380,20 +382,19 @@
 
 	//スタックフレームに存在する既存のパラメータを復元
-	pobj_parameter->RestoreParameter(psi->RealParmNum);
+	pobj_parameter->RestoreParameter( (int)pUserProc->RealParams().size() );
 
 	//パラメータオブジェクトを破棄
 	delete pobj_parameter;
+
+	return true;
 }
 
-int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
-	char *temporary;
-
-	temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1);
+bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){
 
 	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();
-
+	}
 
 
@@ -404,20 +405,20 @@
 	//パラメータオブジェクトを生成
 	ParamImpl *pobj_parameter=0;
-	pobj_parameter=new ParamImpl(Parameter);
+	pobj_parameter=new ParamImpl(lpszParms);
 
 	//エラーチェック
-	if( !pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){
+	if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return pdi->ReturnType;
+		return false;
 	}
 
 	//スタックフレームに存在する既存のパラメータをバックアップ
-	pobj_parameter->BackupParameter(pdi->ParmNum);
+	pobj_parameter->BackupParameter( (int)pDllProc->Params().size() );
 
 	//一時オブジェクトを生成
-	pobj_parameter->NewTempParameters( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum );
+	pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
 
 	//レジスタ、スタックフレームにセット
-	pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
+	pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
 
 
@@ -429,8 +430,8 @@
 
 	//call dword ptr[ImportTable]
-	op_call( pdi );
+	op_call( pDllProc );
 
 	/* 64コンパイラでは不要
-	if(pdi->bCdecl){
+	if(pDllProc->bCdecl){
 		//add esp,ParmSize
 	}*/
@@ -440,13 +441,9 @@
 
 	//スタックフレームに存在する既存のパラメータを復元
-	pobj_parameter->RestoreParameter(pdi->ParmNum);
+	pobj_parameter->RestoreParameter( (int)pDllProc->Params().size() );
 
 	//パラメータオブジェクトを破棄
 	delete pobj_parameter;
 
-	if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
-
-	HeapDefaultFree(temporary);
-
-	return pdi->ReturnType;
+	return true;
 }
