Skip to content

Commit dfb0e87

Browse files
committed
#1531: контроль количества аргументов вызова.
1 parent aaeaa5f commit dfb0e87

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/OneScript.Native/Runtime/CallableMethod.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the
88
using System.Collections.Generic;
99
using System.Linq.Expressions;
1010
using OneScript.Contexts;
11+
using OneScript.Exceptions;
1112
using OneScript.Execution;
1213
using OneScript.Native.Compiler;
1314
using OneScript.Values;
@@ -42,7 +43,16 @@ public BslValue Invoke(IBslProcess process, object target, BslValue[] args)
4243
{
4344
throw new InvalidOperationException($"Method {_method} was not compiled");
4445
}
45-
46+
if (_method.GetBslParameters().Length < args.Length)
47+
{
48+
throw RuntimeException.TooManyArgumentsPassed();
49+
}
50+
if (_method.GetBslParameters().Length > args.Length)
51+
{
52+
// TODO: значения параметров по-умолчанию?
53+
throw RuntimeException.TooFewArgumentsPassed();
54+
}
55+
4656
var callableWrapper = GetCallableWrapper(target);
4757
return _delegate.Invoke(callableWrapper, args, process);
4858
}

src/ScriptEngine/Machine/MachineInstance.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ private void SetExecutionFrame(ExecutionFrame frame, MachineMethodInfo methodInf
138138
frame.MethodName = methodInfo.Name;
139139
frame.InstructionPointer = methDescr.EntryPoint;
140140

141-
var parameters = methodInfo.GetBslParameters();
141+
var parameters = methodInfo.GetBslParameters();
142+
if (argValues.Length > parameters.Length)
143+
{
144+
throw RuntimeException.TooManyArgumentsPassed();
145+
}
142146
var variables = methDescr.LocalVariables;
143147
var locals = new IVariable[variables.Length];
144148
int i = 0;
@@ -171,6 +175,10 @@ private void SetExecutionFrame(ExecutionFrame frame, MachineMethodInfo methodInf
171175
for (; i < parameters.Length; i++)
172176
{
173177
var paramDef = parameters[i];
178+
if (!paramDef.HasDefaultValue)
179+
{
180+
throw RuntimeException.TooFewArgumentsPassed();
181+
}
174182
var value = paramDef.HasDefaultValue ? (IValue)paramDef.DefaultValue : ValueFactory.Create();
175183
locals[i] = Variable.Create(value, variables[i]);
176184
}

0 commit comments

Comments
 (0)