From 79bc66243965adc55d2eab8fc4aaabbc4a10302e Mon Sep 17 00:00:00 2001 From: Joe Shaw Date: Sun, 13 Mar 2005 01:13:04 +0000 Subject: *** empty log message *** --- mono/ProxyBuilder.cs | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/mono/ProxyBuilder.cs b/mono/ProxyBuilder.cs index fefac473..737a82af 100644 --- a/mono/ProxyBuilder.cs +++ b/mono/ProxyBuilder.cs @@ -21,6 +21,8 @@ namespace DBus new Type[0]); private static MethodInfo Service_AddSignalCalledMI = typeof(Service).GetMethod("add_SignalCalled", new Type[] {typeof(Service.SignalCalledHandler)}); + private static MethodInfo Service_RemoveSignalCalledMI = typeof(Service).GetMethod("remove_SignalCalled", + new Type[] {typeof(Service.SignalCalledHandler)}); private static MethodInfo Signal_PathNameMI = typeof(Signal).GetMethod("get_PathName", new Type[0]); private static MethodInfo Message_ArgumentsMI = typeof(Message).GetMethod("get_Arguments", @@ -402,7 +404,7 @@ namespace DBus } } - public void BuildConstructor(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo pathF, MethodInfo signalCalledMI) + public void BuildConstructor(ref TypeBuilder typeB, FieldInfo serviceF, FieldInfo pathF, MethodInfo signalCalledMI, FieldInfo deleF) { Type[] pars = {typeof(Service), typeof(string)}; ConstructorBuilder constructor = typeB.DefineConstructor(MethodAttributes.RTSpecialName | @@ -419,12 +421,19 @@ namespace DBus generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_2); generator.Emit(OpCodes.Stfld, pathF); - - //generator.EmitWriteLine("myService.SignalCalled += new Service.SignalCalledHandler(Service_SignalCalled)"); + + //generator.EmitWriteLine("this.delegate_created = new Service.SignalCalledHandler(Service_SignalCalled)"); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldftn, signalCalledMI); generator.Emit(OpCodes.Newobj, Service_SignalCalledHandlerC); + generator.Emit(OpCodes.Stloc_0); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldloc_0); + generator.Emit(OpCodes.Stfld, deleF); + + //generator.EmitWriteLine("myService.SignalCalled += this.delegate_created"); + generator.Emit(OpCodes.Ldloc_0); generator.EmitCall(OpCodes.Callvirt, Service_AddSignalCalledMI, null); //generator.EmitWriteLine("return"); @@ -453,6 +462,27 @@ namespace DBus generator.Emit(OpCodes.Ret); } + public void BuildFinalizer (TypeBuilder tb, FieldInfo fi) + { + // Note that this is a *HORRIBLE* example of how to build a finalizer + // It doesn't use the try/finally to chain to Object::Finalize. However, + // because that is always going to be a nop, lets just ignore that here. + // If you are trying to find the right code, look at what mcs does ;-). + + MethodBuilder mb = tb.DefineMethod("Finalize", + MethodAttributes.Family | + MethodAttributes.HideBySig | + MethodAttributes.Virtual, + typeof (void), + new Type [0]); + ILGenerator generator = mb.GetILGenerator(); + + //generator.EmitWriteLine("this.service.SignalCalled -= this.delegate_created"); + generator.Emit (OpCodes.Ldfld, fi); + generator.Emit (OpCodes.Call, Service_RemoveSignalCalledMI); + generator.Emit (OpCodes.Ret); + } + public object GetSignalProxy() { Type proxyType = Service.ProxyAssembly.GetType(ObjectName + ".SignalProxy"); @@ -516,9 +546,13 @@ namespace DBus FieldBuilder pathF = typeB.DefineField("pathName", typeof(string), FieldAttributes.Private); + FieldBuilder deleF = typeB.DefineField("delegate_created", + typeof(Service.SignalCalledHandler), + FieldAttributes.Private); + BuildFinalizer (typeB, deleF); MethodInfo signalCalledMI = BuildSignalCalled(ref typeB, serviceF, pathF); - BuildConstructor(ref typeB, serviceF, pathF, signalCalledMI); + BuildConstructor(ref typeB, serviceF, pathF, signalCalledMI, deleF); // Build the methods foreach (DictionaryEntry interfaceEntry in this.introspector.InterfaceProxies) { -- cgit