Skip to content

Commit 5aaf54d

Browse files
committed
fix EvilBeaver#1772: возврат Рефлектором измененных параметров при исключении +тест
1 parent 36e2ca9 commit 5aaf54d

2 files changed

Lines changed: 56 additions & 19 deletions

File tree

‎src/OneScript.StandardLibrary/Reflector.cs‎

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,40 @@ public IValue CallMethod(IBslProcess process, IRuntimeContextInstance target, st
5757
else
5858
argsToPass = GetArgsToPass(arguments, methInfo.CallParameters);
5959

60-
IValue retValue = ValueFactory.Create();
61-
if (methInfo.IsFunction())
62-
{
63-
target.CallAsFunction(methodIdx, argsToPass, out retValue, process);
64-
}
65-
else
66-
{
67-
target.CallAsProcedure(methodIdx, argsToPass, process);
68-
}
69-
70-
if (arguments != null)
71-
{
72-
for (int i = 0; i < argsToPass.Length; i++)
73-
{
74-
if (i < arguments.Count())
75-
{
76-
arguments.Set(i, argsToPass[i] is IValueReference r ? r.Value : argsToPass[i]);
77-
}
60+
IValue retValue = BslUndefinedValue.Instance;
61+
try
62+
{
63+
if (methInfo.IsFunction())
64+
{
65+
target.CallAsFunction(methodIdx, argsToPass, out retValue, process);
66+
}
67+
else
68+
{
69+
target.CallAsProcedure(methodIdx, argsToPass, process);
7870
}
7971
}
80-
72+
catch (Exception ex)
73+
{
74+
CopyArgsBack(argsToPass, arguments);
75+
throw ex;
76+
}
77+
78+
CopyArgsBack(argsToPass, arguments);
8179
return retValue;
80+
}
81+
82+
private static void CopyArgsBack(IValue[] argsToPass, ArrayImpl arguments)
83+
{
84+
if (arguments == null)
85+
return;
86+
87+
for (int i = 0; i < argsToPass.Length; i++)
88+
{
89+
if (i < arguments.Count())
90+
{
91+
arguments.Set(i, argsToPass[i] is IValueReference r ? r.Value : argsToPass[i]);
92+
}
93+
}
8294
}
8395

8496
private static IValue[] GetArgsToPass(ArrayImpl arguments, ReadOnlySpan<BslCallParameter> parameters)

‎tests/reflector.os‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуМетодов_ДляРефлектора");
2121
ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуМетодов_ДляРазныхТипов");
2222
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПараметрыИзмененныеВПроцедуреВозвращеныВМассив");
23+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПараметрыИзмененныеВПроцедуреВозвращеныВМассивПриИсключении");
2324

2425
ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ПолучитьТаблицуСвойств");
2526

@@ -313,6 +314,30 @@
313314

314315
КонецПроцедуры
315316

317+
318+
Процедура ИзменитьПараметрСИсключением(Парам) Экспорт
319+
Парам = 22;
320+
ВызватьИсключение "!";
321+
Парам = 33;
322+
КонецПроцедуры
323+
324+
Процедура ТестДолжен_ПроверитьЧтоПараметрыИзмененныеВПроцедуреВозвращеныВМассивПриИсключении() Экспорт
325+
326+
Рефлектор = Новый Рефлектор;
327+
328+
Аргументы = Новый Массив(1);
329+
Аргументы[0] = 11;
330+
331+
Попытка
332+
Рефлектор.ВызватьМетод(ЭтотОбъект, "ИзменитьПараметрСИсключением", Аргументы);
333+
Исключение
334+
КонецПопытки;
335+
336+
юТест.ПроверитьРавенство(22, Аргументы[0], "Переменная не должна поменять значение");
337+
338+
КонецПроцедуры
339+
340+
316341
Процедура ТестДолжен_ПроверитьМетод_ПолучитьТаблицуСвойств() Экспорт
317342

318343
Пример = ПолучитьОбъектДляПроверки("test_reflector");

0 commit comments

Comments
 (0)