From ddc85fe9a750a9f96f06880a57169d4d44fdd101 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Fri, 21 Nov 2014 00:58:36 +0200 Subject: [PATCH] bind chain optimizations --- src/bindx/BindxExt.hx | 45 +++++++++++++++---------------------------- test/ChainBindTest.hx | 22 ++++++++++++++++++++- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/bindx/BindxExt.hx b/src/bindx/BindxExt.hx index b09c79e..f3b7416 100644 --- a/src/bindx/BindxExt.hx +++ b/src/bindx/BindxExt.hx @@ -100,56 +100,41 @@ class BindExt { var e = prev.e; var fieldListenerBody = []; - var fieldListener:Expr; + var fieldListener; if (field.bindable) zeroListener = { f:field, l:listenerNameExpr }; var type = Context.typeof(field.e).toComplexType(); - var unbind:Expr; - + var callPrev = macro $prevListenerNameExpr($a { prev.params != null ? [] : [macro null, macro n.$fieldName] } ); if (prev.bindable) { - unbind = BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(valueExpr, prev.field, prevListenerNameExpr ); + var unbind = BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(valueExpr, prev.field, prevListenerNameExpr ); res.bind.push(macro var $value:Null<$type> = null ); res.unbind.push(macro if ($valueExpr != null) { $unbind; $valueExpr = null; } ); - fieldListenerBody.push(macro - if (n != null) { - $ { BindMacros.bindingSignalProvider.getClassFieldBindExpr(macro n, prev.field, prevListenerNameExpr ) } - $prevListenerNameExpr($a { prev.params != null ? [] : [macro n.$fieldName, macro n.$fieldName] } ); - } - ); + fieldListenerBody.push(macro if ($valueExpr != null) $unbind ); + fieldListenerBody.push(macro $valueExpr = n ); + fieldListenerBody.push(macro if (n != null) { + $ { BindMacros.bindingSignalProvider.getClassFieldBindExpr(macro n, prev.field, prevListenerNameExpr ) } + $callPrev; + }); } else { - fieldListenerBody.push(macro - if (n != null) { - $prevListenerNameExpr($a { prev.params != null ? [] : [macro n.$fieldName, macro n.$fieldName] } ); - } - ); + fieldListenerBody.push(macro if (n != null) $callPrev ); } if (field.params != null) { - if (prev.bindable) { - if (field.bindable) { - fieldListenerBody.unshift(macro $valueExpr = n ); - fieldListenerBody.unshift(macro if ($valueExpr != null) $unbind ); - } else { - fieldListenerBody.unshift(macro if (n != null) ${BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(macro n, prev.field, prevListenerNameExpr )} ); - } - } - fieldListenerBody.unshift(macro var n:Null<$type> = $e ); + fieldListenerBody.unshift(macro var n:Null<$type> = try $e catch (e:Dynamic) null ); fieldListener = macro function $listenerName ():Void $b { fieldListenerBody }; } else { - if (prev.bindable) { - fieldListenerBody.unshift(macro $valueExpr = n ); - fieldListenerBody.unshift(macro if ($valueExpr != null) $unbind ); - fieldListenerBody.unshift(macro if (o != null) ${BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(macro o, prev.field, prevListenerNameExpr )} ); + fieldListenerBody.unshift(macro if (o != null) + ${BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(macro o, prev.field, prevListenerNameExpr )} + ); } - fieldListener = macro function $listenerName (o:Null<$type>, n:Null<$type>):Void - $b { fieldListenerBody }; + fieldListener = macro function $listenerName (o:Null<$type>, n:Null<$type>):Void $b { fieldListenerBody }; } res.bind.push(fieldListener); diff --git a/test/ChainBindTest.hx b/test/ChainBindTest.hx index 66f5007..af1e20a 100644 --- a/test/ChainBindTest.hx +++ b/test/ChainBindTest.hx @@ -63,9 +63,25 @@ class ChainBindTest extends BuddySuite { b.c.nc.c.f("tada").d = val = "b"; callNum.should.be(2); + b2.c.nc.c.f("tada").d = val = "c"; + var t = b.c; + b.c = b2.c; + + callNum.should.be(3); + + val = t.nc.c.f("tada").d; + b.c = t; + + callNum.should.be(4); + + b2.c.nc.c.f("tada").d = val = "d"; + + b.c.nc.c = b2.c.nc.c; + callNum.should.be(5); + unbind(); b.c.nc.c.f("tada").d = "c"; - callNum.should.be(2); + callNum.should.be(5); }); it("BindExt.chain should bind chain changes (double gap)", { @@ -119,6 +135,10 @@ class BindableChain implements bindx.IBindable { return c; } + public function nf(s:String):BindableChain { + return nc; + } + public function new(depth:Int) { if (depth > 0) { c = new BindableChain(depth - 1);