From 18b5ffeb206bcd65da02a76ef250d111380257e6 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 3 Jun 2026 01:00:27 +0300 Subject: [PATCH 1/5] =?UTF-8?q?#1531:=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D1=80=D0=BE=D1=81=D1=81-=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D1=8B=20=D0=B4=D0=B5=D0=BB=D0=B5=D0=B3=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/cross-delegate-native.os | 97 +++++++++++++++++++++++++++++++++ tests/cross-delegate-stack.os | 99 ++++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 tests/cross-delegate-native.os create mode 100644 tests/cross-delegate-stack.os diff --git a/tests/cross-delegate-native.os b/tests/cross-delegate-native.os new file mode 100644 index 000000000..a8413a589 --- /dev/null +++ b/tests/cross-delegate-native.os @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////// +// Тест класса Действие/Action +/////////////////////////////////////////////////////////////////////// + +Перем юТест; + +//////////////////////////////////////////////////////////////////// +// Программный интерфейс + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("ТестДолжен_ВыполнитьДействиеОбъектаТеста_Стэковый"); + ВсеТесты.Добавить("ТестДолжен_ВыполнитьДействиеОбъектаТеста_Родной"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьКоличествоПараметров_Стэковый"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьКоличествоПараметров_Родной"); + + Возврат ВсеТесты; + +КонецФункции + +Процедура ТестДолжен_ВыполнитьДействиеОбъектаТеста(Знач ТипДелегата) + + Делегат = ТестовыйДелегат(ТипДелегата); + Делегат.Выполнить("123", 456); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличествоПараметров(Знач ТипДелегата) + + Делегат = ТестовыйДелегат(ТипДелегата); + + ЕстьОшибка = Ложь; + Попытка + Делегат.Выполнить("123"); + Исключение + ЕстьОшибка = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(ЕстьОшибка, "Вызов с недостаточным количеством параметров должен бросать исключение"); + + ЕстьОшибка = Ложь; + Попытка + Делегат.Выполнить("123", 456, '00010101'); + Исключение + ЕстьОшибка = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(ЕстьОшибка, "Вызов с избыточным количеством параметров должен бросать исключение"); + +КонецПроцедуры + +Процедура ТестДолжен_ВыполнитьДействиеОбъектаТеста_Стэковый() Экспорт + ТестДолжен_ВыполнитьДействиеОбъектаТеста("#stack"); +КонецПроцедуры + +Процедура ТестДолжен_ВыполнитьДействиеОбъектаТеста_Родной() Экспорт + ТестДолжен_ВыполнитьДействиеОбъектаТеста("#native"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличествоПараметров_Родной() Экспорт + ТестДолжен_ПроверитьКоличествоПараметров("#native") +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличествоПараметров_Стэковый() Экспорт + ТестДолжен_ПроверитьКоличествоПараметров("#stack") +КонецПроцедуры + +Функция ТестовыйДелегат(Знач ТипДелегата) + + ПутьКСкрипту = юТест.ИмяВременногоФайла("os"); + ИмяКласса = "Класс" + СтрЗаменить(Новый УникальныйИдентификатор, "-", ""); + + ТекстКласса = ТипДелегата + + " + | + |Процедура Тест(Парам, Парам2) Экспорт + | Сообщить(Парам + Парам2); + |КонецПроцедуры"; + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКСкрипту); + ЗаписьТекста.Записать(ТекстКласса); + ЗаписьТекста.Закрыть(); + + ПодключитьСценарий(ПутьКСкрипту, ИмяКласса); + + Класс = Новый(ИмяКласса); + + Делегат = Новый Действие(Класс, "Тест"); + + Возврат Делегат; + +КонецФункции diff --git a/tests/cross-delegate-stack.os b/tests/cross-delegate-stack.os new file mode 100644 index 000000000..01c7739ac --- /dev/null +++ b/tests/cross-delegate-stack.os @@ -0,0 +1,99 @@ +#stack + +/////////////////////////////////////////////////////////////////////// +// Тест класса Действие/Action +/////////////////////////////////////////////////////////////////////// + +Перем юТест; + +//////////////////////////////////////////////////////////////////// +// Программный интерфейс + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("ТестДолжен_ВыполнитьДействиеОбъектаТеста_Стэковый"); + ВсеТесты.Добавить("ТестДолжен_ВыполнитьДействиеОбъектаТеста_Родной"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьКоличествоПараметров_Стэковый"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьКоличествоПараметров_Родной"); + + Возврат ВсеТесты; + +КонецФункции + +Процедура ТестДолжен_ВыполнитьДействиеОбъектаТеста(Знач ТипДелегата) + + Делегат = ТестовыйДелегат(ТипДелегата); + Делегат.Выполнить("123", 456); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличествоПараметров(Знач ТипДелегата) + + Делегат = ТестовыйДелегат(ТипДелегата); + + ЕстьОшибка = Ложь; + Попытка + Делегат.Выполнить("123"); + Исключение + ЕстьОшибка = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(ЕстьОшибка, "Вызов с недостаточным количеством параметров должен бросать исключение"); + + ЕстьОшибка = Ложь; + Попытка + Делегат.Выполнить("123", 456, '00010101'); + Исключение + ЕстьОшибка = Истина; + КонецПопытки; + + юТест.ПроверитьИстину(ЕстьОшибка, "Вызов с избыточным количеством параметров должен бросать исключение"); + +КонецПроцедуры + +Процедура ТестДолжен_ВыполнитьДействиеОбъектаТеста_Стэковый() Экспорт + ТестДолжен_ВыполнитьДействиеОбъектаТеста("#stack"); +КонецПроцедуры + +Процедура ТестДолжен_ВыполнитьДействиеОбъектаТеста_Родной() Экспорт + ТестДолжен_ВыполнитьДействиеОбъектаТеста("#native"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличествоПараметров_Родной() Экспорт + ТестДолжен_ПроверитьКоличествоПараметров("#native") +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьКоличествоПараметров_Стэковый() Экспорт + ТестДолжен_ПроверитьКоличествоПараметров("#stack") +КонецПроцедуры + +Функция ТестовыйДелегат(Знач ТипДелегата) + + ПутьКСкрипту = юТест.ИмяВременногоФайла("os"); + ИмяКласса = "Класс" + СтрЗаменить(Новый УникальныйИдентификатор, "-", ""); + + ТекстКласса = ТипДелегата + + " + | + |Процедура Тест(Парам, Парам2) Экспорт + | Сообщить(Парам + Парам2); + |КонецПроцедуры"; + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКСкрипту); + ЗаписьТекста.Записать(ТекстКласса); + ЗаписьТекста.Закрыть(); + + ПодключитьСценарий(ПутьКСкрипту, ИмяКласса); + + Класс = Новый(ИмяКласса); + + Делегат = Новый Действие(Класс, "Тест"); + + Возврат Делегат; + +КонецФункции From c22978a8749a33e2f472de0807edd434125ab8ab Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 3 Jun 2026 01:00:37 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E=D1=89=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Tests/DocumenterTests/XmlDocConversionTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Tests/DocumenterTests/XmlDocConversionTest.cs b/src/Tests/DocumenterTests/XmlDocConversionTest.cs index 19534c9c0..da3b2c4e1 100644 --- a/src/Tests/DocumenterTests/XmlDocConversionTest.cs +++ b/src/Tests/DocumenterTests/XmlDocConversionTest.cs @@ -31,7 +31,8 @@ public void TestConversionOfTextBlock() var expected = @"Для Каждого Переменная Из ПеременныеСреды() Цикл Сообщить(Переменная.Ключ + "" = "" + Переменная.Значение); -КонецЦикла;"; +КонецЦикла;" + .ReplaceLineEndings("\n"); Assert.Equal(expected, text); } From aaeaa5feba9972b0f2715343831d12ab813d2f58 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 3 Jun 2026 01:01:05 +0300 Subject: [PATCH 3/5] =?UTF-8?q?#1531:=20=D0=9C=D0=B5=D1=82=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B4=D0=B5=D0=BB=D0=B5=D0=B3=D0=B0?= =?UTF-8?q?=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/DelegateAction.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/OneScript.StandardLibrary/DelegateAction.cs b/src/OneScript.StandardLibrary/DelegateAction.cs index 32fb02697..3ab1b2721 100644 --- a/src/OneScript.StandardLibrary/DelegateAction.cs +++ b/src/OneScript.StandardLibrary/DelegateAction.cs @@ -83,6 +83,16 @@ public override void CallAsProcedure(int methodNumber, IValue[] arguments, IBslP _action(process, arguments); } + [ContextMethod("Выполнить")] + public BslValue Execute(IBslProcess process, params BslValue[] p) + { + var retValue = _action(process, p); + return retValue is IValueReference r + ? r.BslValue + : (BslValue)(retValue ?? ValueFactory.Create()) + ; + } + [ScriptConstructor] public static DelegateAction Create(IRuntimeContextInstance target, string methodName) { From dfb0e87cb188935f7585b09cd99341da9c8b886b Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 3 Jun 2026 01:01:53 +0300 Subject: [PATCH 4/5] =?UTF-8?q?#1531:=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B0=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Runtime/CallableMethod.cs | 12 +++++++++++- src/ScriptEngine/Machine/MachineInstance.cs | 10 +++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/OneScript.Native/Runtime/CallableMethod.cs b/src/OneScript.Native/Runtime/CallableMethod.cs index f61237aad..35e972f6d 100644 --- a/src/OneScript.Native/Runtime/CallableMethod.cs +++ b/src/OneScript.Native/Runtime/CallableMethod.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq.Expressions; using OneScript.Contexts; +using OneScript.Exceptions; using OneScript.Execution; using OneScript.Native.Compiler; using OneScript.Values; @@ -42,7 +43,16 @@ public BslValue Invoke(IBslProcess process, object target, BslValue[] args) { throw new InvalidOperationException($"Method {_method} was not compiled"); } - + if (_method.GetBslParameters().Length < args.Length) + { + throw RuntimeException.TooManyArgumentsPassed(); + } + if (_method.GetBslParameters().Length > args.Length) + { + // TODO: значения параметров по-умолчанию? + throw RuntimeException.TooFewArgumentsPassed(); + } + var callableWrapper = GetCallableWrapper(target); return _delegate.Invoke(callableWrapper, args, process); } diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index eb5d73bf1..fc735a311 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -138,7 +138,11 @@ private void SetExecutionFrame(ExecutionFrame frame, MachineMethodInfo methodInf frame.MethodName = methodInfo.Name; frame.InstructionPointer = methDescr.EntryPoint; - var parameters = methodInfo.GetBslParameters(); + var parameters = methodInfo.GetBslParameters(); + if (argValues.Length > parameters.Length) + { + throw RuntimeException.TooManyArgumentsPassed(); + } var variables = methDescr.LocalVariables; var locals = new IVariable[variables.Length]; int i = 0; @@ -171,6 +175,10 @@ private void SetExecutionFrame(ExecutionFrame frame, MachineMethodInfo methodInf for (; i < parameters.Length; i++) { var paramDef = parameters[i]; + if (!paramDef.HasDefaultValue) + { + throw RuntimeException.TooFewArgumentsPassed(); + } var value = paramDef.HasDefaultValue ? (IValue)paramDef.DefaultValue : ValueFactory.Create(); locals[i] = Variable.Create(value, variables[i]); } From b534a4316d2d6d9a92031a04a61f839b7b816de2 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 3 Jun 2026 10:37:04 +0300 Subject: [PATCH 5/5] =?UTF-8?q?#1531:=20=D0=97=D0=B0=D0=B1=D1=8B=D1=82?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B0=D0=BD=D0=BD=D0=BE=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/cross-delegate-native.os | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/cross-delegate-native.os b/tests/cross-delegate-native.os index a8413a589..27ef557e1 100644 --- a/tests/cross-delegate-native.os +++ b/tests/cross-delegate-native.os @@ -1,3 +1,5 @@ +#native + /////////////////////////////////////////////////////////////////////// // Тест класса Действие/Action ///////////////////////////////////////////////////////////////////////