From 7794aaa92ea81d64f3f96819fe8ee53f7f17e585 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 20 Oct 2023 21:23:53 +0400 Subject: [PATCH 1/5] =?UTF-8?q?fix=20#1364:=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8C=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B5=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=BB=D0=B5=D0=BA=D1=82=D0=BE=D1=80=20+?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20(v2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/Reflector.cs | 29 ++++++++------ tests/reflector.os | 44 ++++++++++++++++++++++ 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/OneScript.StandardLibrary/Reflector.cs b/src/OneScript.StandardLibrary/Reflector.cs index 1f610d5eb..a13f8a85f 100644 --- a/src/OneScript.StandardLibrary/Reflector.cs +++ b/src/OneScript.StandardLibrary/Reflector.cs @@ -79,26 +79,31 @@ public IValue CallMethod(IRuntimeContextInstance target, string methodName, Arra private static IValue[] GetArgsToPass(ArrayImpl arguments, ParameterInfo[] parameters) { - var argsToPass = new List(); - if (arguments != null) - { - argsToPass.AddRange(arguments); - } - - if (parameters.Length < argsToPass.Count) + var argValues = arguments?.ToArray() ?? Array.Empty(); + // ArrayImpl не может (не должен!) содержать null или NotAValidValue + + if (argValues.Length > parameters.Length) throw RuntimeException.TooManyArgumentsPassed(); - for (int i = 0; i < argsToPass.Count; i++) + var argsToPass = new IValue[parameters.Length]; + + int i = 0; + for (; i < argValues.Length; i++) { if (parameters[i].IsByRef()) - argsToPass[i] = Variable.Create(argsToPass[i], $"reflectorArg{i}"); + argsToPass[i] = Variable.Create(argValues[i], ""); + else + argsToPass[i] = argValues[i]; } - while (argsToPass.Count < parameters.Length) + for (; i < parameters.Length; i++) { - argsToPass.Add(null); + if (!parameters[i].HasDefaultValue) + throw RuntimeException.TooFewArgumentsPassed(); + + // else keep null as a default value } - return argsToPass.ToArray(); + return argsToPass; } /// diff --git a/tests/reflector.os b/tests/reflector.os index b5a07ca6f..8b498cc28 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -24,6 +24,9 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуСвойств"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаСПараметрамиПоУмолчанию"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаБезПараметровПоУмолчанию"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуПараметровПоУмолчанию"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодСуществуетДляТипа"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуМетодовДляТипа"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляСистемногоТипа"); @@ -420,6 +423,47 @@ КонецФункции +Процедура ТестДолжен_ПроверитьВызовМетодаБезПараметровПоУмолчанию() Экспорт + Рефлектор = Новый Рефлектор; + + Массив = Новый Массив(1); + Арг = Новый Массив; + Арг.Добавить(0); + + Ошибка = Ложь; + Попытка + Рефлектор.ВызватьМетод(Массив, "Установить", Арг); + Ч = Массив[0]; + Ошибка = Истина; + Исключение + Сообщение = ОписаниеОшибки(); + Если СтрНайти(Сообщение,"NullReferenceException") <> 0 Тогда + Ошибка = Истина; + КонецЕсли; + КонецПопытки; + + Если Ошибка Тогда + юТест.ТестПровален("Вызов рефлектора с недостаточным количеством параметров без умолчания"); + КонецЕсли; + +КонецПроцедуры + +Процедура ТестПередачиПараметровПоУмолчанию(Пар1, Пар2="п2") Экспорт + юТест.ПроверитьРавенство(Пар1, "п1", "Тест передачи параметров: параметр 1"); + юТест.ПроверитьРавенство(Пар2, "п2", "Тест передачи параметров: параметр 2"); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПередачуПараметровПоУмолчанию() Экспорт + Рефлектор = Новый Рефлектор; + + Массив = Новый Массив(1); + Арг = Новый Массив; + Арг.Добавить("п1"); + Рефлектор.ВызватьМетод(ЭтотОбъект, "ТестПередачиПараметровПоУмолчанию", Арг); + +КонецПроцедуры + + Процедура ТестДолжен_ПроверитьМетодСуществуетДляТипа() Экспорт Рефлектор = Новый Рефлектор; From 08b08b03bcbc8557a61c474641ad8c08d01e0b25 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 20 Oct 2023 21:26:13 +0400 Subject: [PATCH 2/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B5=D1=84=D0=B8=D0=BA=D1=81=D1=8B?= =?UTF-8?q?=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Language/LexicalAnalysis/LabelLexerState.cs | 7 +++++++ .../SyntaxAnalysis/AstNodes/ErrorTerminalNode.cs | 7 +++++++ .../SyntaxAnalysis/AstNodes/LabelNode.cs | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/src/OneScript.Language/LexicalAnalysis/LabelLexerState.cs b/src/OneScript.Language/LexicalAnalysis/LabelLexerState.cs index d9734fb91..fbabf2d8c 100644 --- a/src/OneScript.Language/LexicalAnalysis/LabelLexerState.cs +++ b/src/OneScript.Language/LexicalAnalysis/LabelLexerState.cs @@ -1,3 +1,10 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + using System.Diagnostics; using OneScript.Localization; diff --git a/src/OneScript.Language/SyntaxAnalysis/AstNodes/ErrorTerminalNode.cs b/src/OneScript.Language/SyntaxAnalysis/AstNodes/ErrorTerminalNode.cs index b3a0a3deb..a4a3c76f9 100644 --- a/src/OneScript.Language/SyntaxAnalysis/AstNodes/ErrorTerminalNode.cs +++ b/src/OneScript.Language/SyntaxAnalysis/AstNodes/ErrorTerminalNode.cs @@ -1,3 +1,10 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + using OneScript.Language.LexicalAnalysis; namespace OneScript.Language.SyntaxAnalysis.AstNodes diff --git a/src/OneScript.Language/SyntaxAnalysis/AstNodes/LabelNode.cs b/src/OneScript.Language/SyntaxAnalysis/AstNodes/LabelNode.cs index f26c8adc5..9721e90ce 100644 --- a/src/OneScript.Language/SyntaxAnalysis/AstNodes/LabelNode.cs +++ b/src/OneScript.Language/SyntaxAnalysis/AstNodes/LabelNode.cs @@ -1,3 +1,10 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + using OneScript.Language.LexicalAnalysis; namespace OneScript.Language.SyntaxAnalysis.AstNodes From 26b037690ff9a3c511866eaf2b1929e22732af43 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 20 Oct 2023 21:42:42 +0400 Subject: [PATCH 3/5] =?UTF-8?q?=D0=9E=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=BD=D0=B5=D1=82=D0=BE=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=20=D0=B2=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=D1=85=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/Reflector.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OneScript.StandardLibrary/Reflector.cs b/src/OneScript.StandardLibrary/Reflector.cs index a13f8a85f..1d25c2096 100644 --- a/src/OneScript.StandardLibrary/Reflector.cs +++ b/src/OneScript.StandardLibrary/Reflector.cs @@ -107,11 +107,11 @@ private static IValue[] GetArgsToPass(ArrayImpl arguments, ParameterInfo[] param } /// - /// Проверяет существование указанного метода у переданного объекта.. + /// Проверяет существование указанного метода у переданного объекта. /// /// Объект, из которого получаем таблицу методов. /// Имя метода для вызова - /// Истину, если метод существует, и Ложь в обратном случае. + /// Истина, если метод существует, и Ложь в обратном случае. [ContextMethod("МетодСуществует", "MethodExists")] public bool MethodExists(IValue target, string methodName) { @@ -211,10 +211,10 @@ private static RuntimeException NonReflectableType() } /// - /// Получает таблицу методов для переданного объекта.. + /// Получает таблицу методов для переданного объекта. /// /// Объект, из которого получаем таблицу методов. - /// Таблица значений колонками: Имя, Количество, ЭтоФункция, Аннотации + /// Таблица значений с колонками: Имя, Количество, ЭтоФункция, Аннотации, Параметры, Экспорт [ContextMethod("ПолучитьТаблицуМетодов", "GetMethodsTable")] public ValueTable GetMethodsTable(IValue target) { @@ -367,11 +367,11 @@ private static void FillMethodsTable(ValueTable result, IEnumerable - /// Получает таблицу свойств для переданного объекта.. + /// Получает таблицу свойств для переданного объекта. /// /// Объект, из которого получаем таблицу свойств. /// Включить в результат приватные поля - /// Таблица значений с колонками - Имя, Аннотации + /// Таблица значений с колонками - Имя, Аннотации, Экспорт [ContextMethod("ПолучитьТаблицуСвойств", "GetPropertiesTable")] public ValueTable GetPropertiesTable(IValue target, bool withPrivate = false) { From b0f364110593607a63e5035e1dd51a52fe9bcf93 Mon Sep 17 00:00:00 2001 From: Michael Rybakin Date: Fri, 20 Oct 2023 21:56:57 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.StandardLibrary/Reflector.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OneScript.StandardLibrary/Reflector.cs b/src/OneScript.StandardLibrary/Reflector.cs index 1d25c2096..06415985d 100644 --- a/src/OneScript.StandardLibrary/Reflector.cs +++ b/src/OneScript.StandardLibrary/Reflector.cs @@ -325,7 +325,7 @@ private static void FillMethodsTable(ValueTable result, IEnumerable Date: Sat, 21 Oct 2023 20:09:46 +0400 Subject: [PATCH 5/5] =?UTF-8?q?=D0=92=D1=8B=D0=B7=D0=BE=D0=B2=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20COM-=D0=BE=D0=B1=D1=8A?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=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/OneScript.StandardLibrary/Reflector.cs | 8 ++++++-- .../Machine/Contexts/COMWrapperContext.cs | 10 ++-------- .../Machine/Contexts/UnmanagedCOMWrapperContext.cs | 7 +++++-- tests/reflector.os | 12 ++++++++++++ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/OneScript.StandardLibrary/Reflector.cs b/src/OneScript.StandardLibrary/Reflector.cs index 06415985d..0032434d6 100644 --- a/src/OneScript.StandardLibrary/Reflector.cs +++ b/src/OneScript.StandardLibrary/Reflector.cs @@ -51,8 +51,12 @@ public IValue CallMethod(IRuntimeContextInstance target, string methodName, Arra var methodIdx = target.GetMethodNumber(methodName); var methInfo = target.GetMethodInfo(methodIdx); - var argsToPass = GetArgsToPass(arguments, methInfo.GetParameters()); - + IValue[] argsToPass; + if (target.DynamicMethodSignatures) + argsToPass = arguments?.ToArray() ?? Array.Empty(); + else + argsToPass = GetArgsToPass(arguments, methInfo.GetParameters()); + IValue retValue = ValueFactory.Create(); if (methInfo.IsFunction()) { diff --git a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs index 80f620dda..960ebdc01 100644 --- a/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs @@ -327,14 +327,8 @@ public void Dispose() #endregion - public override bool DynamicMethodSignatures - { - get - { - return true; - } - } - + public override bool DynamicMethodSignatures => true; + [ScriptConstructor] public static COMWrapperContext Constructor(IValue[] args) { diff --git a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs index 058ed8715..b9893ff1d 100644 --- a/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs +++ b/src/ScriptEngine/Machine/Contexts/UnmanagedCOMWrapperContext.cs @@ -174,8 +174,11 @@ public override int GetMethodNumber(string name) public override BslMethodInfo GetMethodInfo(int methodNumber) { - //TODO: Доработать RcwMethodMetadata - return BslMethodBuilder.Create().Build(); + var md = _methods[methodNumber]; + return BslMethodBuilder.Create() + .Name(md.Name) + .ReturnType(md.IsFunction ?? true ? typeof(IValue) : typeof(void)) + .Build(); } private MethodSignature GetMethodDescription(int methodNumber) diff --git a/tests/reflector.os b/tests/reflector.os index 8b498cc28..7973d1ca4 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -50,6 +50,10 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПримитивный"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПользовательский"); +#Если Windows Тогда + ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаComОбъекта"); +#КонецЕсли + Возврат ВсеТесты; КонецФункции @@ -870,3 +874,11 @@ юТест.ПроверитьЗаполненность(ИзвестныйТип.Значение); КонецПроцедуры + +#Если Windows Тогда +Процедура ТестДолжен_ПроверитьВызовМетодаComОбъекта() Экспорт + FSO = ПолучитьCOMОбъект("", "Scripting.FileSystemObject"); + Рез = FSO.DriveExists("C"); + юТест.ПроверитьТип(Рез, "Булево"); +КонецПроцедуры +#КонецЕсли