Moved in-AppDomain event execution from Script to OpenSim.Region.ScriptEngine.Executor. Script no longer responsible for handling event calls to itself (and we can create reference cache in Executor).
parent
318376707d
commit
37446b0392
|
@ -1,10 +1,56 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.Common
|
namespace OpenSim.Region.ScriptEngine.Common
|
||||||
{
|
{
|
||||||
class Executor
|
public class Executor: MarshalByRefObject
|
||||||
{
|
{
|
||||||
|
/* TODO:
|
||||||
|
*
|
||||||
|
* Needs to be common for all AppDomains - share memory too?
|
||||||
|
* Needs to have an instance in each AppDomain, and some way of referring it.
|
||||||
|
* Need to know what AppDomain a script is in so we know where to find our instance.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
private IScript m_Script;
|
||||||
|
|
||||||
|
public Executor(IScript Script)
|
||||||
|
{
|
||||||
|
m_Script = Script;
|
||||||
|
}
|
||||||
|
public void ExecuteEvent(string FunctionName, object[] args)
|
||||||
|
{
|
||||||
|
// IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
|
||||||
|
// Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead!
|
||||||
|
|
||||||
|
//foreach (MemberInfo mi in this.GetType().GetMembers())
|
||||||
|
//{
|
||||||
|
//if (mi.ToString().ToLower().Contains("default"))
|
||||||
|
//{
|
||||||
|
// Console.WriteLine("Member found: " + mi.ToString());
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
|
||||||
|
Type type = m_Script.GetType();
|
||||||
|
|
||||||
|
Console.WriteLine("ScriptEngine Executor.ExecuteEvent: \"" + m_Script.State() + "_event_" + FunctionName + "\"");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
type.InvokeMember(m_Script.State() + "_event_" + FunctionName, BindingFlags.InvokeMethod, null, m_Script, args);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// TODO: Send to correct place
|
||||||
|
Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
{
|
{
|
||||||
public interface LSL_BuiltIn_Commands_Interface
|
public interface LSL_BuiltIn_Commands_Interface
|
||||||
{
|
{
|
||||||
|
|
||||||
string State();
|
string State();
|
||||||
|
|
||||||
double llSin(double f);
|
double llSin(double f);
|
||||||
|
|
|
@ -12,9 +12,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
{
|
{
|
||||||
private int MaxScriptsPerAppDomain = 1;
|
private int MaxScriptsPerAppDomain = 1;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// List of all AppDomains
|
/// Internal list of all AppDomains
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private List<AppDomainStructure> AppDomains = new List<AppDomainStructure>();
|
private List<AppDomainStructure> AppDomains = new List<AppDomainStructure>();
|
||||||
|
/// <summary>
|
||||||
|
/// Structure to keep track of data around AppDomain
|
||||||
|
/// </summary>
|
||||||
private struct AppDomainStructure
|
private struct AppDomainStructure
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -37,10 +40,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
private object GetLock = new object(); // Mutex
|
private object GetLock = new object(); // Mutex
|
||||||
private object FreeLock = new object(); // Mutex
|
private object FreeLock = new object(); // Mutex
|
||||||
|
|
||||||
private ScriptEngine m_scriptEngine;
|
//private ScriptEngine m_scriptEngine;
|
||||||
public AppDomainManager(ScriptEngine scriptEngine)
|
//public AppDomainManager(ScriptEngine scriptEngine)
|
||||||
|
public AppDomainManager()
|
||||||
{
|
{
|
||||||
m_scriptEngine = scriptEngine;
|
//m_scriptEngine = scriptEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -54,6 +58,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
// Current full?
|
// Current full?
|
||||||
if (CurrentAD.ScriptsLoaded >= MaxScriptsPerAppDomain)
|
if (CurrentAD.ScriptsLoaded >= MaxScriptsPerAppDomain)
|
||||||
{
|
{
|
||||||
|
// Add it to AppDomains list and empty current
|
||||||
AppDomains.Add(CurrentAD);
|
AppDomains.Add(CurrentAD);
|
||||||
CurrentAD = new AppDomainStructure();
|
CurrentAD = new AppDomainStructure();
|
||||||
}
|
}
|
||||||
|
@ -68,7 +73,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increase number of scripts loaded
|
// Increase number of scripts loaded into this
|
||||||
|
// TODO:
|
||||||
|
// - We assume that every time someone wants an AppDomain they will load into it
|
||||||
|
// if this assumption is wrong we end up with a miscount and will never unload it.
|
||||||
|
//
|
||||||
CurrentAD.ScriptsLoaded++;
|
CurrentAD.ScriptsLoaded++;
|
||||||
// Return AppDomain
|
// Return AppDomain
|
||||||
return CurrentAD.CurrentAppDomain;
|
return CurrentAD.CurrentAppDomain;
|
||||||
|
@ -84,46 +93,19 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
{
|
{
|
||||||
// Create and prepare a new AppDomain
|
// Create and prepare a new AppDomain
|
||||||
AppDomainNameCount++;
|
AppDomainNameCount++;
|
||||||
// TODO: Currently security and configuration match current appdomain
|
// TODO: Currently security match current appdomain
|
||||||
|
|
||||||
// Construct and initialize settings for a second AppDomain.
|
// Construct and initialize settings for a second AppDomain.
|
||||||
AppDomainSetup ads = new AppDomainSetup();
|
AppDomainSetup ads = new AppDomainSetup();
|
||||||
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
|
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
|
||||||
//Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ScriptEngines");
|
|
||||||
//ads.ApplicationName = "DotNetScriptEngine";
|
|
||||||
//ads.DynamicBase = ads.ApplicationBase;
|
|
||||||
|
|
||||||
//Console.WriteLine("AppDomain BaseDirectory: " + ads.ApplicationBase);
|
|
||||||
ads.DisallowBindingRedirects = false;
|
ads.DisallowBindingRedirects = false;
|
||||||
ads.DisallowCodeDownload = true;
|
ads.DisallowCodeDownload = true;
|
||||||
ads.ShadowCopyFiles = "true";
|
ads.ShadowCopyFiles = "true"; // Enabled shadowing
|
||||||
|
ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
|
||||||
ads.ConfigurationFile =
|
|
||||||
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
|
|
||||||
|
|
||||||
AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads);
|
AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads);
|
||||||
//foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
|
|
||||||
//{
|
|
||||||
// //Console.WriteLine("Loading: " + a.GetName(true));
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// //AD.Load(a.GetName(true));
|
|
||||||
|
|
||||||
// }
|
// Return the new AppDomain
|
||||||
// catch (Exception e)
|
|
||||||
// {
|
|
||||||
// //Console.WriteLine("FAILED load");
|
|
||||||
// }
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
//Console.WriteLine("Assembly file: " + this.GetType().Assembly.CodeBase);
|
|
||||||
//Console.WriteLine("Assembly name: " + this.GetType().ToString());
|
|
||||||
//AD.CreateInstanceFrom(this.GetType().Assembly.CodeBase, "OpenSim.Region.ScriptEngine.DotNetEngine.ScriptEngine");
|
|
||||||
|
|
||||||
//AD.Load(this.GetType().Assembly.CodeBase);
|
|
||||||
|
|
||||||
Console.WriteLine("Done preparing new AppDomain.");
|
|
||||||
return AD;
|
return AD;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -135,14 +117,19 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
{
|
{
|
||||||
lock (FreeLock)
|
lock (FreeLock)
|
||||||
{
|
{
|
||||||
|
// Go through all
|
||||||
foreach (AppDomainStructure ads in new System.Collections.ArrayList(AppDomains))
|
foreach (AppDomainStructure ads in new System.Collections.ArrayList(AppDomains))
|
||||||
{
|
{
|
||||||
|
// Don't process current AppDomain
|
||||||
if (ads.CurrentAppDomain != CurrentAD.CurrentAppDomain)
|
if (ads.CurrentAppDomain != CurrentAD.CurrentAppDomain)
|
||||||
{
|
{
|
||||||
// Not current AppDomain
|
// Not current AppDomain
|
||||||
if (ads.ScriptsLoaded == ads.ScriptsWaitingUnload)
|
// Is number of unloaded bigger or equal to number of loaded?
|
||||||
|
if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload)
|
||||||
{
|
{
|
||||||
|
// Remove from internal list
|
||||||
AppDomains.Remove(ads);
|
AppDomains.Remove(ads);
|
||||||
|
// Unload
|
||||||
AppDomain.Unload(ads.CurrentAppDomain);
|
AppDomain.Unload(ads.CurrentAppDomain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -159,16 +146,20 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
{
|
{
|
||||||
lock (FreeLock)
|
lock (FreeLock)
|
||||||
{
|
{
|
||||||
|
// Check if it is current AppDomain
|
||||||
if (CurrentAD.CurrentAppDomain == ad)
|
if (CurrentAD.CurrentAppDomain == ad)
|
||||||
{
|
{
|
||||||
|
// Yes - increase
|
||||||
CurrentAD.ScriptsWaitingUnload++;
|
CurrentAD.ScriptsWaitingUnload++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lopp through all AppDomains
|
||||||
foreach (AppDomainStructure ads in new System.Collections.ArrayList(AppDomains))
|
foreach (AppDomainStructure ads in new System.Collections.ArrayList(AppDomains))
|
||||||
{
|
{
|
||||||
if (ads.CurrentAppDomain == ad)
|
if (ads.CurrentAppDomain == ad)
|
||||||
{
|
{
|
||||||
|
// Found it - messy code to increase structure
|
||||||
AppDomainStructure ads2 = ads;
|
AppDomainStructure ads2 = ads;
|
||||||
ads2.ScriptsWaitingUnload++;
|
ads2.ScriptsWaitingUnload++;
|
||||||
AppDomains.Remove(ads);
|
AppDomains.Remove(ads);
|
||||||
|
@ -178,5 +169,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
} // foreach
|
} // foreach
|
||||||
} // lock
|
} // lock
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,17 @@ using System.Reflection;
|
||||||
|
|
||||||
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
|
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
|
||||||
{
|
{
|
||||||
public class LSL_BaseClass : MarshalByRefObject, LSL_BuiltIn_Commands_Interface
|
public class LSL_BaseClass : MarshalByRefObject, LSL_BuiltIn_Commands_Interface, IScript
|
||||||
{
|
{
|
||||||
|
private Executor m_Exec;
|
||||||
|
public Executor Exec {
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (m_Exec == null)
|
||||||
|
m_Exec = new Executor(this);
|
||||||
|
return m_Exec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public LSL_BuiltIn_Commands_Interface m_LSL_Functions;
|
public LSL_BuiltIn_Commands_Interface m_LSL_Functions;
|
||||||
|
|
||||||
|
@ -48,33 +57,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ExecuteEvent(string FunctionName, object[] args)
|
|
||||||
{
|
|
||||||
//foreach (MemberInfo mi in this.GetType().GetMembers())
|
|
||||||
//{
|
|
||||||
//if (mi.ToString().ToLower().Contains("default"))
|
|
||||||
//{
|
|
||||||
// Console.WriteLine("Member found: " + mi.ToString());
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
|
|
||||||
Type type = this.GetType();
|
|
||||||
|
|
||||||
Console.WriteLine("ScriptEngine Invoke: \"" + this.State() + "_event_" + FunctionName + "\"");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
type.InvokeMember(this.State() + "_event_" + FunctionName, BindingFlags.InvokeMethod, null, this, args);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
// TODO: Send to correct place
|
|
||||||
Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -16,6 +16,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LSL_BuiltIn_Commands: MarshalByRefObject, LSL_BuiltIn_Commands_Interface
|
public class LSL_BuiltIn_Commands: MarshalByRefObject, LSL_BuiltIn_Commands_Interface
|
||||||
{
|
{
|
||||||
|
|
||||||
private System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
private System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
||||||
private ScriptManager m_manager;
|
private ScriptManager m_manager;
|
||||||
private IScriptHost m_host;
|
private IScriptHost m_host;
|
||||||
|
@ -74,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
|
||||||
public void llWhisper(int channelID, string text)
|
public void llWhisper(int channelID, string text)
|
||||||
{
|
{
|
||||||
//Common.SendToDebug("INTERNAL FUNCTION llWhisper(" + channelID + ", \"" + text + "\");");
|
//Common.SendToDebug("INTERNAL FUNCTION llWhisper(" + channelID + ", \"" + text + "\");");
|
||||||
Console.WriteLine("llWhisper Channel " + channelID + ", Text: \"" + text + "\"");
|
//Console.WriteLine("llWhisper Channel " + channelID + ", Text: \"" + text + "\"");
|
||||||
//type for whisper is 0
|
//type for whisper is 0
|
||||||
World.SimChat(Helpers.StringToField(text),
|
World.SimChat(Helpers.StringToField(text),
|
||||||
0, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
|
0, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
|
||||||
|
@ -86,7 +87,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
|
||||||
{
|
{
|
||||||
//TODO: DO SOMETHING USEFUL HERE
|
//TODO: DO SOMETHING USEFUL HERE
|
||||||
//Common.SendToDebug("INTERNAL FUNCTION llSay(" + (int)channelID + ", \"" + (string)text + "\");");
|
//Common.SendToDebug("INTERNAL FUNCTION llSay(" + (int)channelID + ", \"" + (string)text + "\");");
|
||||||
Console.WriteLine("llSay Channel " + channelID + ", Text: \"" + text + "\"");
|
//Console.WriteLine("llSay Channel " + channelID + ", Text: \"" + text + "\"");
|
||||||
//type for say is 1
|
//type for say is 1
|
||||||
|
|
||||||
World.SimChat(Helpers.StringToField(text),
|
World.SimChat(Helpers.StringToField(text),
|
||||||
|
@ -95,7 +96,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
|
||||||
|
|
||||||
public void llShout(int channelID, string text)
|
public void llShout(int channelID, string text)
|
||||||
{
|
{
|
||||||
Console.WriteLine("llShout Channel " + channelID + ", Text: \"" + text + "\"");
|
//Console.WriteLine("llShout Channel " + channelID + ", Text: \"" + text + "\"");
|
||||||
//type for shout is 2
|
//type for shout is 2
|
||||||
World.SimChat(Helpers.StringToField(text),
|
World.SimChat(Helpers.StringToField(text),
|
||||||
2, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
|
2, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
|
||||||
|
|
|
@ -101,7 +101,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
QueueItemStruct QIS = EventQueue.Dequeue();
|
QueueItemStruct QIS = EventQueue.Dequeue();
|
||||||
//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 ObjectID: " + QIS.ObjectID + ", ScriptID: " + QIS.ScriptID + ", FunctionName: " + QIS.FunctionName);
|
||||||
// TODO: Execute function
|
// TODO: Execute function
|
||||||
myScriptEngine.myScriptManager.ExecuteFunction(QIS.ObjectID, QIS.ScriptID, QIS.FunctionName, QIS.param);
|
myScriptEngine.myScriptManager.ExecuteEvent(QIS.ObjectID, QIS.ScriptID, QIS.FunctionName, QIS.param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
myEventQueueManager = new EventQueueManager(this);
|
myEventQueueManager = new EventQueueManager(this);
|
||||||
myEventManager = new EventManager(this);
|
myEventManager = new EventManager(this);
|
||||||
myScriptManager = new ScriptManager(this);
|
myScriptManager = new ScriptManager(this);
|
||||||
myAppDomainManager = new AppDomainManager(this);
|
myAppDomainManager = new AppDomainManager();
|
||||||
|
|
||||||
// Should we iterate the region for scripts that needs starting?
|
// 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?
|
// Or can we assume we are loaded before anything else so we can use proper events?
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads scripts
|
/// Loads scripts
|
||||||
/// Compiles them if necessary
|
/// Compiles them if necessary
|
||||||
/// Execute functions for EventQueueManager
|
/// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class ScriptManager
|
public class ScriptManager
|
||||||
|
@ -182,18 +182,15 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
//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, ObjectID);
|
||||||
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, ObjectID);
|
||||||
|
|
||||||
//string FullScriptID = ScriptID + "." + ObjectID;
|
|
||||||
// Add it to our temporary active script keeper
|
// Add it to our temporary active script keeper
|
||||||
//Scripts.Add(FullScriptID, Script);
|
//Scripts.Add(FullScriptID, Script);
|
||||||
SetScript(ObjectID, ScriptID, Script);
|
SetScript(ObjectID, ScriptID, Script);
|
||||||
// We need to give (untrusted) assembly a private instance of BuiltIns
|
// 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.
|
// this private copy will contain Read-Only FullScriptID so that it can bring that on to the server whenever needed.
|
||||||
//OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL_BuiltIn_Commands_Interface LSLB = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL_BuiltIn_Commands_TestImplementation(FullScriptID);
|
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL_BuiltIn_Commands LSLB = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL_BuiltIn_Commands(this, ObjectID);
|
||||||
|
|
||||||
// Start the script - giving it BuiltIns
|
// Start the script - giving it BuiltIns
|
||||||
//myScriptEngine.m_logger.Verbose("ScriptEngine", "ScriptManager initializing script, handing over private builtin command interface");
|
Script.Start(LSLB);
|
||||||
|
|
||||||
Script.Start(new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL_BuiltIn_Commands(this, ObjectID));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -210,12 +207,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
return FileName;
|
return FileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
//private AppDomain GetFreeAppDomain()
|
|
||||||
//{
|
|
||||||
// // TODO: Find an available AppDomain - if none, create one and add default security
|
|
||||||
// return Thread.GetDomain();
|
|
||||||
//}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Does actual loading and initialization of script Assembly
|
/// Does actual loading and initialization of script Assembly
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -239,68 +230,25 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
|
||||||
return mbrt;
|
return mbrt;
|
||||||
//return (LSL_BaseClass)mbrt;
|
//return (LSL_BaseClass)mbrt;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// //myScriptEngine.m_logger.Verbose("ScriptEngine", "ScriptManager Loading Assembly " + FileName);
|
|
||||||
// // Load .Net Assembly (.dll)
|
|
||||||
// // Initialize and return it
|
|
||||||
|
|
||||||
// // TODO: Add error handling
|
|
||||||
// // Script might not follow our rules since users can upload -anything-
|
|
||||||
|
|
||||||
// Assembly a;
|
|
||||||
// //try
|
|
||||||
// //{
|
|
||||||
|
|
||||||
|
|
||||||
// // Load to default appdomain (temporary)
|
|
||||||
// a = Assembly.LoadFrom(FileName);
|
|
||||||
// // Load to specified appdomain
|
|
||||||
// // TODO: Insert security
|
|
||||||
// //a = FreeAppDomain.Load(FileName);
|
|
||||||
// //}
|
|
||||||
// //catch (Exception e)
|
|
||||||
// //{
|
|
||||||
// //}
|
|
||||||
|
|
||||||
|
|
||||||
// //foreach (Type _t in a.GetTypes())
|
|
||||||
// //{
|
|
||||||
// // Console.WriteLine("Type: " + _t.ToString());
|
|
||||||
// //}
|
|
||||||
|
|
||||||
// Type t;
|
|
||||||
// //try
|
|
||||||
// //{
|
|
||||||
// t = a.GetType("SecondLife.Script", true);
|
|
||||||
// //}
|
|
||||||
// //catch (Exception e)
|
|
||||||
// //{
|
|
||||||
// //}
|
|
||||||
|
|
||||||
// // Create constructor arguments
|
|
||||||
// object[] args = new object[]
|
|
||||||
// {
|
|
||||||
//// this,
|
|
||||||
//// host
|
|
||||||
// };
|
|
||||||
|
|
||||||
// return (OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass)Activator.CreateInstance(t, args );
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ExecuteFunction(IScriptHost ObjectID, string ScriptID, string FunctionName, object[] args)
|
/// <summary>
|
||||||
|
/// Execute a LL-event-function in Script
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ObjectID">Object the script is located in</param>
|
||||||
|
/// <param name="ScriptID">Script ID</param>
|
||||||
|
/// <param name="FunctionName">Name of function</param>
|
||||||
|
/// <param name="args">Arguments to pass to function</param>
|
||||||
|
internal void ExecuteEvent(IScriptHost ObjectID, string ScriptID, string FunctionName, object[] args)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Execute a function in the script
|
// Execute a function in the script
|
||||||
m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function ObjectID: " + ObjectID + ", ScriptID: " + ScriptID + ", FunctionName: " + FunctionName);
|
m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function ObjectID: " + ObjectID + ", ScriptID: " + ScriptID + ", FunctionName: " + FunctionName);
|
||||||
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID);
|
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = m_scriptEngine.myScriptManager.GetScript(ObjectID, ScriptID);
|
||||||
|
|
||||||
Script.ExecuteEvent(FunctionName, args);
|
// Must be done in correct AppDomain, so leaving it up to the script itself
|
||||||
|
|
||||||
|
Script.Exec.ExecuteEvent(FunctionName, args);
|
||||||
|
|
||||||
//Type type = Script.GetType();
|
//Type type = Script.GetType();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue