From 5a86fd2c31ce0ede9825657c969ccaa1ef423d5c Mon Sep 17 00:00:00 2001
From: Tedd Hansen
Date: Wed, 22 Aug 2007 18:09:38 +0000
Subject: (Untested) Scripts are individually loaded into objects (on rez), and
event fired likewise. Bugfixes coming in next commit.
---
OpenSim/Region/Application/OpenSimMain.cs | 2 -
.../Scenes/Scripting/ScriptEngineInterface.cs | 2 +-
.../ScriptEngine/DotNetEngine/AppDomainManager.cs | 1 +
.../DotNetEngine/Compiler/LSL/Compiler.cs | 44 ++++---
.../ScriptEngine/DotNetEngine/EventManager.cs | 38 +++++-
.../ScriptEngine/DotNetEngine/EventQueueManager.cs | 55 +++++----
.../ScriptEngine/DotNetEngine/ScriptEngine.cs | 32 +++---
.../ScriptEngine/DotNetEngine/ScriptManager.cs | 128 +++++++++------------
8 files changed, 161 insertions(+), 141 deletions(-)
(limited to 'OpenSim')
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index b301bf2..867f16f 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -183,8 +183,6 @@ namespace OpenSim
OpenSim.Region.Environment.Scenes.Scripting.ScriptEngineInterface ScriptEngine = ScriptEngineLoader.LoadScriptEngine("DotNetEngine");
scene.AddScriptEngine(ScriptEngine, m_log);
- // TODO: TEMP load default script
- ScriptEngine.StartScript(Path.Combine("ScriptEngines", "Default.lsl"), new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost());
//Server side object editing permissions checking
if (m_permissions)
diff --git a/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs b/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs
index 33021ee..5970fac 100644
--- a/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs
+++ b/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs
@@ -38,6 +38,6 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
{
void InitializeEngine(OpenSim.Region.Environment.Scenes.Scene Sceneworld, OpenSim.Framework.Console.LogBase logger);
void Shutdown();
- void StartScript(string ScriptID, IScriptHost ObjectID);
+// void StartScript(string ScriptID, IScriptHost ObjectID);
}
}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs
index 2898bee..49f6712 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs
@@ -9,6 +9,7 @@ using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Scenes.Scripting;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
using OpenSim.Region.ScriptEngine.Common;
+using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
index ad2717c..9dd274e 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
@@ -13,39 +13,51 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
{
private LSL2CSConverter LSL_Converter = new LSL2CSConverter();
private CSharpCodeProvider codeProvider = new CSharpCodeProvider();
+ private int ScriptCompileCounter = 0;
//private ICodeCompiler icc = codeProvider.CreateCompiler();
- public string Compile(string LSOFileName)
+ public string CompileFromFile(string LSOFileName)
{
-
-
- // Output assembly name
- string OutFile = Path.Combine("ScriptEngines", Path.GetFileNameWithoutExtension(LSOFileName) + ".dll");
- //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll");
-
- Common.SendToDebug("Reading source code into memory");
- // TODO: Add error handling
string CS_Code;
switch (System.IO.Path.GetExtension(LSOFileName).ToLower())
{
case ".txt":
case ".lsl":
Common.SendToDebug("Source code is LSL, converting to CS");
- CS_Code = LSL_Converter.Convert(File.ReadAllText(LSOFileName));
- break;
+ return CompileFromLSLText(File.ReadAllText(LSOFileName));
case ".cs":
Common.SendToDebug("Source code is CS");
- CS_Code = File.ReadAllText(LSOFileName);
- break;
+ return CompileFromCSText(File.ReadAllText(LSOFileName));
default:
throw new Exception("Unknown script type.");
}
+ }
+ ///
+ /// Converts script from LSL to CS and calls CompileFromCSText
+ ///
+ /// LSL script
+ /// Filename to .dll assembly
+ public string CompileFromLSLText(string Script)
+ {
+ return CompileFromCSText(LSL_Converter.Convert(Script));
+ }
+ ///
+ /// Compile CS script to .Net assembly (.dll)
+ ///
+ /// CS script
+ /// Filename to .dll assembly
+ public string CompileFromCSText(string Script)
+ {
- Common.SendToDebug("Compiling");
+
+ // Output assembly name
+ ScriptCompileCounter++;
+ string OutFile = Path.Combine("ScriptEngines", "Script_" + ScriptCompileCounter + ".dll");
+ //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll");
// DEBUG - write source to disk
try
{
- File.WriteAllText(Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(LSOFileName) + ".cs"), CS_Code);
+ File.WriteAllText(Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(OutFile) + ".cs"), Script);
}
catch { }
@@ -68,7 +80,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
//parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment");
parameters.GenerateExecutable = false;
parameters.OutputAssembly = OutFile;
- CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, CS_Code);
+ CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Script);
// Go through errors
// TODO: Return errors to user somehow
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs
index 32353ce..92afcf3 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs
@@ -42,7 +42,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
class EventManager
{
private ScriptEngine myScriptEngine;
- public IScriptHost TEMP_OBJECT_ID;
+ //public IScriptHost TEMP_OBJECT_ID;
public EventManager(ScriptEngine _ScriptEngine)
{
myScriptEngine = _ScriptEngine;
@@ -51,19 +51,47 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// TODO: ADD SERVER HOOK TO LOAD A SCRIPT THROUGH myScriptEngine.ScriptManager
// Hook up a test event to our test form
- myScriptEngine.Log.Verbose("ScriptEngine", "EventManager Hooking up dummy-event: touch_start");
- // TODO: REPLACE THIS WITH A REAL TOUCH_START EVENT IN SERVER
+ //myScriptEngine.Log.Verbose("ScriptEngine", "EventManager Hooking up to server events");
myScriptEngine.World.EventManager.OnObjectGrab += new OpenSim.Region.Environment.Scenes.EventManager.ObjectGrabDelegate(touch_start);
- //myScriptEngine.World.touch_start += new TempWorldInterfaceEventDelegates.touch_start(touch_start);
+ myScriptEngine.World.EventManager.OnRezScript += new OpenSim.Region.Environment.Scenes.EventManager.NewRezScript(OnRezScript);
+
}
public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient)
{
// Add to queue for all scripts in ObjectID object
//myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Event: touch_start");
- myScriptEngine.myEventQueueManager.AddToObjectQueue(TEMP_OBJECT_ID, "touch_start", new object[] { (int)0 });
+ myScriptEngine.myEventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] { (int)1 });
}
+ public void OnRezScript(uint localID, LLUUID itemID, string script)
+ {
+ // TODO: Add code to compile script and wire up script to object
+ // Either the script is a stand-alone entity with a reference to public host,
+ // Or the host has a reference to the script because it was in its inventory.
+ //myScriptEngine.myScriptManager.StartScript(
+ // Path.Combine("ScriptEngines", "Default.lsl"),
+ // new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost()
+ //);
+ myScriptEngine.myScriptManager.StartScript(
+ localID,
+ itemID,
+ script
+ );
+
+ }
+ public void OnDeRezScript(uint localID, LLUUID itemID)
+ {
+ //myScriptEngine.myScriptManager.StartScript(
+ // Path.Combine("ScriptEngines", "Default.lsl"),
+ // new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost()
+ //);
+ myScriptEngine.myScriptManager.StopScript(
+ localID,
+ itemID
+ );
+
+ }
// TODO: Replace placeholders below
// These needs to be hooked up to OpenSim during init of this class
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs
index c2a4b88..3ef21db 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs
@@ -32,6 +32,7 @@ using System.Text;
using System.Threading;
using System.Reflection;
using OpenSim.Region.Environment.Scenes.Scripting;
+using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
@@ -64,16 +65,16 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
///
private struct QueueItemStruct
{
- public IScriptHost ObjectID;
- public string ScriptID;
+ public uint localID;
+ public LLUUID itemID;
public string FunctionName;
public object[] param;
}
///
- /// List of ObjectID locks for mutex processing of script events
+ /// List of localID locks for mutex processing of script events
///
- private List ObjectLocks = new List();
+ private List ObjectLocks = new List();
private object TryLockLock = new object(); // Mutex lock object
private ScriptEngine myScriptEngine;
@@ -140,7 +141,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
else
{
// Something in queue, process
- //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for ObjectID: " + QIS.ObjectID + ", ScriptID: " + QIS.ScriptID + ", FunctionName: " + QIS.FunctionName);
+ //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName);
// OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD
lock (QueueLock)
@@ -152,7 +153,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
QIS = EventQueue.Dequeue();
// Check if object is being processed by someone else
- if (TryLock(QIS.ObjectID) == false)
+ if (TryLock(QIS.localID) == false)
{
// Object is already being processed, requeue it
EventQueue.Enqueue(QIS);
@@ -169,8 +170,14 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
if (GotItem == true)
{
// Execute function
- myScriptEngine.myScriptManager.ExecuteEvent(QIS.ObjectID, QIS.ScriptID, QIS.FunctionName, QIS.param);
- ReleaseLock(QIS.ObjectID);
+ try
+ {
+ myScriptEngine.myScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, QIS.FunctionName, QIS.param);
+ }
+ finally
+ {
+ ReleaseLock(QIS.localID);
+ }
}
} // Something in queue
@@ -183,37 +190,37 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
}
///
- /// Try to get a mutex lock on ObjectID
+ /// Try to get a mutex lock on localID
///
- ///
+ ///
///
- private bool TryLock(IScriptHost ObjectID)
+ private bool TryLock(uint localID)
{
lock (TryLockLock)
{
- if (ObjectLocks.Contains(ObjectID) == true)
+ if (ObjectLocks.Contains(localID) == true)
{
return false;
}
else
{
- ObjectLocks.Add(ObjectID);
+ ObjectLocks.Add(localID);
return true;
}
}
}
///
- /// Release mutex lock on ObjectID
+ /// Release mutex lock on localID
///
- ///
- private void ReleaseLock(IScriptHost ObjectID)
+ ///
+ private void ReleaseLock(uint localID)
{
lock (TryLockLock)
{
- if (ObjectLocks.Contains(ObjectID) == true)
+ if (ObjectLocks.Contains(localID) == true)
{
- ObjectLocks.Remove(ObjectID);
+ ObjectLocks.Remove(localID);
}
}
}
@@ -221,26 +228,26 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
///
/// Add event to event execution queue
///
- ///
+ ///
/// Name of the function, will be state + "_event_" + FunctionName
/// Array of parameters to match event mask
- public void AddToObjectQueue(IScriptHost ObjectID, string FunctionName, object[] param)
+ public void AddToObjectQueue(uint localID, string FunctionName, object[] param)
{
// Determine all scripts in Object and add to their queue
- //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding ObjectID: " + ObjectID + ", FunctionName: " + FunctionName);
+ //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName);
lock (QueueLock)
{
- foreach (string ScriptID in myScriptEngine.myScriptManager.GetScriptKeys(ObjectID))
+ foreach (LLUUID itemID in myScriptEngine.myScriptManager.GetScriptKeys(localID))
{
// Add to each script in that object
// TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter?
// Create a structure and add data
QueueItemStruct QIS = new QueueItemStruct();
- QIS.ObjectID = ObjectID;
- QIS.ScriptID = ScriptID;
+ QIS.localID = localID;
+ QIS.itemID = itemID;
QIS.FunctionName = FunctionName;
QIS.param = param;
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs
index 2786943..77bd409 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs
@@ -64,9 +64,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
public void InitializeEngine(OpenSim.Region.Environment.Scenes.Scene Sceneworld, OpenSim.Framework.Console.LogBase logger)
{
+
World = Sceneworld;
m_log = logger;
-
+
+ Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing");
+
//m_logger.Status("ScriptEngine", "InitializeEngine");
// Create all objects we'll be using
@@ -78,30 +81,21 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// Should we iterate the region for scripts that needs starting?
// Or can we assume we are loaded before anything else so we can use proper events?
- // Event hook for when scripts are dragged to script inventory
- World.EventManager.OnRezScript += NewRezScriptHandler;
}
-
- private void NewRezScriptHandler(uint localID, LLUUID itemID, string script)
- {
- // TODO: Add code to compile script and wire up script to object
- // Either the script is a stand-alone entity with a reference to public host,
- // Or the host has a reference to the script because it was in its inventory.
- }
-
+
public void Shutdown()
{
// We are shutting down
}
- // !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app)
- [Obsolete("!!!FOR DEBUGGING ONLY!!!")]
- public void StartScript(string ScriptID, IScriptHost ObjectID)
- {
- this.myEventManager.TEMP_OBJECT_ID = ObjectID;
- Log.Status("ScriptEngine", "DEBUG FUNCTION: StartScript: " + ScriptID);
- myScriptManager.StartScript(ScriptID, ObjectID);
- }
+ //// !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app)
+ //[Obsolete("!!!FOR DEBUGGING ONLY!!!")]
+ //public void StartScript(string ScriptID, IScriptHost ObjectID)
+ //{
+ // this.myEventManager.TEMP_OBJECT_ID = ObjectID;
+ // Log.Status("ScriptEngine", "DEBUG FUNCTION: StartScript: " + ScriptID);
+ // myScriptManager.StartScript(ScriptID, ObjectID);
+ //}
}
}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs
index 2be65e3..b7a4aca 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs
@@ -37,6 +37,7 @@ using OpenSim.Region.Environment.Scenes.Scripting;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
using OpenSim.Region.ScriptEngine.Common;
+using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
@@ -53,7 +54,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
public ScriptManager(ScriptEngine scriptEngine)
{
m_scriptEngine = scriptEngine;
- m_scriptEngine.Log.Verbose("ScriptEngine", "ScriptManager Start");
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
@@ -69,7 +69,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// Object>
// IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
// Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead!
- internal Dictionary> Scripts = new Dictionary>();
+ internal Dictionary> Scripts = new Dictionary>();
public Scene World
{
get
@@ -79,75 +79,75 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
}
- internal Dictionary.KeyCollection GetScriptKeys(IScriptHost ObjectID)
+ internal Dictionary.KeyCollection GetScriptKeys(uint localID)
{
- if (Scripts.ContainsKey(ObjectID) == false)
+ if (Scripts.ContainsKey(localID) == false)
return null;
- Dictionary Obj;
- Scripts.TryGetValue(ObjectID, out Obj);
+ Dictionary Obj;
+ Scripts.TryGetValue(localID, out Obj);
return Obj.Keys;
}
- internal LSL_BaseClass GetScript(IScriptHost ObjectID, string ScriptID)
+ internal LSL_BaseClass GetScript(uint localID, LLUUID itemID)
{
- if (Scripts.ContainsKey(ObjectID) == false)
+ if (Scripts.ContainsKey(localID) == false)
return null;
- Dictionary Obj;
- Scripts.TryGetValue(ObjectID, out Obj);
- if (Obj.ContainsKey(ScriptID) == false)
+ Dictionary Obj;
+ Scripts.TryGetValue(localID, out Obj);
+ if (Obj.ContainsKey(itemID) == false)
return null;
// Get script
LSL_BaseClass Script;
- Obj.TryGetValue(ScriptID, out Script);
+ Obj.TryGetValue(itemID, out Script);
return Script;
}
- internal void SetScript(IScriptHost ObjectID, string ScriptID, LSL_BaseClass Script)
+ internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script)
{
// Create object if it doesn't exist
- if (Scripts.ContainsKey(ObjectID) == false)
+ if (Scripts.ContainsKey(localID) == false)
{
- Scripts.Add(ObjectID, new Dictionary());
+ Scripts.Add(localID, new Dictionary());
}
// Delete script if it exists
- Dictionary Obj;
- Scripts.TryGetValue(ObjectID, out Obj);
- if (Obj.ContainsKey(ScriptID) == true)
- Obj.Remove(ScriptID);
+ Dictionary Obj;
+ Scripts.TryGetValue(localID, out Obj);
+ if (Obj.ContainsKey(itemID) == true)
+ Obj.Remove(itemID);
// Add to object
- Obj.Add(ScriptID, Script);
+ Obj.Add(itemID, Script);
}
- internal void RemoveScript(IScriptHost ObjectID, string ScriptID)
+ internal void RemoveScript(uint localID, LLUUID itemID)
{
// Don't have that object?
- if (Scripts.ContainsKey(ObjectID) == false)
+ if (Scripts.ContainsKey(localID) == false)
return;
// Delete script if it exists
- Dictionary Obj;
- Scripts.TryGetValue(ObjectID, out Obj);
- if (Obj.ContainsKey(ScriptID) == true)
- Obj.Remove(ScriptID);
+ Dictionary Obj;
+ Scripts.TryGetValue(localID, out Obj);
+ if (Obj.ContainsKey(itemID) == true)
+ Obj.Remove(itemID);
}
///
/// Fetches, loads and hooks up a script to an objects events
///
- ///
- ///
- public void StartScript(string ScriptID, IScriptHost ObjectID)
+ ///
+ ///
+ public void StartScript(uint localID, LLUUID itemID, string Script)
{
//IScriptHost root = host.GetRoot();
- m_scriptEngine.Log.Verbose("ScriptEngine", "ScriptManager StartScript: ScriptID: " + ScriptID + ", ObjectID: " + ObjectID);
+ m_scriptEngine.Log.Verbose("ScriptEngine", "ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID);
// We will initialize and start the script.
// It will be up to the script itself to hook up the correct events.
@@ -157,59 +157,39 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
- // * Fetch script from server
- // DEBUG - ScriptID is an actual filename during debug
- // (therefore we can also check type by looking at extension)
- FileName = ScriptID;
-
- // * Does script need compile? Send it to LSL compiler first. (TODO: Use (and clean) compiler cache)
- //myScriptEngine.m_logger.Verbose("ScriptEngine", "ScriptManager Script extension: " + System.IO.Path.GetExtension(FileName).ToLower());
- switch (System.IO.Path.GetExtension(FileName).ToLower())
- {
- case ".txt":
- case ".lsl":
- case ".cs":
- m_scriptEngine.Log.Verbose("ScriptEngine", "ScriptManager Script is CS/LSL, compiling to .Net Assembly");
- // Create a new instance of the compiler (currently we don't want reuse)
- OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
- // Compile
- FileName = LSLCompiler.Compile(FileName);
- break;
- default:
- throw new Exception("Unknown script type.");
- }
-
-
-
- m_scriptEngine.Log.Verbose("ScriptEngine", "Compilation done");
+ // Create a new instance of the compiler (currently we don't want reuse)
+ OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
+ // Compile (We assume LSL)
+ FileName = LSLCompiler.CompileFromLSLText(Script);
+ m_scriptEngine.Log.Verbose("ScriptEngine", "Compilation of " + FileName + " done");
// * Insert yield into code
FileName = ProcessYield(FileName);
//OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass Script = LoadAndInitAssembly(FreeAppDomain, FileName);
- //OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = LoadAndInitAssembly(FreeAppDomain, FileName, ObjectID);
+ //OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = LoadAndInitAssembly(FreeAppDomain, FileName, localID);
long before;
before = GC.GetTotalMemory(true);
- LSL_BaseClass Script = m_scriptEngine.myAppDomainManager.LoadScript(FileName);
- Console.WriteLine("Script occupies {0} bytes", GC.GetTotalMemory(true) - before);
+ LSL_BaseClass CompiledScript = m_scriptEngine.myAppDomainManager.LoadScript(FileName);
+ Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before);
before = GC.GetTotalMemory(true);
- Script = m_scriptEngine.myAppDomainManager.LoadScript(FileName);
- Console.WriteLine("Script occupies {0} bytes", GC.GetTotalMemory(true) - before);
+ //Script = m_scriptEngine.myAppDomainManager.LoadScript(FileName);
+ //Console.WriteLine("Script occupies {0} bytes", GC.GetTotalMemory(true) - before);
//before = GC.GetTotalMemory(true);
//Script = m_scriptEngine.myAppDomainManager.LoadScript(FileName);
//Console.WriteLine("Script occupies {0} bytes", GC.GetTotalMemory(true) - before);
// Add it to our temporary active script keeper
- //Scripts.Add(FullScriptID, Script);
- SetScript(ObjectID, ScriptID, Script);
+ //Scripts.Add(FullitemID, Script);
+ SetScript(localID, itemID, CompiledScript);
// We need to give (untrusted) assembly a private instance of BuiltIns
- // this private copy will contain Read-Only FullScriptID so that it can bring that on to the server whenever needed.
- LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(this, ObjectID);
+ // this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed.
+ LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(this, World.GetSceneObjectPart(localID));
// Start the script - giving it BuiltIns
- Script.Start(LSLB);
+ CompiledScript.Start(LSLB);
}
catch (Exception e)
@@ -219,16 +199,16 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
}
- public void StopScript(string ScriptID, IScriptHost ObjectID)
+ public void StopScript(uint localID, LLUUID itemID)
{
// Stop script
// Get AppDomain
- AppDomain ad = GetScript(ObjectID, ScriptID).Exec.GetAppDomain();
+ AppDomain ad = GetScript(localID, itemID).Exec.GetAppDomain();
// Tell script not to accept new requests
- GetScript(ObjectID, ScriptID).Exec.StopScript();
+ GetScript(localID, itemID).Exec.StopScript();
// Remove from internal structure
- RemoveScript(ObjectID, ScriptID);
+ RemoveScript(localID, itemID);
// Tell AppDomain that we have stopped script
m_scriptEngine.myAppDomainManager.StopScript(ad);
}
@@ -244,16 +224,16 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
///
/// Execute a LL-event-function in Script
///
- /// Object the script is located in
- /// Script ID
+ /// Object the script is located in
+ /// Script ID
/// Name of function
/// Arguments to pass to function
- internal void ExecuteEvent(IScriptHost ObjectID, string ScriptID, string FunctionName, object[] args)
+ internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args)
{
// Execute a function in the script
- m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function ObjectID: " + ObjectID + ", ScriptID: " + ScriptID + ", FunctionName: " + FunctionName);
- LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID);
+ m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName);
+ LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(localID, itemID);
// Must be done in correct AppDomain, so leaving it up to the script itself
Script.Exec.ExecuteEvent(FunctionName, args);
--
cgit v1.1