Index: trunk/abdev/BasicCompiler32/Compile_Func.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Func.cpp	(revision 331)
+++ trunk/abdev/BasicCompiler32/Compile_Func.cpp	(revision 332)
@@ -221,36 +221,8 @@
 	compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize );
 }
-void Opcode_Func_AddressOf( const char *name, const Type &baseType ){
-	extern int cp;
-	const UserProc *pUserProc;
-
-	if( baseType.IsProcPtr() )
-	{
-		//左辺の型にのっとり、オーバーロードを解決
-
-		std::vector<const UserProc *> subs;
-		GetOverloadSubHash( name, subs );
-		if( subs.size() == 0 ){
-			SetError(27,name,cp);
-			return;
-		}
-
-		//オーバーロードを解決
-		pUserProc=OverloadSolution(name,subs,compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(), Type() );
-
-		if(!pUserProc){
-			SetError(27,name,cp);
-			return;
-		}
-	}
-	else{
-		pUserProc=GetSubHash(name);
-		if(!pUserProc){
-			SetError(27,name,cp);
-			return;
-		}
-	}
-
-	if( pUserProc->IsVirtual() ){
+
+void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
+{
+	if( userProc.IsVirtual() ){
 		///////////////////////////////
 		// 仮想関数の場合
@@ -262,5 +234,5 @@
 		char ObjectName[VN_SIZE];
 		ReferenceKind referenceKind;
-		SplitObjectName(name,ObjectName, referenceKind );
+		SplitObjectName( methodInstanceName, ObjectName, referenceKind );
 
 		if(ObjectName[0]){
@@ -305,5 +277,5 @@
 		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
 
-		int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
+		int i2 = pobj_c->GetFuncNumInVtbl( &userProc );
 
 		//mov eax,dword ptr[edx+func_index]
@@ -319,8 +291,133 @@
 
 		//mov eax,ProcAddr
-		compiler.codeGenerator.op_addressof( REG_EAX, pUserProc );
-	}
-
-	pUserProc->Using();
+		compiler.codeGenerator.op_addressof( REG_EAX, &userProc );
+	}
+
+	userProc.Using();
+}
+void Opcode_CreateSimpleDelegate( const char *methodInstanceName, const UserProc &userProc )
+{
+	/////////////////////////////////////////////////////////////////
+	// 関数ポインタをpush
+	/////////////////////////////////////////////////////////////////
+
+	//push AddressOf(userProc)
+	_Opcode_Func_AddressOf( methodInstanceName, userProc );
+	compiler.codeGenerator.op_push( REG_EAX );
+
+
+	/////////////////////////////////////////////////////////////////
+	// オブジェクト ポインタをpush
+	/////////////////////////////////////////////////////////////////
+
+	// オブジェクト名を取得
+	char objectName[VN_SIZE];
+	char memberName[VN_SIZE];
+	char *thisPtrName = "This";
+	Type type;
+	if( SplitMemberName( methodInstanceName, objectName, memberName ) )
+	{
+		if( GetVarType( objectName, type, false ) )
+		{
+			thisPtrName = objectName;
+		}
+	}
+
+	// オブジェクト ポインタを取得
+	RELATIVE_VAR relativeVar;
+	GetVarOffsetReadOnly( thisPtrName, &relativeVar, type );
+	if( !type.IsObject() )
+	{
+		extern int cp;
+		SetError(1,NULL,cp);
+		return;
+	}
+
+	SetVarPtrToEax( &relativeVar );
+
+	//mov eax,dword ptr[eax]
+	compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+
+	//push this
+	compiler.codeGenerator.op_push( REG_EAX );
+
+
+	/////////////////////////////////////////////////////////////////
+	// call _System_CreateSimpleDynamicDelegate
+	/////////////////////////////////////////////////////////////////
+
+	// call _System_CreateSimpleDynamicDelegate
+	extern const UserProc *pSub_System_CreateSimpleDynamicDelegate;
+	compiler.codeGenerator.op_call( pSub_System_CreateSimpleDynamicDelegate );
+}
+void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType ){
+	extern int cp;
+	const UserProc *pUserProc;
+
+	const Parameters *pBaseParams = NULL;
+	bool isDelegate = false;
+	if( baseType.IsProcPtr() )
+	{
+		// 左辺で関数ポインタを要求されているとき
+		pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
+	}
+	else if( baseType.IsObject() && baseType.GetClass().GetName() == "_SimpleDelegate" )
+	{
+		extern const Delegate *pConstructingDelegate;
+		if( !pConstructingDelegate )
+		{
+			SetError();
+		}
+		// 左辺でデリゲートを要求されているとき
+		pBaseParams = &pConstructingDelegate->Params();
+
+		isDelegate = true;
+	}
+
+	if( pBaseParams )
+	{
+		//左辺の型にのっとり、オーバーロードを解決
+
+		std::vector<const UserProc *> subs;
+		GetOverloadSubHash( name, subs );
+		if( subs.size() == 0 ){
+			SetError(27,name,cp);
+			return;
+		}
+
+		//オーバーロードを解決
+		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type() );
+
+		if(!pUserProc){
+			SetError(27,name,cp);
+			return;
+		}
+	}
+	else{
+		pUserProc=GetSubHash(name);
+		if(!pUserProc){
+			SetError(27,name,cp);
+			return;
+		}
+	}
+
+	if( isDelegate )
+	{
+		if( isCallOn )
+		{
+			// デリゲートのとき
+			Opcode_CreateSimpleDelegate( name, *pUserProc );
+		}
+		resultType = baseType;
+	}
+	else
+	{
+		if( isCallOn )
+		{
+			// 関数ポインタのとき
+			_Opcode_Func_AddressOf( name, *pUserProc );
+		}
+		resultType.SetBasicType( DEF_PTR_VOID );
+	}
 }
 void Opcode_Func_SizeOf( const string &typeName ){
@@ -493,6 +590,5 @@
 			break;
 		case FUNC_ADDRESSOF:
-			if( isCallOn ) Opcode_Func_AddressOf( Parameter, baseType );
-			resultType.SetBasicType( DEF_PTR_VOID );
+			Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
 			break;
 		case FUNC_SIZEOF:
