Index: /BasicCompiler32/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler32/BasicCompiler.vcproj	(revision 49)
+++ /BasicCompiler32/BasicCompiler.vcproj	(revision 50)
@@ -48,4 +48,5 @@
 				Name="VCCLCompilerTool"
 				Optimization="0"
+				AdditionalIncludeDirectories="..\cpplibs\boost"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN"
 				MinimalRebuild="true"
@@ -708,32 +709,4 @@
 					</FileConfiguration>
 				</File>
-				<File
-					RelativePath="..\BasicCompiler_Common\Subroutine.cpp"
-					>
-					<FileConfiguration
-						Name="Debug|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="English_Rel|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-				</File>
 				<Filter
 					Name="Intermediate"
@@ -1290,4 +1263,40 @@
 						RelativePath="..\BasicCompiler_Common\Exception.h"
 						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Procedure"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\Parameter.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Subroutine.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="English_Rel|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
 					</File>
 				</Filter>
Index: /BasicCompiler32/CParameter.cpp
===================================================================
--- /BasicCompiler32/CParameter.cpp	(revision 49)
+++ /BasicCompiler32/CParameter.cpp	(revision 50)
@@ -1,328 +1,4 @@
 #include "../BasicCompiler_Common/common.h"
 #include "opcode.h"
-
-CParameter::CParameter(char *buffer){
-	///////////////////////////
-	// パラメータ文字列を整理
-	///////////////////////////
-
-	extern HANDLE hHeap;
-	int i,i2,i3;
-	char temporary[VN_SIZE];
-
-	i=0;
-	ParmsNum=0;
-	while(1){
-		if(buffer[i]=='\0') break;
-
-		for(i2=0;;i2++,i++){
-			if(buffer[i]=='\"'){
-				temporary[i2]=buffer[i];
-				for(i++,i2++;;i++,i2++){
-					temporary[i2]=buffer[i];
-					if(buffer[i]=='\"') break;
-				}
-				continue;
-			}
-
-			if(buffer[i]=='('){
-				i3=GetStringInPare(temporary+i2,buffer+i);
-				i2+=i3-1;
-				i+=i3-1;
-				continue;
-			}
-			if(buffer[i]=='['){
-				i3=GetStringInBracket(temporary+i2,buffer+i);
-				i2+=i3-1;
-				i+=i3-1;
-				continue;
-			}
-
-			if(buffer[i]==','||buffer[i]=='\0'){
-				temporary[i2]=0;
-				break;
-			}
-			temporary[i2]=buffer[i];
-		}
-
-		Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-		lstrcpy(Parms[ParmsNum],temporary);
-		ParmsNum++;
-
-		if(buffer[i]==',') i++;
-	}
-
-	ReturnTypeInfo.type=0;
-	ReturnTypeInfo.u.lpIndex=0;
-}
-CParameter::CParameter(PARAMETER_INFO *pParamInfo,int ParmNum){
-	int i;
-	for(i=0;i<ParmNum;i++){
-		Parms[i]=0;
-		types[i].type=pParamInfo[i].type;
-		types[i].u.lpIndex=pParamInfo[i].u.index;
-	}
-	this->ParmsNum=ParmNum;
-
-	ReturnTypeInfo.type=0;
-	ReturnTypeInfo.u.lpIndex=0;
-}
-CParameter::~CParameter(){
-	int i2;
-
-	//パラメータ文字列を解放
-	for(i2=0;i2<ParmsNum;i2++){
-		if(Parms[i2]==(char *)-1) continue;
-
-		if(Parms[i2]) HeapDefaultFree(Parms[i2]);
-	}
-}
-
-
-void CParameter::SetReturnType(TYPEINFO *pTypeInfo){
-	ReturnTypeInfo=*pTypeInfo;
-}
-
-BOOL CParameter::_overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level){
-	//パラメータを識別してオーバーロードを解決
-
-	//パラメータの個数が不一致の場合
-	if(pi_num!=ParmsNum) return 0;
-
-	int i,type;
-	LONG_PTR lpIndex;
-	for(i=0;i<pi_num;i++){
-		if(Parms[i]){
-			TYPEINFO BaseType={ppi[i].type,ppi[i].u.index};
-			type=NumOpe_GetType(Parms[i],&BaseType,&lpIndex);
-		}
-		else{
-			type=types[i].type;
-			lpIndex=types[i].u.lpIndex;
-		}
-
-		if(type!=ppi[i].type){
-			if(overload_level==OVERLOAD_LEVEL1){
-				return 0;
-			}
-			else if(overload_level==OVERLOAD_LEVEL2){
-				if(!(
-					IsWholeNumberType(type)&&IsWholeNumberType(ppi[i].type)||
-					IsRealNumberType(type)&&IsRealNumberType(ppi[i].type)
-					)) return 0;
-			}
-			else if(overload_level==OVERLOAD_LEVEL3){
-				if(type==DEF_OBJECT||ppi[i].type==DEF_OBJECT) return 0;
-			}
-		}
-		else{
-			if(NATURAL_TYPE(type)==DEF_OBJECT){
-				if(lpIndex!=ppi[i].u.index) return 0;
-			}
-		}
-	}
-
-	if(pReturnTypeInfo){
-		//戻り値も比較対象にする
-		if(ReturnTypeInfo.type==pReturnTypeInfo->type){
-			if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){
-				if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
-			}
-		}
-		else return 0;
-	}
-
-	return 1;
-}
-SUBINFO *CParameter::OverloadSolutionWithReturnType(const char *name,SUBINFO **ppsi,int num){
-	int i,sw=0;
-	SUBINFO *psi;
-	psi=0;
-	for(i=0;i<num;i++){
-		psi=ppsi[i];
-
-		TYPEINFO ReturnTypeInfo;
-		ReturnTypeInfo.type=psi->ReturnType;
-		ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
-
-		//エラーチェック
-		if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){
-			if(sw){
-				SetError(52,name,cp);
-				return 0;
-			}
-			sw=1;
-			break;
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			TYPEINFO ReturnTypeInfo;
-			ReturnTypeInfo.type=psi->ReturnType;
-			ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){
-				if(sw){
-					SetError(52,name,cp);
-					return 0;
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			TYPEINFO ReturnTypeInfo;
-			ReturnTypeInfo.type=psi->ReturnType;
-			ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){
-				if(sw){
-					SetError(52,name,cp);
-					return 0;
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		SetError(52,name,cp);
-		return 0;
-	}
-
-	return psi;
-}
-
-SUBINFO *CParameter::OverloadSolution(const char *name,SUBINFO **ppsi,int num){
-	int i,sw=0;
-	SUBINFO *psi;
-	psi=0;
-
-	for(i=0;i<num;i++){
-		psi=ppsi[i];
-
-		//エラーチェック
-		if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){
-			if(sw){
-				return OverloadSolutionWithReturnType(name,ppsi,num);
-			}
-			sw=1;
-			break;
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){
-				if(sw){
-					return OverloadSolutionWithReturnType(name,ppsi,num);
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){
-				if(sw){
-					return OverloadSolutionWithReturnType(name,ppsi,num);
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		SUBINFO *temp_psi;
-		for(i=0;i<num;i++){
-			temp_psi=ppsi[i];
-
-			//エラーチェック
-			if(temp_psi->ParmNum==this->ParmsNum){
-				if(sw){
-					sw=0;
-					break;
-				}
-				sw=1;
-
-				psi=temp_psi;
-			}
-		}
-	}
-
-	if(!sw){
-		SetError(52,name,cp);
-		return 0;
-	}
-
-	return psi;
-}
-
-BOOL CParameter::ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
-	if(ParmsNum>pi_num){
-		if(ppi[pi_num-1].type!=DEF_ELLIPSE){
-			//パラメータが多すぎるとき
-			SetError(10,FuncName,cp);
-			return 0;
-		}
-	}
-	else if(ParmsNum<pi_num){
-		if(ParmsNum<SecondParmNum){
-			if(ppi[ParmsNum].type==DEF_ELLIPSE){
-				return 1;
-			}
-
-			//パラメータが少なすぎるとき
-			SetError(10,FuncName,cp);
-			return 0;
-		}
-
-		//省略パラメータに "0" を指定する
-		for(;ParmsNum < pi_num;ParmsNum++){
-			extern HANDLE hHeap;
-			char temporary[64];
-			if(ppi[ParmsNum].bByVal) lstrcpy(temporary,"0");
-			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
-			Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-			lstrcpy(Parms[ParmsNum],temporary);
-		}
-	}
-
-	return 1;
-}
-void CParameter::MacroParameterSupport(PARAMETER_INFO *ppi){
-	int i;
-	for(i=0;i<ParmsNum;i++){
-		if(Parms[i][0]=='\0'){
-			extern HANDLE hHeap;
-			char temporary[64];
-			if(ppi[i].bByVal) lstrcpy(temporary,"0");
-			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
-			HeapDefaultFree(Parms[i]);
-			Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-			lstrcpy(Parms[i],temporary);
-		}
-	}
-}
 
 void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
Index: /BasicCompiler32/Compile_CallProc.cpp
===================================================================
--- /BasicCompiler32/Compile_CallProc.cpp	(revision 49)
+++ /BasicCompiler32/Compile_CallProc.cpp	(revision 50)
@@ -29,133 +29,4 @@
 	pLocalVarAddrSchedule[LocalVarAddrScheduleNum]=obp;
 	LocalVarAddrScheduleNum++;
-}
-int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
-	int ret_type;
-
-	if(idProc==PROC_DEFAULT){
-		/////////////////////
-		// ユーザー定義関数
-		/////////////////////
-
-		SUBINFO *psi;
-		psi=(SUBINFO *)pInfo;
-
-		//GetSubHash内でエラー提示が行われた場合
-		if(psi==(SUBINFO *)-1) return -1;
-
-
-		//オブジェクト名を取得
-		char ObjectName[VN_SIZE];
-		int RefType;
-		SplitObjectName(name,ObjectName,&RefType);
-
-
-		////////////////////////
-		// オーバーロードを解決
-		////////////////////////
-
-		SUBINFO **ppsi;
-		int num;
-		ppsi=GetOverloadSubHash(name,&num);
-		if(num){
-			//オーバーロードを解決
-			psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
-			HeapDefaultFree(ppsi);
-
-			if(!psi) return 0;
-		}
-
-
-		Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
-		if( plpRetIndex ){
-			*plpRetIndex = psi->u.ReturnIndex;
-		}
-		return psi->ReturnType;
-	}
-	else if(idProc==PROC_DLL){
-		/////////////////////////
-		// DLL関数
-		/////////////////////////
-		DECLAREINFO *pdi;
-		pdi=(DECLAREINFO *)pInfo;
-
-		ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
-	}
-	else if(idProc==PROC_BUILTIN){
-		/////////////////////////
-		// 組み込み関数
-		/////////////////////////
-		int FuncId;
-		FuncId=(int)(_int64)pInfo;
-
-		TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
-		Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
-		if( plpRetIndex ){
-			*plpRetIndex = ReturnTypeInfo.u.lpIndex;
-		}
-		return ReturnTypeInfo.type;
-	}
-	else if(idProc==PROC_PTR){
-		/////////////////
-		// 関数ポインタ
-		/////////////////
-
-		LONG_PTR lpIndex;
-		GetVarType(name,&lpIndex,0);
-
-		extern PROCPTRINFO *pProcPtrInfo;
-		ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
-	}
-
-	return ret_type;
-}
-
-BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
-	//プロパティ用のメソッドを呼び出す
-
-	//配列要素を取得
-	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
-	GetArrayElement(variable,VarName,ArrayElements);
-
-	//オブジェクト名を取得
-	char ObjectName[VN_SIZE];
-	int RefType;
-	SplitObjectName(VarName,ObjectName,&RefType);
-
-	//オーバーロード用の関数リストを作成
-	SUBINFO **ppsi;
-	int num;
-	ppsi=GetOverloadSubHash(VarName,&num);
-	if(num==0){
-		return 0;
-	}
-
-	//パラメータを整備
-	char *Parameter;
-	Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
-	lstrcpy(Parameter,ArrayElements);
-	if(RightSide){
-		if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
-		lstrcat(Parameter,RightSide);
-	}
-
-	//オーバーロードを解決
-	SUBINFO *psi;
-	psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
-	HeapDefaultFree(ppsi);
-
-	if(psi){
-		//呼び出し
-		Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
-
-		if(pRetTypeInfo){
-			pRetTypeInfo->type = psi->ReturnType;
-			pRetTypeInfo->u.lpIndex = psi->u.ReturnIndex;
-		}
-	}
-
-	HeapDefaultFree(Parameter);
-
-	return 1;
 }
 
