diff --git a/polymod/hscript/_internal/Interp.hx b/polymod/hscript/_internal/Interp.hx index e1bf612c..e9bae626 100644 --- a/polymod/hscript/_internal/Interp.hx +++ b/polymod/hscript/_internal/Interp.hx @@ -459,7 +459,8 @@ class Interp { return Reflect.makeVarArgs(function(bindArgs:Array) { - return Reflect.callMethod(null, o, args.concat(bindArgs)); + var newArgs:Array = buildBindArgs(args, bindArgs); + return Reflect.callMethod(null, o, newArgs.concat(bindArgs)); }); } @@ -2214,8 +2215,25 @@ class Interp default: } - var args = new Array(); - for (p in params) args.push(expr(p)); + var args = new Array(); + for (p in params) + { + // We push a special `_` string so it's easily identifiable when using `bind` + // We will later evaluate this when the function itself is called. + switch (Tools.expr(p)) + { + case EIdent('_'): + switch (Tools.expr(e)) + { + case EField(_, 'bind'): + args.push('_'); + continue; + default: + } + default: + } + args.push(expr(p)); + } switch (Tools.expr(e)) { @@ -5032,6 +5050,23 @@ class Interp // } } + function buildBindArgs(args:Array, bindArgs:Array):Array + { + if ((args.findIndex((arg) -> arg == '_') == -1) || args.length == 0) + return args; + + var funcArgs:Array = args.copy(); + for (i in 0...funcArgs.length) + { + if (funcArgs[i] == '_') + { + if (bindArgs.length > 0) + funcArgs[i] = bindArgs.shift(); + } + } + return funcArgs; + } + private inline function buildScriptClassStaticFunction(clsName:String, fieldName:String):Dynamic { return Reflect.makeVarArgs(function(args:Array):Dynamic