From e571f8e3644590bbfd388eecb156c98286a1343c Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Mon, 8 Dec 2014 21:29:01 +0200 Subject: [PATCH] inline some methods, speedup --- src/bindx/Bind.hx | 23 +++++++++++++---------- src/bindx/BindExt.hx | 2 +- src/bindx/MetaUtils.hx | 22 ++++++++++++++-------- test.hxml | 4 +++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/bindx/Bind.hx b/src/bindx/Bind.hx index 4eec159..ae769c8 100644 --- a/src/bindx/Bind.hx +++ b/src/bindx/Bind.hx @@ -37,23 +37,23 @@ class Bind { #if macro - static function internalBind(field:Expr, listener:Expr, doBind:Bool):Expr { + static inline function internalBind(field:Expr, listener:Expr, doBind:Bool):Expr { var fieldData = warnCheckField(field); return if (doBind) BindMacros.bindingSignalProvider.getClassFieldBindExpr(fieldData.e, fieldData.field, listener); else BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(fieldData.e, fieldData.field, listener); } - static function internalBindTo(field:Expr, target:Expr):Expr { + static inline function internalBindTo(field:Expr, target:Expr):Expr { var fieldData = warnCheckField(field); return BindMacros.bindingSignalProvider.getClassFieldBindToExpr(fieldData.e, fieldData.field, target); } - static function internalNotify(field:Expr, ?oldValue:Expr, ?newValue:Expr):Expr { + static inline function internalNotify(field:Expr, ?oldValue:Expr, ?newValue:Expr):Expr { var fieldData = warnCheckField(field); return BindMacros.bindingSignalProvider.getClassFieldChangedExpr(fieldData.e, fieldData.field, oldValue, newValue); } - static function internalUnbindAll(object:ExprOf):Expr { + static inline function internalUnbindAll(object:ExprOf):Expr { var type = Context.typeof(object).follow(); if (!isBindable(type.getClass())) { Context.error('\'${object.toString()}\' must be bindx.IBindable', object.pos); @@ -61,7 +61,7 @@ class Bind { return BindMacros.bindingSignalProvider.getUnbindAllExpr(object, type); } - static function warnCheckField(field:Expr):{e:Expr, field:ClassField} { + static inline function warnCheckField(field:Expr):{e:Expr, field:ClassField} { var res = null; try { res = checkField(field); @@ -108,19 +108,22 @@ class Bind { return {e:f, field:null, error:new GenericError('\'${f.toString()}\' is not bindable', f.pos)}; } - static function isBindable(classType:ClassType):Bool { + static inline function isBindable(classType:ClassType):Bool { var check = [classType]; - while (check.length > 0) { + var res = false; + while (check.length > 0 && !res) { var t = check.shift(); while (t != null) { - if (t.module == "bindx.IBindable" && t.name == "IBindable") - return true; + if (t.module == "bindx.IBindable" && t.name == "IBindable") { + res = true; + break; + } for (it in t.interfaces) check.push(it.t.get()); t = t.superClass != null ? t.superClass.t.get() : null; } } - return false; + return res; } #end } \ No newline at end of file diff --git a/src/bindx/BindExt.hx b/src/bindx/BindExt.hx index 85d758b..d24e1aa 100644 --- a/src/bindx/BindExt.hx +++ b/src/bindx/BindExt.hx @@ -52,7 +52,7 @@ class BindExt { #if macro - static function internalBindChain(expr:Expr, listener:Expr):Expr { + static inline function internalBindChain(expr:Expr, listener:Expr):Expr { var zeroListener = listenerName(0, ""); var chain = null; try { chain = warnPrepareChain(expr, macro $i{ zeroListener }); } catch (e:GenericError) e.contextError(); diff --git a/src/bindx/MetaUtils.hx b/src/bindx/MetaUtils.hx index 1d8bf8f..1cbb1bf 100644 --- a/src/bindx/MetaUtils.hx +++ b/src/bindx/MetaUtils.hx @@ -12,23 +12,29 @@ class MetaUtils { static public inline var BINDABLE_META = ":bindable"; - static public function findParam(meta:MetadataEntry, name:String):Expr { - if (meta.params == null) - return null; + static public inline function findParam(meta:MetadataEntry, name:String):Expr { + var res = null; - for (p in meta.params) { + if (meta.params != null) for (p in meta.params) { switch (p.expr) { case EBinop(OpAssign, e1, e2): - if (e1.toString() == name) return {expr:e2.expr, pos:p.pos}; + if (e1.toString() == name) res = {expr:e2.expr, pos:p.pos}; case _: Context.warning('Bindable arguments syntax error. Supported syntax: (flag1=true, flag2=false)', p.pos); } + if (res != null) break; } - return null; + return res; } - static public inline function bindableMeta(meta:Metadata):MetadataEntry - return meta.find(function (it) return it.name == BINDABLE_META); + static public inline function bindableMeta(meta:Metadata):MetadataEntry { + var res = null; + for (m in meta) if (m.name == BINDABLE_META) { + res = m; + break; + } + return res; + } } class FieldMetaUtils { diff --git a/test.hxml b/test.hxml index 44c4599..6d2354d 100644 --- a/test.hxml +++ b/test.hxml @@ -5,4 +5,6 @@ --interp -lib buddy -D reporter=buddy.reporting.TravisHxReporter --D console_log \ No newline at end of file +-D console_log +--times +-D macro_times \ No newline at end of file