Index: /BasicCompiler32/Compile_Func.cpp
===================================================================
--- /BasicCompiler32/Compile_Func.cpp	(revision 49)
+++ /BasicCompiler32/Compile_Func.cpp	(revision 50)
@@ -249,10 +249,7 @@
 		//左辺の型にのっとり、オーバーロードを解決
 
-		SUBINFO **ppsi;
-		int num;
-		ppsi=GetOverloadSubHash(name,&num);
-		if(!num){
-			HeapDefaultFree(ppsi);
-
+		std::vector<SUBINFO *> subs;
+		GetOverloadSubHash( name, subs );
+		if( subs.size() == 0 ){
 			SetError(27,name,cp);
 			return;
@@ -261,6 +258,5 @@
 		//オーバーロードを解決
 		extern PROCPTRINFO *pProcPtrInfo;
-		psi=OverloadSolution(name,ppsi,num,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
-		HeapDefaultFree(ppsi);
+		psi=OverloadSolution(name,subs,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
 
 		if(!psi){
Index: /BasicCompiler32/Compile_Object.cpp
===================================================================
--- /BasicCompiler32/Compile_Object.cpp	(revision 49)
+++ /BasicCompiler32/Compile_Object.cpp	(revision 50)
@@ -2,5 +2,5 @@
 #include "opcode.h"
 
-void CallConstructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+void _call_constructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
 	////////////////////////////
 	// コンストラクタの呼び出し
@@ -31,13 +31,12 @@
 	////////////////////////
 
-	SUBINFO **ppsi;
+	std::vector<SUBINFO *> subs;
+	pobj_c->EnumMethod( pobj_c->name, subs );
+
 	SUBINFO *psi;
-	int num;
-	ppsi=GetOverloadObjectSubHash(pobj_c->name,pobj_c,&num);
-	if(num){
+	if( subs.size() > 0 ){
 		//オーバーロードを解決
 		psi=OverloadSolutionWithStrParam(pobj_c->name,
-			ppsi,num,CreateParameter,"",NULL);
-		HeapDefaultFree(ppsi);
+			subs,CreateParameter,"",NULL);
 
 		if(!psi) return;
@@ -253,5 +252,5 @@
 	if(ObjectSize[0]) bSomeObjects=1;
 	else bSomeObjects=0;
-	CallConstructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
+	_call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
 
 	return DEF_PTR_OBJECT;
Index: /BasicCompiler32/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler32/Compile_ProcOp.cpp	(revision 49)
+++ /BasicCompiler32/Compile_ProcOp.cpp	(revision 50)
@@ -72,5 +72,5 @@
 					TypeInfo.type=GlobalVar[i].type;
 					TypeInfo.u.lpIndex=GlobalVar[i].u.index;
-					CallConstractor(
+					CallConstructor(
 						GlobalVar[i].name,
 						GlobalVar[i].SubScripts,
Index: /BasicCompiler32/Compile_Statement.cpp
===================================================================
--- /BasicCompiler32/Compile_Statement.cpp	(revision 49)
+++ /BasicCompiler32/Compile_Statement.cpp	(revision 50)
@@ -1095,10 +1095,7 @@
 					pobj_c=(CClass *)lpIndex;
 
-					SUBINFO **ppsi;
-					int num;
-					ppsi=pobj_c->GetOperatorSubInfo(CALC_EQUAL,num);
-					if(num==0){
-						HeapDefaultFree(ppsi);
-
+					std::vector<SUBINFO *> subs;
+					pobj_c->EnumMethod( CALC_EQUAL, subs );
+					if( subs.size() == 0 ){
 						return;
 					}
@@ -1116,6 +1113,5 @@
 					//オーバーロードを解決
 					SUBINFO *psi;
-					psi=OverloadSolution("==",ppsi,num,ppi,iParmNum,NULL);
-					HeapDefaultFree(ppsi);
+					psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
 					HeapDefaultFree(ppi);
 
Index: /BasicCompiler32/Compile_Var.cpp
===================================================================
--- /BasicCompiler32/Compile_Var.cpp	(revision 49)
+++ /BasicCompiler32/Compile_Var.cpp	(revision 50)
@@ -1304,5 +1304,5 @@
 		//コンストラクタ呼び出し
 		if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
-			CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
+			CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter);
 		}
 	}
Index: /BasicCompiler32/Opcode.h
===================================================================
--- /BasicCompiler32/Opcode.h	(revision 49)
+++ /BasicCompiler32/Opcode.h	(revision 50)
@@ -204,6 +204,6 @@
 
 public:
-	CParameter(char *buffer);
-	CParameter(PARAMETER_INFO *pParamInfo,int ParmNum);
+	CParameter(const char *buffer);
+	CParameter(const PARAMETER_INFO *pParamInfo, const int ParmNum);
 	~CParameter();
 	void SetReturnType(TYPEINFO *pTypeInfo);
@@ -211,7 +211,7 @@
 private:
 	BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
-	SUBINFO *OverloadSolutionWithReturnType(const char *name,SUBINFO **ppsi,int num);
+	SUBINFO *OverloadSolutionWithReturnType( const char *name, std::vector<SUBINFO *> &subs );
 public:
-	SUBINFO *OverloadSolution(const char *name,SUBINFO **ppsi,int num);
+	SUBINFO *OverloadSolution( const char *name, std::vector<SUBINFO *> &subs );
 
 	BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
@@ -227,6 +227,4 @@
 //Compile_CallProc.cpp
 void AddLocalVarAddrSchedule();
-int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
-BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
 #define PROCFLAG_NEW	1
 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
Index: /BasicCompiler32/OperatorProc.cpp
===================================================================
--- /BasicCompiler32/OperatorProc.cpp	(revision 49)
+++ /BasicCompiler32/OperatorProc.cpp	(revision 50)
@@ -26,10 +26,7 @@
 	pobj_c=(CClass *)index_stack[sp-2];
 
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_c->GetOperatorSubInfo(idCalc,num);
-	if(num==0){
-		HeapDefaultFree(ppsi);
-
+	std::vector<SUBINFO *> subs;
+	pobj_c->EnumMethod( idCalc, subs );
+	if( subs.size() == 0 ){
 		return 0;
 	}
@@ -43,7 +40,7 @@
 	int i;
 	BOOL bReturnTypeIsObject=1;
-	TYPEINFO ReturnType={DEF_OBJECT,ppsi[0]->u.ReturnIndex};
-	for(i=0;i<num;i++){
-		if(ppsi[i]->ReturnType!=DEF_OBJECT)
+	TYPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};
+	foreach( SUBINFO *psi, subs ){
+		if(psi->ReturnType!=DEF_OBJECT)
 			bReturnTypeIsObject=0;
 	}
@@ -83,6 +80,5 @@
 	else GetCalcName(idCalc,temporary);
 	SUBINFO *psi;
-	psi=OverloadSolution(temporary,ppsi,num,ppi,iParmNum,pBaseTypeInfo);
-	HeapDefaultFree(ppsi);
+	psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
 
 	if(!psi){
@@ -263,17 +259,12 @@
 }
 void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_Class->GetOperatorSubInfo(CALC_ARRAY_GET,num);
-	if(num==0){
-		HeapDefaultFree(ppsi);
-
+	std::vector<SUBINFO *> subs;
+	pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
 		return;
 	}
 
-	Opcode_CallProc(Parameter,ppsi[0],0,ObjectName,DEF_OBJECT);
-	RetTypeInfo.type=ppsi[0]->ReturnType;
-	RetTypeInfo.u.lpIndex = ppsi[0]->u.ReturnIndex;
-
-	HeapDefaultFree(ppsi);
-}
+	Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT);
+	RetTypeInfo.type = subs[0]->ReturnType;
+	RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
+}
Index: /BasicCompiler64/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler64/BasicCompiler.vcproj	(revision 49)
+++ /BasicCompiler64/BasicCompiler.vcproj	(revision 50)
@@ -48,4 +48,5 @@
 				Name="VCCLCompilerTool"
 				Optimization="0"
+				AdditionalIncludeDirectories="..\cpplibs\boost"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN;_AMD64_;_WIN64"
 				MinimalRebuild="true"
@@ -1378,8 +1379,4 @@
 					>
 				</File>
-				<File
-					RelativePath="..\BasicCompiler_Common\Subroutine.cpp"
-					>
-				</File>
 				<Filter
 					Name="Intermediate"
@@ -1539,4 +1536,16 @@
 					<File
 						RelativePath="..\BasicCompiler_Common\NativeCode.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Procedure"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\Parameter.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Subroutine.cpp"
 						>
 					</File>
Index: /BasicCompiler64/CParameter.cpp
===================================================================
--- /BasicCompiler64/CParameter.cpp	(revision 49)
+++ /BasicCompiler64/CParameter.cpp	(revision 50)
@@ -1,326 +1,4 @@
 #include "../BasicCompiler_Common/common.h"
 #include "opcode.h"
-
-CParameter::CParameter(char *buffer){
-	///////////////////////////
-	// パラメータ文字列を整理
-	///////////////////////////
-
-	extern HANDLE hHeap;
-	int i,i2,i3;
-	char temporary[VN_SIZE];
-
-	i=0;
-	ParmsNum=0;
-	while(1){
-		if(buffer[i]=='\0') break;
-
-		for(i2=0;;i2++,i++){
-			if(buffer[i]=='\"'){
-				temporary[i2]=buffer[i];
-				for(i++,i2++;;i++,i2++){
-					temporary[i2]=buffer[i];
-					if(buffer[i]=='\"') break;
-				}
-				continue;
-			}
-
-			if(buffer[i]=='('){
-				i3=GetStringInPare(temporary+i2,buffer+i);
-				i2+=i3-1;
-				i+=i3-1;
-				continue;
-			}
-			if(buffer[i]=='['){
-				i3=GetStringInBracket(temporary+i2,buffer+i);
-				i2+=i3-1;
-				i+=i3-1;
-				continue;
-			}
-
-			if(buffer[i]==','||buffer[i]=='\0'){
-				temporary[i2]=0;
-				break;
-			}
-			temporary[i2]=buffer[i];
-		}
-
-		Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-		lstrcpy(Parms[ParmsNum],temporary);
-		ParmsNum++;
-
-		if(buffer[i]==',') i++;
-	}
-
-	ReturnTypeInfo.type=0;
-	ReturnTypeInfo.u.lpIndex=0;
-}
-CParameter::CParameter(PARAMETER_INFO *pParamInfo,int ParmNum){
-	int i;
-	for(i=0;i<ParmNum;i++){
-		Parms[i]=0;
-		types[i].type=pParamInfo[i].type;
-		types[i].u.lpIndex=pParamInfo[i].u.index;
-	}
-	this->ParmsNum=ParmNum;
-
-	ReturnTypeInfo.type=0;
-	ReturnTypeInfo.u.lpIndex=0;
-}
-CParameter::~CParameter(){
-	int i2;
-
-	//パラメータ文字列を解放
-	for(i2=0;i2<ParmsNum;i2++){
-		if(Parms[i2]==(char *)-1) continue;
-
-		if(Parms[i2]) HeapDefaultFree(Parms[i2]);
-	}
-}
-
-void CParameter::SetReturnType(TYPEINFO *pTypeInfo){
-	ReturnTypeInfo=*pTypeInfo;
-}
-
-BOOL CParameter::_overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level){
-	//パラメータを識別してオーバーロードを解決
-
-	//パラメータの個数が不一致の場合
-	if(pi_num!=ParmsNum) return 0;
-
-	int i,type;
-	LONG_PTR lpIndex;
-	for(i=0;i<pi_num;i++){
-		if(Parms[i]){
-			TYPEINFO BaseType={ppi[i].type,ppi[i].u.index};
-			type=NumOpe_GetType(Parms[i],&BaseType,&lpIndex);
-		}
-		else{
-			type=types[i].type;
-			lpIndex=types[i].u.lpIndex;
-		}
-
-		if(type!=ppi[i].type){
-			if(overload_level==OVERLOAD_LEVEL1){
-				return 0;
-			}
-			else if(overload_level==OVERLOAD_LEVEL2){
-				if(!(
-					IsWholeNumberType(type)&&IsWholeNumberType(ppi[i].type)||
-					IsRealNumberType(type)&&IsRealNumberType(ppi[i].type)
-					)) return 0;
-			}
-			else if(overload_level==OVERLOAD_LEVEL3){
-				if(type==DEF_OBJECT||ppi[i].type==DEF_OBJECT) return 0;
-			}
-		}
-		else{
-			if(NATURAL_TYPE(type)==DEF_OBJECT){
-				if(lpIndex!=ppi[i].u.index) return 0;
-			}
-		}
-	}
-
-	if(pReturnTypeInfo){
-		//戻り値も比較対象にする
-		if(ReturnTypeInfo.type==pReturnTypeInfo->type){
-			if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){
-				if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
-			}
-		}
-		else return 0;
-	}
-
-	return 1;
-}
-SUBINFO *CParameter::OverloadSolutionWithReturnType(const char *name,SUBINFO **ppsi,int num){
-	int i,sw=0;
-	SUBINFO *psi;
-	psi=0;
-	for(i=0;i<num;i++){
-		psi=ppsi[i];
-
-		TYPEINFO ReturnTypeInfo;
-		ReturnTypeInfo.type=psi->ReturnType;
-		ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
-
-		//エラーチェック
-		if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){
-			if(sw){
-				SetError(52,name,cp);
-				return 0;
-			}
-			sw=1;
-			break;
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			TYPEINFO ReturnTypeInfo;
-			ReturnTypeInfo.type=psi->ReturnType;
-			ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){
-				if(sw){
-					SetError(52,name,cp);
-					return 0;
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			TYPEINFO ReturnTypeInfo;
-			ReturnTypeInfo.type=psi->ReturnType;
-			ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){
-				if(sw){
-					SetError(52,name,cp);
-					return 0;
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		SetError(52,name,cp);
-		return 0;
-	}
-
-	return psi;
-}
-
-SUBINFO *CParameter::OverloadSolution(const char *name,SUBINFO **ppsi,int num){
-	int i,sw=0;
-	SUBINFO *psi;
-	psi=0;
-	for(i=0;i<num;i++){
-		psi=ppsi[i];
-
-		//エラーチェック
-		if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){
-			if(sw){
-				return OverloadSolutionWithReturnType(name,ppsi,num);
-			}
-			sw=1;
-			break;
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){
-				if(sw){
-					return OverloadSolutionWithReturnType(name,ppsi,num);
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		for(i=0;i<num;i++){
-			psi=ppsi[i];
-
-			//エラーチェック
-			if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){
-				if(sw){
-					return OverloadSolutionWithReturnType(name,ppsi,num);
-				}
-				sw=1;
-				break;
-			}
-		}
-	}
-
-	if(!sw){
-		SUBINFO *temp_psi;
-		for(i=0;i<num;i++){
-			temp_psi=ppsi[i];
-
-			//エラーチェック
-			if(temp_psi->ParmNum==this->ParmsNum){
-				if(sw){
-					sw=0;
-					break;
-				}
-				sw=1;
-
-				psi=temp_psi;
-			}
-		}
-	}
-
-	if(!sw){
-		SetError(52,name,cp);
-		return 0;
-	}
-
-	return psi;
-}
-
-BOOL CParameter::ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
-	if(ParmsNum>pi_num){
-		if(ppi[pi_num-1].type!=DEF_ELLIPSE){
-			//パラメータが多すぎるとき
-			SetError(10,FuncName,cp);
-			return 0;
-		}
-	}
-	else if(ParmsNum<pi_num){
-		if(ParmsNum<SecondParmNum){
-			if(ppi[ParmsNum].type==DEF_ELLIPSE){
-				return 1;
-			}
-
-			//パラメータが少なすぎるとき
-			SetError(10,FuncName,cp);
-			return 0;
-		}
-
-		//省略パラメータに "0" を指定する
-		for(;ParmsNum < pi_num;ParmsNum++){
-			extern HANDLE hHeap;
-			char temporary[64];
-			if(ppi[ParmsNum].bByVal) lstrcpy(temporary,"0");
-			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
-			Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-			lstrcpy(Parms[ParmsNum],temporary);
-		}
-	}
-
-	return 1;
-}
-void CParameter::MacroParameterSupport(PARAMETER_INFO *ppi){
-	int i;
-	for(i=0;i<ParmsNum;i++){
-		if(Parms[i][0]=='\0'){
-			extern HANDLE hHeap;
-			char temporary[64];
-			if(ppi[i].bByVal) lstrcpy(temporary,"0");
-			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
-			HeapDefaultFree(Parms[i]);
-			Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-			lstrcpy(Parms[i],temporary);
-		}
-	}
-}
 
 void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
Index: /BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- /BasicCompiler64/Compile_CallProc.cpp	(revision 49)
+++ /BasicCompiler64/Compile_CallProc.cpp	(revision 50)
@@ -29,134 +29,4 @@
 	pLocalVarAddrSchedule[LocalVarAddrScheduleNum]=obp;
 	LocalVarAddrScheduleNum++;
-}
-
-int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
-	int ret_type;
-
-	if(idProc==PROC_DEFAULT){
-		/////////////////////
-		// ユーザー定義関数
-		/////////////////////
-
-		SUBINFO *psi;
-		psi=(SUBINFO *)pInfo;
-
-		//GetSubHash内でエラー提示が行われた場合
-		if(psi==(SUBINFO *)-1) return -1;
-
-
-		//オブジェクト名を取得
-		char ObjectName[VN_SIZE];
-		int RefType;
-		SplitObjectName(name,ObjectName,&RefType);
-
-
-		////////////////////////
-		// オーバーロードを解決
-		////////////////////////
-
-		SUBINFO **ppsi;
-		int num;
-		ppsi=GetOverloadSubHash(name,&num);
-		if(num){
-			//オーバーロードを解決
-			psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
-			HeapDefaultFree(ppsi);
-
-			if(!psi) return 0;
-		}
-
-
-		Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
-		if( plpRetIndex ){
-			*plpRetIndex = psi->u.ReturnIndex;
-		}
-		return psi->ReturnType;
-	}
-	else if(idProc==PROC_DLL){
-		/////////////////////////
-		// DLL関数
-		/////////////////////////
-		DECLAREINFO *pdi;
-		pdi=(DECLAREINFO *)pInfo;
-
-		ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
-	}
-	else if(idProc==PROC_BUILTIN){
-		/////////////////////////
-		// 組み込み関数
-		/////////////////////////
-		int FuncId;
-		FuncId=(int)(_int64)pInfo;
-
-		TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
-		Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
-		if( plpRetIndex ){
-			*plpRetIndex = ReturnTypeInfo.u.lpIndex;
-		}
-		return ReturnTypeInfo.type;
-	}
-	else if(idProc==PROC_PTR){
-		/////////////////
-		// 関数ポインタ
-		/////////////////
-
-		LONG_PTR lpIndex;
-		GetVarType(name,&lpIndex,0);
-
-		extern PROCPTRINFO *pProcPtrInfo;
-		ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
-	}
-
-	return ret_type;
-}
-
-BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
-	//プロパティ用のメソッドを呼び出す
-
-	//配列要素を取得
-	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
-	GetArrayElement(variable,VarName,ArrayElements);
-
-	//オブジェクト名を取得
-	char ObjectName[VN_SIZE];
-	int RefType;
-	SplitObjectName(VarName,ObjectName,&RefType);
-
-	//オーバーロード用の関数リストを作成
-	SUBINFO **ppsi;
-	int num;
-	ppsi=GetOverloadSubHash(VarName,&num);
-	if(num==0){
-		return 0;
-	}
-
-	//パラメータを整備
-	char *Parameter;
-	Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
-	lstrcpy(Parameter,ArrayElements);
-	if(RightSide){
-		if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
-		lstrcat(Parameter,RightSide);
-	}
-
-	//オーバーロードを解決
-	SUBINFO *psi;
-	psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
-	HeapDefaultFree(ppsi);
-
-	if(psi){
-		//呼び出し
-		Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
-
-		if( pRetTypeInfo ){
-			pRetTypeInfo->type = psi->ReturnType;
-			pRetTypeInfo->u.lpIndex = psi->u.ReturnIndex;
-		}
-	}
-
-	HeapDefaultFree(Parameter);
-
-	return 1;
 }
 
