From 85068dae60db02b168a29ffd75e1408e30d279e1 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 27 Sep 2008 05:31:43 +0000 Subject: Add friendly error messages to both engines. --- .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 51 +++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance') diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index c8d60af..aa9ace4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -80,6 +80,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance private int m_ControlEventsInQueue = 0; private int m_LastControlLevel = 0; private bool m_CollisionInQueue = false; + private Dictionary, KeyValuePair> + m_LineMap; + + public Dictionary, KeyValuePair> + LineMap + { + get { return m_LineMap; } + set { m_LineMap = value; } + } private Dictionary m_Apis = new Dictionary(); @@ -628,7 +637,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance try { // DISPLAY ERROR INWORLD - string text = "Runtime error:\n" + e.InnerException.ToString(); + string text = FormatException(e); + if (text.Length > 1000) text = text.Substring(0, 1000); m_Engine.World.SimChat(Utils.StringToBytes(text), @@ -812,5 +822,44 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { return String.Format("{0} {1} on {2}", m_ScriptName, m_ItemID, m_PrimName); } + + string FormatException(Exception e) + { + string message = "Runtime error:\n" + e.InnerException.StackTrace; + string[] lines = message.Split(new char[] {'\n'}); + + foreach (string line in lines) + { + if (line.Contains("SecondLife.Script")) + { + int idx = line.IndexOf(':'); + if (idx != -1) + { + string val = line.Substring(idx+1); + int lineNum = 0; + if (int.TryParse(val, out lineNum)) + { + KeyValuePair pos = + Compiler.FindErrorPosition( + lineNum, 0, LineMap); + + int scriptLine = pos.Key; + int col = pos.Value; + if (scriptLine == 0) + scriptLine++; + if (col == 0) + col++; + message = string.Format("Runtime error:\n" + + "Line ({0}): {1}", scriptLine - 1, + e.InnerException.Message); + + return message; + } + } + } + } + + return message; + } } } -- cgit v1.1