Index: trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_CallProc.cpp	(revision 329)
+++ trunk/abdev/BasicCompiler64/Compile_CallProc.cpp	(revision 330)
@@ -24,6 +24,6 @@
 }
 
-bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){
-
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer)
+{
 	extern BOOL bDebugCompile;
 	extern BOOL bDebugSupportProc;
@@ -475,5 +475,83 @@
 }
 
-void UnsafeCall( const char *methodPtrValueStr, const char *params )
+void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
 {
+	///////////////////////////////////////////////////////////////
+	// _System_LocalThisのダミーをセット
+	///////////////////////////////////////////////////////////////
+
+	char temporary[VN_SIZE]={0};
+	if( objPtrValueStr && objPtrValueStr[0] ){
+		//_System_LocalThis（第一パラメータ）のダミーを作成
+		lstrcpy(temporary,"0,");
+	}
+	if( dg.ReturnType().IsStruct() ){
+		// ※ByRef _System_ReturnValue パラメータのダミーをセット
+		lstrcat(temporary,"0,");
+	}
+
+	if(params[0]=='\0'&&temporary[0])
+		temporary[lstrlen(temporary)-1]=0;
+	else lstrcat(temporary,params);
+
+
+	ParamImpl *pobj_parameter = new ParamImpl( params );
+
+	//スタックフレームに存在する既存のパラメータをバックアップ
+	pobj_parameter->BackupParameter( (int)dg.Params().size() );
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() );
+
+	//レジスタ、スタックフレームにセット
+	pobj_parameter->SetParameter( dg.GetName(), dg.Params() );
+
+
+	if( objPtrValueStr && objPtrValueStr[0] )
+	{
+		RELATIVE_VAR RelativeVar;
+		//Constアクセスが不可能なメソッドの場合
+		if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){
+			Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" );
+			return;
+		}
+
+		SetVarPtrToReg(REG_RCX,&RelativeVar);
+
+		// 参照を実体ポインタにする
+		//mov rcx,qword ptr[rcx]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
+	}
+
+
+	{
+		////////////////////////
+		// call
+		////////////////////////
+		RELATIVE_VAR RelativeVar;
+		GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() );
+		SetVarPtrToReg(REG_RAX,&RelativeVar);
+
+		//mov rax,qword ptr[rax]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_RAX,0,MOD_BASE);
+
+		//call rax
+		compiler.codeGenerator.PutOld(
+			(char)0xFF,
+			(char)0xD0
+		);
+	}
+
+
+	//レジスタのブロッキングを解除		※パラメータセット時にロックされたレジスタ
+	pobj_BlockReg->clear();
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//スタックフレームに存在する既存のパラメータを復元
+	pobj_parameter->RestoreParameter( (int)dg.Params().size() );
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
 }
Index: trunk/abdev/BasicCompiler64/Compile_Func.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_Func.cpp	(revision 329)
+++ trunk/abdev/BasicCompiler64/Compile_Func.cpp	(revision 330)
@@ -14,5 +14,6 @@
 	if( lstrcmpi( FuncName, "VarPtr" ) == 0 )			return FUNC_VARPTR;
 	if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )			return FUNC_OBJPTR;
-	if( lstrcmpi( FuncName, "__unsafe_call" ) == 0 )	return FUNC_UNSAFE_CALL;
+	if( lstrcmpi( FuncName, "__delegate_dynamicmethod_call" ) == 0 )	return FUNC_DELEGATE_DYNAMICMETHOD_CALL;
+	if( lstrcmpi( FuncName, "__delegate_staticmethod_call" ) == 0 )		return FUNC_DELEGATE_STATICMETHOD_CALL;
 	if( lstrcmpi( FuncName, "GetDouble" ) == 0 )		return FUNC_GETDOUBLE;
 	if( lstrcmpi( FuncName, "GetSingle" ) == 0 )		return FUNC_GETSINGLE;
@@ -253,12 +254,19 @@
 }
 
-void Opcode_Func_unsafe_call( const char *paramsStr, Type &resultType, bool isCallOn )
+void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
 {
 	if( isCallOn )
 	{
 		int i = 0;
-		char methodPtrParamStr[8192];
-		GetOneParameter( paramsStr, i, methodPtrParamStr );
-		UnsafeCall( methodPtrParamStr, paramsStr + i );
+		char methodPtrParamStr[VN_SIZE];
+		i = GetOneParameter( paramsStr, i, methodPtrParamStr );
+
+		char objPtrValueStr[VN_SIZE];
+		if( isDynamicCall )
+		{
+			i = GetOneParameter( paramsStr, i, objPtrValueStr );
+		}
+
+		Opcode_CallDelegate( compiler.pCompilingClass->GetDelegate(), methodPtrParamStr, objPtrValueStr, paramsStr + i );
 	}
 
@@ -311,6 +319,9 @@
 			Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
 			break;
-		case FUNC_UNSAFE_CALL:
-			Opcode_Func_unsafe_call( Parameter, resultType, isCallOn );
+		case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
+			Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
+			break;
+		case FUNC_DELEGATE_STATICMETHOD_CALL:
+			Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
 			break;
 
Index: trunk/abdev/BasicCompiler64/FunctionValue.h
===================================================================
--- trunk/abdev/BasicCompiler64/FunctionValue.h	(revision 329)
+++ trunk/abdev/BasicCompiler64/FunctionValue.h	(revision 330)
@@ -14,5 +14,6 @@
 #define FUNC_ADDRESSOF		0x0619
 #define FUNC_SIZEOF			0x0620
-#define FUNC_UNSAFE_CALL	0x0621
+#define FUNC_DELEGATE_DYNAMICMETHOD_CALL	0x0621
+#define FUNC_DELEGATE_STATICMETHOD_CALL		0x0622
 
 //ポインタ
Index: trunk/abdev/BasicCompiler64/Opcode.h
===================================================================
--- trunk/abdev/BasicCompiler64/Opcode.h	(revision 329)
+++ trunk/abdev/BasicCompiler64/Opcode.h	(revision 330)
@@ -327,5 +327,5 @@
 bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName);
 bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
-void UnsafeCall( const char *methodPtrValueStr, const char *params );
+void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params );
 
 //Compile_ProcOp.cpp
