From a47b0ab98e6de0b40bc8e10f21aa819ada73d945 Mon Sep 17 00:00:00 2001 From: Andrei Ovsiankin Date: Fri, 10 May 2024 11:56:01 +0300 Subject: [PATCH] =?UTF-8?q?closes=20#1396=20=D0=92=20=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D1=87=D0=B8=D0=BA=D0=B5=20=D0=BD=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=B2=20"=D0=B7=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D1=8C=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B9",=20=D0=BA=D0=B0=D0=BA=20=D0=B2=D0=BD=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Кроме того, рефлектор считает внешний контекст публичным. Изменено так, что внешний контекст является внутренней переменной. --- src/OneScript.StandardLibrary/Reflector.cs | 6 +++ .../Contexts/UserScriptContextInstance.cs | 4 +- tests/reflector.os | 46 +++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/OneScript.StandardLibrary/Reflector.cs b/src/OneScript.StandardLibrary/Reflector.cs index 0032434d6..ce00dd30c 100644 --- a/src/OneScript.StandardLibrary/Reflector.cs +++ b/src/OneScript.StandardLibrary/Reflector.cs @@ -271,6 +271,12 @@ private void FillPropertiesTableForObject(ValueTable result, IValue target, bool var properties = scriptObject.GetProperties() .Where(prop => !fieldNames.Contains(prop.Name)); + + if (!withPrivate) + { + properties = properties.OfType() + .Where(p => p.IsExported); + } FillPropertiesTable(result, properties.Concat(fields)); } diff --git a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs index 0c980cb07..acb163da4 100644 --- a/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs +++ b/src/ScriptEngine/Machine/Contexts/UserScriptContextInstance.cs @@ -305,9 +305,9 @@ protected override string ConvertToString() void IDebugPresentationAcceptor.Accept(IDebugValueVisitor visitor) { - var instanceProps = Module - .Properties + var instanceProps = this.GetProperties() .OfType() + .Where(p => p.DispatchId != THISOBJ_VARIABLE_INDEX) .OrderBy(x => x.DispatchId) .ToDictionary(x => x.Name, x => x.DispatchId); diff --git a/tests/reflector.os b/tests/reflector.os index 7973d1ca4..0e70763f5 100644 --- a/tests/reflector.os +++ b/tests/reflector.os @@ -50,6 +50,10 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПримитивный"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПользовательский"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуВнешнихПараметров"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРефлексиюВнешнегоПараметра"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьРефлексиюВнешнегоПараметраВРежимеПриватных"); + #Если Windows Тогда ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаComОбъекта"); #КонецЕсли @@ -882,3 +886,45 @@ юТест.ПроверитьТип(Рез, "Булево"); КонецПроцедуры #КонецЕсли + +Процедура ТестДолжен_ПроверитьПередачуВнешнихПараметров() Экспорт + Код = "Перем Результат Экспорт; Результат = Множитель * 5"; + Параметры = Новый Структура("Множитель", 2); + + ЗагружаемыйСценарий = ЗагрузитьСценарийИзСтроки(Код, Параметры); + + юТест.ПроверитьРавенство(10, ЗагружаемыйСценарий.Результат); +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРефлексиюВнешнегоПараметра() Экспорт + Код = "Перем Результат Экспорт; Результат = Множитель * 5"; + Параметры = Новый Структура("Множитель", 2); + + ЗагружаемыйСценарий = ЗагрузитьСценарийИзСтроки(Код, Параметры); + + Рефлектор = Новый Рефлектор; + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ЗагружаемыйСценарий); + + юТест.ПроверитьРавенство(1, ТаблицаСвойств.Количество()); + юТест.ПроверитьРавенство("Результат", ТаблицаСвойств[0].Имя); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРефлексиюВнешнегоПараметраВРежимеПриватных() Экспорт + Код = "Перем Результат Экспорт; Результат = Множитель * 5"; + Параметры = Новый Структура("Множитель", 2); + + ЗагружаемыйСценарий = ЗагрузитьСценарийИзСтроки(Код, Параметры); + + Рефлектор = Новый Рефлектор; + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(ЗагружаемыйСценарий, Истина); + ТаблицаСвойств.Сортировать("Имя"); + + юТест.ПроверитьРавенство(2, ТаблицаСвойств.Количество()); + юТест.ПроверитьРавенство("Множитель", ТаблицаСвойств[0].Имя); + юТест.ПроверитьЛожь(ТаблицаСвойств[0].Экспорт); + + юТест.ПроверитьРавенство("Результат", ТаблицаСвойств[1].Имя); + юТест.ПроверитьИстину(ТаблицаСвойств[1].Экспорт); + +КонецПроцедуры