From 01b44b53eb469d60bd5b4668cebe880fd1f34062 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Tue, 14 Jan 2025 15:26:12 +1000 Subject: [PATCH 1/2] =?UTF-8?q?1.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D1=82=D0=B5=D0=BA=20=D0=B2=D1=8B=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D0=B2=20=D0=B2=20=D0=B8=D0=BD=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BE=D0=B1=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B5=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=202.=20=D0=92=20=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=D0=9A=D0=B0=D0=B4=D1=80=D0=BE=D0=B2=D0=A1=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D0=B0=D0=92=D1=8B=D0=B7=D0=BE=D0=B2=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=20=D0=9A=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=BE()=203.=20=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F=D0=9A=D0=B0=D0=B4=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BA=D0=B0=D0=92=D1=8B=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tasks/BackgroundTask.cs | 1 + .../Contexts/StackTraceCollectionContext.cs | 24 +++++++++++++++++++ src/ScriptEngine/Machine/MachineInstance.cs | 1 + tests/tasks.os | 18 ++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs b/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs index fdf1793ce..f56a59833 100644 --- a/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs +++ b/src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs @@ -111,6 +111,7 @@ public void ExecuteOnCurrentThread() catch (ScriptException exception) { State = TaskStateEnum.CompletedWithErrors; + exception.RuntimeSpecificInfo = MachineInstance.Current.GetExecutionFrames(); ExceptionInfo = new ExceptionInfoContext(exception); } } diff --git a/src/ScriptEngine/Machine/Contexts/StackTraceCollectionContext.cs b/src/ScriptEngine/Machine/Contexts/StackTraceCollectionContext.cs index 6506c9b45..4599a6200 100644 --- a/src/ScriptEngine/Machine/Contexts/StackTraceCollectionContext.cs +++ b/src/ScriptEngine/Machine/Contexts/StackTraceCollectionContext.cs @@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the using System.Collections.Generic; using System.Linq; using OneScript.Contexts; +using OneScript.Exceptions; namespace ScriptEngine.Machine.Contexts { @@ -30,6 +31,11 @@ internal StackTraceCollectionContext(IEnumerable frames) }).ToList(); } + /// + /// Возвращает количество кадров в стеке вызовов + /// + /// Число - Количество кадров в стеке вызовов + [ContextMethod("Количество", "Count")] public override int Count() { return _frames.Count; @@ -39,5 +45,23 @@ public override IEnumerator GetEnumerator() { return _frames.GetEnumerator(); } + + public override bool IsIndexed => true; + + public override IValue GetIndexedValue(IValue index) + { + var idx = (int)index.AsNumber(); + + if (idx < 0 || idx >= Count()) + throw IndexOutOfBoundsException(); + + return _frames[idx]; + } + + private static RuntimeException IndexOutOfBoundsException() + { + return new RuntimeException("Значение индекса выходит за пределы диапазона"); + } + } } diff --git a/src/ScriptEngine/Machine/MachineInstance.cs b/src/ScriptEngine/Machine/MachineInstance.cs index e342cf4aa..6dd586abe 100644 --- a/src/ScriptEngine/Machine/MachineInstance.cs +++ b/src/ScriptEngine/Machine/MachineInstance.cs @@ -2451,6 +2451,7 @@ private IValue PopRawValue() public IList GetExecutionFrames() { + CreateFullCallstack(); return _fullCallstackCache; } diff --git a/tests/tasks.os b/tests/tasks.os index 42e1f2c42..6ddca4af2 100644 --- a/tests/tasks.os +++ b/tests/tasks.os @@ -22,6 +22,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозвращаетсяРезультатДелегата"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетБлокировка"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКодМожетОпределитьИДЗадания"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВИнформацииОбОшибкеЕстьСтекВызовов"); Возврат ВсеТесты; @@ -263,3 +264,20 @@ юТест.ПроверитьРавенство(Неопределено, ЗаданиеГлавногоПотока); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьЧтоВИнформацииОбОшибкеЕстьСтекВызовов() Экспорт + + Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ПроцедураСИсключением"); + Задание.ОжидатьЗавершения(); + + СтекВызовов = Задание.ИнформацияОбОшибке.ПолучитьСтекВызовов(); + + юТест.ПроверитьТип(СтекВызовов, "КоллекцияКадровСтекаВызовов"); + + юТест.ПроверитьРавенство(СтекВызовов.Количество(), 1); + + юТест.ПроверитьРавенство(СтекВызовов[0].Метод, "ПроцедураСИсключением"); + юТест.ПроверитьРавенство(СтекВызовов[0].НомерСтроки, 45); + юТест.ПроверитьРавенство(СтекВызовов[0].ИмяМодуля, ТекущийСценарий().Источник); + +КонецПроцедуры From 6ae256487c42daab8fafc3205e20e935b214efee Mon Sep 17 00:00:00 2001 From: sfaqer Date: Fri, 17 Jan 2025 09:11:24 +1000 Subject: [PATCH 2/2] =?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=D1=82=D0=B5=D1=81=D1=82=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=BE=D0=B2=20=D0=B2=20=D0=B8=D0=BD=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=D0=B1=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B5=20=D1=84=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F,=20=D0=9D=D0=BE=D0=BC=D0=B5=D1=80=D0=A1=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8C,=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B0=D0=BB=20=D0=BF=D1=80=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D1=85=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/tasks.os | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tasks.os b/tests/tasks.os index 6c999ef93..1cc7f878b 100644 --- a/tests/tasks.os +++ b/tests/tasks.os @@ -284,7 +284,7 @@ юТест.ПроверитьРавенство(СтекВызовов.Количество(), 1); юТест.ПроверитьРавенство(СтекВызовов[0].Метод, "ПроцедураСИсключением"); - юТест.ПроверитьРавенство(СтекВызовов[0].НомерСтроки, 45); + юТест.ПроверитьЗаполненность(СтекВызовов[0].НомерСтроки); юТест.ПроверитьРавенство(СтекВызовов[0].ИмяМодуля, ТекущийСценарий().Источник); КонецПроцедуры