# HG changeset patch # User Jordan Miner # Date 1265492753 21600 # Node ID e7595d58f8a3db2cd75cbfbe87f2229faf5d9f30 # Parent 651082a9b3643f503f28e4b01b25d53a0ab35a42 Reduce the size of an Event by sharing the mainHandler and dispatcher frame pointers. diff -r 651082a9b364 -r e7595d58f8a3 dynamin/core/event.d --- a/dynamin/core/event.d Sat Feb 06 15:12:52 2010 -0600 +++ b/dynamin/core/event.d Sat Feb 06 15:45:53 2010 -0600 @@ -70,14 +70,18 @@ public alias void delegate(ArgsType e) Dispatcher; Handler[] handlers; - /// - private Handler mainHandler; - /// - private Dispatcher dispatcher; + private void* ptr; + private void function(ArgsType e) mainHandler; + private void function(ArgsType e) dispatcher; + void setUp(Handler mainHandler, Dispatcher dispatcher = null) { - this.mainHandler = mainHandler; - this.dispatcher = dispatcher; + if(mainHandler.ptr != dispatcher.ptr && dispatcher.ptr != null) + throw new Exception("mainHandler.ptr must equal dispatcher.ptr"); + ptr = mainHandler.ptr; + this.mainHandler = mainHandler.funcptr; + this.dispatcher = dispatcher.funcptr; } + void defaultDispatch(ArgsType e) { callHandlers(e); callMainHandler(e); @@ -89,10 +93,14 @@ void opCall(ArgsType e) { if(e is null) Stdout("Warning: EventArgs null").newline; - if(!dispatcher.funcptr) + if(!dispatcher) { defaultDispatch(e); - else - dispatcher(e); + return; + } + Dispatcher dg; + dg.ptr = ptr; + dg.funcptr = dispatcher; + dg(e); } /** * Adds the specified handler to this event. The handler will be called @@ -137,8 +145,12 @@ void callMainHandler(ArgsType e) { auto stopEventArgs = cast(StopEventArgs)e; // if e is an instance of StopEventArgs, then check if it is stopped - if(stopEventArgs is null || !stopEventArgs.stopped) - mainHandler(e); + if(stopEventArgs is null || !stopEventArgs.stopped) { + Handler dg; + dg.ptr = ptr; + dg.funcptr = mainHandler; + dg(e); + } } }