From 05e8b4e72c440e19c54fbcb17e2120834a27c3ab Mon Sep 17 00:00:00 2001 From: root Date: Tue, 22 Dec 2009 06:25:32 +0100 Subject: Add a data path for error messages Committed from my other box where git is not configured properly Signed-off-by: Melanie --- .../Framework/Interfaces/IEntityInventory.cs | 2 ++ .../Region/Framework/Interfaces/IScriptModule.cs | 3 +++ OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 18 ++++++++++++------ .../Framework/Scenes/SceneObjectPartInventory.cs | 22 ++++++++++++++++++++++ OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 5 +++++ 5 files changed, 44 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 89a45da..67395fa 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -26,6 +26,7 @@ */ using System.Collections.Generic; +using System.Collections; using OpenMetaverse; using OpenSim.Framework; @@ -71,6 +72,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Start all the scripts contained in this entity's inventory /// void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); + ArrayList GetScriptErrors(UUID itemID); /// /// Stop all the scripts in this entity. diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index 98efcbe..e90b300 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -26,6 +26,7 @@ */ using System; +using System.Collections; using OpenMetaverse; namespace OpenSim.Region.Framework.Interfaces @@ -39,5 +40,7 @@ namespace OpenSim.Region.Framework.Interfaces bool PostScriptEvent(UUID itemID, string name, Object[] args); bool PostObjectEvent(UUID itemID, string name, Object[] args); + + ArrayList GetScriptErrors(UUID itemID); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 0b0c205..89ce4ae 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; +using System.Collections; using System.Reflection; using System.Text; using System.Timers; @@ -215,13 +216,13 @@ namespace OpenSim.Region.Framework.Scenes /// The prim which contains the item to update /// Indicates whether the script to update is currently running /// - public void CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId, + public ArrayList CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId, UUID primId, bool isScriptRunning, byte[] data) { if (!Permissions.CanEditScript(itemId, primId, remoteClient.AgentId)) { remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); - return; + return new ArrayList(); } // Retrieve group @@ -234,7 +235,7 @@ namespace OpenSim.Region.Framework.Scenes "Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist", itemId, primId); - return; + return new ArrayList(); } // Retrieve item @@ -247,7 +248,7 @@ namespace OpenSim.Region.Framework.Scenes + " but the item does not exist in this inventory", itemId, part.Name, part.UUID); - return; + return new ArrayList(); } AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data); @@ -264,29 +265,33 @@ namespace OpenSim.Region.Framework.Scenes part.GetProperties(remoteClient); // Trigger rerunning of script (use TriggerRezScript event, see RezScript) + ArrayList errors = new ArrayList(); + if (isScriptRunning) { // Needs to determine which engine was running it and use that // part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0); + errors = part.Inventory.GetScriptErrors(item.ItemID); } else { remoteClient.SendAgentAlertMessage("Script saved", false); } + return errors; } /// /// CapsUpdateTaskInventoryScriptAsset(IClientAPI, UUID, UUID, bool, byte[]) /// - public void CapsUpdateTaskInventoryScriptAsset(UUID avatarId, UUID itemId, + public ArrayList CapsUpdateTaskInventoryScriptAsset(UUID avatarId, UUID itemId, UUID primId, bool isScriptRunning, byte[] data) { ScenePresence avatar; if (TryGetAvatar(avatarId, out avatar)) { - CapsUpdateTaskInventoryScriptAsset( + return CapsUpdateTaskInventoryScriptAsset( avatar.ControllingClient, itemId, primId, isScriptRunning, data); } else @@ -295,6 +300,7 @@ namespace OpenSim.Region.Framework.Scenes "[PRIM INVENTORY]: " + "Avatar {0} cannot be found to update its prim item asset", avatarId); + return new ArrayList(); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index b98747a..eb7f5ff 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -29,6 +29,7 @@ using System; using System.Xml; using System.IO; using System.Collections.Generic; +using System.Collections; using System.Reflection; using OpenMetaverse; using log4net; @@ -205,6 +206,27 @@ namespace OpenSim.Region.Framework.Scenes } } + public ArrayList GetScriptErrors(UUID itemID) + { + ArrayList ret = new ArrayList(); + + IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces(); + if (engines == null) // No engine at all + return ret; + + foreach (IScriptModule e in engines) + { + if (e != null) + { + ArrayList errors = e.GetScriptErrors(itemID); + foreach (Object line in errors) + ret.Add(line); + } + } + + return ret; + } + /// /// Stop all the scripts in this prim. /// diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 25a4cd6..035686e 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1470,5 +1470,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine return true; } + + public ArrayList GetScriptErrors(UUID itemID) + { + return new ArrayList(); + } } } -- cgit v1.1 From 1876ce90af98722a205d1c7181ef66b6a2b54fc5 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 22 Dec 2009 09:24:01 +0000 Subject: FINALLY! Script compile errors now appear in the script error pane, not in a funky debug window. --- .../Shared/CodeTools/CSCodeGenerator.cs | 2 +- .../ScriptEngine/Shared/CodeTools/Compiler.cs | 2 +- .../Shared/CodeTools/Tests/CSCodeGeneratorTest.cs | 4 +- .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 2 +- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 163 ++++++++++++--------- 5 files changed, 98 insertions(+), 75 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index e427f50..b1fb6c2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs @@ -111,7 +111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools if (emessage.StartsWith(slinfo+": ")) emessage = emessage.Substring(slinfo.Length+2); - message = String.Format("Line ({0},{1}) {2}", + message = String.Format("({0},{1}) {2}", e.slInfo.lineNumber - 2, e.slInfo.charPosition - 1, emessage); diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index 3080c71..d8c0ba5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs @@ -623,7 +623,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools // The Second Life viewer's script editor begins // countingn lines and columns at 0, so we subtract 1. - errtext += String.Format("Line ({0},{1}): {4} {2}: {3}\n", + errtext += String.Format("({0},{1}): {4} {2}: {3}\n", lslPos.Key - 1, lslPos.Value - 1, CompErr.ErrorNumber, text, severity); hadErrors = true; diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs index 3ca7f7c..63afb0b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs @@ -1673,7 +1673,7 @@ default { // The syntax error is on line 6, char 5 (expected ';', found // '}'). - Assert.AreEqual("Line (4,4) syntax error", e.Message); + Assert.AreEqual("(4,4) syntax error", e.Message); throw; } } @@ -1698,7 +1698,7 @@ default catch (System.Exception e) { // The syntax error is on line 5, char 14 (Syntax error) - Assert.AreEqual("Line (3,13) syntax error", e.Message); + Assert.AreEqual("(3,13) syntax error", e.Message); throw; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 5c5d57e..d30d2dc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -967,7 +967,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance if (col == 0) col++; message = string.Format("Runtime error:\n" + - "Line ({0}): {1}", scriptLine - 1, + "({0}): {1}", scriptLine - 1, e.InnerException.Message); System.Console.WriteLine(e.ToString()+"\n"); diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 035686e..11b02e1 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -77,6 +77,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine private string m_ScriptErrorMessage; private Dictionary m_uniqueScripts = new Dictionary(); private bool m_AppDomainLoading; + private Dictionary m_ScriptErrors = + new Dictionary(); // disable warning: need to keep a reference to XEngine.EventManager // alive to avoid it being garbage collected @@ -589,87 +591,97 @@ namespace OpenSim.Region.ScriptEngine.XEngine Dictionary, KeyValuePair> linemap; - try + lock(m_ScriptErrors) { - lock (m_AddingAssemblies) + try { - m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap); - if (!m_AddingAssemblies.ContainsKey(assembly)) { - m_AddingAssemblies[assembly] = 1; - } else { - m_AddingAssemblies[assembly]++; + lock (m_AddingAssemblies) + { + m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap); + if (!m_AddingAssemblies.ContainsKey(assembly)) { + m_AddingAssemblies[assembly] = 1; + } else { + m_AddingAssemblies[assembly]++; + } } - } - string[] warnings = m_Compiler.GetWarnings(); + string[] warnings = m_Compiler.GetWarnings(); - if (warnings != null && warnings.Length != 0) - { - foreach (string warning in warnings) + if (warnings != null && warnings.Length != 0) { - try + foreach (string warning in warnings) { - // DISPLAY WARNING INWORLD - string text = "Warning:\n" + warning; - if (text.Length > 1000) - text = text.Substring(0, 1000); - if (!ShowScriptSaveResponse(item.OwnerID, - assetID, text, true)) - { - if (presence != null && (!postOnRez)) - presence.ControllingClient.SendAgentAlertMessage("Script saved with warnings, check debug window!", false); - - World.SimChat(Utils.StringToBytes(text), - ChatTypeEnum.DebugChannel, 2147483647, - part.AbsolutePosition, - part.Name, part.UUID, false); - } - } - catch (Exception e2) // LEGIT: User Scripting - { - m_log.Error("[XEngine]: " + - "Error displaying warning in-world: " + - e2.ToString()); - m_log.Error("[XEngine]: " + - "Warning:\r\n" + - warning); + if (!m_ScriptErrors.ContainsKey(itemID)) + m_ScriptErrors[itemID] = new ArrayList(); + + m_ScriptErrors[itemID].Add(warning); + // try + // { + // // DISPLAY WARNING INWORLD + // string text = "Warning:\n" + warning; + // if (text.Length > 1000) + // text = text.Substring(0, 1000); + // if (!ShowScriptSaveResponse(item.OwnerID, + // assetID, text, true)) + // { + // if (presence != null && (!postOnRez)) + // presence.ControllingClient.SendAgentAlertMessage("Script saved with warnings, check debug window!", false); + // + // World.SimChat(Utils.StringToBytes(text), + // ChatTypeEnum.DebugChannel, 2147483647, + // part.AbsolutePosition, + // part.Name, part.UUID, false); + // } + // } + // catch (Exception e2) // LEGIT: User Scripting + // { + // m_log.Error("[XEngine]: " + + // "Error displaying warning in-world: " + + // e2.ToString()); + // m_log.Error("[XEngine]: " + + // "Warning:\r\n" + + // warning); + // } } } } - } - catch (Exception e) - { - try + catch (Exception e) { - // DISPLAY ERROR INWORLD - m_ScriptErrorMessage += "Failed to compile script in object: '" + part.ParentGroup.RootPart.Name + "' Script name: '" + item.Name + "' Error message: " + e.Message.ToString(); - - m_ScriptFailCount++; - string text = "Error compiling script '" + item.Name + "':\n" + e.Message.ToString(); - if (text.Length > 1000) - text = text.Substring(0, 1000); - if (!ShowScriptSaveResponse(item.OwnerID, - assetID, text, false)) - { - if (presence != null && (!postOnRez)) - presence.ControllingClient.SendAgentAlertMessage("Script saved with errors, check debug window!", false); - World.SimChat(Utils.StringToBytes(text), - ChatTypeEnum.DebugChannel, 2147483647, - part.AbsolutePosition, - part.Name, part.UUID, false); - } - } - catch (Exception e2) // LEGIT: User Scripting - { - m_log.Error("[XEngine]: "+ - "Error displaying error in-world: " + - e2.ToString()); - m_log.Error("[XEngine]: " + - "Errormessage: Error compiling script:\r\n" + - e.Message.ToString()); - } + // try + // { + if (!m_ScriptErrors.ContainsKey(itemID)) + m_ScriptErrors[itemID] = new ArrayList(); + // DISPLAY ERROR INWORLD + // m_ScriptErrorMessage += "Failed to compile script in object: '" + part.ParentGroup.RootPart.Name + "' Script name: '" + item.Name + "' Error message: " + e.Message.ToString(); + // + m_ScriptFailCount++; + m_ScriptErrors[itemID].Add(e.Message.ToString()); + // string text = "Error compiling script '" + item.Name + "':\n" + e.Message.ToString(); + // if (text.Length > 1000) + // text = text.Substring(0, 1000); + // if (!ShowScriptSaveResponse(item.OwnerID, + // assetID, text, false)) + // { + // if (presence != null && (!postOnRez)) + // presence.ControllingClient.SendAgentAlertMessage("Script saved with errors, check debug window!", false); + // World.SimChat(Utils.StringToBytes(text), + // ChatTypeEnum.DebugChannel, 2147483647, + // part.AbsolutePosition, + // part.Name, part.UUID, false); + // } + // } + // catch (Exception e2) // LEGIT: User Scripting + // { + // m_log.Error("[XEngine]: "+ + // "Error displaying error in-world: " + + // e2.ToString()); + // m_log.Error("[XEngine]: " + + // "Errormessage: Error compiling script:\r\n" + + // e.Message.ToString()); + // } - return false; + return false; + } } lock (m_Scripts) @@ -1473,7 +1485,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine public ArrayList GetScriptErrors(UUID itemID) { - return new ArrayList(); + System.Threading.Thread.Sleep(1000); + + lock (m_ScriptErrors) + { + if (m_ScriptErrors.ContainsKey(itemID)) + { + ArrayList ret = m_ScriptErrors[itemID]; + m_ScriptErrors.Remove(itemID); + return ret; + } + return new ArrayList(); + } } } } -- cgit v1.1