diff --git a/src/Peachpie.CodeAnalysis/FlowAnalysis/Worklist.cs b/src/Peachpie.CodeAnalysis/FlowAnalysis/Worklist.cs index 4e6e83e4e7..1d9251c5e5 100644 --- a/src/Peachpie.CodeAnalysis/FlowAnalysis/Worklist.cs +++ b/src/Peachpie.CodeAnalysis/FlowAnalysis/Worklist.cs @@ -146,15 +146,29 @@ public void PingReturnUpdate(ExitBlock updatedExit, T callingBlock) void Process(T block) { - var list = _analyzers; - for (int i = 0; i < list.Count; i++) + try { - list[i](block); + var list = _analyzers; + for (int i = 0; i < list.Count; i++) + { + list[i](block); + } } + catch (Exception e) + { + if (block.TryGetPath(out var path, out var line)) + { + // write more information to the output: + Console.WriteLine( + $"{e.Message} caused by block at at {path}:{line}" + ); + } + // block.FlowState.Routine. - // block.FlowState.Routine. + //CompilerLogSource.Log.Count("BoundBlockProcessings"); - //CompilerLogSource.Log.Count("BoundBlockProcessings"); + throw; + } } /// diff --git a/src/Peachpie.CodeAnalysis/Utilities/AstUtils.cs b/src/Peachpie.CodeAnalysis/Utilities/AstUtils.cs index f942bd54d3..fefe4030a6 100644 --- a/src/Peachpie.CodeAnalysis/Utilities/AstUtils.cs +++ b/src/Peachpie.CodeAnalysis/Utilities/AstUtils.cs @@ -14,6 +14,7 @@ using Pchp.CodeAnalysis.Semantics; using System.Runtime.InteropServices; using Pchp.CodeAnalysis.FlowAnalysis; +using Pchp.CodeAnalysis.Semantics.Graph; namespace Pchp.CodeAnalysis { @@ -357,6 +358,37 @@ public static Microsoft.CodeAnalysis.Text.TextSpan GetMoveNextSpan(this ForeachS return default; } + public static bool TryGetPath(this BoundBlock block, out string path, out int line) + { + path = null; + line = -1; + + if (block != null) + { + if (block.PhpSyntax != null) + { + var unit = block.PhpSyntax.ContainingSourceUnit; + if (unit != null) + { + path = unit.FilePath; + + if (block.PhpSyntax.Span.IsValid) + { + line = unit.GetLineFromPosition(block.PhpSyntax.Span.Start); + } + } + + //if (path == null && block.FlowState?.Routine != null) + //{ + // path = block.FlowState.Routine... + //} + } + } + + // + return path != null; + } + sealed class ElementVisitor : TreeVisitor where TElement : LangElement {