diff options
author | Melanie Thielker | 2008-09-27 05:31:43 +0000 |
---|---|---|
committer | Melanie Thielker | 2008-09-27 05:31:43 +0000 |
commit | 85068dae60db02b168a29ffd75e1408e30d279e1 (patch) | |
tree | 8389c246a6e9891eb1bf310b85cba19a1668d790 /OpenSim/Region/ScriptEngine/DotNetEngine | |
parent | Mantis #2277 (diff) | |
download | opensim-SC-85068dae60db02b168a29ffd75e1408e30d279e1.zip opensim-SC-85068dae60db02b168a29ffd75e1408e30d279e1.tar.gz opensim-SC-85068dae60db02b168a29ffd75e1408e30d279e1.tar.bz2 opensim-SC-85068dae60db02b168a29ffd75e1408e30d279e1.tar.xz |
Add friendly error messages to both engines.
Diffstat (limited to '')
3 files changed, 74 insertions, 30 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs index 634a12b..4a094e2 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs | |||
@@ -139,6 +139,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
139 | public string functionName; | 139 | public string functionName; |
140 | public DetectParams[] llDetectParams; | 140 | public DetectParams[] llDetectParams; |
141 | public object[] param; | 141 | public object[] param; |
142 | public Dictionary<KeyValuePair<int,int>,KeyValuePair<int,int>> | ||
143 | LineMap; | ||
142 | } | 144 | } |
143 | 145 | ||
144 | #endregion | 146 | #endregion |
@@ -349,6 +351,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
349 | return false; | 351 | return false; |
350 | } | 352 | } |
351 | 353 | ||
354 | InstanceData id = m_ScriptEngine.m_ScriptManager.GetScript( | ||
355 | localID, itemID); | ||
356 | |||
352 | // Create a structure and add data | 357 | // Create a structure and add data |
353 | QueueItemStruct QIS = new QueueItemStruct(); | 358 | QueueItemStruct QIS = new QueueItemStruct(); |
354 | QIS.localID = localID; | 359 | QIS.localID = localID; |
@@ -356,6 +361,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
356 | QIS.functionName = FunctionName; | 361 | QIS.functionName = FunctionName; |
357 | QIS.llDetectParams = qParams; | 362 | QIS.llDetectParams = qParams; |
358 | QIS.param = param; | 363 | QIS.param = param; |
364 | if (id != null) | ||
365 | QIS.LineMap = id.LineMap; | ||
359 | 366 | ||
360 | // Add it to queue | 367 | // Add it to queue |
361 | eventQueue.Enqueue(QIS); | 368 | eventQueue.Enqueue(QIS); |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs index 2d60ed5..16dafdc 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | ||
30 | using System.Reflection; | 31 | using System.Reflection; |
31 | using System.Text.RegularExpressions; | 32 | using System.Text.RegularExpressions; |
32 | using System.Threading; | 33 | using System.Threading; |
@@ -37,6 +38,7 @@ using OpenSim.Framework; | |||
37 | using OpenSim.Region.Environment.Scenes; | 38 | using OpenSim.Region.Environment.Scenes; |
38 | using OpenSim.Region.Environment.Scenes.Scripting; | 39 | using OpenSim.Region.Environment.Scenes.Scripting; |
39 | using OpenSim.Region.ScriptEngine.Shared; | 40 | using OpenSim.Region.ScriptEngine.Shared; |
41 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | ||
40 | 42 | ||
41 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 43 | namespace OpenSim.Region.ScriptEngine.DotNetEngine |
42 | { | 44 | { |
@@ -198,10 +200,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
198 | } | 200 | } |
199 | catch (Exception e) | 201 | catch (Exception e) |
200 | { | 202 | { |
201 | if (lastScriptEngine != null) | ||
202 | lastScriptEngine.Log.Error("[" + ScriptEngineName + | ||
203 | "]: Exception in EventQueueThreadLoop: " + | ||
204 | e.ToString()); | ||
205 | } | 203 | } |
206 | } | 204 | } |
207 | } | 205 | } |
@@ -290,32 +288,32 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
290 | catch (Exception e) | 288 | catch (Exception e) |
291 | { | 289 | { |
292 | InExecution = false; | 290 | InExecution = false; |
291 | string text = FormatException(e, QIS.LineMap); | ||
292 | |||
293 | // DISPLAY ERROR INWORLD | 293 | // DISPLAY ERROR INWORLD |
294 | string text = "Error executing script function \"" + | ||
295 | QIS.functionName + "\":\r\n"; | ||
296 | 294 | ||
297 | if (e.InnerException != null) | 295 | // if (e.InnerException != null) |
298 | { | 296 | // { |
299 | // Send inner exception | 297 | // // Send inner exception |
300 | string line = " (unknown line)"; | 298 | // string line = " (unknown line)"; |
301 | Regex rx = new Regex(@"SecondLife\.Script\..+[\s:](?<line>\d+)\.?\r?$", RegexOptions.Compiled); | 299 | // Regex rx = new Regex(@"SecondLife\.Script\..+[\s:](?<line>\d+)\.?\r?$", RegexOptions.Compiled); |
302 | if (rx.Match(e.InnerException.ToString()).Success) | 300 | // if (rx.Match(e.InnerException.ToString()).Success) |
303 | line = " (line " + rx.Match(e.InnerException.ToString()).Result("${line}") + ")"; | 301 | // line = " (line " + rx.Match(e.InnerException.ToString()).Result("${line}") + ")"; |
304 | text += e.InnerException.Message.ToString() + line; | 302 | // text += e.InnerException.Message.ToString() + line; |
305 | } | 303 | // } |
306 | else | 304 | // else |
307 | { | 305 | // { |
308 | text += "\r\n"; | 306 | // text += "\r\n"; |
309 | // Send normal | 307 | // // Send normal |
310 | text += e.Message.ToString(); | 308 | // text += e.Message.ToString(); |
311 | } | 309 | // } |
312 | if (KillCurrentScript) | 310 | // if (KillCurrentScript) |
313 | text += "\r\nScript will be deactivated!"; | 311 | // text += "\r\nScript will be deactivated!"; |
314 | 312 | ||
315 | try | 313 | try |
316 | { | 314 | { |
317 | if (text.Length > 1500) | 315 | if (text.Length >= 1100) |
318 | text = text.Substring(0, 1500); | 316 | text = text.Substring(0, 1099); |
319 | IScriptHost m_host = | 317 | IScriptHost m_host = |
320 | m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); | 318 | m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); |
321 | m_ScriptEngine.World.SimChat( | 319 | m_ScriptEngine.World.SimChat( |
@@ -343,10 +341,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
343 | QIS.localID, QIS.itemID); | 341 | QIS.localID, QIS.itemID); |
344 | } | 342 | } |
345 | } | 343 | } |
346 | |||
347 | // Pass it on so it's displayed on the console | ||
348 | // and in the logs (mikem 2008.06.02). | ||
349 | throw e.InnerException; | ||
350 | } | 344 | } |
351 | finally | 345 | finally |
352 | { | 346 | { |
@@ -358,5 +352,45 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
358 | } | 352 | } |
359 | } | 353 | } |
360 | } | 354 | } |
355 | |||
356 | string FormatException(Exception e, Dictionary<KeyValuePair<int,int>, | ||
357 | KeyValuePair<int,int>> LineMap) | ||
358 | { | ||
359 | string message = "Runtime error:\n" + e.InnerException.StackTrace; | ||
360 | string[] lines = message.Split(new char[] {'\n'}); | ||
361 | |||
362 | foreach (string line in lines) | ||
363 | { | ||
364 | if (line.Contains("SecondLife.Script")) | ||
365 | { | ||
366 | int idx = line.IndexOf(':'); | ||
367 | if (idx != -1) | ||
368 | { | ||
369 | string val = line.Substring(idx+1); | ||
370 | int lineNum = 0; | ||
371 | if (int.TryParse(val, out lineNum)) | ||
372 | { | ||
373 | KeyValuePair<int, int> pos = | ||
374 | Compiler.FindErrorPosition( | ||
375 | lineNum, 0, LineMap); | ||
376 | |||
377 | int scriptLine = pos.Key; | ||
378 | int col = pos.Value; | ||
379 | if (scriptLine == 0) | ||
380 | scriptLine++; | ||
381 | if (col == 0) | ||
382 | col++; | ||
383 | message = string.Format("Runtime error:\n" + | ||
384 | "Line ({0}): {1}", scriptLine - 1, | ||
385 | e.InnerException.Message); | ||
386 | |||
387 | return message; | ||
388 | } | ||
389 | } | ||
390 | } | ||
391 | } | ||
392 | |||
393 | return message; | ||
394 | } | ||
361 | } | 395 | } |
362 | } | 396 | } |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs index 8329805..1c1dcf3 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs | |||
@@ -53,6 +53,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
53 | public int StartParam; | 53 | public int StartParam; |
54 | public AppDomain AppDomain; | 54 | public AppDomain AppDomain; |
55 | public Dictionary<string, IScriptApi> Apis; | 55 | public Dictionary<string, IScriptApi> Apis; |
56 | public Dictionary<KeyValuePair<int,int>, KeyValuePair<int,int>> | ||
57 | LineMap; | ||
56 | } | 58 | } |
57 | 59 | ||
58 | public class ScriptManager | 60 | public class ScriptManager |
@@ -159,6 +161,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
159 | m_scriptEngine.m_AppDomainManager.LoadScript( | 161 | m_scriptEngine.m_AppDomainManager.LoadScript( |
160 | CompiledScriptFile, out id.AppDomain); | 162 | CompiledScriptFile, out id.AppDomain); |
161 | 163 | ||
164 | id.LineMap = LSLCompiler.LineMap(); | ||
162 | id.Script = CompiledScript; | 165 | id.Script = CompiledScript; |
163 | id.Source = Script; | 166 | id.Source = Script; |
164 | id.StartParam = startParam; | 167 | id.StartParam = startParam; |
@@ -212,7 +215,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
212 | try | 215 | try |
213 | { | 216 | { |
214 | // DISPLAY ERROR INWORLD | 217 | // DISPLAY ERROR INWORLD |
215 | string text = "Error compiling script:\r\n" + | 218 | string text = "Error compiling script:\n" + |
216 | e.Message.ToString(); | 219 | e.Message.ToString(); |
217 | if (text.Length > 1100) | 220 | if (text.Length > 1100) |
218 | text = text.Substring(0, 1099); | 221 | text = text.Substring(0, 1099); |