Skip to content

Commit 77725f7

Browse files
committed
fixes EvilBeaver#1535 Отладчик неверно шагает, не встает на строку КонецПроцедуры/Функции при обработке возврата
1 parent 38d2b03 commit 77725f7

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

src/ScriptEngine/Compiler/StackMachineCodeGenerator.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,33 @@ protected override void VisitMethodBody(MethodNode methodNode)
310310

311311
base.VisitMethodBody(methodNode);
312312

313-
if (methodNode.Signature.IsFunction)
313+
var isDebugCode = ExtraCodeConditionsMet(CodeGenerationFlags.DebugCode);
314+
int codeEnd;
315+
if (isDebugCode)
316+
{
317+
// В отладочном коде всегда есть LineNum перед Return
318+
// Нам надо перейти из явных ретурнов именно на него,
319+
// чтобы при раннем возврате отладчик встал на КонецПроцедуры/КонецФункции
320+
Debug.Assert(_module.Code.Count > 0 && _module.Code[^1].Code == OperationCode.LineNum);
321+
if (methodNode.Signature.IsFunction)
322+
{
323+
// перед финальным linenum надо вставить неявный возврат undefined
324+
var lineNumOp = _module.Code[^1];
325+
_module.Code[^1] = new Command() { Code = OperationCode.PushUndef };
326+
_module.Code.Add(lineNumOp);
327+
}
328+
codeEnd = _module.Code.Count - 1;
329+
}
330+
else
314331
{
315-
AddCommand(OperationCode.PushUndef);
332+
if (methodNode.Signature.IsFunction)
333+
{
334+
// неявный возврат Undefined
335+
AddCommand(OperationCode.PushUndef);
336+
}
337+
codeEnd = _module.Code.Count;
316338
}
317339

318-
var codeEnd = _module.Code.Count;
319340

320341
AddCommand(OperationCode.Return);
321342

0 commit comments

Comments
 (0)