Index: /BasicCompiler64/Compile_Func.cpp
===================================================================
--- /BasicCompiler64/Compile_Func.cpp	(revision 49)
+++ /BasicCompiler64/Compile_Func.cpp	(revision 50)
@@ -101,10 +101,7 @@
 		//左辺の型にのっとり、オーバーロードを解決
 
-		SUBINFO **ppsi;
-		int num;
-		ppsi=GetOverloadSubHash( name, &num );
-		if(!num){
-			HeapDefaultFree(ppsi);
-
+		std::vector<SUBINFO *> subs;
+		GetOverloadSubHash( name, subs );
+		if( subs.size() == 0 ){
 			SetError(27,name,cp);
 			return;
@@ -113,6 +110,5 @@
 		//オーバーロードを解決
 		extern PROCPTRINFO *pProcPtrInfo;
-		psi=OverloadSolution(name,ppsi,num,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
-		HeapDefaultFree(ppsi);
+		psi=OverloadSolution(name,subs,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
 
 		if(!psi){
Index: /BasicCompiler64/Compile_Object.cpp
===================================================================
--- /BasicCompiler64/Compile_Object.cpp	(revision 49)
+++ /BasicCompiler64/Compile_Object.cpp	(revision 50)
@@ -2,5 +2,5 @@
 #include "opcode.h"
 
-void CallConstructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+void _call_constructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
 	////////////////////////////
 	// コンストラクタの呼び出し
@@ -32,13 +32,12 @@
 	////////////////////////
 
-	SUBINFO **ppsi;
+	std::vector<SUBINFO *> subs;
+	pobj_c->EnumMethod( pobj_c->name, subs );
+
 	SUBINFO *psi;
-	int num;
-	ppsi=GetOverloadObjectSubHash(pobj_c->name,pobj_c,&num);
-	if(num){
+	if( subs.size() > 0 ){
 		//オーバーロードを解決
 		psi=OverloadSolutionWithStrParam(pobj_c->name,
-			ppsi,num,CreateParameter,"",NULL);
-		HeapDefaultFree(ppsi);
+			subs,CreateParameter,"",NULL);
 
 		if(!psi) return;
@@ -227,5 +226,5 @@
 	////////////////////////////
 
-	CallConstructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
+	_call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
 
 
Index: /BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler64/Compile_ProcOp.cpp	(revision 49)
+++ /BasicCompiler64/Compile_ProcOp.cpp	(revision 50)
@@ -84,5 +84,5 @@
 					TypeInfo.type=GlobalVar[i].type;
 					TypeInfo.u.lpIndex=GlobalVar[i].u.index;
-					CallConstractor(
+					CallConstructor(
 						GlobalVar[i].name,
 						GlobalVar[i].SubScripts,
Index: /BasicCompiler64/Compile_Statement.cpp
===================================================================
--- /BasicCompiler64/Compile_Statement.cpp	(revision 49)
+++ /BasicCompiler64/Compile_Statement.cpp	(revision 50)
@@ -725,10 +725,7 @@
 					pobj_c=(CClass *)lpIndex;
 
-					SUBINFO **ppsi;
-					int num;
-					ppsi=pobj_c->GetOperatorSubInfo(CALC_EQUAL,num);
-					if(num==0){
-						HeapDefaultFree(ppsi);
-
+					std::vector<SUBINFO *> subs;
+					pobj_c->EnumMethod( CALC_EQUAL, subs );
+					if( subs.size() == 0 ){
 						return;
 					}
@@ -746,6 +743,5 @@
 					//オーバーロードを解決
 					SUBINFO *psi;
-					psi=OverloadSolution("==",ppsi,num,ppi,iParmNum,NULL);
-					HeapDefaultFree(ppsi);
+					psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
 					HeapDefaultFree(ppi);
 
Index: /BasicCompiler64/Compile_Var.cpp
===================================================================
--- /BasicCompiler64/Compile_Var.cpp	(revision 49)
+++ /BasicCompiler64/Compile_Var.cpp	(revision 50)
@@ -1300,5 +1300,5 @@
 		//コンストラクタ呼び出し
 		if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
-			CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
+			CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter);
 		}
 	}
Index: /BasicCompiler64/Opcode.h
===================================================================
--- /BasicCompiler64/Opcode.h	(revision 49)
+++ /BasicCompiler64/Opcode.h	(revision 50)
@@ -341,6 +341,6 @@
 
 public:
-	CParameter(char *buffer);
-	CParameter(PARAMETER_INFO *pParamInfo,int ParmNum);
+	CParameter(const char *buffer);
+	CParameter(const PARAMETER_INFO *pParamInfo, const int ParmNum);
 	~CParameter();
 	void SetReturnType(TYPEINFO *pTypeInfo);
@@ -348,7 +348,7 @@
 private:
 	BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
-	SUBINFO *OverloadSolutionWithReturnType(const char *name,SUBINFO **ppsi,int num);
+	SUBINFO *OverloadSolutionWithReturnType( const char *name, std::vector<SUBINFO *> &subs );
 public:
-	SUBINFO *OverloadSolution(const char *name,SUBINFO **ppsi,int num);
+	SUBINFO *OverloadSolution( const char *name, std::vector<SUBINFO *> &subs );
 
 	BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
@@ -380,6 +380,4 @@
 //Compile_CallProc.cpp
 void AddLocalVarAddrSchedule();
-int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
-BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
 #define PROCFLAG_NEW	1
 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
Index: /BasicCompiler64/OperatorProc.cpp
===================================================================
--- /BasicCompiler64/OperatorProc.cpp	(revision 49)
+++ /BasicCompiler64/OperatorProc.cpp	(revision 50)
@@ -31,10 +31,7 @@
 	pobj_c=(CClass *)index_stack[sp-2];
 
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_c->GetOperatorSubInfo(idCalc,num);
-	if(num==0){
-		HeapDefaultFree(ppsi);
-
+	std::vector<SUBINFO *> subs;
+	pobj_c->EnumMethod( idCalc, subs );
+	if( subs.size() == 0 ){
 		return 0;
 	}
@@ -48,7 +45,7 @@
 	int i;
 	BOOL bReturnTypeIsObject=1;
-	TYPEINFO ReturnType={DEF_OBJECT,ppsi[0]->u.ReturnIndex};
-	for(i=0;i<num;i++){
-		if(ppsi[i]->ReturnType!=DEF_OBJECT)
+	TYPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};
+	for(i=0;i<subs.size();i++){
+		if(subs[i]->ReturnType!=DEF_OBJECT)
 			bReturnTypeIsObject=0;
 	}
@@ -88,6 +85,6 @@
 	else GetCalcName(idCalc,temporary);
 	SUBINFO *psi;
-	psi=OverloadSolution(temporary,ppsi,num,ppi,iParmNum,pBaseTypeInfo);
-	HeapDefaultFree(ppsi);
+	psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
+
 
 	if(!psi){
@@ -438,10 +435,8 @@
 //インデクサ（getter）を呼び出す
 void CallIndexerGetterProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_Class->GetOperatorSubInfo(CALC_ARRAY_GET,num);
-	if(num==0){
-		HeapDefaultFree(ppsi);
-
+
+	std::vector<SUBINFO *> subs;
+	pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
 		return;
 	}
@@ -452,7 +447,7 @@
 	//////////////////////////////////////////////////////
 
-		Opcode_CallProc(Parameter,ppsi[0],0,ObjectName,DEF_OBJECT);
-		RetTypeInfo.type = ppsi[0]->ReturnType;
-		RetTypeInfo.u.lpIndex = ppsi[0]->u.ReturnIndex;
+		Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT);
+		RetTypeInfo.type = subs[0]->ReturnType;
+		RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
 
 		//mov reg,rax
@@ -464,4 +459,3 @@
 	}////////////////////////////////////////////
 
-	HeapDefaultFree(ppsi);
 }
Index: /BasicCompiler_Common/Class.cpp
===================================================================
--- /BasicCompiler_Common/Class.cpp	(revision 49)
+++ /BasicCompiler_Common/Class.cpp	(revision 50)
@@ -142,5 +142,5 @@
 				cp=pobj_c->ppobj_StaticMember[i]->source_code_address;
 
-				CallConstractor(temporary,
+				CallConstructor(temporary,
 					pobj_c->ppobj_StaticMember[i]->SubScripts,
 					pobj_c->ppobj_StaticMember[i]->TypeInfo,
@@ -225,11 +225,6 @@
 	}
 
-	if(ppobj_StaticMethod){
-		//静的メソッド
-		for(i=0;i<iStaticMethodNum;i++){
-			delete ppobj_StaticMethod[i];
-		}
-		HeapDefaultFree(ppobj_StaticMethod);
-		ppobj_StaticMethod=0;
+	foreach( CMethod *method, StaticMethods ){
+		delete method;
 	}
 }
@@ -306,13 +301,12 @@
 }
 void CClass::AddStaticMethod(SUBINFO *psi,DWORD dwAccess){
-	ppobj_StaticMethod=(CMethod **)HeapReAlloc(hHeap,0,ppobj_StaticMethod,(iStaticMethodNum+1)*sizeof(CMethod *));
-	ppobj_StaticMethod[iStaticMethodNum]=new CMethod();
-	ppobj_StaticMethod[iStaticMethodNum]->psi=psi;
-	ppobj_StaticMethod[iStaticMethodNum]->dwAccess=dwAccess;
-	ppobj_StaticMethod[iStaticMethodNum]->bAbstract=0;
-	ppobj_StaticMethod[iStaticMethodNum]->bVirtual=0;
-	ppobj_StaticMethod[iStaticMethodNum]->pobj_InheritsClass=0;
-
-	iStaticMethodNum++;
+	CMethod *method = new CMethod();
+	method->psi=psi;
+	method->dwAccess=dwAccess;
+	method->bAbstract=0;
+	method->bVirtual=0;
+	method->pobj_InheritsClass=0;
+
+	StaticMethods.push_back( method );
 }
 BOOL CClass::DupliCheckAll(const char *name){
@@ -355,22 +349,14 @@
 }
 CMethod *CClass::GetMethodInfo( SUBINFO *psi ){
-	int i;
-	for( i=0; i<iMethodNum; i++ ){
-		if( psi == ppobj_Method[i]->psi ) break;
-	}
-	if( i == iMethodNum ){
-		return NULL;
-	}
-	return ppobj_Method[i];
+	for( int i=iMethodNum-1; i>=0; i-- ){
+		if( psi == ppobj_Method[i]->psi ) return ppobj_Method[i];
+	}
+	return NULL;
 }
 CMethod *CClass::GetStaticMethodInfo( SUBINFO *psi ){
-	int i;
-	for( i=0; i<iStaticMethodNum; i++ ){
-		if( psi == ppobj_StaticMethod[i]->psi ) break;
-	}
-	if( i == iStaticMethodNum ){
-		return NULL;
-	}
-	return ppobj_StaticMethod[i];
+	for( int i=(int)StaticMethods.size()-1; i>=0; i-- ){
+		if( psi == StaticMethods[i]->psi ) return StaticMethods[i];
+	}
+	return NULL;
 }
 bool CClass::IsExistMethod( const char *name ){
@@ -381,8 +367,41 @@
 }
 bool CClass::IsExistStaticMethod( const char *name ){
-	for( int i=0; i<iStaticMethodNum; i++ ){
-		if( lstrcmp( ppobj_StaticMethod[i]->psi->name, name ) == 0 ) return true;
+	foreach( CMethod *method, StaticMethods ){
+		if( lstrcmp( method->psi->name, name ) == 0 ) return true;
 	}
 	return false;
+}
+
+void CClass::EnumStaticMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const
+{
+	foreach( CMethod *method, StaticMethods ){
+		if(lstrcmp(methodName,method->psi->name)==0){
+			subs.push_back( method->psi );
+		}
+	}
+}
+
+void CClass::EnumMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const
+{
+	//オブジェクトのメンバ関数の場合
+	//※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
+	for(int i=iMethodNum-1;i>=0;i--){
+		if(lstrcmp(name,ppobj_Method[i]->psi->name)==0){
+			subs.push_back( ppobj_Method[i]->psi );
+		}
+	}
+}
+
+void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector<SUBINFO *> &subs ) const
+{
+	for(int i=0;i<iMethodNum;i++){
+		char *temp;
+		temp=ppobj_Method[i]->psi->name;
+		if(temp[0]==1&&temp[1]==ESC_OPERATOR){
+			if((BYTE)temp[2]==idOperatorCalc){
+				subs.push_back( ppobj_Method[i]->psi );
+			}
+		}
+	}
 }
 
@@ -465,26 +484,4 @@
 
 	return false;
-}
-
-
-SUBINFO **CClass::GetOperatorSubInfo(BYTE idCalc,int &num){
-	//格納のための構造体配列を用意
-	SUBINFO **ppArray_si;
-	ppArray_si=(SUBINFO **)HeapAlloc(hHeap,0,sizeof(SUBINFO *)*1024);
-	num=0;
-
-	int i;
-	for(i=0;i<iMethodNum;i++){
-		char *temp;
-		temp=ppobj_Method[i]->psi->name;
-		if(temp[0]==1&&temp[1]==ESC_OPERATOR){
-			if((BYTE)temp[2]==idCalc){
-				ppArray_si[num]=ppobj_Method[i]->psi;
-				num++;
-			}
-		}
-	}
-
-	return ppArray_si;
 }
 
@@ -895,6 +892,4 @@
 			pobj_c->ppobj_Method=(CMethod **)HeapAlloc(hHeap,0,1);
 			pobj_c->iMethodNum=0;
-			pobj_c->ppobj_StaticMethod=(CMethod **)HeapAlloc(hHeap,0,1);
-			pobj_c->iStaticMethodNum=0;
 
 			pobj_c->ConstructorMemberSubIndex=-1;
@@ -1057,6 +1052,4 @@
 			pobj_c->ppobj_Method=(CMethod **)HeapAlloc(hHeap,0,1);
 			pobj_c->iMethodNum=0;
-			pobj_c->ppobj_StaticMethod=(CMethod **)HeapAlloc(hHeap,0,1);
-			pobj_c->iStaticMethodNum=0;
 
 			pobj_c->ConstructorMemberSubIndex=-1;
Index: /BasicCompiler_Common/Class.h
===================================================================
--- /BasicCompiler_Common/Class.h	(revision 49)
+++ /BasicCompiler_Common/Class.h	(revision 50)
@@ -1,3 +1,3 @@
-
+#include <vector>
 
 class CClass;
@@ -61,4 +61,7 @@
 };
 class CClass{
+	//静的メソッド情報
+	std::vector<CMethod *> StaticMethods;
+
 public:
 	//クラス名
@@ -83,8 +86,4 @@
 	int iStaticMemberNum;
 
-	//静的メソッド情報
-	CMethod **ppobj_StaticMethod;
-	int iStaticMethodNum;
-
 	//仮想関数の数
 	int vtbl_num;
@@ -117,4 +116,9 @@
 	bool IsExistStaticMethod( const char *name );
 
+	//メソッドを列挙
+	void EnumStaticMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const;
+	void EnumMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const;
+	void EnumMethod( const BYTE idOperatorCalc, std::vector<SUBINFO *> &subs ) const;
+
 
 	//vtbl
@@ -126,8 +130,4 @@
 	void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
 	bool IsAbstract();
-
-
-	//オペレータ関数の取得
-	SUBINFO **GetOperatorSubInfo(BYTE idCalc,int &num);
 
 
Index: /BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- /BasicCompiler_Common/NumOpe_GetType.cpp	(revision 49)
+++ /BasicCompiler_Common/NumOpe_GetType.cpp	(revision 50)
@@ -193,10 +193,7 @@
 	pobj_c=(CClass *)index_stack[sp-2];
 
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_c->GetOperatorSubInfo(idCalc,num);
-	if(num==0){
-		HeapDefaultFree(ppsi);
-
+	std::vector<SUBINFO *> subs;
+	pobj_c->EnumMethod( idCalc, subs );
+	if( subs.size() == 0 ){
 		return 0;
 	}
@@ -234,6 +231,6 @@
 	else GetCalcName(idCalc,temporary);
 	SUBINFO *psi;
-	psi=OverloadSolution(temporary,ppsi,num,ppi,iParmNum,pBaseTypeInfo);
-	HeapDefaultFree(ppsi);
+	psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
+
 
 	if(!psi){
Index: /BasicCompiler_Common/Object.cpp
===================================================================
--- /BasicCompiler_Common/Object.cpp	(revision 49)
+++ /BasicCompiler_Common/Object.cpp	(revision 50)
@@ -113,5 +113,5 @@
 
 
-void CallConstractor(char *ObjectName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter){
+void CallConstructor(char *ObjectName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter){
 	if(TypeInfo.type!=DEF_OBJECT) return;
 
Index: /BasicCompiler_Common/Overload.cpp
===================================================================
--- /BasicCompiler_Common/Overload.cpp	(revision 49)
+++ /BasicCompiler_Common/Overload.cpp	(revision 50)
@@ -7,58 +7,70 @@
 #endif
 
-SUBINFO *OverloadSolutionWithStrParam(char *name,SUBINFO **ppsi,int num,char *Parameter,char *ObjectName,TYPEINFO *pReturnTypeInfo){
-	// オーバーロードの解決
+SUBINFO *OverloadSolutionWithStrParam(
+	const char *name,
+	std::vector<SUBINFO *> &subs,
+	const char *Parameter,
+	const char *ObjectName,
+	TYPEINFO *pReturnTypeInfo){
 
-	//オーバーロードされていないとき
-	if(num==1) return ppsi[0];
+		// オーバーロードの解決
+
+		//オーバーロードされていないとき
+		if( subs.size() == 1 ) return subs[0];
 
 
-	////////////////////////
-	// パラメータをセット
-	////////////////////////
+		////////////////////////
+		// パラメータをセット
+		////////////////////////
 
-	CParameter *pobj_parameter=0;
+		CParameter *pobj_parameter=0;
 
-	char MethodName[VN_SIZE];
-	if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name );
+		char MethodName[VN_SIZE];
+		if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name );
 
-	//メソッドの場合は静的かどうかを調べる
-	bool isStatic = false;
-	CClass *pClass = ppsi[0]->pobj_ParentClass;
-	if( pClass ){
-		isStatic = pClass->IsExistStaticMethod( MethodName );
-	}
+		//メソッドの場合は静的かどうかを調べる
+		bool isStatic = false;
+		CClass *pClass = subs[0]->pobj_ParentClass;
+		if( pClass ){
+			isStatic = pClass->IsExistStaticMethod( MethodName );
+		}
 
-	//パラメータオブジェクトを生成
-	pobj_parameter=new CParameter(Parameter);
-	if(pReturnTypeInfo) pobj_parameter->SetReturnType(pReturnTypeInfo);
+		//パラメータオブジェクトを生成
+		pobj_parameter=new CParameter(Parameter);
+		if(pReturnTypeInfo) pobj_parameter->SetReturnType(pReturnTypeInfo);
 
 
-	SUBINFO *psi;
-	psi=pobj_parameter->OverloadSolution(name,ppsi,num);
+		SUBINFO *psi;
+		psi=pobj_parameter->OverloadSolution(name,subs);
 
 
-	//パラメータオブジェクトを破棄
-	delete pobj_parameter;
-	pobj_parameter=0;
+		//パラメータオブジェクトを破棄
+		delete pobj_parameter;
+		pobj_parameter=0;
 
-	return psi;
+		return psi;
 }
 
-SUBINFO *OverloadSolution(const char *name,SUBINFO **ppsi,int num,PARAMETER_INFO *ppi,int ParmNum,TYPEINFO *pReturnTypeInfo){
-	// オーバーロードの解決
+SUBINFO *OverloadSolution(
+	const char *name,
+	std::vector<SUBINFO *> &subs,
+	const PARAMETER_INFO *ppi,
+	const int ParmNum,
+	TYPEINFO *pReturnTypeInfo){
 
-	//オーバーロードされていないとき
-	if(num==1) return ppsi[0];
+		// オーバーロードの解決
+
+		//オーバーロードされていないとき
+		if( subs.size() == 1 ) return subs[0];
 
 
-	CParameter *pobj_Parameter=new CParameter(ppi,ParmNum);
-	if(pReturnTypeInfo) pobj_Parameter->SetReturnType(pReturnTypeInfo);
+		CParameter *pobj_Parameter=new CParameter(ppi,ParmNum);
+		if(pReturnTypeInfo) pobj_Parameter->SetReturnType(pReturnTypeInfo);
 
-	SUBINFO *psi;
-	psi=pobj_Parameter->OverloadSolution(name,ppsi,num);
+		SUBINFO *psi;
+		psi=pobj_Parameter->OverloadSolution(name,subs);
 
-	delete pobj_Parameter;
+		delete pobj_Parameter;
 
-	return psi;
+		return psi;
 }
Index: /BasicCompiler_Common/Subroutine.cpp
===================================================================
--- /BasicCompiler_Common/Subroutine.cpp	(revision 49)
+++ /BasicCompiler_Common/Subroutine.cpp	(revision 50)
@@ -104,5 +104,7 @@
 	return true;
 }
-int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
+
+
+int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
 	int ret_type;
 
@@ -129,11 +131,9 @@
 		////////////////////////
 
-		SUBINFO **ppsi;
-		int num;
-		ppsi=GetOverloadSubHash(name,&num);
-		if(num){
+		std::vector<SUBINFO *> subs;
+		GetOverloadSubHash(name,subs);
+		if(subs.size()){
 			//オーバーロードを解決
-			psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
-			HeapDefaultFree(ppsi);
+			psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
 
 			if(!psi) return 0;
@@ -141,6 +141,9 @@
 
 
-		ret_type=psi->ReturnType;
-		*plpRetIndex=psi->u.ReturnIndex;
+		Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
+		if( plpRetIndex ){
+			*plpRetIndex = psi->u.ReturnIndex;
+		}
+		return psi->ReturnType;
 	}
 	else if(idProc==PROC_DLL){
@@ -151,6 +154,5 @@
 		pdi=(DECLAREINFO *)pInfo;
 
-		ret_type=pdi->ReturnType;
-		*plpRetIndex=pdi->u.ReturnIndex;
+		ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
 	}
 	else if(idProc==PROC_BUILTIN){
@@ -161,6 +163,10 @@
 		FuncId=(int)(_int64)pInfo;
 
-		ret_type=GetFunctionType(FuncId);
-		*plpRetIndex=-1;
+		TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
+		Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
+		if( plpRetIndex ){
+			*plpRetIndex = ReturnTypeInfo.u.lpIndex;
+		}
+		return ReturnTypeInfo.type;
 	}
 	else if(idProc==PROC_PTR){
@@ -173,11 +179,10 @@
 
 		extern PROCPTRINFO *pProcPtrInfo;
-		ret_type=pProcPtrInfo[lpIndex].ReturnType;
-		*plpRetIndex=pProcPtrInfo[lpIndex].u.ReturnIndex;
+		ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
 	}
 
 	return ret_type;
 }
-BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
+BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
 	//プロパティ用のメソッドを呼び出す
 
@@ -192,8 +197,7 @@
 
 	//オーバーロード用の関数リストを作成
-	SUBINFO **ppsi;
-	int num;
-	ppsi=GetOverloadSubHash(VarName,&num);
-	if(num==0){
+	std::vector<SUBINFO *> subs;
+	GetOverloadSubHash(VarName,subs);
+	if(subs.size()==0){
 		return 0;
 	}
@@ -210,6 +214,126 @@
 	//オーバーロードを解決
 	SUBINFO *psi;
-	psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
-	HeapDefaultFree(ppsi);
+	psi=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
+
+	if(psi){
+		//呼び出し
+		Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
+
+		if( pRetTypeInfo ){
+			pRetTypeInfo->type = psi->ReturnType;
+			pRetTypeInfo->u.lpIndex = psi->u.ReturnIndex;
+		}
+	}
+
+	HeapDefaultFree(Parameter);
+
+	return 1;
+}
+
+
+int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
+	int ret_type;
+
+	if(idProc==PROC_DEFAULT){
+		/////////////////////
+		// ユーザー定義関数
+		/////////////////////
+
+		SUBINFO *psi;
+		psi=(SUBINFO *)pInfo;
+
+		//GetSubHash内でエラー提示が行われた場合
+		if(psi==(SUBINFO *)-1) return -1;
+
+
+		//オブジェクト名を取得
+		char ObjectName[VN_SIZE];
+		int RefType;
+		SplitObjectName(name,ObjectName,&RefType);
+
+
+		////////////////////////
+		// オーバーロードを解決
+		////////////////////////
+
+		std::vector<SUBINFO *> subs;
+		GetOverloadSubHash(name,subs);
+		if( subs.size() > 0 ){
+			//オーバーロードを解決
+			psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
+
+			if(!psi) return 0;
+		}
+
+
+		ret_type=psi->ReturnType;
+		*plpRetIndex=psi->u.ReturnIndex;
+	}
+	else if(idProc==PROC_DLL){
+		/////////////////////////
+		// DLL関数
+		/////////////////////////
+		DECLAREINFO *pdi;
+		pdi=(DECLAREINFO *)pInfo;
+
+		ret_type=pdi->ReturnType;
+		*plpRetIndex=pdi->u.ReturnIndex;
+	}
+	else if(idProc==PROC_BUILTIN){
+		/////////////////////////
+		// 組み込み関数
+		/////////////////////////
+		int FuncId;
+		FuncId=(int)(_int64)pInfo;
+
+		ret_type=GetFunctionType(FuncId);
+		*plpRetIndex=-1;
+	}
+	else if(idProc==PROC_PTR){
+		/////////////////
+		// 関数ポインタ
+		/////////////////
+
+		LONG_PTR lpIndex;
+		GetVarType(name,&lpIndex,0);
+
+		extern PROCPTRINFO *pProcPtrInfo;
+		ret_type=pProcPtrInfo[lpIndex].ReturnType;
+		*plpRetIndex=pProcPtrInfo[lpIndex].u.ReturnIndex;
+	}
+
+	return ret_type;
+}
+BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
+	//プロパティ用のメソッドを呼び出す
+
+	//配列要素を取得
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(variable,VarName,ArrayElements);
+
+	//オブジェクト名を取得
+	char ObjectName[VN_SIZE];
+	int RefType;
+	SplitObjectName(VarName,ObjectName,&RefType);
+
+	//オーバーロード用の関数リストを作成
+	std::vector<SUBINFO *> subs;
+	GetOverloadSubHash(VarName,subs);
+	if(subs.size()==0){
+		return 0;
+	}
+
+	//パラメータを整備
+	char *Parameter;
+	Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
+	lstrcpy(Parameter,ArrayElements);
+	if(RightSide){
+		if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
+		lstrcat(Parameter,RightSide);
+	}
+
+	//オーバーロードを解決
+	SUBINFO *psi;
+	psi=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
 
 	if(psi){
@@ -225,17 +349,12 @@
 //インデクサ（getter）の戻り値を取得
 bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo){
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_Class->GetOperatorSubInfo(CALC_ARRAY_GET,num);
-	if(num==0){
-		HeapDefaultFree(ppsi);
-
+	std::vector<SUBINFO *> subs;
+	pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
 		return false;
 	}
 
-	RetTypeInfo.type = ppsi[0]->ReturnType;
-	RetTypeInfo.u.lpIndex = ppsi[0]->u.ReturnIndex;
-
-	HeapDefaultFree(ppsi);
+	RetTypeInfo.type = subs[0]->ReturnType;
+	RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
 
 	return true;
Index: /BasicCompiler_Common/calculation.cpp
===================================================================
--- /BasicCompiler_Common/calculation.cpp	(revision 49)
+++ /BasicCompiler_Common/calculation.cpp	(revision 50)
@@ -1199,16 +1199,14 @@
 	BOOL bRet=0;
 
-	SUBINFO **ppsi;
-	int num;
-	ppsi=pobj_c->GetOperatorSubInfo(CALC_SUBSITUATION,num);
-	if(num==0){
+	std::vector<SUBINFO *> subs;
+	pobj_c->EnumMethod( CALC_SUBSITUATION, subs );
+	if( subs.size() == 0 ){
 		bRet=0;
 		goto finish;
 	}
 
-	int i;
-	for(i=0;i<num;i++){
-		if(ppsi[i]->ParmNum==2){
-			TYPEINFO TypeInfo={ppsi[i]->pParmInfo[1].type,ppsi[i]->pParmInfo[1].u.index};
+	foreach( SUBINFO *psi, subs ){
+		if(psi->ParmNum==2){
+			TYPEINFO TypeInfo={psi->pParmInfo[1].type,psi->pParmInfo[1].u.index};
 			if(IsStringObjectType(&TypeInfo)){
 				bRet=1;
@@ -1219,5 +1217,4 @@
 
 finish:
-	HeapDefaultFree(ppsi);
 	return bRet;
 }
Index: /BasicCompiler_Common/common.h
===================================================================
--- /BasicCompiler_Common/common.h	(revision 49)
+++ /BasicCompiler_Common/common.h	(revision 50)
@@ -11,4 +11,9 @@
 #include <shlobj.h>
 #include <vector>
+
+//boost libraries
+#include <boost/foreach.hpp>
+
+#define foreach BOOST_FOREACH
 
 #ifdef _AMD64_
@@ -417,6 +422,5 @@
 SUBINFO *GetSubHash(const char *name,BOOL bError=0);
 SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0);
-SUBINFO **GetOverloadObjectSubHash(char *name,CClass *pobj_c, int *pNum);
-SUBINFO **GetOverloadSubHash(const char *name,int *pNum);
+void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs );
 
 //Object.cpp
@@ -424,9 +428,19 @@
 int GetSizeOfClass(CClass *pobj_c);
 void AddClassName(char *Parameter,int NowLine);
-void CallConstractor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter);
+void CallConstructor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter);
 
 //Overload.sbp
-SUBINFO *OverloadSolutionWithStrParam(char *name,SUBINFO **ppsi,int num,char *Parameter,char *ObjectName,TYPEINFO *pReturnTypeInfo);
-SUBINFO *OverloadSolution(const char *name,SUBINFO **ppsi,int num,PARAMETER_INFO *ppi,int ParmNum,TYPEINFO *pReturnTypeInfo);
+SUBINFO *OverloadSolutionWithStrParam(
+	const char *name,
+	std::vector<SUBINFO *> &subs,
+	const char *Parameter,
+	const char *ObjectName,
+	TYPEINFO *pReturnTypeInfo);
+SUBINFO *OverloadSolution(
+	const char *name,
+	std::vector<SUBINFO *> &subs,
+	const PARAMETER_INFO *ppi,
+	const int ParmNum,
+	TYPEINFO *pReturnTypeInfo);
 
 //Debug.cpp
@@ -550,4 +564,6 @@
 void SplitObjectName(const char *name,char *ObjectName,int *pRefType);
 bool SplitMemberName( const char *desc, char *object, char *member );
+int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
+BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
Index: /BasicCompiler_Common/hash.cpp
===================================================================
--- /BasicCompiler_Common/hash.cpp	(revision 49)
+++ /BasicCompiler_Common/hash.cpp	(revision 50)
@@ -53,29 +53,5 @@
 }
 
-SUBINFO **GetOverloadObjectSubHash(char *name,CClass *pobj_c, int *pNum){
-	int i;
-
-
-	//格納のための構造体配列を用意
-	extern HANDLE hHeap;
-	SUBINFO **ppArray_si;
-	int num=0;
-	ppArray_si=(SUBINFO **)HeapAlloc(hHeap,0,sizeof(SUBINFO *)*1024);
-
-
-	//オブジェクトのメンバ関数の場合
-	//※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
-	for(i=pobj_c->iMethodNum-1;i>=0;i--){
-		if(lstrcmp(name,pobj_c->ppobj_Method[i]->psi->name)==0){
-			ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
-			num++;
-		}
-	}
-
-	*pNum=num;
-	return ppArray_si;
-}
-
-SUBINFO **GetOverloadSubHash( const char *lpszName, int *pNum ){
+void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs ){
 	extern SUBINFO *pSubInfo;
 	extern int SubInfoNum;
@@ -90,11 +66,4 @@
 	}
 	else lstrcpy(name,lpszName);
-
-
-	//格納のための構造体配列を用意
-	extern HANDLE hHeap;
-	SUBINFO **ppArray_si;
-	int num=0;
-	ppArray_si=(SUBINFO **)HeapAlloc(hHeap,0,sizeof(SUBINFO *)*1024);
 
 
@@ -122,5 +91,5 @@
 				}
 				else{
-					goto finish;
+					return;
 				}
 			}
@@ -129,10 +98,5 @@
 		if( isStatic ){
 			// 静的メソッドから取得
-			for(i=0;i<pobj_c->iStaticMethodNum;i++){
-				if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
-					ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
-					num++;
-				}
-			}
+			pobj_c->EnumStaticMethod( NestMember, subs );
 		}
 		else{
@@ -142,6 +106,5 @@
 			for(i=pobj_c->iMethodNum-1;i>=0;i--){
 				if(lstrcmp(NestMember,pobj_c->ppobj_Method[i]->psi->name)==0){
-					ppArray_si[num]=pobj_c->ppobj_Method[i]->psi;
-					num++;
+					subs.push_back( pobj_c->ppobj_Method[i]->psi );
 				}
 			}
@@ -161,10 +124,5 @@
 			CClass *pobj_c = pobj_CompilingClass;
 
-			for(i=0;i<pobj_c->iStaticMethodNum;i++){
-				if(lstrcmp(name,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){
-					ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi;
-					num++;
-				}
-			}
+			pobj_c->EnumStaticMethod( NestMember, subs );
 
 
@@ -178,6 +136,5 @@
 			for(;i<pobj_CompilingClass->iMethodNum;i++){
 				if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
-					ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
-					num++;
+					subs.push_back( pobj_CompilingClass->ppobj_Method[i]->psi );
 				}
 			}
@@ -188,6 +145,5 @@
 				if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass){
 					if(lstrcmp(name,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){
-						ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi;
-						num++;
+						subs.push_back( pobj_CompilingClass->ppobj_Method[i]->psi );
 					}
 				}
@@ -211,6 +167,5 @@
 			if(!psi->pobj_ParentClass){
 				if(lstrcmp(psi->name,name)==0){
-					ppArray_si[num]=psi;
-					num++;
+					subs.push_back( psi );
 				}
 			}
@@ -220,30 +175,23 @@
 
 	}
-finish:
-
-	*pNum=num;
-	return ppArray_si;
 }
 
 //オーバーロードされていない関数を取得（昔のコンパイラソースコードとの互換性保持）
 SUBINFO *GetSubHash(const char *lpszName,BOOL bError){
-	int num;
-	SUBINFO **ppsi,*psi;
-	ppsi = GetOverloadSubHash(lpszName,&num);
+	std::vector<SUBINFO *> subs;
+	GetOverloadSubHash(lpszName,subs);
 
 	//関数が存在しないとき
-	if(num == 0){
-		HeapDefaultFree(ppsi);
+	if(subs.size() == 0){
 		return 0;
 	}
 
 	//一つ以上の関数が存在するときは内部エラー（デバッグ用）
-	if(num > 1){
+	if(subs.size() > 1){
 		if(bError) SetError(300,NULL,cp);
 	}
 
-	psi = ppsi[0];
-
-	HeapDefaultFree(ppsi);
+	SUBINFO *psi;
+	psi = subs[0];
 
 	return psi;
@@ -253,17 +201,15 @@
 	sprintf(temporary,"%s.%s",ObjectName,MethodName);
 
-	int num;
-	SUBINFO **ppsi,*psi;
-	ppsi = GetOverloadSubHash(temporary,&num);
+	std::vector<SUBINFO *> subs;
+	SUBINFO *psi;
+	GetOverloadSubHash(temporary,subs);
 
 	//関数が存在しないとき
-	if(num == 0){
-		HeapDefaultFree(ppsi);
+	if(subs.size() == 0){
 		return 0;
 	}
 
 	//オーバーロードを解決
-	psi=OverloadSolutionWithStrParam(temporary,ppsi,num,Parameter,ObjectName,NULL);
-	HeapDefaultFree(ppsi);
+	psi=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName,NULL);
 
 	return psi;
