Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 38 additions & 3 deletions polymod/hscript/_internal/Interp.hx
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,8 @@ class Interp
{
return Reflect.makeVarArgs(function(bindArgs:Array<Dynamic>)
{
return Reflect.callMethod(null, o, args.concat(bindArgs));
var newArgs:Array<Dynamic> = buildBindArgs(args, bindArgs);
return Reflect.callMethod(null, o, newArgs.concat(bindArgs));
});
}

Expand Down Expand Up @@ -2214,8 +2215,25 @@ class Interp
default:
}

var args = new Array();
for (p in params) args.push(expr(p));
var args = new Array<Dynamic>();
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))
{
Expand Down Expand Up @@ -5032,6 +5050,23 @@ class Interp
// }
}

function buildBindArgs(args:Array<Dynamic>, bindArgs:Array<Dynamic>):Array<Dynamic>
{
if ((args.findIndex((arg) -> arg == '_') == -1) || args.length == 0)
return args;

var funcArgs:Array<Dynamic> = 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>):Dynamic
Expand Down
Loading