Skip to content
Merged
Show file tree
Hide file tree
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
1 change: 1 addition & 0 deletions polymod/hscript/_internal/Expr.hx
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ enum Error
EBlacklistedField(f:String);
EPurgedFunction(f:String); // Function can't be called because it previously threw an uncaught exception
EInvalidArgCount(f:String, expected:Int, given:Int); // Given arguments count don't match the minimum required parameters
EExceedArgsCount(f:String, allowed:Int, passed:Int); // Provided arguments exceed the maximum allowed parameter count
ENullObjectReference(f:String); // Accessing a field of "null"
EInvalidScriptedFnAccess(f:String);
EInvalidScriptedVarGet(v:String);
Expand Down
11 changes: 10 additions & 1 deletion polymod/hscript/_internal/PolymodInterpEx.hx
Original file line number Diff line number Diff line change
Expand Up @@ -1941,15 +1941,24 @@ class PolymodInterpEx extends Interp
if (args == null) return;

var minParams = 0;
var maxAllowed = params.length;

for (i in 0...params.length)
{
var p = params[i];
if (!p.opt && p.value == null) minParams = i + 1;
}

final funcName:String = (name != null) ? " for function '" + name + "'" : "";
if (args.length < minParams)
{
error(EInvalidArgCount((name != null) ? " for function '" + name + "'" : "", minParams, args.length));
error(EInvalidArgCount(funcName, minParams, args.length));
}
else if (args.length > maxAllowed)
{
// Manual return for `new` as parameter count shouldn't matter here
if (name == "new") return;
error(EExceedArgsCount(funcName, maxAllowed, args.length));
}
}

Expand Down
3 changes: 2 additions & 1 deletion polymod/hscript/_internal/PolymodScriptClass.hx
Original file line number Diff line number Diff line change
Expand Up @@ -586,14 +586,15 @@ class PolymodScriptClass
if (fn != null)
{
// previousValues is used to restore variables after they are shadowed in the local scope.
var previousValues:Map<String, Dynamic> = _interp.setFunctionValues(fn, args, fnName);
var previousValues:Map<String, Dynamic> = [];

// Copy the locals and store them for later.
var localsCopy:Map<String, {r:Dynamic, ?isfinal:Null<Bool>}> = _interp.locals.copy();

var r:Dynamic = null;
try
{
previousValues = _interp.setFunctionValues(fn, args, fnName);
r = _interp.executeEx(fn.expr);
}
catch (err:Expr.Error)
Expand Down
3 changes: 2 additions & 1 deletion polymod/hscript/_internal/Printer.hx
Original file line number Diff line number Diff line change
Expand Up @@ -696,7 +696,8 @@ class Printer
case EInvalidModule(m): "Invalid module: " + m;
case EBlacklistedModule(m): "Blacklisted module: " + m;
case EBlacklistedField(m): "Blacklisted field: " + m;
case EInvalidArgCount(f, expected, given): 'Invalid number of given arguments. Got $given, required $expected' + f;
case EInvalidArgCount(f, expected, given): 'Provided arguments are fewer than the required function parameters. Got $given, required $expected' + f;
case EExceedArgsCount(f, allowed, passed): 'Provided arguments exceeds the allowed function parameter count. Passed $passed, allowed $allowed' + f;
case EPurgedFunction(f): "Invalid access to purged function (did it throw an uncaught exception earlier?): " + f;
case ENullObjectReference(f): "Invalid reference to field of a null object: " + f;
case EInvalidInStaticContext(v): "Invalid field access from static context: " + v;
Expand Down