remove ^M, as native storage should be UNIX format, and ^M in/out mashing

will happen on the windows side now that eol-style is correct
afrisby
Sean Dague 2007-09-13 11:41:42 +00:00
parent 2154c61648
commit afea5f2205
29 changed files with 7407 additions and 7407 deletions

View File

@ -1,115 +1,115 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using System.Runtime.Remoting.Lifetime; using System.Runtime.Remoting.Lifetime;
namespace OpenSim.Region.ScriptEngine.Common namespace OpenSim.Region.ScriptEngine.Common
{ {
public class Executor : MarshalByRefObject public class Executor : MarshalByRefObject
{ {
// Private instance for each script // Private instance for each script
private IScript m_Script; private IScript m_Script;
private Dictionary<string, MethodInfo> Events = new Dictionary<string, MethodInfo>(); private Dictionary<string, MethodInfo> Events = new Dictionary<string, MethodInfo>();
private bool m_Running = true; private bool m_Running = true;
//private List<IScript> Scripts = new List<IScript>(); //private List<IScript> Scripts = new List<IScript>();
public Executor(IScript Script) public Executor(IScript Script)
{ {
m_Script = Script; m_Script = Script;
} }
// Object never expires // Object never expires
public override Object InitializeLifetimeService() public override Object InitializeLifetimeService()
{ {
//Console.WriteLine("Executor: InitializeLifetimeService()"); //Console.WriteLine("Executor: InitializeLifetimeService()");
// return null; // return null;
ILease lease = (ILease)base.InitializeLifetimeService(); ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial) if (lease.CurrentState == LeaseState.Initial)
{ {
lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1);
// lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
// lease.RenewOnCallTime = TimeSpan.FromSeconds(2); // lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
} }
return lease; return lease;
} }
public AppDomain GetAppDomain() public AppDomain GetAppDomain()
{ {
return AppDomain.CurrentDomain; return AppDomain.CurrentDomain;
} }
public void ExecuteEvent(string FunctionName, object[] args) public void ExecuteEvent(string FunctionName, object[] args)
{ {
// IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
// Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead!
//try //try
//{ //{
if (m_Running == false) if (m_Running == false)
{ {
// Script is inactive, do not execute! // Script is inactive, do not execute!
return; return;
} }
string EventName = m_Script.State() + "_event_" + FunctionName; string EventName = m_Script.State() + "_event_" + FunctionName;
//type.InvokeMember(EventName, BindingFlags.InvokeMethod, null, m_Script, args); //type.InvokeMember(EventName, BindingFlags.InvokeMethod, null, m_Script, args);
//Console.WriteLine("ScriptEngine Executor.ExecuteEvent: \"" + EventName + "\""); //Console.WriteLine("ScriptEngine Executor.ExecuteEvent: \"" + EventName + "\"");
if (Events.ContainsKey(EventName) == false) if (Events.ContainsKey(EventName) == false)
{ {
// Not found, create // Not found, create
Type type = m_Script.GetType(); Type type = m_Script.GetType();
try try
{ {
MethodInfo mi = type.GetMethod(EventName); MethodInfo mi = type.GetMethod(EventName);
Events.Add(EventName, mi); Events.Add(EventName, mi);
} }
catch catch
{ {
// Event name not found, cache it as not found // Event name not found, cache it as not found
Events.Add(EventName, null); Events.Add(EventName, null);
} }
} }
// Get event // Get event
MethodInfo ev = null; MethodInfo ev = null;
Events.TryGetValue(EventName, out ev); Events.TryGetValue(EventName, out ev);
if (ev == null) // No event by that name! if (ev == null) // No event by that name!
{ {
//Console.WriteLine("ScriptEngine Can not find any event named: \"" + EventName + "\""); //Console.WriteLine("ScriptEngine Can not find any event named: \"" + EventName + "\"");
return; return;
} }
// Found // Found
//try //try
//{ //{
// Invoke it // Invoke it
ev.Invoke(m_Script, args); ev.Invoke(m_Script, args);
//} //}
//catch (Exception e) //catch (Exception e)
//{ //{
// // TODO: Send to correct place // // TODO: Send to correct place
// Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString()); // Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString());
//} //}
//} //}
//catch { } //catch { }
} }
public void StopScript() public void StopScript()
{ {
m_Running = false; m_Running = false;
} }
} }
} }

View File

@ -1,12 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.ScriptEngine.Common namespace OpenSim.Region.ScriptEngine.Common
{ {
public interface IScript public interface IScript
{ {
string State(); string State();
Executor Exec { get; } Executor Exec { get; }
} }
} }

View File

@ -1,53 +1,53 @@
using System; using System;
namespace OpenSim.Region.ScriptEngine.Common namespace OpenSim.Region.ScriptEngine.Common
{ {
[Serializable] [Serializable]
public class LSL_Types public class LSL_Types
{ {
[Serializable] [Serializable]
public struct Vector3 public struct Vector3
{ {
public double X; public double X;
public double Y; public double Y;
public double Z; public double Z;
public Vector3(Vector3 vector) public Vector3(Vector3 vector)
{ {
X = (float)vector.X; X = (float)vector.X;
Y = (float)vector.Y; Y = (float)vector.Y;
Z = (float)vector.Z; Z = (float)vector.Z;
} }
public Vector3(double x, double y, double z) public Vector3(double x, double y, double z)
{ {
X = x; X = x;
Y = y; Y = y;
Z = z; Z = z;
} }
} }
[Serializable] [Serializable]
public struct Quaternion public struct Quaternion
{ {
public double X; public double X;
public double Y; public double Y;
public double Z; public double Z;
public double R; public double R;
public Quaternion(Quaternion Quat) public Quaternion(Quaternion Quat)
{ {
X = (float)Quat.X; X = (float)Quat.X;
Y = (float)Quat.Y; Y = (float)Quat.Y;
Z = (float)Quat.Z; Z = (float)Quat.Z;
R = (float)Quat.R; R = (float)Quat.R;
} }
public Quaternion(double x, double y, double z, double r) public Quaternion(double x, double y, double z, double r)
{ {
X = x; X = x;
Y = y; Y = y;
Z = z; Z = z;
R = r; R = r;
} }
} }
} }
} }

View File

@ -1,33 +1,33 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.Common")] [assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.Common")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OpenSim.Region.ScriptEngine.Common")] [assembly: AssemblyProduct("OpenSim.Region.ScriptEngine.Common")]
[assembly: AssemblyCopyright("Copyright © 2007")] [assembly: AssemblyCopyright("Copyright © 2007")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible // Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from // to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. // COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)] [assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM // The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0bf07c53-ae51-487f-a907-e9b30c251602")] [assembly: Guid("0bf07c53-ae51-487f-a907-e9b30c251602")]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //
// Major Version // Major Version
// Minor Version // Minor Version
// Build Number // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,197 +1,197 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using System.Runtime.Remoting; using System.Runtime.Remoting;
using System.IO; using System.IO;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
using OpenSim.Region.ScriptEngine.Common; using OpenSim.Region.ScriptEngine.Common;
using libsecondlife; using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
public class AppDomainManager public class AppDomainManager
{ {
private int maxScriptsPerAppDomain = 1; private int maxScriptsPerAppDomain = 1;
/// <summary> /// <summary>
/// Internal 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> /// <summary>
/// Structure to keep track of data around AppDomain /// Structure to keep track of data around AppDomain
/// </summary> /// </summary>
private class AppDomainStructure private class AppDomainStructure
{ {
/// <summary> /// <summary>
/// The AppDomain itself /// The AppDomain itself
/// </summary> /// </summary>
public AppDomain CurrentAppDomain; public AppDomain CurrentAppDomain;
/// <summary> /// <summary>
/// Number of scripts loaded into AppDomain /// Number of scripts loaded into AppDomain
/// </summary> /// </summary>
public int ScriptsLoaded; public int ScriptsLoaded;
/// <summary> /// <summary>
/// Number of dead scripts /// Number of dead scripts
/// </summary> /// </summary>
public int ScriptsWaitingUnload; public int ScriptsWaitingUnload;
} }
/// <summary> /// <summary>
/// Current AppDomain /// Current AppDomain
/// </summary> /// </summary>
private AppDomainStructure currentAD; private AppDomainStructure currentAD;
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() public AppDomainManager()
{ {
//m_scriptEngine = scriptEngine; //m_scriptEngine = scriptEngine;
} }
/// <summary> /// <summary>
/// Find a free AppDomain, creating one if necessary /// Find a free AppDomain, creating one if necessary
/// </summary> /// </summary>
/// <returns>Free AppDomain</returns> /// <returns>Free AppDomain</returns>
private AppDomainStructure GetFreeAppDomain() private AppDomainStructure GetFreeAppDomain()
{ {
Console.WriteLine("Finding free AppDomain"); Console.WriteLine("Finding free AppDomain");
lock (getLock) lock (getLock)
{ {
// Current full? // Current full?
if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain)
{ {
// Add it to AppDomains list and empty current // Add it to AppDomains list and empty current
appDomains.Add(currentAD); appDomains.Add(currentAD);
currentAD = null; currentAD = null;
} }
// No current // No current
if (currentAD == null) if (currentAD == null)
{ {
// Create a new current AppDomain // Create a new current AppDomain
currentAD = new AppDomainStructure(); currentAD = new AppDomainStructure();
currentAD.CurrentAppDomain = PrepareNewAppDomain(); currentAD.CurrentAppDomain = PrepareNewAppDomain();
} }
Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded);
return currentAD; return currentAD;
} // lock } // lock
} }
private int AppDomainNameCount; private int AppDomainNameCount;
/// <summary> /// <summary>
/// Create and prepare a new AppDomain for scripts /// Create and prepare a new AppDomain for scripts
/// </summary> /// </summary>
/// <returns>The new AppDomain</returns> /// <returns>The new AppDomain</returns>
private AppDomain PrepareNewAppDomain() private AppDomain PrepareNewAppDomain()
{ {
// Create and prepare a new AppDomain // Create and prepare a new AppDomain
AppDomainNameCount++; AppDomainNameCount++;
// TODO: Currently security 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;
ads.DisallowBindingRedirects = false; ads.DisallowBindingRedirects = false;
ads.DisallowCodeDownload = true; ads.DisallowCodeDownload = true;
ads.ShadowCopyFiles = "true"; // Enabled shadowing 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);
// Return the new AppDomain // Return the new AppDomain
return AD; return AD;
} }
/// <summary> /// <summary>
/// Unload appdomains that are full and have only dead scripts /// Unload appdomains that are full and have only dead scripts
/// </summary> /// </summary>
private void UnloadAppDomains() private void UnloadAppDomains()
{ {
lock (freeLock) lock (freeLock)
{ {
// Go through all // 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 // Don't process current AppDomain
if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) if (ads.CurrentAppDomain != currentAD.CurrentAppDomain)
{ {
// Not current AppDomain // Not current AppDomain
// Is number of unloaded bigger or equal to number of loaded? // Is number of unloaded bigger or equal to number of loaded?
if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload)
{ {
Console.WriteLine("Found empty AppDomain, unloading"); Console.WriteLine("Found empty AppDomain, unloading");
// Remove from internal list // Remove from internal list
appDomains.Remove(ads); appDomains.Remove(ads);
#if DEBUG #if DEBUG
long m = GC.GetTotalMemory(true); long m = GC.GetTotalMemory(true);
#endif #endif
// Unload // Unload
AppDomain.Unload(ads.CurrentAppDomain); AppDomain.Unload(ads.CurrentAppDomain);
#if DEBUG #if DEBUG
Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + " bytes of memory"); Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + " bytes of memory");
#endif #endif
} }
} }
} // foreach } // foreach
} // lock } // lock
} }
public OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadScript(string FileName) public OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadScript(string FileName)
{ {
// Find next available AppDomain to put it in // Find next available AppDomain to put it in
AppDomainStructure FreeAppDomain = GetFreeAppDomain(); AppDomainStructure FreeAppDomain = GetFreeAppDomain();
Console.WriteLine("Loading into AppDomain: " + FileName); Console.WriteLine("Loading into AppDomain: " + FileName);
LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script");
//Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt));
FreeAppDomain.ScriptsLoaded++; FreeAppDomain.ScriptsLoaded++;
return mbrt; return mbrt;
} }
/// <summary> /// <summary>
/// Increase "dead script" counter for an AppDomain /// Increase "dead script" counter for an AppDomain
/// </summary> /// </summary>
/// <param name="ad"></param> /// <param name="ad"></param>
//[Obsolete("Needs fixing, needs a real purpose in life!!!")] //[Obsolete("Needs fixing, needs a real purpose in life!!!")]
public void StopScript(AppDomain ad) public void StopScript(AppDomain ad)
{ {
lock (freeLock) lock (freeLock)
{ {
Console.WriteLine("Stopping script in AppDomain"); Console.WriteLine("Stopping script in AppDomain");
// Check if it is current AppDomain // Check if it is current AppDomain
if (currentAD.CurrentAppDomain == ad) if (currentAD.CurrentAppDomain == ad)
{ {
// Yes - increase // Yes - increase
currentAD.ScriptsWaitingUnload++; currentAD.ScriptsWaitingUnload++;
return; return;
} }
// Lopp through all AppDomains // 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 // Found it
ads.ScriptsWaitingUnload++; ads.ScriptsWaitingUnload++;
break; break;
} }
} // foreach } // foreach
} // lock } // lock
UnloadAppDomains(); // Outsite lock, has its own GetLock UnloadAppDomains(); // Outsite lock, has its own GetLock
} }
} }
} }

View File

@ -1,59 +1,59 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
public static class Common public static class Common
{ {
static public bool debug = true; static public bool debug = true;
static public ScriptEngine mySE; static public ScriptEngine mySE;
//public delegate void SendToDebugEventDelegate(string Message); //public delegate void SendToDebugEventDelegate(string Message);
//public delegate void SendToLogEventDelegate(string Message); //public delegate void SendToLogEventDelegate(string Message);
//static public event SendToDebugEventDelegate SendToDebugEvent; //static public event SendToDebugEventDelegate SendToDebugEvent;
//static public event SendToLogEventDelegate SendToLogEvent; //static public event SendToLogEventDelegate SendToLogEvent;
static public void SendToDebug(string Message) static public void SendToDebug(string Message)
{ {
//if (Debug == true) //if (Debug == true)
mySE.Log.Verbose("ScriptEngine", "Debug: " + Message); mySE.Log.Verbose("ScriptEngine", "Debug: " + Message);
//SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
} }
static public void SendToLog(string Message) static public void SendToLog(string Message)
{ {
//if (Debug == true) //if (Debug == true)
mySE.Log.Verbose("ScriptEngine", "LOG: " + Message); mySE.Log.Verbose("ScriptEngine", "LOG: " + Message);
//SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
} }
} }
} }

View File

@ -1,113 +1,113 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.IO; using System.IO;
using Microsoft.CSharp; using Microsoft.CSharp;
using System.CodeDom.Compiler; using System.CodeDom.Compiler;
using System.Reflection; using System.Reflection;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
{ {
public class Compiler public class Compiler
{ {
private LSL2CSConverter LSL_Converter = new LSL2CSConverter(); private LSL2CSConverter LSL_Converter = new LSL2CSConverter();
private CSharpCodeProvider codeProvider = new CSharpCodeProvider(); private CSharpCodeProvider codeProvider = new CSharpCodeProvider();
private static UInt64 scriptCompileCounter = 0; private static UInt64 scriptCompileCounter = 0;
//private ICodeCompiler icc = codeProvider.CreateCompiler(); //private ICodeCompiler icc = codeProvider.CreateCompiler();
public string CompileFromFile(string LSOFileName) public string CompileFromFile(string LSOFileName)
{ {
switch (System.IO.Path.GetExtension(LSOFileName).ToLower()) switch (System.IO.Path.GetExtension(LSOFileName).ToLower())
{ {
case ".txt": case ".txt":
case ".lsl": case ".lsl":
Common.SendToDebug("Source code is LSL, converting to CS"); Common.SendToDebug("Source code is LSL, converting to CS");
return CompileFromLSLText(File.ReadAllText(LSOFileName)); return CompileFromLSLText(File.ReadAllText(LSOFileName));
case ".cs": case ".cs":
Common.SendToDebug("Source code is CS"); Common.SendToDebug("Source code is CS");
return CompileFromCSText(File.ReadAllText(LSOFileName)); return CompileFromCSText(File.ReadAllText(LSOFileName));
default: default:
throw new Exception("Unknown script type."); throw new Exception("Unknown script type.");
} }
} }
/// <summary> /// <summary>
/// Converts script from LSL to CS and calls CompileFromCSText /// Converts script from LSL to CS and calls CompileFromCSText
/// </summary> /// </summary>
/// <param name="Script">LSL script</param> /// <param name="Script">LSL script</param>
/// <returns>Filename to .dll assembly</returns> /// <returns>Filename to .dll assembly</returns>
public string CompileFromLSLText(string Script) public string CompileFromLSLText(string Script)
{ {
return CompileFromCSText(LSL_Converter.Convert(Script)); return CompileFromCSText(LSL_Converter.Convert(Script));
} }
/// <summary> /// <summary>
/// Compile CS script to .Net assembly (.dll) /// Compile CS script to .Net assembly (.dll)
/// </summary> /// </summary>
/// <param name="Script">CS script</param> /// <param name="Script">CS script</param>
/// <returns>Filename to .dll assembly</returns> /// <returns>Filename to .dll assembly</returns>
public string CompileFromCSText(string Script) public string CompileFromCSText(string Script)
{ {
// Output assembly name // Output assembly name
scriptCompileCounter++; scriptCompileCounter++;
string OutFile = Path.Combine("ScriptEngines", "Script_" + scriptCompileCounter + ".dll"); string OutFile = Path.Combine("ScriptEngines", "Script_" + scriptCompileCounter + ".dll");
try try
{ {
System.IO.File.Delete(OutFile); System.IO.File.Delete(OutFile);
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine("Exception attempting to delete old compiled script: " + e.ToString()); Console.WriteLine("Exception attempting to delete old compiled script: " + e.ToString());
} }
//string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll"); //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll");
// DEBUG - write source to disk // DEBUG - write source to disk
try try
{ {
File.WriteAllText(Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(OutFile) + ".cs"), Script); File.WriteAllText(Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(OutFile) + ".cs"), Script);
} }
catch { } catch { }
// Do actual compile // Do actual compile
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.IncludeDebugInformation = true; parameters.IncludeDebugInformation = true;
// Add all available assemblies // Add all available assemblies
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{ {
//Console.WriteLine("Adding assembly: " + asm.Location); //Console.WriteLine("Adding assembly: " + asm.Location);
//parameters.ReferencedAssemblies.Add(asm.Location); //parameters.ReferencedAssemblies.Add(asm.Location);
} }
string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
string rootPathSE = Path.GetDirectoryName(this.GetType().Assembly.Location); string rootPathSE = Path.GetDirectoryName(this.GetType().Assembly.Location);
//Console.WriteLine("Assembly location: " + rootPath); //Console.WriteLine("Assembly location: " + rootPath);
parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll")); parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll"));
parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Region.ScriptEngine.DotNetEngine.dll")); parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Region.ScriptEngine.DotNetEngine.dll"));
//parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment"); //parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment");
parameters.GenerateExecutable = false; parameters.GenerateExecutable = false;
parameters.OutputAssembly = OutFile; parameters.OutputAssembly = OutFile;
parameters.IncludeDebugInformation = false; parameters.IncludeDebugInformation = false;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Script); CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Script);
// Go through errors // Go through errors
// TODO: Return errors to user somehow // TODO: Return errors to user somehow
if (results.Errors.Count > 0) if (results.Errors.Count > 0)
{ {
string errtext = ""; string errtext = "";
foreach (CompilerError CompErr in results.Errors) foreach (CompilerError CompErr in results.Errors)
{ {
errtext += "Line number " + (CompErr.Line - 1) + errtext += "Line number " + (CompErr.Line - 1) +
", Error Number: " + CompErr.ErrorNumber + ", Error Number: " + CompErr.ErrorNumber +
", '" + CompErr.ErrorText + "'\r\n"; ", '" + CompErr.ErrorText + "'\r\n";
} }
throw new Exception(errtext); throw new Exception(errtext);
} }
return OutFile; return OutFile;
} }
} }
} }

View File

@ -1,265 +1,265 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
{ {
public class LSL2CSConverter public class LSL2CSConverter
{ {
//private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled); //private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled);
private Dictionary<string, string> dataTypes = new Dictionary<string, string>(); private Dictionary<string, string> dataTypes = new Dictionary<string, string>();
private Dictionary<string, string> quotes = new Dictionary<string, string>(); private Dictionary<string, string> quotes = new Dictionary<string, string>();
public LSL2CSConverter() public LSL2CSConverter()
{ {
// Only the types we need to convert // Only the types we need to convert
dataTypes.Add("void", "void"); dataTypes.Add("void", "void");
dataTypes.Add("integer", "int"); dataTypes.Add("integer", "int");
dataTypes.Add("float", "double"); dataTypes.Add("float", "double");
dataTypes.Add("string", "string"); dataTypes.Add("string", "string");
dataTypes.Add("key", "string"); dataTypes.Add("key", "string");
dataTypes.Add("vector", "LSL_Types.Vector3"); dataTypes.Add("vector", "LSL_Types.Vector3");
dataTypes.Add("rotation", "LSL_Types.Quaternion"); dataTypes.Add("rotation", "LSL_Types.Quaternion");
dataTypes.Add("list", "list"); dataTypes.Add("list", "list");
dataTypes.Add("null", "null"); dataTypes.Add("null", "null");
} }
public string Convert(string Script) public string Convert(string Script)
{ {
string Return = ""; string Return = "";
Script = " \r\n" + Script; Script = " \r\n" + Script;
// //
// Prepare script for processing // Prepare script for processing
// //
// Clean up linebreaks // Clean up linebreaks
Script = Regex.Replace(Script, @"\r\n", "\n"); Script = Regex.Replace(Script, @"\r\n", "\n");
Script = Regex.Replace(Script, @"\n", "\r\n"); Script = Regex.Replace(Script, @"\n", "\r\n");
// QUOTE REPLACEMENT // QUOTE REPLACEMENT
// temporarily replace quotes so we can work our magic on the script without // temporarily replace quotes so we can work our magic on the script without
// always considering if we are inside our outside ""'s // always considering if we are inside our outside ""'s
string _Script = ""; string _Script = "";
string C; string C;
bool in_quote = false; bool in_quote = false;
bool quote_replaced = false; bool quote_replaced = false;
string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_"; string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_";
string quote = ""; string quote = "";
bool last_was_escape = false; bool last_was_escape = false;
int quote_replaced_count = 0; int quote_replaced_count = 0;
for (int p = 0; p < Script.Length; p++) for (int p = 0; p < Script.Length; p++)
{ {
C = Script.Substring(p, 1); C = Script.Substring(p, 1);
while (true) while (true)
{ {
// found " and last was not \ so this is not an escaped \" // found " and last was not \ so this is not an escaped \"
if (C == "\"" && last_was_escape == false) if (C == "\"" && last_was_escape == false)
{ {
// Toggle inside/outside quote // Toggle inside/outside quote
in_quote = !in_quote; in_quote = !in_quote;
if (in_quote) if (in_quote)
{ {
quote_replaced_count++; quote_replaced_count++;
} }
else else
{ {
if (quote == "") if (quote == "")
{ {
// We didn't replace quote, probably because of empty string? // We didn't replace quote, probably because of empty string?
_Script += quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); _Script += quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]);
} }
// We just left a quote // We just left a quote
quotes.Add(quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote); quotes.Add(quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote);
quote = ""; quote = "";
} }
break; break;
} }
if (!in_quote) if (!in_quote)
{ {
// We are not inside a quote // We are not inside a quote
quote_replaced = false; quote_replaced = false;
} }
else else
{ {
// We are inside a quote // We are inside a quote
if (!quote_replaced) if (!quote_replaced)
{ {
// Replace quote // Replace quote
_Script += quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); _Script += quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]);
quote_replaced = true; quote_replaced = true;
} }
quote += C; quote += C;
break; break;
} }
_Script += C; _Script += C;
break; break;
} }
last_was_escape = false; last_was_escape = false;
if (C == @"\") if (C == @"\")
{ {
last_was_escape = true; last_was_escape = true;
} }
} }
Script = _Script; Script = _Script;
// //
// END OF QUOTE REPLACEMENT // END OF QUOTE REPLACEMENT
// //
// //
// PROCESS STATES // PROCESS STATES
// Remove state definitions and add state names to start of each event within state // Remove state definitions and add state names to start of each event within state
// //
int ilevel = 0; int ilevel = 0;
int lastlevel = 0; int lastlevel = 0;
string ret = ""; string ret = "";
string cache = ""; string cache = "";
bool in_state = false; bool in_state = false;
string current_statename = ""; string current_statename = "";
for (int p = 0; p < Script.Length; p++) for (int p = 0; p < Script.Length; p++)
{ {
C = Script.Substring(p, 1); C = Script.Substring(p, 1);
while (true) while (true)
{ {
// inc / dec level // inc / dec level
if (C == @"{") if (C == @"{")
ilevel++; ilevel++;
if (C == @"}") if (C == @"}")
ilevel--; ilevel--;
if (ilevel < 0) if (ilevel < 0)
ilevel = 0; ilevel = 0;
cache += C; cache += C;
// if level == 0, add to return // if level == 0, add to return
if (ilevel == 1 && lastlevel == 0) if (ilevel == 1 && lastlevel == 0)
{ {
// 0 => 1: Get last // 0 => 1: Get last
Match m = Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Match m = Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
in_state = false; in_state = false;
if (m.Success) if (m.Success)
{ {
// Go back to level 0, this is not a state // Go back to level 0, this is not a state
in_state = true; in_state = true;
current_statename = m.Groups[1].Captures[0].Value; current_statename = m.Groups[1].Captures[0].Value;
//Console.WriteLine("Current statename: " + current_statename); //Console.WriteLine("Current statename: " + current_statename);
cache = Regex.Replace(cache, @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", "${s1}${s2}", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); cache = Regex.Replace(cache, @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", "${s1}${s2}", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
} }
ret += cache; ret += cache;
cache = ""; cache = "";
} }
if (ilevel == 0 && lastlevel == 1) if (ilevel == 0 && lastlevel == 1)
{ {
// 1 => 0: Remove last } // 1 => 0: Remove last }
if (in_state == true) if (in_state == true)
{ {
cache = cache.Remove(cache.Length - 1, 1); cache = cache.Remove(cache.Length - 1, 1);
//cache = Regex.Replace(cache, "}$", "", RegexOptions.Multiline | RegexOptions.Singleline); //cache = Regex.Replace(cache, "}$", "", RegexOptions.Multiline | RegexOptions.Singleline);
//Replace function names //Replace function names
// void dataserver(key query_id, string data) { // void dataserver(key query_id, string data) {
//cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); //cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
//Console.WriteLine("Replacing using statename: " + current_statename); //Console.WriteLine("Replacing using statename: " + current_statename);
cache = Regex.Replace(cache, @"^(\s*)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1public " + current_statename + "_event_$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); cache = Regex.Replace(cache, @"^(\s*)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1public " + current_statename + "_event_$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
} }
ret += cache; ret += cache;
cache = ""; cache = "";
in_state = true; in_state = true;
current_statename = ""; current_statename = "";
} }
break; break;
} }
lastlevel = ilevel; lastlevel = ilevel;
} }
ret += cache; ret += cache;
cache = ""; cache = "";
Script = ret; Script = ret;
ret = ""; ret = "";
foreach (string key in dataTypes.Keys) foreach (string key in dataTypes.Keys)
{ {
string val; string val;
dataTypes.TryGetValue(key, out val); dataTypes.TryGetValue(key, out val);
// Replace CAST - (integer) with (int) // Replace CAST - (integer) with (int)
Script = Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", RegexOptions.Compiled | RegexOptions.Multiline); Script = Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", RegexOptions.Compiled | RegexOptions.Multiline);
// Replace return types and function variables - integer a() and f(integer a, integer a) // Replace return types and function variables - integer a() and f(integer a, integer a)
Script = Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)", @"$1$2" + val + "$3", RegexOptions.Compiled | RegexOptions.Multiline); Script = Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)", @"$1$2" + val + "$3", RegexOptions.Compiled | RegexOptions.Multiline);
} }
// Add "void" in front of functions that needs it // Add "void" in front of functions that needs it
Script = Regex.Replace(Script, @"^(\s*public\s+)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Script = Regex.Replace(Script, @"^(\s*public\s+)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
// Replace <x,y,z> and <x,y,z,r> // Replace <x,y,z> and <x,y,z,r>
Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Quaternion($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Quaternion($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Vector3($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Vector3($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
// Replace List []'s // Replace List []'s
Script = Regex.Replace(Script, @"\[([^\]]*)\]", @"List.Parse($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Script = Regex.Replace(Script, @"\[([^\]]*)\]", @"List.Parse($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
// Replace (string) to .ToString() // // Replace (string) to .ToString() //
Script = Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.ToString()", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Script = Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.ToString()", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
Script = Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); Script = Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
// REPLACE BACK QUOTES // REPLACE BACK QUOTES
foreach (string key in quotes.Keys) foreach (string key in quotes.Keys)
{ {
string val; string val;
quotes.TryGetValue(key, out val); quotes.TryGetValue(key, out val);
Script = Script.Replace(key, "\"" + val + "\""); Script = Script.Replace(key, "\"" + val + "\"");
} }
// Add namespace, class name and inheritance // Add namespace, class name and inheritance
Return = "";// + Return = "";// +
//"using System; " + //"using System; " +
//"using System.Collections.Generic; " + //"using System.Collections.Generic; " +
//"using System.Text; " + //"using System.Text; " +
//"using OpenSim.Region.ScriptEngine.Common; " + //"using OpenSim.Region.ScriptEngine.Common; " +
//"using integer = System.Int32; " + //"using integer = System.Int32; " +
//"using key = System.String; "; //"using key = System.String; ";
//// Make a Using out of DataTypes //// Make a Using out of DataTypes
//// Using integer = System.Int32; //// Using integer = System.Int32;
//string _val; //string _val;
//foreach (string key in DataTypes.Keys) //foreach (string key in DataTypes.Keys)
//{ //{
// DataTypes.TryGetValue(key, out _val); // DataTypes.TryGetValue(key, out _val);
// if (key != _val) // if (key != _val)
// { // {
// Return += "using " + key + " = " + _val + "; "; // Return += "using " + key + " = " + _val + "; ";
// } // }
//} //}
Return += "" + Return += "" +
"namespace SecondLife { "; "namespace SecondLife { ";
Return += "" + Return += "" +
//"[Serializable] " + //"[Serializable] " +
"public class Script : OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass { "; "public class Script : OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass { ";
Return += @"public Script() { } "; Return += @"public Script() { } ";
Return += Script; Return += Script;
Return += "} }\r\n"; Return += "} }\r\n";
return Return; return Return;
} }
} }
} }

View File

@ -1,84 +1,84 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
public static class Common public static class Common
{ {
static public bool Debug = true; static public bool Debug = true;
static public bool IL_UseTryCatch = true; static public bool IL_UseTryCatch = true;
static public bool IL_CreateConstructor = true; static public bool IL_CreateConstructor = true;
static public bool IL_CreateFunctionList = true; static public bool IL_CreateFunctionList = true;
static public bool IL_ProcessCodeChunks = true; static public bool IL_ProcessCodeChunks = true;
public delegate void SendToDebugEventDelegate(string Message); public delegate void SendToDebugEventDelegate(string Message);
public delegate void SendToLogEventDelegate(string Message); public delegate void SendToLogEventDelegate(string Message);
static public event SendToDebugEventDelegate SendToDebugEvent; static public event SendToDebugEventDelegate SendToDebugEvent;
static public event SendToLogEventDelegate SendToLogEvent; static public event SendToLogEventDelegate SendToLogEvent;
static public void SendToDebug(string Message) static public void SendToDebug(string Message)
{ {
//if (Debug == true) //if (Debug == true)
Console.WriteLine("COMPILER:Debug: " + Message); Console.WriteLine("COMPILER:Debug: " + Message);
SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
} }
static public void SendToLog(string Message) static public void SendToLog(string Message)
{ {
//if (Debug == true) //if (Debug == true)
Console.WriteLine("COMPILER:LOG: " + Message); Console.WriteLine("COMPILER:LOG: " + Message);
SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
} }
} }
// TEMPORARY TEST THINGIES // TEMPORARY TEST THINGIES
public static class IL_Helper public static class IL_Helper
{ {
public static string ReverseFormatString(string text1, string format) public static string ReverseFormatString(string text1, string format)
{ {
Common.SendToDebug("ReverseFormatString text1: " + text1); Common.SendToDebug("ReverseFormatString text1: " + text1);
Common.SendToDebug("ReverseFormatString format: " + format); Common.SendToDebug("ReverseFormatString format: " + format);
return string.Format(format, text1); return string.Format(format, text1);
} }
public static string ReverseFormatString(string text1, UInt32 text2, string format) public static string ReverseFormatString(string text1, UInt32 text2, string format)
{ {
Common.SendToDebug("ReverseFormatString text1: " + text1); Common.SendToDebug("ReverseFormatString text1: " + text1);
Common.SendToDebug("ReverseFormatString text2: " + text2.ToString()); Common.SendToDebug("ReverseFormatString text2: " + text2.ToString());
Common.SendToDebug("ReverseFormatString format: " + format); Common.SendToDebug("ReverseFormatString format: " + format);
return string.Format(format, text1, text2.ToString()); return string.Format(format, text1, text2.ToString());
} }
public static string Cast_ToString(object obj) public static string Cast_ToString(object obj)
{ {
Common.SendToDebug("OBJECT TO BE CASTED: " + obj.GetType().ToString()); Common.SendToDebug("OBJECT TO BE CASTED: " + obj.GetType().ToString());
return "ABCDEFGIHJKLMNOPQ123"; return "ABCDEFGIHJKLMNOPQ123";
} }
} }
} }

View File

@ -1,300 +1,300 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Reflection; using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
using System.Threading; using System.Threading;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
public class Engine public class Engine
{ {
//private string LSO_FileName = @"LSO\AdditionTest.lso"; //private string LSO_FileName = @"LSO\AdditionTest.lso";
private string LSO_FileName;// = @"LSO\CloseToDefault.lso"; private string LSO_FileName;// = @"LSO\CloseToDefault.lso";
AppDomain appDomain; AppDomain appDomain;
public string Compile(string LSOFileName) public string Compile(string LSOFileName)
{ {
LSO_FileName = LSOFileName; LSO_FileName = LSOFileName;
//appDomain = AppDomain.CreateDomain("AlternateAppDomain"); //appDomain = AppDomain.CreateDomain("AlternateAppDomain");
appDomain = Thread.GetDomain(); appDomain = Thread.GetDomain();
// Create Assembly Name // Create Assembly Name
AssemblyName asmName = new AssemblyName(); AssemblyName asmName = new AssemblyName();
asmName.Name = System.IO.Path.GetFileNameWithoutExtension(LSO_FileName); asmName.Name = System.IO.Path.GetFileNameWithoutExtension(LSO_FileName);
//asmName.Name = "TestAssembly"; //asmName.Name = "TestAssembly";
string DLL_FileName = asmName.Name + ".dll"; string DLL_FileName = asmName.Name + ".dll";
string DLL_FileName_WithPath = System.IO.Path.GetDirectoryName(LSO_FileName) + @"\" + DLL_FileName; string DLL_FileName_WithPath = System.IO.Path.GetDirectoryName(LSO_FileName) + @"\" + DLL_FileName;
Common.SendToLog("LSO File Name: " + System.IO.Path.GetFileName(LSO_FileName)); Common.SendToLog("LSO File Name: " + System.IO.Path.GetFileName(LSO_FileName));
Common.SendToLog("Assembly name: " + asmName.Name); Common.SendToLog("Assembly name: " + asmName.Name);
Common.SendToLog("Assembly File Name: " + asmName.Name + ".dll"); Common.SendToLog("Assembly File Name: " + asmName.Name + ".dll");
Common.SendToLog("Starting processing of LSL ByteCode..."); Common.SendToLog("Starting processing of LSL ByteCode...");
Common.SendToLog(""); Common.SendToLog("");
// Create Assembly // Create Assembly
AssemblyBuilder asmBuilder = appDomain.DefineDynamicAssembly( AssemblyBuilder asmBuilder = appDomain.DefineDynamicAssembly(
asmName, asmName,
AssemblyBuilderAccess.RunAndSave AssemblyBuilderAccess.RunAndSave
); );
//// Create Assembly //// Create Assembly
//AssemblyBuilder asmBuilder = //AssemblyBuilder asmBuilder =
// Thread.GetDomain().DefineDynamicAssembly // Thread.GetDomain().DefineDynamicAssembly
//(asmName, AssemblyBuilderAccess.RunAndSave); //(asmName, AssemblyBuilderAccess.RunAndSave);
// Create a module (and save to disk) // Create a module (and save to disk)
ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule
(asmName.Name, (asmName.Name,
DLL_FileName); DLL_FileName);
//Common.SendToDebug("asmName.Name is still \"" + asmName.Name + "\""); //Common.SendToDebug("asmName.Name is still \"" + asmName.Name + "\"");
// Create a Class (/Type) // Create a Class (/Type)
TypeBuilder typeBuilder = modBuilder.DefineType( TypeBuilder typeBuilder = modBuilder.DefineType(
"LSL_ScriptObject", "LSL_ScriptObject",
TypeAttributes.Public | TypeAttributes.BeforeFieldInit, TypeAttributes.Public | TypeAttributes.BeforeFieldInit,
typeof(OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass)); typeof(OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass));
//, //,
// typeof()); // typeof());
//, typeof(LSL_BuiltIn_Commands_Interface)); //, typeof(LSL_BuiltIn_Commands_Interface));
//, //,
// typeof(object), // typeof(object),
// new Type[] { typeof(LSL_CLRInterface.LSLScript) }); // new Type[] { typeof(LSL_CLRInterface.LSLScript) });
/* /*
* Generate the IL itself * Generate the IL itself
*/ */
LSO_Parser LSOP = new LSO_Parser(LSO_FileName, typeBuilder); LSO_Parser LSOP = new LSO_Parser(LSO_FileName, typeBuilder);
LSOP.OpenFile(); LSOP.OpenFile();
LSOP.Parse(); LSOP.Parse();
// Constructor has to be created AFTER LSO_Parser because of accumulated variables // Constructor has to be created AFTER LSO_Parser because of accumulated variables
if (Common.IL_CreateConstructor) if (Common.IL_CreateConstructor)
IL_CREATE_CONSTRUCTOR(typeBuilder, LSOP); IL_CREATE_CONSTRUCTOR(typeBuilder, LSOP);
LSOP.CloseFile(); LSOP.CloseFile();
/* /*
* Done generating. Create a type and run it. * Done generating. Create a type and run it.
*/ */
Common.SendToLog("Attempting to compile assembly..."); Common.SendToLog("Attempting to compile assembly...");
// Compile it // Compile it
Type type = typeBuilder.CreateType(); Type type = typeBuilder.CreateType();
Common.SendToLog("Compilation successful!"); Common.SendToLog("Compilation successful!");
Common.SendToLog("Saving assembly: " + DLL_FileName); Common.SendToLog("Saving assembly: " + DLL_FileName);
asmBuilder.Save(DLL_FileName); asmBuilder.Save(DLL_FileName);
Common.SendToLog("Returning assembly filename: " + DLL_FileName); Common.SendToLog("Returning assembly filename: " + DLL_FileName);
return DLL_FileName; return DLL_FileName;
//Common.SendToLog("Creating an instance of new assembly..."); //Common.SendToLog("Creating an instance of new assembly...");
//// Create an instance we can play with //// Create an instance we can play with
////LSLScript hello = (LSLScript)Activator.CreateInstance(type); ////LSLScript hello = (LSLScript)Activator.CreateInstance(type);
////LSL_CLRInterface.LSLScript MyScript = (LSL_CLRInterface.LSLScript)Activator.CreateInstance(type); ////LSL_CLRInterface.LSLScript MyScript = (LSL_CLRInterface.LSLScript)Activator.CreateInstance(type);
//object MyScript = (object)Activator.CreateInstance(type); //object MyScript = (object)Activator.CreateInstance(type);
//System.Reflection.MemberInfo[] Members = type.GetMembers(); //System.Reflection.MemberInfo[] Members = type.GetMembers();
//Common.SendToLog("Members of assembly " + type.ToString() + ":"); //Common.SendToLog("Members of assembly " + type.ToString() + ":");
//foreach (MemberInfo member in Members) //foreach (MemberInfo member in Members)
// Common.SendToLog(member.ToString()); // Common.SendToLog(member.ToString());
//// Play with it //// Play with it
////MyScript.event_state_entry("Test"); ////MyScript.event_state_entry("Test");
//object[] args = { null }; //object[] args = { null };
////System.Collections.Generic.List<string> Functions = (System.Collections.Generic.List<string>)type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null); ////System.Collections.Generic.List<string> Functions = (System.Collections.Generic.List<string>)type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null);
//string[] ret = { }; //string[] ret = { };
//if (Common.IL_CreateFunctionList) //if (Common.IL_CreateFunctionList)
// ret = (string[])type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null); // ret = (string[])type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null);
//foreach (string s in ret) //foreach (string s in ret)
//{ //{
// Common.SendToLog(""); // Common.SendToLog("");
// Common.SendToLog("*** Executing LSL Server Event: " + s); // Common.SendToLog("*** Executing LSL Server Event: " + s);
// //object test = type.GetMember(s); // //object test = type.GetMember(s);
// //object runner = type.InvokeMember(s, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, MyScript, args); // //object runner = type.InvokeMember(s, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, MyScript, args);
// //runner(); // //runner();
// //objBooks_Late = type.InvokeMember(s, BindingFlags.CreateInstance, null, objApp_Late, null); // //objBooks_Late = type.InvokeMember(s, BindingFlags.CreateInstance, null, objApp_Late, null);
// type.InvokeMember(s, BindingFlags.InvokeMethod, null, MyScript, new object[] { "Test" }); // type.InvokeMember(s, BindingFlags.InvokeMethod, null, MyScript, new object[] { "Test" });
//} //}
} }
private static void IL_CREATE_CONSTRUCTOR(TypeBuilder typeBuilder, LSO_Parser LSOP) private static void IL_CREATE_CONSTRUCTOR(TypeBuilder typeBuilder, LSO_Parser LSOP)
{ {
Common.SendToDebug("IL_CREATE_CONSTRUCTOR()"); Common.SendToDebug("IL_CREATE_CONSTRUCTOR()");
//ConstructorBuilder constructor = typeBuilder.DefineConstructor( //ConstructorBuilder constructor = typeBuilder.DefineConstructor(
// MethodAttributes.Public, // MethodAttributes.Public,
// CallingConventions.Standard, // CallingConventions.Standard,
// new Type[0]); // new Type[0]);
ConstructorBuilder constructor = typeBuilder.DefineConstructor( ConstructorBuilder constructor = typeBuilder.DefineConstructor(
MethodAttributes.Public | MethodAttributes.Public |
MethodAttributes.SpecialName | MethodAttributes.SpecialName |
MethodAttributes.RTSpecialName, MethodAttributes.RTSpecialName,
CallingConventions.Standard, CallingConventions.Standard,
new Type[0]); new Type[0]);
//Define the reflection ConstructorInfor for System.Object //Define the reflection ConstructorInfor for System.Object
ConstructorInfo conObj = typeof(LSL_BaseClass).GetConstructor(new Type[0]); ConstructorInfo conObj = typeof(LSL_BaseClass).GetConstructor(new Type[0]);
//call constructor of base object //call constructor of base object
ILGenerator il = constructor.GetILGenerator(); ILGenerator il = constructor.GetILGenerator();
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, conObj); il.Emit(OpCodes.Call, conObj);
//Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: UInt32 State = 0;"); //Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: UInt32 State = 0;");
//string FieldName; //string FieldName;
//// Create state object //// Create state object
//FieldName = "State"; //FieldName = "State";
//FieldBuilder State_fb = typeBuilder.DefineField( //FieldBuilder State_fb = typeBuilder.DefineField(
// FieldName, // FieldName,
// typeof(UInt32), // typeof(UInt32),
// FieldAttributes.Public); // FieldAttributes.Public);
//il.Emit(OpCodes.Ldarg_0); //il.Emit(OpCodes.Ldarg_0);
//il.Emit(OpCodes.Ldc_I4, 0); //il.Emit(OpCodes.Ldc_I4, 0);
//il.Emit(OpCodes.Stfld, State_fb); //il.Emit(OpCodes.Stfld, State_fb);
//Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: LSL_BuiltIn_Commands_TestImplementation LSL_BuiltIns = New LSL_BuiltIn_Commands_TestImplementation();"); //Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: LSL_BuiltIn_Commands_TestImplementation LSL_BuiltIns = New LSL_BuiltIn_Commands_TestImplementation();");
////Type objType1 = typeof(object); ////Type objType1 = typeof(object);
//Type objType1 = typeof(LSL_BuiltIn_Commands_TestImplementation); //Type objType1 = typeof(LSL_BuiltIn_Commands_TestImplementation);
//FieldName = "LSL_BuiltIns"; //FieldName = "LSL_BuiltIns";
//FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField( //FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField(
// FieldName, // FieldName,
// objType1, // objType1,
// FieldAttributes.Public); // FieldAttributes.Public);
////LSL_BuiltIn_Commands_TestImplementation _ti = new LSL_BuiltIn_Commands_TestImplementation(); ////LSL_BuiltIn_Commands_TestImplementation _ti = new LSL_BuiltIn_Commands_TestImplementation();
//il.Emit(OpCodes.Ldarg_0); //il.Emit(OpCodes.Ldarg_0);
////il.Emit(OpCodes.Ldstr, "Test 123"); ////il.Emit(OpCodes.Ldstr, "Test 123");
//il.Emit(OpCodes.Newobj, objType1.GetConstructor(new Type[] { })); //il.Emit(OpCodes.Newobj, objType1.GetConstructor(new Type[] { }));
//il.Emit(OpCodes.Stfld, LSL_BuiltIns_fb); //il.Emit(OpCodes.Stfld, LSL_BuiltIns_fb);
foreach (UInt32 pos in LSOP.StaticBlocks.Keys) foreach (UInt32 pos in LSOP.StaticBlocks.Keys)
{ {
LSO_Struct.StaticBlock sb; LSO_Struct.StaticBlock sb;
LSOP.StaticBlocks.TryGetValue(pos, out sb); LSOP.StaticBlocks.TryGetValue(pos, out sb);
if (sb.ObjectType > 0 && sb.ObjectType < 8) { // We don't want void or null's if (sb.ObjectType > 0 && sb.ObjectType < 8) { // We don't want void or null's
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
// Push position to stack // Push position to stack
il.Emit(OpCodes.Ldc_I4, pos); il.Emit(OpCodes.Ldc_I4, pos);
//il.Emit(OpCodes.Box, typeof(UInt32)); //il.Emit(OpCodes.Box, typeof(UInt32));
Type datatype = null; Type datatype = null;
// Push data to stack // Push data to stack
Common.SendToDebug("Adding to static (" + pos + ") type: " + ((LSO_Enums.Variable_Type_Codes)sb.ObjectType).ToString() + " (" + sb.ObjectType + ")"); Common.SendToDebug("Adding to static (" + pos + ") type: " + ((LSO_Enums.Variable_Type_Codes)sb.ObjectType).ToString() + " (" + sb.ObjectType + ")");
switch ((LSO_Enums.Variable_Type_Codes)sb.ObjectType) switch ((LSO_Enums.Variable_Type_Codes)sb.ObjectType)
{ {
case LSO_Enums.Variable_Type_Codes.Float: case LSO_Enums.Variable_Type_Codes.Float:
case LSO_Enums.Variable_Type_Codes.Integer: case LSO_Enums.Variable_Type_Codes.Integer:
//UInt32 //UInt32
il.Emit(OpCodes.Ldc_I4, BitConverter.ToUInt32(sb.BlockVariable, 0)); il.Emit(OpCodes.Ldc_I4, BitConverter.ToUInt32(sb.BlockVariable, 0));
datatype = typeof(UInt32); datatype = typeof(UInt32);
il.Emit(OpCodes.Box, datatype); il.Emit(OpCodes.Box, datatype);
break; break;
case LSO_Enums.Variable_Type_Codes.String: case LSO_Enums.Variable_Type_Codes.String:
case LSO_Enums.Variable_Type_Codes.Key: case LSO_Enums.Variable_Type_Codes.Key:
//String //String
LSO_Struct.HeapBlock hb = LSOP.GetHeap(LSOP.myHeader.HR + BitConverter.ToUInt32(sb.BlockVariable, 0) - 1); LSO_Struct.HeapBlock hb = LSOP.GetHeap(LSOP.myHeader.HR + BitConverter.ToUInt32(sb.BlockVariable, 0) - 1);
il.Emit(OpCodes.Ldstr, System.Text.Encoding.UTF8.GetString(hb.Data)); il.Emit(OpCodes.Ldstr, System.Text.Encoding.UTF8.GetString(hb.Data));
datatype = typeof(string); datatype = typeof(string);
break; break;
case LSO_Enums.Variable_Type_Codes.Vector: case LSO_Enums.Variable_Type_Codes.Vector:
datatype = typeof(LSO_Enums.Vector); datatype = typeof(LSO_Enums.Vector);
//TODO: Not implemented //TODO: Not implemented
break; break;
case LSO_Enums.Variable_Type_Codes.Rotation: case LSO_Enums.Variable_Type_Codes.Rotation:
//Object //Object
//TODO: Not implemented //TODO: Not implemented
datatype = typeof(LSO_Enums.Rotation); datatype = typeof(LSO_Enums.Rotation);
break; break;
default: default:
datatype = typeof(object); datatype = typeof(object);
break; break;
} }
// Make call // Make call
il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("AddToStatic", new Type[] { typeof(UInt32), datatype })); il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("AddToStatic", new Type[] { typeof(UInt32), datatype }));
} }
} }
////il.Emit(OpCodes.Newobj, typeof(UInt32)); ////il.Emit(OpCodes.Newobj, typeof(UInt32));
//il.Emit(OpCodes.Starg_0); //il.Emit(OpCodes.Starg_0);
//// Create LSL function library //// Create LSL function library
//FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField("LSL_BuiltIns", typeof(LSL_BuiltIn_Commands_Interface), FieldAttributes.Public); //FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField("LSL_BuiltIns", typeof(LSL_BuiltIn_Commands_Interface), FieldAttributes.Public);
//il.Emit(OpCodes.Newobj, typeof(LSL_BuiltIn_Commands_Interface)); //il.Emit(OpCodes.Newobj, typeof(LSL_BuiltIn_Commands_Interface));
//il.Emit(OpCodes.Stloc_1); //il.Emit(OpCodes.Stloc_1);
il.Emit(OpCodes.Ret); il.Emit(OpCodes.Ret);
} }
// End of class // End of class
} }
} }

View File

@ -1,56 +1,56 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
partial class LSO_Parser partial class LSO_Parser
{ {
private static TypeBuilder CreateType(ModuleBuilder modBuilder, string typeName) private static TypeBuilder CreateType(ModuleBuilder modBuilder, string typeName)
{ {
TypeBuilder typeBuilder = modBuilder.DefineType(typeName, TypeBuilder typeBuilder = modBuilder.DefineType(typeName,
TypeAttributes.Public | TypeAttributes.Public |
TypeAttributes.Class | TypeAttributes.Class |
TypeAttributes.AutoClass | TypeAttributes.AutoClass |
TypeAttributes.AnsiClass | TypeAttributes.AnsiClass |
TypeAttributes.BeforeFieldInit | TypeAttributes.BeforeFieldInit |
TypeAttributes.AutoLayout, TypeAttributes.AutoLayout,
typeof(object), typeof(object),
new Type[] { typeof(object) }); new Type[] { typeof(object) });
return typeBuilder; return typeBuilder;
} }
} }
} }

View File

@ -1,60 +1,60 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.IO; using System.IO;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler; using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler;
using OpenSim.Region.ScriptEngine.Common; using OpenSim.Region.ScriptEngine.Common;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
public partial class LSL_BaseClass public partial class LSL_BaseClass
{ {
//public MemoryStream LSLStack = new MemoryStream(); //public MemoryStream LSLStack = new MemoryStream();
public Stack<object> LSLStack = new Stack<object>(); public Stack<object> LSLStack = new Stack<object>();
public Dictionary<UInt32, object> StaticVariables = new Dictionary<UInt32, object>(); public Dictionary<UInt32, object> StaticVariables = new Dictionary<UInt32, object>();
public Dictionary<UInt32, object> GlobalVariables = new Dictionary<UInt32, object>(); public Dictionary<UInt32, object> GlobalVariables = new Dictionary<UInt32, object>();
public Dictionary<UInt32, object> LocalVariables = new Dictionary<UInt32, object>(); public Dictionary<UInt32, object> LocalVariables = new Dictionary<UInt32, object>();
//public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>(); //public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>();
//public void AddFunction(String x) { //public void AddFunction(String x) {
// FunctionList.Add(x); // FunctionList.Add(x);
//} //}
//public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>; //public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>;
//public struct StackItemStruct //public struct StackItemStruct
//{ //{
// public LSO_Enums.Variable_Type_Codes ItemType; // public LSO_Enums.Variable_Type_Codes ItemType;
// public object Data; // public object Data;
//} //}
public UInt32 State = 0; public UInt32 State = 0;
public LSL_BuiltIn_Commands_Interface LSL_Builtins; public LSL_BuiltIn_Commands_Interface LSL_Builtins;
public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn() public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn()
{ {
return LSL_Builtins; return LSL_Builtins;
} }
public LSL_BaseClass() { } public LSL_BaseClass() { }
public virtual int OverrideMe() public virtual int OverrideMe()
{ {
return 0; return 0;
} }
public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins) public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins)
{ {
LSL_Builtins = LSLBuiltins; LSL_Builtins = LSLBuiltins;
Common.SendToLog("OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass.Start() called"); Common.SendToLog("OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass.Start() called");
//LSL_Builtins.llSay(0, "Test"); //LSL_Builtins.llSay(0, "Test");
return; return;
} }
public void AddToStatic(UInt32 index, object obj) public void AddToStatic(UInt32 index, object obj)
{ {
Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType()); Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType());
StaticVariables.Add(index, obj); StaticVariables.Add(index, obj);
} }
} }
} }

View File

@ -1,373 +1,373 @@
//using System; //using System;
//using System.Collections.Generic; //using System.Collections.Generic;
//using System.Text; //using System.Text;
//namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO //namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
//{ //{
// public partial class LSL_BaseClass // public partial class LSL_BaseClass
// { // {
// public float llSin() { // public float llSin() {
// float f = (float)LSLStack.Pop(); // float f = (float)LSLStack.Pop();
// return LSL_Builtins.llSin(f); // return LSL_Builtins.llSin(f);
// } // }
// public float llCos() { // public float llCos() {
// float f = (float)LSLStack.Pop(); // float f = (float)LSLStack.Pop();
// return LSL_Builtins.llCos(f); // return LSL_Builtins.llCos(f);
// } // }
// public float llTan() { // public float llTan() {
// float f = (float)LSLStack.Pop(); // float f = (float)LSLStack.Pop();
// return LSL_Builtins.llTan(f); // return LSL_Builtins.llTan(f);
// } // }
// public float llAtan2() { // public float llAtan2() {
// float x = (float)LSLStack.Pop(); // float x = (float)LSLStack.Pop();
// float y = (float)LSLStack.Pop(); // float y = (float)LSLStack.Pop();
// return LSL_Builtins.llAtan2(x, y); // return LSL_Builtins.llAtan2(x, y);
// } // }
// public float llSqrt() { // public float llSqrt() {
// float f = (float)LSLStack.Pop(); // float f = (float)LSLStack.Pop();
// return LSL_Builtins.llSqrt(f); // return LSL_Builtins.llSqrt(f);
// } // }
// float llPow() // float llPow()
// { // {
// float fexponent = (float)LSLStack.Pop(); // float fexponent = (float)LSLStack.Pop();
// float fbase = (float)LSLStack.Pop(); // float fbase = (float)LSLStack.Pop();
// return LSL_Builtins.llPow(fbase, fexponent); // return LSL_Builtins.llPow(fbase, fexponent);
// } // }
// //UInt32 llAbs(UInt32 i){ return; } // //UInt32 llAbs(UInt32 i){ return; }
// //float llFabs(float f){ return; } // //float llFabs(float f){ return; }
// //float llFrand(float mag){ return; } // //float llFrand(float mag){ return; }
// //UInt32 llFloor(float f){ return; } // //UInt32 llFloor(float f){ return; }
// //UInt32 llCeil(float f){ return; } // //UInt32 llCeil(float f){ return; }
// //UInt32 llRound(float f){ return; } // //UInt32 llRound(float f){ return; }
// //float llVecMag(LSO_Enums.Vector v){ return; } // //float llVecMag(LSO_Enums.Vector v){ return; }
// //LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v){ return; } // //LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v){ return; }
// //float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b){ return; } // //float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b){ return; }
// //LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r){ return; } // //LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r){ return; }
// //LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v){ return; } // //LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v){ return; }
// //LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up){ return; } // //LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up){ return; }
// //LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r){ return; } // //LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r){ return; }
// //LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r){ return; } // //LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r){ return; }
// //LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r){ return; } // //LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r){ return; }
// //LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end){ return; } // //LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end){ return; }
// public void llWhisper() // public void llWhisper()
// { // {
// UInt16 i = (UInt16)LSLStack.Pop(); // UInt16 i = (UInt16)LSLStack.Pop();
// string s = (string)LSLStack.Pop(); // string s = (string)LSLStack.Pop();
// LSL_Builtins.llWhisper(i, s); // LSL_Builtins.llWhisper(i, s);
// } // }
// public void llSay() // public void llSay()
// { // {
// UInt16 i = (UInt16)LSLStack.Pop(); // UInt16 i = (UInt16)LSLStack.Pop();
// string s = (string)LSLStack.Pop(); // string s = (string)LSLStack.Pop();
// LSL_Builtins.llSay(i, s); // LSL_Builtins.llSay(i, s);
// } // }
// //void llShout(UInt16 channelID, string text); // //void llShout(UInt16 channelID, string text);
// //UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg); // //UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg);
// //void llListenControl(UInt32 number, UInt32 active); // //void llListenControl(UInt32 number, UInt32 active);
// //void llListenRemove(UInt32 number); // //void llListenRemove(UInt32 number);
// //void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc); // //void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc);
// //void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate); // //void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate);
// //void llSensorRemove(); // //void llSensorRemove();
// //string llDetectedName(UInt32 number); // //string llDetectedName(UInt32 number);
// //LSO_Enums.Key llDetectedKey(UInt32 number); // //LSO_Enums.Key llDetectedKey(UInt32 number);
// //LSO_Enums.Key llDetectedOwner(UInt32 number); // //LSO_Enums.Key llDetectedOwner(UInt32 number);
// //UInt32 llDetectedType(UInt32 number); // //UInt32 llDetectedType(UInt32 number);
// //LSO_Enums.Vector llDetectedPos(UInt32 number); // //LSO_Enums.Vector llDetectedPos(UInt32 number);
// //LSO_Enums.Vector llDetectedVel(UInt32 number); // //LSO_Enums.Vector llDetectedVel(UInt32 number);
// //LSO_Enums.Vector llDetectedGrab(UInt32 number); // //LSO_Enums.Vector llDetectedGrab(UInt32 number);
// //LSO_Enums.Rotation llDetectedRot(UInt32 number); // //LSO_Enums.Rotation llDetectedRot(UInt32 number);
// //UInt32 llDetectedGroup(UInt32 number); // //UInt32 llDetectedGroup(UInt32 number);
// //UInt32 llDetectedLinkNumber(UInt32 number); // //UInt32 llDetectedLinkNumber(UInt32 number);
// //void llDie(); // //void llDie();
// //float llGround(LSO_Enums.Vector offset); // //float llGround(LSO_Enums.Vector offset);
// //float llCloud(LSO_Enums.Vector offset); // //float llCloud(LSO_Enums.Vector offset);
// //LSO_Enums.Vector llWind(LSO_Enums.Vector offset); // //LSO_Enums.Vector llWind(LSO_Enums.Vector offset);
// //void llSetStatus(UInt32 status, UInt32 value); // //void llSetStatus(UInt32 status, UInt32 value);
// //UInt32 llGetStatus(UInt32 status); // //UInt32 llGetStatus(UInt32 status);
// //void llSetScale(LSO_Enums.Vector scale); // //void llSetScale(LSO_Enums.Vector scale);
// //LSO_Enums.Vector llGetScale(); // //LSO_Enums.Vector llGetScale();
// //void llSetColor(); // //void llSetColor();
// //float llGetAlpha(); // //float llGetAlpha();
// //void llSetAlpha(); // //void llSetAlpha();
// //LSO_Enums.Vector llGetColor(); // //LSO_Enums.Vector llGetColor();
// //void llSetTexture(); // //void llSetTexture();
// //void llScaleTexture(); // //void llScaleTexture();
// //void llOffsetTexture(); // //void llOffsetTexture();
// //void llRotateTexture(); // //void llRotateTexture();
// //string llGetTexture(); // //string llGetTexture();
// //void llSetPos(); // //void llSetPos();
// public void llGetPos() { } // public void llGetPos() { }
// public void llGetLocalPos() { } // public void llGetLocalPos() { }
// public void llSetRot() { } // public void llSetRot() { }
// public void llGetRot() { } // public void llGetRot() { }
// public void llGetLocalRot() { } // public void llGetLocalRot() { }
// public void llSetForce() { } // public void llSetForce() { }
// public void llGetForce() { } // public void llGetForce() { }
// public void llTarget() { } // public void llTarget() { }
// public void llTargetRemove() { } // public void llTargetRemove() { }
// public void llRotTarget() { } // public void llRotTarget() { }
// public void llRotTargetRemove() { } // public void llRotTargetRemove() { }
// public void llMoveToTarget() { } // public void llMoveToTarget() { }
// public void llStopMoveToTarget() { } // public void llStopMoveToTarget() { }
// public void llApplyImpulse() { } // public void llApplyImpulse() { }
// public void llApplyRotationalImpulse() { } // public void llApplyRotationalImpulse() { }
// public void llSetTorque() { } // public void llSetTorque() { }
// public void llGetTorque() { } // public void llGetTorque() { }
// public void llSetForceAndTorque() { } // public void llSetForceAndTorque() { }
// public void llGetVel() { } // public void llGetVel() { }
// public void llGetAccel() { } // public void llGetAccel() { }
// public void llGetOmega() { } // public void llGetOmega() { }
// public void llGetTimeOfDay() { } // public void llGetTimeOfDay() { }
// public void llGetWallclock() { } // public void llGetWallclock() { }
// public void llGetTime() { } // public void llGetTime() { }
// public void llResetTime() { } // public void llResetTime() { }
// public void llGetAndResetTime() { } // public void llGetAndResetTime() { }
// public void llSound() { } // public void llSound() { }
// public void llPlaySound() { } // public void llPlaySound() { }
// public void llLoopSound() { } // public void llLoopSound() { }
// public void llLoopSoundMaster() { } // public void llLoopSoundMaster() { }
// public void llLoopSoundSlave() { } // public void llLoopSoundSlave() { }
// public void llPlaySoundSlave() { } // public void llPlaySoundSlave() { }
// public void llTriggerSound() { } // public void llTriggerSound() { }
// public void llStopSound() { } // public void llStopSound() { }
// public void llPreloadSound() { } // public void llPreloadSound() { }
// public void llGetSubString() { } // public void llGetSubString() { }
// public void llDeleteSubString() { } // public void llDeleteSubString() { }
// public void llInsertString() { } // public void llInsertString() { }
// public void llToUpper() { } // public void llToUpper() { }
// public void llToLower() { } // public void llToLower() { }
// public void llGiveMoney() { } // public void llGiveMoney() { }
// public void llMakeExplosion() { } // public void llMakeExplosion() { }
// public void llMakeFountain() { } // public void llMakeFountain() { }
// public void llMakeSmoke() { } // public void llMakeSmoke() { }
// public void llMakeFire() { } // public void llMakeFire() { }
// public void llRezObject() { } // public void llRezObject() { }
// public void llLookAt() { } // public void llLookAt() { }
// public void llStopLookAt() { } // public void llStopLookAt() { }
// public void llSetTimerEvent() { } // public void llSetTimerEvent() { }
// public void llSleep() { } // public void llSleep() { }
// public void llGetMass() { } // public void llGetMass() { }
// public void llCollisionFilter() { } // public void llCollisionFilter() { }
// public void llTakeControls() { } // public void llTakeControls() { }
// public void llReleaseControls() { } // public void llReleaseControls() { }
// public void llAttachToAvatar() { } // public void llAttachToAvatar() { }
// public void llDetachFromAvatar() { } // public void llDetachFromAvatar() { }
// public void llTakeCamera() { } // public void llTakeCamera() { }
// public void llReleaseCamera() { } // public void llReleaseCamera() { }
// public void llGetOwner() { } // public void llGetOwner() { }
// public void llInstantMessage() { } // public void llInstantMessage() { }
// public void llEmail() { } // public void llEmail() { }
// public void llGetNextEmail() { } // public void llGetNextEmail() { }
// public void llGetKey() { } // public void llGetKey() { }
// public void llSetBuoyancy() { } // public void llSetBuoyancy() { }
// public void llSetHoverHeight() { } // public void llSetHoverHeight() { }
// public void llStopHover() { } // public void llStopHover() { }
// public void llMinEventDelay() { } // public void llMinEventDelay() { }
// public void llSoundPreload() { } // public void llSoundPreload() { }
// public void llRotLookAt() { } // public void llRotLookAt() { }
// public void llStringLength() { } // public void llStringLength() { }
// public void llStartAnimation() { } // public void llStartAnimation() { }
// public void llStopAnimation() { } // public void llStopAnimation() { }
// public void llPointAt() { } // public void llPointAt() { }
// public void llStopPointAt() { } // public void llStopPointAt() { }
// public void llTargetOmega() { } // public void llTargetOmega() { }
// public void llGetStartParameter() { } // public void llGetStartParameter() { }
// public void llGodLikeRezObject() { } // public void llGodLikeRezObject() { }
// public void llRequestPermissions() { } // public void llRequestPermissions() { }
// public void llGetPermissionsKey() { } // public void llGetPermissionsKey() { }
// public void llGetPermissions() { } // public void llGetPermissions() { }
// public void llGetLinkNumber() { } // public void llGetLinkNumber() { }
// public void llSetLinkColor() { } // public void llSetLinkColor() { }
// public void llCreateLink() { } // public void llCreateLink() { }
// public void llBreakLink() { } // public void llBreakLink() { }
// public void llBreakAllLinks() { } // public void llBreakAllLinks() { }
// public void llGetLinkKey() { } // public void llGetLinkKey() { }
// public void llGetLinkName() { } // public void llGetLinkName() { }
// public void llGetInventoryNumber() { } // public void llGetInventoryNumber() { }
// public void llGetInventoryName() { } // public void llGetInventoryName() { }
// public void llSetScriptState() { } // public void llSetScriptState() { }
// public void llGetEnergy() { } // public void llGetEnergy() { }
// public void llGiveInventory() { } // public void llGiveInventory() { }
// public void llRemoveInventory() { } // public void llRemoveInventory() { }
// public void llSetText() { } // public void llSetText() { }
// public void llWater() { } // public void llWater() { }
// public void llPassTouches() { } // public void llPassTouches() { }
// public void llRequestAgentData() { } // public void llRequestAgentData() { }
// public void llRequestInventoryData() { } // public void llRequestInventoryData() { }
// public void llSetDamage() { } // public void llSetDamage() { }
// public void llTeleportAgentHome() { } // public void llTeleportAgentHome() { }
// public void llModifyLand() { } // public void llModifyLand() { }
// public void llCollisionSound() { } // public void llCollisionSound() { }
// public void llCollisionSprite() { } // public void llCollisionSprite() { }
// public void llGetAnimation() { } // public void llGetAnimation() { }
// public void llResetScript() { } // public void llResetScript() { }
// public void llMessageLinked() { } // public void llMessageLinked() { }
// public void llPushObject() { } // public void llPushObject() { }
// public void llPassCollisions() { } // public void llPassCollisions() { }
// public void llGetScriptName() { } // public void llGetScriptName() { }
// public void llGetNumberOfSides() { } // public void llGetNumberOfSides() { }
// public void llAxisAngle2Rot() { } // public void llAxisAngle2Rot() { }
// public void llRot2Axis() { } // public void llRot2Axis() { }
// public void llRot2Angle() { } // public void llRot2Angle() { }
// public void llAcos() { } // public void llAcos() { }
// public void llAsin() { } // public void llAsin() { }
// public void llAngleBetween() { } // public void llAngleBetween() { }
// public void llGetInventoryKey() { } // public void llGetInventoryKey() { }
// public void llAllowInventoryDrop() { } // public void llAllowInventoryDrop() { }
// public void llGetSunDirection() { } // public void llGetSunDirection() { }
// public void llGetTextureOffset() { } // public void llGetTextureOffset() { }
// public void llGetTextureScale() { } // public void llGetTextureScale() { }
// public void llGetTextureRot() { } // public void llGetTextureRot() { }
// public void llSubStringIndex() { } // public void llSubStringIndex() { }
// public void llGetOwnerKey() { } // public void llGetOwnerKey() { }
// public void llGetCenterOfMass() { } // public void llGetCenterOfMass() { }
// public void llListSort() { } // public void llListSort() { }
// public void llGetListLength() { } // public void llGetListLength() { }
// public void llList2Integer() { } // public void llList2Integer() { }
// public void llList2Float() { } // public void llList2Float() { }
// public void llList2String() { } // public void llList2String() { }
// public void llList2Key() { } // public void llList2Key() { }
// public void llList2Vector() { } // public void llList2Vector() { }
// public void llList2Rot() { } // public void llList2Rot() { }
// public void llList2List() { } // public void llList2List() { }
// public void llDeleteSubList() { } // public void llDeleteSubList() { }
// public void llGetListEntryType() { } // public void llGetListEntryType() { }
// public void llList2CSV() { } // public void llList2CSV() { }
// public void llCSV2List() { } // public void llCSV2List() { }
// public void llListRandomize() { } // public void llListRandomize() { }
// public void llList2ListStrided() { } // public void llList2ListStrided() { }
// public void llGetRegionCorner() { } // public void llGetRegionCorner() { }
// public void llListInsertList() { } // public void llListInsertList() { }
// public void llListFindList() { } // public void llListFindList() { }
// public void llGetObjectName() { } // public void llGetObjectName() { }
// public void llSetObjectName() { } // public void llSetObjectName() { }
// public void llGetDate() { } // public void llGetDate() { }
// public void llEdgeOfWorld() { } // public void llEdgeOfWorld() { }
// public void llGetAgentInfo() { } // public void llGetAgentInfo() { }
// public void llAdjustSoundVolume() { } // public void llAdjustSoundVolume() { }
// public void llSetSoundQueueing() { } // public void llSetSoundQueueing() { }
// public void llSetSoundRadius() { } // public void llSetSoundRadius() { }
// public void llKey2Name() { } // public void llKey2Name() { }
// public void llSetTextureAnim() { } // public void llSetTextureAnim() { }
// public void llTriggerSoundLimited() { } // public void llTriggerSoundLimited() { }
// public void llEjectFromLand() { } // public void llEjectFromLand() { }
// public void llParseString2List() { } // public void llParseString2List() { }
// public void llOverMyLand() { } // public void llOverMyLand() { }
// public void llGetLandOwnerAt() { } // public void llGetLandOwnerAt() { }
// public void llGetNotecardLine() { } // public void llGetNotecardLine() { }
// public void llGetAgentSize() { } // public void llGetAgentSize() { }
// public void llSameGroup() { } // public void llSameGroup() { }
// public void llUnSit() { } // public void llUnSit() { }
// public void llGroundSlope() { } // public void llGroundSlope() { }
// public void llGroundNormal() { } // public void llGroundNormal() { }
// public void llGroundContour() { } // public void llGroundContour() { }
// public void llGetAttached() { } // public void llGetAttached() { }
// public void llGetFreeMemory() { } // public void llGetFreeMemory() { }
// public void llGetRegionName() { } // public void llGetRegionName() { }
// public void llGetRegionTimeDilation() { } // public void llGetRegionTimeDilation() { }
// public void llGetRegionFPS() { } // public void llGetRegionFPS() { }
// public void llParticleSystem() { } // public void llParticleSystem() { }
// public void llGroundRepel() { } // public void llGroundRepel() { }
// public void llGiveInventoryList() { } // public void llGiveInventoryList() { }
// public void llSetVehicleType() { } // public void llSetVehicleType() { }
// public void llSetVehicleFloatParam() { } // public void llSetVehicleFloatParam() { }
// public void llSetVehicleVectorParam() { } // public void llSetVehicleVectorParam() { }
// public void llSetVehicleRotationParam() { } // public void llSetVehicleRotationParam() { }
// public void llSetVehicleFlags() { } // public void llSetVehicleFlags() { }
// public void llRemoveVehicleFlags() { } // public void llRemoveVehicleFlags() { }
// public void llSitTarget() { } // public void llSitTarget() { }
// public void llAvatarOnSitTarget() { } // public void llAvatarOnSitTarget() { }
// public void llAddToLandPassList() { } // public void llAddToLandPassList() { }
// public void llSetTouchText() { } // public void llSetTouchText() { }
// public void llSetSitText() { } // public void llSetSitText() { }
// public void llSetCameraEyeOffset() { } // public void llSetCameraEyeOffset() { }
// public void llSetCameraAtOffset() { } // public void llSetCameraAtOffset() { }
// public void llDumpList2String() { } // public void llDumpList2String() { }
// public void llScriptDanger() { } // public void llScriptDanger() { }
// public void llDialog() { } // public void llDialog() { }
// public void llVolumeDetect() { } // public void llVolumeDetect() { }
// public void llResetOtherScript() { } // public void llResetOtherScript() { }
// public void llGetScriptState() { } // public void llGetScriptState() { }
// public void llRemoteLoadScript() { } // public void llRemoteLoadScript() { }
// public void llSetRemoteScriptAccessPin() { } // public void llSetRemoteScriptAccessPin() { }
// public void llRemoteLoadScriptPin() { } // public void llRemoteLoadScriptPin() { }
// public void llOpenRemoteDataChannel() { } // public void llOpenRemoteDataChannel() { }
// public void llSendRemoteData() { } // public void llSendRemoteData() { }
// public void llRemoteDataReply() { } // public void llRemoteDataReply() { }
// public void llCloseRemoteDataChannel() { } // public void llCloseRemoteDataChannel() { }
// public void llMD5String() { } // public void llMD5String() { }
// public void llSetPrimitiveParams() { } // public void llSetPrimitiveParams() { }
// public void llStringToBase64() { } // public void llStringToBase64() { }
// public void llBase64ToString() { } // public void llBase64ToString() { }
// public void llXorBase64Strings() { } // public void llXorBase64Strings() { }
// public void llRemoteDataSetRegion() { } // public void llRemoteDataSetRegion() { }
// public void llLog10() { } // public void llLog10() { }
// public void llLog() { } // public void llLog() { }
// public void llGetAnimationList() { } // public void llGetAnimationList() { }
// public void llSetParcelMusicURL() { } // public void llSetParcelMusicURL() { }
// public void llGetRootPosition() { } // public void llGetRootPosition() { }
// public void llGetRootRotation() { } // public void llGetRootRotation() { }
// public void llGetObjectDesc() { } // public void llGetObjectDesc() { }
// public void llSetObjectDesc() { } // public void llSetObjectDesc() { }
// public void llGetCreator() { } // public void llGetCreator() { }
// public void llGetTimestamp() { } // public void llGetTimestamp() { }
// public void llSetLinkAlpha() { } // public void llSetLinkAlpha() { }
// public void llGetNumberOfPrims() { } // public void llGetNumberOfPrims() { }
// public void llGetNumberOfNotecardLines() { } // public void llGetNumberOfNotecardLines() { }
// public void llGetBoundingBox() { } // public void llGetBoundingBox() { }
// public void llGetGeometricCenter() { } // public void llGetGeometricCenter() { }
// public void llGetPrimitiveParams() { } // public void llGetPrimitiveParams() { }
// public void llIntegerToBase64() { } // public void llIntegerToBase64() { }
// public void llBase64ToInteger() { } // public void llBase64ToInteger() { }
// public void llGetGMTclock() { } // public void llGetGMTclock() { }
// public void llGetSimulatorHostname() { } // public void llGetSimulatorHostname() { }
// public void llSetLocalRot() { } // public void llSetLocalRot() { }
// public void llParseStringKeepNulls() { } // public void llParseStringKeepNulls() { }
// public void llRezAtRoot() { } // public void llRezAtRoot() { }
// public void llGetObjectPermMask() { } // public void llGetObjectPermMask() { }
// public void llSetObjectPermMask() { } // public void llSetObjectPermMask() { }
// public void llGetInventoryPermMask() { } // public void llGetInventoryPermMask() { }
// public void llSetInventoryPermMask() { } // public void llSetInventoryPermMask() { }
// public void llGetInventoryCreator() { } // public void llGetInventoryCreator() { }
// public void llOwnerSay() { } // public void llOwnerSay() { }
// public void llRequestSimulatorData() { } // public void llRequestSimulatorData() { }
// public void llForceMouselook() { } // public void llForceMouselook() { }
// public void llGetObjectMass() { } // public void llGetObjectMass() { }
// public void llListReplaceList() { } // public void llListReplaceList() { }
// public void llLoadURL() { } // public void llLoadURL() { }
// public void llParcelMediaCommandList() { } // public void llParcelMediaCommandList() { }
// public void llParcelMediaQuery() { } // public void llParcelMediaQuery() { }
// public void llModPow() { } // public void llModPow() { }
// public void llGetInventoryType() { } // public void llGetInventoryType() { }
// public void llSetPayPrice() { } // public void llSetPayPrice() { }
// public void llGetCameraPos() { } // public void llGetCameraPos() { }
// public void llGetCameraRot() { } // public void llGetCameraRot() { }
// public void llSetPrimURL() { } // public void llSetPrimURL() { }
// public void llRefreshPrimURL() { } // public void llRefreshPrimURL() { }
// public void llEscapeURL() { } // public void llEscapeURL() { }
// public void llUnescapeURL() { } // public void llUnescapeURL() { }
// public void llMapDestination() { } // public void llMapDestination() { }
// public void llAddToLandBanList() { } // public void llAddToLandBanList() { }
// public void llRemoveFromLandPassList() { } // public void llRemoveFromLandPassList() { }
// public void llRemoveFromLandBanList() { } // public void llRemoveFromLandBanList() { }
// public void llSetCameraParams() { } // public void llSetCameraParams() { }
// public void llClearCameraParams() { } // public void llClearCameraParams() { }
// public void llListStatistics() { } // public void llListStatistics() { }
// public void llGetUnixTime() { } // public void llGetUnixTime() { }
// public void llGetParcelFlags() { } // public void llGetParcelFlags() { }
// public void llGetRegionFlags() { } // public void llGetRegionFlags() { }
// public void llXorBase64StringsCorrect() { } // public void llXorBase64StringsCorrect() { }
// public void llHTTPRequest() { } // public void llHTTPRequest() { }
// public void llResetLandBanList() { } // public void llResetLandBanList() { }
// public void llResetLandPassList() { } // public void llResetLandPassList() { }
// public void llGetParcelPrimCount() { } // public void llGetParcelPrimCount() { }
// public void llGetParcelPrimOwners() { } // public void llGetParcelPrimOwners() { }
// public void llGetObjectPrimCount() { } // public void llGetObjectPrimCount() { }
// public void llGetParcelMaxPrims() { } // public void llGetParcelMaxPrims() { }
// public void llGetParcelDetails() { } // public void llGetParcelDetails() { }
// } // }
//} //}

View File

@ -1,350 +1,350 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
public partial class LSL_BaseClass public partial class LSL_BaseClass
{ {
/* /*
* OPCODES * OPCODES
* *
* These are internal "assembly" commands, * These are internal "assembly" commands,
* basic operators like "ADD", "PUSH" and "POP" * basic operators like "ADD", "PUSH" and "POP"
* *
* It also contains managed stack and keeps track of internal variables, etc. * It also contains managed stack and keeps track of internal variables, etc.
* *
*/ */
public void StoreToLocal(UInt32 index) public void StoreToLocal(UInt32 index)
{ {
// TODO: How to determine local? // TODO: How to determine local?
Common.SendToDebug("::StoreToLocal " + index); Common.SendToDebug("::StoreToLocal " + index);
if (LocalVariables.ContainsKey(index)) if (LocalVariables.ContainsKey(index))
LocalVariables.Remove(index); LocalVariables.Remove(index);
LocalVariables.Add(index, LSLStack.Peek()); LocalVariables.Add(index, LSLStack.Peek());
} }
public void StoreToGlobal(UInt32 index) public void StoreToGlobal(UInt32 index)
{ {
Common.SendToDebug("::StoreToGlobal " + index); Common.SendToDebug("::StoreToGlobal " + index);
if (GlobalVariables.ContainsKey(index)) if (GlobalVariables.ContainsKey(index))
GlobalVariables.Remove(index); GlobalVariables.Remove(index);
GlobalVariables.Add(index, LSLStack.Peek()); GlobalVariables.Add(index, LSLStack.Peek());
} }
public void StoreToStatic(UInt32 index) public void StoreToStatic(UInt32 index)
{ {
Common.SendToDebug("::StoreToStatic " + index); Common.SendToDebug("::StoreToStatic " + index);
//if (StaticVariables.ContainsKey(index)) //if (StaticVariables.ContainsKey(index))
// StaticVariables.Remove(index); // StaticVariables.Remove(index);
StaticVariables.Add(index, LSLStack.Peek()); StaticVariables.Add(index, LSLStack.Peek());
} }
public void GetFromLocal(UInt32 index) public void GetFromLocal(UInt32 index)
{ {
// TODO: How to determine local? // TODO: How to determine local?
Common.SendToDebug("::GetFromLocal " + index); Common.SendToDebug("::GetFromLocal " + index);
object ret; object ret;
LocalVariables.TryGetValue(index, out ret); LocalVariables.TryGetValue(index, out ret);
LSLStack.Push(ret); LSLStack.Push(ret);
//return ret; //return ret;
} }
public void GetFromGlobal(UInt32 index) public void GetFromGlobal(UInt32 index)
{ {
Common.SendToDebug("::GetFromGlobal " + index); Common.SendToDebug("::GetFromGlobal " + index);
object ret; object ret;
GlobalVariables.TryGetValue(index, out ret); GlobalVariables.TryGetValue(index, out ret);
LSLStack.Push(ret); LSLStack.Push(ret);
//return ret; //return ret;
} }
public void GetFromStatic(UInt32 index) public void GetFromStatic(UInt32 index)
{ {
Common.SendToDebug("::GetFromStatic " + index); Common.SendToDebug("::GetFromStatic " + index);
object ret; object ret;
StaticVariables.TryGetValue(index, out ret); StaticVariables.TryGetValue(index, out ret);
Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString()); Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString());
LSLStack.Push(ret); LSLStack.Push(ret);
//return ret; //return ret;
} }
public object POPToStack() public object POPToStack()
{ {
Common.SendToDebug("::POPToStack"); Common.SendToDebug("::POPToStack");
//return LSLStack.Pop(); //return LSLStack.Pop();
object p = LSLStack.Pop(); object p = LSLStack.Pop();
if (p.GetType() == typeof(UInt32)) if (p.GetType() == typeof(UInt32))
return (UInt32)p; return (UInt32)p;
if (p.GetType() == typeof(string)) if (p.GetType() == typeof(string))
return (string)p; return (string)p;
if (p.GetType() == typeof(Int32)) if (p.GetType() == typeof(Int32))
return (Int32)p; return (Int32)p;
if (p.GetType() == typeof(UInt16)) if (p.GetType() == typeof(UInt16))
return (UInt16)p; return (UInt16)p;
if (p.GetType() == typeof(float)) if (p.GetType() == typeof(float))
return (float)p; return (float)p;
if (p.GetType() == typeof(LSO_Enums.Vector)) if (p.GetType() == typeof(LSO_Enums.Vector))
return (LSO_Enums.Vector)p; return (LSO_Enums.Vector)p;
if (p.GetType() == typeof(LSO_Enums.Rotation)) if (p.GetType() == typeof(LSO_Enums.Rotation))
return (LSO_Enums.Rotation)p; return (LSO_Enums.Rotation)p;
if (p.GetType() == typeof(LSO_Enums.Key)) if (p.GetType() == typeof(LSO_Enums.Key))
return (LSO_Enums.Key)p; return (LSO_Enums.Key)p;
return p; return p;
} }
//public object POPToStack(UInt32 count) //public object POPToStack(UInt32 count)
//{ //{
// // POP NUMBER FROM TOP OF STACK // // POP NUMBER FROM TOP OF STACK
// //LSLStack.SetLength(LSLStack.Length - 4); // //LSLStack.SetLength(LSLStack.Length - 4);
// Common.SendToDebug("::POPToStack " + count); // Common.SendToDebug("::POPToStack " + count);
// if (count < 2) // if (count < 2)
// return LSLStack.Pop(); // return LSLStack.Pop();
// Stack<object> s = new Stack<object>(); // Stack<object> s = new Stack<object>();
// for (int i = 0; i < count; i++) // for (int i = 0; i < count; i++)
// { // {
// s.Push(LSLStack.Pop); // s.Push(LSLStack.Pop);
// } // }
//} //}
public void POP() public void POP()
{ {
// POP NUMBER FROM TOP OF STACK // POP NUMBER FROM TOP OF STACK
//LSLStack.SetLength(LSLStack.Length - 4); //LSLStack.SetLength(LSLStack.Length - 4);
Common.SendToDebug("::POP"); Common.SendToDebug("::POP");
if (LSLStack.Count < 1) if (LSLStack.Count < 1)
{ {
//TODO: Temporary fix //TODO: Temporary fix
Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!"); Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!");
} }
else else
{ {
LSLStack.Pop(); LSLStack.Pop();
} }
} }
public void PUSH(object Param) public void PUSH(object Param)
{ {
if (Param == null) if (Param == null)
{ {
Common.SendToDebug("::PUSH: <null>"); Common.SendToDebug("::PUSH: <null>");
} }
else else
{ {
//Common.SendToDebug("::PUSH: " + Param.GetType()); //Common.SendToDebug("::PUSH: " + Param.GetType());
} }
LSLStack.Push(Param); LSLStack.Push(Param);
} }
public void ADD(UInt32 Param) public void ADD(UInt32 Param)
{ {
Common.SendToDebug("::ADD: " + Param); Common.SendToDebug("::ADD: " + Param);
object o2 = LSLStack.Pop(); object o2 = LSLStack.Pop();
object o1 = LSLStack.Pop(); object o1 = LSLStack.Pop();
Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + " (" + o2.ToString() + ")"); Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + " (" + o2.ToString() + ")");
if (o2.GetType() == typeof(string)) if (o2.GetType() == typeof(string))
{ {
LSLStack.Push((string)o1 + (string)o2); LSLStack.Push((string)o1 + (string)o2);
return; return;
} }
if (o2.GetType() == typeof(UInt32)) if (o2.GetType() == typeof(UInt32))
{ {
LSLStack.Push((UInt32)o1 + (UInt32)o2); LSLStack.Push((UInt32)o1 + (UInt32)o2);
return; return;
} }
} }
public void SUB(UInt32 Param) public void SUB(UInt32 Param)
{ {
Common.SendToDebug("::SUB: " + Param); Common.SendToDebug("::SUB: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 - i2)); LSLStack.Push((UInt32)(i1 - i2));
} }
public void MUL(UInt32 Param) public void MUL(UInt32 Param)
{ {
Common.SendToDebug("::SUB: " + Param); Common.SendToDebug("::SUB: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 * i2)); LSLStack.Push((UInt32)(i1 * i2));
} }
public void DIV(UInt32 Param) public void DIV(UInt32 Param)
{ {
Common.SendToDebug("::DIV: " + Param); Common.SendToDebug("::DIV: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 / i2)); LSLStack.Push((UInt32)(i1 / i2));
} }
public void MOD(UInt32 Param) public void MOD(UInt32 Param)
{ {
Common.SendToDebug("::MOD: " + Param); Common.SendToDebug("::MOD: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 % i2)); LSLStack.Push((UInt32)(i1 % i2));
} }
public void EQ(UInt32 Param) public void EQ(UInt32 Param)
{ {
Common.SendToDebug("::EQ: " + Param); Common.SendToDebug("::EQ: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
if (i1 == i2) if (i1 == i2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void NEQ(UInt32 Param) public void NEQ(UInt32 Param)
{ {
Common.SendToDebug("::NEQ: " + Param); Common.SendToDebug("::NEQ: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
if (i1 != i2) if (i1 != i2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void LEQ(UInt32 Param) public void LEQ(UInt32 Param)
{ {
Common.SendToDebug("::LEQ: " + Param); Common.SendToDebug("::LEQ: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
if (i1 <= i2) if (i1 <= i2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void GEQ(UInt32 Param) public void GEQ(UInt32 Param)
{ {
Common.SendToDebug("::GEQ: " + Param); Common.SendToDebug("::GEQ: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
if (i1 >= i2) if (i1 >= i2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void LESS(UInt32 Param) public void LESS(UInt32 Param)
{ {
Common.SendToDebug("::LESS: " + Param); Common.SendToDebug("::LESS: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
if (i1 < i2) if (i1 < i2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void GREATER(UInt32 Param) public void GREATER(UInt32 Param)
{ {
Common.SendToDebug("::GREATER: " + Param); Common.SendToDebug("::GREATER: " + Param);
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
if (i1 > i2) if (i1 > i2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void BITAND() public void BITAND()
{ {
Common.SendToDebug("::BITAND"); Common.SendToDebug("::BITAND");
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 & i2)); LSLStack.Push((UInt32)(i1 & i2));
} }
public void BITOR() public void BITOR()
{ {
Common.SendToDebug("::BITOR"); Common.SendToDebug("::BITOR");
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 | i2)); LSLStack.Push((UInt32)(i1 | i2));
} }
public void BITXOR() public void BITXOR()
{ {
Common.SendToDebug("::BITXOR"); Common.SendToDebug("::BITXOR");
UInt32 i2 = (UInt32)LSLStack.Pop(); UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 ^ i2)); LSLStack.Push((UInt32)(i1 ^ i2));
} }
public void BOOLAND() public void BOOLAND()
{ {
Common.SendToDebug("::BOOLAND"); Common.SendToDebug("::BOOLAND");
bool b2 = bool.Parse((string)LSLStack.Pop()); bool b2 = bool.Parse((string)LSLStack.Pop());
bool b1 = bool.Parse((string)LSLStack.Pop()); bool b1 = bool.Parse((string)LSLStack.Pop());
if (b1 && b2) if (b1 && b2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void BOOLOR() public void BOOLOR()
{ {
Common.SendToDebug("::BOOLOR"); Common.SendToDebug("::BOOLOR");
bool b2 = bool.Parse((string)LSLStack.Pop()); bool b2 = bool.Parse((string)LSLStack.Pop());
bool b1 = bool.Parse((string)LSLStack.Pop()); bool b1 = bool.Parse((string)LSLStack.Pop());
if (b1 || b2) if (b1 || b2)
{ {
LSLStack.Push((UInt32)1); LSLStack.Push((UInt32)1);
} }
else else
{ {
LSLStack.Push((UInt32)0); LSLStack.Push((UInt32)0);
} }
} }
public void NEG(UInt32 Param) public void NEG(UInt32 Param)
{ {
Common.SendToDebug("::NEG: " + Param); Common.SendToDebug("::NEG: " + Param);
//UInt32 i2 = (UInt32)LSLStack.Pop(); //UInt32 i2 = (UInt32)LSLStack.Pop();
UInt32 i1 = (UInt32)LSLStack.Pop(); UInt32 i1 = (UInt32)LSLStack.Pop();
LSLStack.Push((UInt32)(i1 * -1)); LSLStack.Push((UInt32)(i1 * -1));
} }
public void BITNOT() public void BITNOT()
{ {
//Common.SendToDebug("::BITNOT"); //Common.SendToDebug("::BITNOT");
//UInt32 i2 = (UInt32)LSLStack.Pop(); //UInt32 i2 = (UInt32)LSLStack.Pop();
//UInt32 i1 = (UInt32)LSLStack.Pop(); //UInt32 i1 = (UInt32)LSLStack.Pop();
//LSLStack.Push((UInt32)(i1 / i2)); //LSLStack.Push((UInt32)(i1 / i2));
} }
public void BOOLNOT() public void BOOLNOT()
{ {
//Common.SendToDebug("::BOOLNOT"); //Common.SendToDebug("::BOOLNOT");
////UInt32 i2 = (UInt32)LSLStack.Pop(); ////UInt32 i2 = (UInt32)LSLStack.Pop();
//UInt32 i1 = (UInt32)LSLStack.Pop(); //UInt32 i1 = (UInt32)LSLStack.Pop();
//LSLStack.Push((UInt32)(i1)); //LSLStack.Push((UInt32)(i1));
} }
} }
} }

View File

@ -1,79 +1,79 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
public class LSL_CLRInterface public class LSL_CLRInterface
{ {
public interface LSLScript public interface LSLScript
{ {
//public virtual void Run(object arg) //public virtual void Run(object arg)
//{ //{
//} //}
//void Run(object arg); //void Run(object arg);
//void event_state_entry(object arg); //void event_state_entry(object arg);
//void event_state_exit(); //void event_state_exit();
//void event_touch_start(object arg); //void event_touch_start(object arg);
//void event_touch(); //void event_touch();
//void event_touch_end(); //void event_touch_end();
//void event_collision_start(); //void event_collision_start();
//void event_collision(); //void event_collision();
//void event_collision_end(); //void event_collision_end();
//void event_land_collision_start(); //void event_land_collision_start();
//void event_land_collision(); //void event_land_collision();
//void event_land_collision_end(); //void event_land_collision_end();
//void event_timer(); //void event_timer();
//void event_listen(); //void event_listen();
//void event_on_rez(); //void event_on_rez();
//void event_sensor(); //void event_sensor();
//void event_no_sensor(); //void event_no_sensor();
//void event_control(); //void event_control();
//void event_money(); //void event_money();
//void event_email(); //void event_email();
//void event_at_target(); //void event_at_target();
//void event_not_at_target(); //void event_not_at_target();
//void event_at_rot_target(); //void event_at_rot_target();
//void event_not_at_rot_target(); //void event_not_at_rot_target();
//void event_run_time_permissions(); //void event_run_time_permissions();
//void event_changed(); //void event_changed();
//void event_attach(); //void event_attach();
//void event_dataserver(); //void event_dataserver();
//void event_link_message(); //void event_link_message();
//void event_moving_start(); //void event_moving_start();
//void event_moving_end(); //void event_moving_end();
//void event_object_rez(); //void event_object_rez();
//void event_remote_data(); //void event_remote_data();
//void event_http_response(); //void event_http_response();
} }
} }
} }

View File

@ -1,436 +1,436 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
using OpenSim.Region.ScriptEngine.Common; using OpenSim.Region.ScriptEngine.Common;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
partial class LSO_Parser partial class LSO_Parser
{ {
//internal Stack<Type> ILStack = new Stack<Type>(); //internal Stack<Type> ILStack = new Stack<Type>();
//LSO_Enums MyLSO_Enums = new LSO_Enums(); //LSO_Enums MyLSO_Enums = new LSO_Enums();
internal bool LSL_PROCESS_OPCODE(ILGenerator il) internal bool LSL_PROCESS_OPCODE(ILGenerator il)
{ {
byte bp1; byte bp1;
UInt32 u32p1; UInt32 u32p1;
float fp1; float fp1;
UInt16 opcode = br_read(1)[0]; UInt16 opcode = br_read(1)[0];
Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString()); Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString());
string idesc = ((LSO_Enums.Operation_Table)opcode).ToString(); string idesc = ((LSO_Enums.Operation_Table)opcode).ToString();
switch ((LSO_Enums.Operation_Table)opcode) switch ((LSO_Enums.Operation_Table)opcode)
{ {
/*************** /***************
* IMPLEMENTED * * IMPLEMENTED *
***************/ ***************/
case LSO_Enums.Operation_Table.NOOP: case LSO_Enums.Operation_Table.NOOP:
break; break;
case LSO_Enums.Operation_Table.PUSHSP: case LSO_Enums.Operation_Table.PUSHSP:
// Push Stack Top (Memory Address) to stack // Push Stack Top (Memory Address) to stack
Common.SendToDebug("Instruction " + idesc); Common.SendToDebug("Instruction " + idesc);
Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack"); Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack");
IL_Push(il, (UInt32)myHeader.SP); IL_Push(il, (UInt32)myHeader.SP);
break; break;
// BYTE // BYTE
case LSO_Enums.Operation_Table.PUSHARGB: case LSO_Enums.Operation_Table.PUSHARGB:
Common.SendToDebug("Param1: " + br_read(1)[0]); Common.SendToDebug("Param1: " + br_read(1)[0]);
break; break;
// INTEGER // INTEGER
case LSO_Enums.Operation_Table.PUSHARGI: case LSO_Enums.Operation_Table.PUSHARGI:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Instruction " + idesc + ", Param1: " + u32p1); Common.SendToDebug("Instruction " + idesc + ", Param1: " + u32p1);
IL_Push(il, u32p1); IL_Push(il, u32p1);
break; break;
// FLOAT // FLOAT
case LSO_Enums.Operation_Table.PUSHARGF: case LSO_Enums.Operation_Table.PUSHARGF:
fp1 = BitConverter.ToUInt32(br_read(4), 0); fp1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Instruction " + idesc + ", Param1: " + fp1); Common.SendToDebug("Instruction " + idesc + ", Param1: " + fp1);
IL_Push(il, fp1); IL_Push(il, fp1);
break; break;
// STRING // STRING
case LSO_Enums.Operation_Table.PUSHARGS: case LSO_Enums.Operation_Table.PUSHARGS:
string s = Read_String(); string s = Read_String();
Common.SendToDebug("Instruction " + idesc + ", Param1: " + s); Common.SendToDebug("Instruction " + idesc + ", Param1: " + s);
IL_Debug(il, "OPCODE: " + idesc + ":" + s); IL_Debug(il, "OPCODE: " + idesc + ":" + s);
IL_Push(il, s); IL_Push(il, s);
break; break;
// VECTOR z,y,x // VECTOR z,y,x
case LSO_Enums.Operation_Table.PUSHARGV: case LSO_Enums.Operation_Table.PUSHARGV:
LSO_Enums.Vector v = new LSO_Enums.Vector(); LSO_Enums.Vector v = new LSO_Enums.Vector();
v.Z = BitConverter.ToUInt32(br_read(4), 0); v.Z = BitConverter.ToUInt32(br_read(4), 0);
v.Y = BitConverter.ToUInt32(br_read(4), 0); v.Y = BitConverter.ToUInt32(br_read(4), 0);
v.X = BitConverter.ToUInt32(br_read(4), 0); v.X = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1 Z: " + v.Z); Common.SendToDebug("Param1 Z: " + v.Z);
Common.SendToDebug("Param1 Y: " + v.Y); Common.SendToDebug("Param1 Y: " + v.Y);
Common.SendToDebug("Param1 X: " + v.X); Common.SendToDebug("Param1 X: " + v.X);
IL_Push(il, v); IL_Push(il, v);
break; break;
// ROTATION s,z,y,x // ROTATION s,z,y,x
case LSO_Enums.Operation_Table.PUSHARGQ: case LSO_Enums.Operation_Table.PUSHARGQ:
LSO_Enums.Rotation r = new LSO_Enums.Rotation(); LSO_Enums.Rotation r = new LSO_Enums.Rotation();
r.S = BitConverter.ToUInt32(br_read(4), 0); r.S = BitConverter.ToUInt32(br_read(4), 0);
r.Z = BitConverter.ToUInt32(br_read(4), 0); r.Z = BitConverter.ToUInt32(br_read(4), 0);
r.Y = BitConverter.ToUInt32(br_read(4), 0); r.Y = BitConverter.ToUInt32(br_read(4), 0);
r.X = BitConverter.ToUInt32(br_read(4), 0); r.X = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1 S: " + r.S); Common.SendToDebug("Param1 S: " + r.S);
Common.SendToDebug("Param1 Z: " + r.Z); Common.SendToDebug("Param1 Z: " + r.Z);
Common.SendToDebug("Param1 Y: " + r.Y); Common.SendToDebug("Param1 Y: " + r.Y);
Common.SendToDebug("Param1 X: " + r.X); Common.SendToDebug("Param1 X: " + r.X);
IL_Push(il, r); IL_Push(il, r);
break; break;
case LSO_Enums.Operation_Table.PUSHE: case LSO_Enums.Operation_Table.PUSHE:
IL_Push(il, (UInt32)0); IL_Push(il, (UInt32)0);
break; break;
case LSO_Enums.Operation_Table.PUSHARGE: case LSO_Enums.Operation_Table.PUSHARGE:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1); Common.SendToDebug("Param1: " + u32p1);
//IL_Push(il, new string(" ".ToCharArray()[0], Convert.ToInt32(u32p1))); //IL_Push(il, new string(" ".ToCharArray()[0], Convert.ToInt32(u32p1)));
IL_Push(il, u32p1); IL_Push(il, u32p1);
break; break;
// BYTE // BYTE
case LSO_Enums.Operation_Table.ADD: case LSO_Enums.Operation_Table.ADD:
case LSO_Enums.Operation_Table.SUB: case LSO_Enums.Operation_Table.SUB:
case LSO_Enums.Operation_Table.MUL: case LSO_Enums.Operation_Table.MUL:
case LSO_Enums.Operation_Table.DIV: case LSO_Enums.Operation_Table.DIV:
case LSO_Enums.Operation_Table.EQ: case LSO_Enums.Operation_Table.EQ:
case LSO_Enums.Operation_Table.NEQ: case LSO_Enums.Operation_Table.NEQ:
case LSO_Enums.Operation_Table.LEQ: case LSO_Enums.Operation_Table.LEQ:
case LSO_Enums.Operation_Table.GEQ: case LSO_Enums.Operation_Table.GEQ:
case LSO_Enums.Operation_Table.LESS: case LSO_Enums.Operation_Table.LESS:
case LSO_Enums.Operation_Table.GREATER: case LSO_Enums.Operation_Table.GREATER:
case LSO_Enums.Operation_Table.NEG: case LSO_Enums.Operation_Table.NEG:
case LSO_Enums.Operation_Table.MOD: case LSO_Enums.Operation_Table.MOD:
bp1 = br_read(1)[0]; bp1 = br_read(1)[0];
Common.SendToDebug("Param1: " + bp1); Common.SendToDebug("Param1: " + bp1);
IL_CallBaseFunction(il, idesc, (UInt32)bp1); IL_CallBaseFunction(il, idesc, (UInt32)bp1);
break; break;
// NO ARGUMENTS // NO ARGUMENTS
case LSO_Enums.Operation_Table.BITAND: case LSO_Enums.Operation_Table.BITAND:
case LSO_Enums.Operation_Table.BITOR: case LSO_Enums.Operation_Table.BITOR:
case LSO_Enums.Operation_Table.BITXOR: case LSO_Enums.Operation_Table.BITXOR:
case LSO_Enums.Operation_Table.BOOLAND: case LSO_Enums.Operation_Table.BOOLAND:
case LSO_Enums.Operation_Table.BOOLOR: case LSO_Enums.Operation_Table.BOOLOR:
case LSO_Enums.Operation_Table.BITNOT: case LSO_Enums.Operation_Table.BITNOT:
case LSO_Enums.Operation_Table.BOOLNOT: case LSO_Enums.Operation_Table.BOOLNOT:
IL_CallBaseFunction(il, idesc); IL_CallBaseFunction(il, idesc);
break; break;
// SHORT // SHORT
case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE: case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE:
// TODO: What is size of short? // TODO: What is size of short?
UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0); UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0);
Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString()); Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString());
//Common.SendToDebug("Param1: " + U16p1); //Common.SendToDebug("Param1: " + U16p1);
string fname = ((LSO_Enums.BuiltIn_Functions)U16p1).ToString(); string fname = ((LSO_Enums.BuiltIn_Functions)U16p1).ToString();
bool cmdFound = false; bool cmdFound = false;
foreach (MethodInfo mi in typeof(LSL_BuiltIn_Commands_Interface).GetMethods()) foreach (MethodInfo mi in typeof(LSL_BuiltIn_Commands_Interface).GetMethods())
{ {
// Found command // Found command
if (mi.Name == fname) if (mi.Name == fname)
{ {
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("GetLSL_BuiltIn", new Type[] { })); il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("GetLSL_BuiltIn", new Type[] { }));
// Pop required number of items from my stack to .Net stack // Pop required number of items from my stack to .Net stack
IL_PopToStack(il, mi.GetParameters().Length); IL_PopToStack(il, mi.GetParameters().Length);
il.Emit(OpCodes.Callvirt, mi); il.Emit(OpCodes.Callvirt, mi);
cmdFound = true; cmdFound = true;
break; break;
} }
} }
if (cmdFound == false) if (cmdFound == false)
{ {
Common.SendToDebug("ERROR: UNABLE TO LOCATE OPCODE " + idesc + " IN BASECLASS"); Common.SendToDebug("ERROR: UNABLE TO LOCATE OPCODE " + idesc + " IN BASECLASS");
} }
break; break;
// RETURN // RETURN
case LSO_Enums.Operation_Table.RETURN: case LSO_Enums.Operation_Table.RETURN:
Common.SendToDebug("OPCODE: RETURN"); Common.SendToDebug("OPCODE: RETURN");
return true; return true;
case LSO_Enums.Operation_Table.POP: case LSO_Enums.Operation_Table.POP:
case LSO_Enums.Operation_Table.POPS: case LSO_Enums.Operation_Table.POPS:
case LSO_Enums.Operation_Table.POPL: case LSO_Enums.Operation_Table.POPL:
case LSO_Enums.Operation_Table.POPV: case LSO_Enums.Operation_Table.POPV:
case LSO_Enums.Operation_Table.POPQ: case LSO_Enums.Operation_Table.POPQ:
// Pops a specific datatype from the stack // Pops a specific datatype from the stack
// We just ignore the datatype for now // We just ignore the datatype for now
IL_Pop(il); IL_Pop(il);
break; break;
// LONG // LONG
case LSO_Enums.Operation_Table.STORE: case LSO_Enums.Operation_Table.STORE:
case LSO_Enums.Operation_Table.STORES: case LSO_Enums.Operation_Table.STORES:
case LSO_Enums.Operation_Table.STOREL: case LSO_Enums.Operation_Table.STOREL:
case LSO_Enums.Operation_Table.STOREV: case LSO_Enums.Operation_Table.STOREV:
case LSO_Enums.Operation_Table.STOREQ: case LSO_Enums.Operation_Table.STOREQ:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1.ToString()); Common.SendToDebug("Param1: " + u32p1.ToString());
IL_CallBaseFunction(il, "StoreToLocal", u32p1); IL_CallBaseFunction(il, "StoreToLocal", u32p1);
break; break;
case LSO_Enums.Operation_Table.STOREG: case LSO_Enums.Operation_Table.STOREG:
case LSO_Enums.Operation_Table.STOREGS: case LSO_Enums.Operation_Table.STOREGS:
case LSO_Enums.Operation_Table.STOREGL: case LSO_Enums.Operation_Table.STOREGL:
case LSO_Enums.Operation_Table.STOREGV: case LSO_Enums.Operation_Table.STOREGV:
case LSO_Enums.Operation_Table.STOREGQ: case LSO_Enums.Operation_Table.STOREGQ:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1.ToString()); Common.SendToDebug("Param1: " + u32p1.ToString());
IL_CallBaseFunction(il, "StoreToGlobal", u32p1); IL_CallBaseFunction(il, "StoreToGlobal", u32p1);
break; break;
case LSO_Enums.Operation_Table.LOADP: case LSO_Enums.Operation_Table.LOADP:
case LSO_Enums.Operation_Table.LOADSP: case LSO_Enums.Operation_Table.LOADSP:
case LSO_Enums.Operation_Table.LOADLP: case LSO_Enums.Operation_Table.LOADLP:
case LSO_Enums.Operation_Table.LOADVP: case LSO_Enums.Operation_Table.LOADVP:
case LSO_Enums.Operation_Table.LOADQP: case LSO_Enums.Operation_Table.LOADQP:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1.ToString()); Common.SendToDebug("Param1: " + u32p1.ToString());
IL_CallBaseFunction(il, "StoreToLocal", u32p1); IL_CallBaseFunction(il, "StoreToLocal", u32p1);
IL_Pop(il); IL_Pop(il);
break; break;
case LSO_Enums.Operation_Table.LOADGP: case LSO_Enums.Operation_Table.LOADGP:
case LSO_Enums.Operation_Table.LOADGSP: case LSO_Enums.Operation_Table.LOADGSP:
case LSO_Enums.Operation_Table.LOADGLP: case LSO_Enums.Operation_Table.LOADGLP:
case LSO_Enums.Operation_Table.LOADGVP: case LSO_Enums.Operation_Table.LOADGVP:
case LSO_Enums.Operation_Table.LOADGQP: case LSO_Enums.Operation_Table.LOADGQP:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1.ToString()); Common.SendToDebug("Param1: " + u32p1.ToString());
IL_CallBaseFunction(il, "StoreToStatic", u32p1 - 6 + myHeader.GVR); IL_CallBaseFunction(il, "StoreToStatic", u32p1 - 6 + myHeader.GVR);
IL_Pop(il); IL_Pop(il);
break; break;
// PUSH FROM LOCAL FRAME // PUSH FROM LOCAL FRAME
case LSO_Enums.Operation_Table.PUSH: case LSO_Enums.Operation_Table.PUSH:
case LSO_Enums.Operation_Table.PUSHS: case LSO_Enums.Operation_Table.PUSHS:
case LSO_Enums.Operation_Table.PUSHL: case LSO_Enums.Operation_Table.PUSHL:
case LSO_Enums.Operation_Table.PUSHV: case LSO_Enums.Operation_Table.PUSHV:
case LSO_Enums.Operation_Table.PUSHQ: case LSO_Enums.Operation_Table.PUSHQ:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1.ToString()); Common.SendToDebug("Param1: " + u32p1.ToString());
IL_CallBaseFunction(il, "GetFromLocal", u32p1); IL_CallBaseFunction(il, "GetFromLocal", u32p1);
break; break;
// PUSH FROM STATIC FRAME // PUSH FROM STATIC FRAME
case LSO_Enums.Operation_Table.PUSHG: case LSO_Enums.Operation_Table.PUSHG:
case LSO_Enums.Operation_Table.PUSHGS: case LSO_Enums.Operation_Table.PUSHGS:
case LSO_Enums.Operation_Table.PUSHGL: case LSO_Enums.Operation_Table.PUSHGL:
case LSO_Enums.Operation_Table.PUSHGV: case LSO_Enums.Operation_Table.PUSHGV:
case LSO_Enums.Operation_Table.PUSHGQ: case LSO_Enums.Operation_Table.PUSHGQ:
u32p1 = BitConverter.ToUInt32(br_read(4), 0); u32p1 = BitConverter.ToUInt32(br_read(4), 0);
Common.SendToDebug("Param1: " + u32p1.ToString()); Common.SendToDebug("Param1: " + u32p1.ToString());
IL_CallBaseFunction(il, "GetFromStatic", u32p1 - 6 + myHeader.GVR); IL_CallBaseFunction(il, "GetFromStatic", u32p1 - 6 + myHeader.GVR);
break; break;
/*********************** /***********************
* NOT IMPLEMENTED YET * * NOT IMPLEMENTED YET *
***********************/ ***********************/
case LSO_Enums.Operation_Table.POPIP: case LSO_Enums.Operation_Table.POPIP:
case LSO_Enums.Operation_Table.POPSP: case LSO_Enums.Operation_Table.POPSP:
case LSO_Enums.Operation_Table.POPSLR: case LSO_Enums.Operation_Table.POPSLR:
case LSO_Enums.Operation_Table.POPARG: case LSO_Enums.Operation_Table.POPARG:
case LSO_Enums.Operation_Table.POPBP: case LSO_Enums.Operation_Table.POPBP:
//Common.SendToDebug("Instruction " + idesc + ": Ignored"); //Common.SendToDebug("Instruction " + idesc + ": Ignored");
Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack (TODO: Only popping 1)"); Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack (TODO: Only popping 1)");
//Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); //Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
IL_Pop(il); IL_Pop(il);
break; break;
// None // None
case LSO_Enums.Operation_Table.PUSHIP: case LSO_Enums.Operation_Table.PUSHIP:
// PUSH INSTRUCTION POINTER // PUSH INSTRUCTION POINTER
break; break;
case LSO_Enums.Operation_Table.PUSHBP: case LSO_Enums.Operation_Table.PUSHBP:
case LSO_Enums.Operation_Table.PUSHEV: case LSO_Enums.Operation_Table.PUSHEV:
break; break;
case LSO_Enums.Operation_Table.PUSHEQ: case LSO_Enums.Operation_Table.PUSHEQ:
break; break;
// LONG // LONG
case LSO_Enums.Operation_Table.JUMP: case LSO_Enums.Operation_Table.JUMP:
Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
break; break;
// BYTE, LONG // BYTE, LONG
case LSO_Enums.Operation_Table.JUMPIF: case LSO_Enums.Operation_Table.JUMPIF:
case LSO_Enums.Operation_Table.JUMPNIF: case LSO_Enums.Operation_Table.JUMPNIF:
Common.SendToDebug("Param1: " + br_read(1)[0]); Common.SendToDebug("Param1: " + br_read(1)[0]);
Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0)); Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0));
break; break;
// LONG // LONG
case LSO_Enums.Operation_Table.STATE: case LSO_Enums.Operation_Table.STATE:
bp1 = br_read(1)[0]; bp1 = br_read(1)[0];
//il.Emit(OpCodes.Ld); // Load local variable 0 onto stack //il.Emit(OpCodes.Ld); // Load local variable 0 onto stack
//il.Emit(OpCodes.Ldc_I4, 0); // Push index position //il.Emit(OpCodes.Ldc_I4, 0); // Push index position
//il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value //il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value
//il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value //il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value
break; break;
case LSO_Enums.Operation_Table.CALL: case LSO_Enums.Operation_Table.CALL:
Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
Common.SendToDebug("ERROR: Function CALL not implemented yet."); Common.SendToDebug("ERROR: Function CALL not implemented yet.");
break; break;
// BYTE // BYTE
case LSO_Enums.Operation_Table.CAST: case LSO_Enums.Operation_Table.CAST:
bp1 = br_read(1)[0]; bp1 = br_read(1)[0];
Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)); Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1));
Common.SendToDebug("Param1: " + bp1); Common.SendToDebug("Param1: " + bp1);
switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1) switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)
{ {
case LSO_Enums.OpCode_Cast_TypeDefs.String: case LSO_Enums.OpCode_Cast_TypeDefs.String:
Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Box, ILStack.Pop());"); Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Box, ILStack.Pop());");
break; break;
default: default:
Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!"); Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!");
break; break;
} }
break; break;
// LONG // LONG
case LSO_Enums.Operation_Table.STACKTOS: case LSO_Enums.Operation_Table.STACKTOS:
case LSO_Enums.Operation_Table.STACKTOL: case LSO_Enums.Operation_Table.STACKTOL:
Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
break; break;
// BYTE // BYTE
case LSO_Enums.Operation_Table.PRINT: case LSO_Enums.Operation_Table.PRINT:
case LSO_Enums.Operation_Table.CALLLIB: case LSO_Enums.Operation_Table.CALLLIB:
Common.SendToDebug("Param1: " + br_read(1)[0]); Common.SendToDebug("Param1: " + br_read(1)[0]);
break; break;
} }
return false; return false;
} }
private void IL_PopToStack(ILGenerator il) private void IL_PopToStack(ILGenerator il)
{ {
IL_PopToStack(il, 1); IL_PopToStack(il, 1);
} }
private void IL_PopToStack(ILGenerator il, int count) private void IL_PopToStack(ILGenerator il, int count)
{ {
Common.SendToDebug("IL_PopToStack();"); Common.SendToDebug("IL_PopToStack();");
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
IL_CallBaseFunction(il, "POPToStack"); IL_CallBaseFunction(il, "POPToStack");
//il.Emit(OpCodes.Ldarg_0); //il.Emit(OpCodes.Ldarg_0);
//il.Emit(OpCodes.Call, //il.Emit(OpCodes.Call,
// typeof(LSL_BaseClass).GetMethod("POPToStack", // typeof(LSL_BaseClass).GetMethod("POPToStack",
// new Type[] { })); // new Type[] { }));
} }
} }
private void IL_Pop(ILGenerator il) private void IL_Pop(ILGenerator il)
{ {
Common.SendToDebug("IL_Pop();"); Common.SendToDebug("IL_Pop();");
IL_CallBaseFunction(il, "POP"); IL_CallBaseFunction(il, "POP");
} }
private void IL_Debug(ILGenerator il, string text) private void IL_Debug(ILGenerator il, string text)
{ {
il.Emit(OpCodes.Ldstr, text); il.Emit(OpCodes.Ldstr, text);
il.Emit(OpCodes.Call, typeof(Common).GetMethod("SendToDebug", il.Emit(OpCodes.Call, typeof(Common).GetMethod("SendToDebug",
new Type[] { typeof(string) } new Type[] { typeof(string) }
)); ));
} }
private void IL_CallBaseFunction(ILGenerator il, string methodname) private void IL_CallBaseFunction(ILGenerator il, string methodname)
{ {
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { })); il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { }));
} }
private void IL_CallBaseFunction(ILGenerator il, string methodname, object data) private void IL_CallBaseFunction(ILGenerator il, string methodname, object data)
{ {
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
if (data.GetType() == typeof(string)) if (data.GetType() == typeof(string))
il.Emit(OpCodes.Ldstr, (string)data); il.Emit(OpCodes.Ldstr, (string)data);
if (data.GetType() == typeof(UInt32)) if (data.GetType() == typeof(UInt32))
il.Emit(OpCodes.Ldc_I4, (UInt32)data); il.Emit(OpCodes.Ldc_I4, (UInt32)data);
il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { data.GetType() })); il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { data.GetType() }));
} }
private void IL_Push(ILGenerator il, object data) private void IL_Push(ILGenerator il, object data)
{ {
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
Common.SendToDebug("PUSH datatype: " + data.GetType()); Common.SendToDebug("PUSH datatype: " + data.GetType());
IL_PushDataTypeToILStack(il, data); IL_PushDataTypeToILStack(il, data);
il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("PUSH", new Type[] { data.GetType() })); il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("PUSH", new Type[] { data.GetType() }));
} }
private void IL_PushDataTypeToILStack(ILGenerator il, object data) private void IL_PushDataTypeToILStack(ILGenerator il, object data)
{ {
if (data.GetType() == typeof(UInt16)) if (data.GetType() == typeof(UInt16))
{ {
il.Emit(OpCodes.Ldc_I4, (UInt16)data); il.Emit(OpCodes.Ldc_I4, (UInt16)data);
il.Emit(OpCodes.Box, data.GetType()); il.Emit(OpCodes.Box, data.GetType());
} }
if (data.GetType() == typeof(UInt32)) if (data.GetType() == typeof(UInt32))
{ {
il.Emit(OpCodes.Ldc_I4, (UInt32)data); il.Emit(OpCodes.Ldc_I4, (UInt32)data);
il.Emit(OpCodes.Box, data.GetType()); il.Emit(OpCodes.Box, data.GetType());
} }
if (data.GetType() == typeof(Int32)) if (data.GetType() == typeof(Int32))
{ {
il.Emit(OpCodes.Ldc_I4, (Int32)data); il.Emit(OpCodes.Ldc_I4, (Int32)data);
il.Emit(OpCodes.Box, data.GetType()); il.Emit(OpCodes.Box, data.GetType());
} }
if (data.GetType() == typeof(float)) if (data.GetType() == typeof(float))
{ {
il.Emit(OpCodes.Ldc_I4, (float)data); il.Emit(OpCodes.Ldc_I4, (float)data);
il.Emit(OpCodes.Box, data.GetType()); il.Emit(OpCodes.Box, data.GetType());
} }
if (data.GetType() == typeof(string)) if (data.GetType() == typeof(string))
il.Emit(OpCodes.Ldstr, (string)data); il.Emit(OpCodes.Ldstr, (string)data);
//if (data.GetType() == typeof(LSO_Enums.Rotation)) //if (data.GetType() == typeof(LSO_Enums.Rotation))
// il.Emit(OpCodes.Ldobj, (LSO_Enums.Rotation)data); // il.Emit(OpCodes.Ldobj, (LSO_Enums.Rotation)data);
//if (data.GetType() == typeof(LSO_Enums.Vector)) //if (data.GetType() == typeof(LSO_Enums.Vector))
// il.Emit(OpCodes.Ldobj, (LSO_Enums.Vector)data); // il.Emit(OpCodes.Ldobj, (LSO_Enums.Vector)data);
//if (data.GetType() == typeof(LSO_Enums.Key)) //if (data.GetType() == typeof(LSO_Enums.Key))
// il.Emit(OpCodes.Ldobj, (LSO_Enums.Key)data); // il.Emit(OpCodes.Ldobj, (LSO_Enums.Key)data);
} }
} }
} }

View File

@ -1,135 +1,135 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO
{ {
static class LSO_Struct static class LSO_Struct
{ {
public struct Header public struct Header
{ {
public UInt32 TM; public UInt32 TM;
public UInt32 IP; public UInt32 IP;
public UInt32 VN; public UInt32 VN;
public UInt32 BP; public UInt32 BP;
public UInt32 SP; public UInt32 SP;
public UInt32 HR; public UInt32 HR;
public UInt32 HP; public UInt32 HP;
public UInt32 CS; public UInt32 CS;
public UInt32 NS; public UInt32 NS;
public UInt32 CE; public UInt32 CE;
public UInt32 IE; public UInt32 IE;
public UInt32 ER; public UInt32 ER;
public UInt32 FR; public UInt32 FR;
public UInt32 SLR; public UInt32 SLR;
public UInt32 GVR; public UInt32 GVR;
public UInt32 GFR; public UInt32 GFR;
public UInt32 PR; public UInt32 PR;
public UInt32 ESR; public UInt32 ESR;
public UInt32 SR; public UInt32 SR;
public UInt64 NCE; public UInt64 NCE;
public UInt64 NIE; public UInt64 NIE;
public UInt64 NER; public UInt64 NER;
} }
public struct StaticBlock public struct StaticBlock
{ {
public UInt32 Static_Chunk_Header_Size; public UInt32 Static_Chunk_Header_Size;
public byte ObjectType; public byte ObjectType;
public byte Unknown; public byte Unknown;
public byte[] BlockVariable; public byte[] BlockVariable;
} }
/* Not actually a structure /* Not actually a structure
public struct StaticBlockVariable public struct StaticBlockVariable
{ {
public UInt32 Integer1; public UInt32 Integer1;
public UInt32 Float1; public UInt32 Float1;
public UInt32 HeapPointer_String; public UInt32 HeapPointer_String;
public UInt32 HeapPointer_Key; public UInt32 HeapPointer_Key;
public byte[] Vector_12; public byte[] Vector_12;
public byte[] Rotation_16; public byte[] Rotation_16;
public UInt32 Pointer_List_Structure; public UInt32 Pointer_List_Structure;
} */ } */
public struct HeapBlock public struct HeapBlock
{ {
public Int32 DataBlockSize; public Int32 DataBlockSize;
public byte ObjectType; public byte ObjectType;
public UInt16 ReferenceCount; public UInt16 ReferenceCount;
public byte[] Data; public byte[] Data;
} }
public struct StateFrameBlock public struct StateFrameBlock
{ {
public UInt32 StateCount; public UInt32 StateCount;
public StatePointerBlock[] StatePointer; public StatePointerBlock[] StatePointer;
} }
public struct StatePointerBlock public struct StatePointerBlock
{ {
public UInt32 Location; public UInt32 Location;
public System.Collections.BitArray EventMask; public System.Collections.BitArray EventMask;
public StateBlock StateBlock; public StateBlock StateBlock;
} }
public struct StateBlock public struct StateBlock
{ {
public UInt32 StartPos; public UInt32 StartPos;
public UInt32 EndPos; public UInt32 EndPos;
public UInt32 HeaderSize; public UInt32 HeaderSize;
public byte Unknown; public byte Unknown;
public StateBlockHandler[] StateBlockHandlers; public StateBlockHandler[] StateBlockHandlers;
} }
public struct StateBlockHandler public struct StateBlockHandler
{ {
public UInt32 CodeChunkPointer; public UInt32 CodeChunkPointer;
public UInt32 CallFrameSize; public UInt32 CallFrameSize;
} }
public struct FunctionBlock public struct FunctionBlock
{ {
public UInt32 FunctionCount; public UInt32 FunctionCount;
public UInt32[] CodeChunkPointer; public UInt32[] CodeChunkPointer;
} }
public struct CodeChunk public struct CodeChunk
{ {
public UInt32 CodeChunkHeaderSize; public UInt32 CodeChunkHeaderSize;
public string Comment; public string Comment;
public System.Collections.Generic.List<CodeChunkArgument> CodeChunkArguments; public System.Collections.Generic.List<CodeChunkArgument> CodeChunkArguments;
public byte EndMarker; public byte EndMarker;
public byte ReturnTypePos; public byte ReturnTypePos;
public StaticBlock ReturnType; public StaticBlock ReturnType;
} }
public struct CodeChunkArgument public struct CodeChunkArgument
{ {
public byte FunctionReturnTypePos; public byte FunctionReturnTypePos;
public byte NullString; public byte NullString;
public StaticBlock FunctionReturnType; public StaticBlock FunctionReturnType;
} }
} }
} }

View File

@ -1,131 +1,131 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using libsecondlife; using libsecondlife;
using OpenSim.Framework.Interfaces; using OpenSim.Framework.Interfaces;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
/// <summary> /// <summary>
/// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it.
/// </summary> /// </summary>
[Serializable] [Serializable]
class EventManager class EventManager
{ {
private ScriptEngine myScriptEngine; private ScriptEngine myScriptEngine;
//public IScriptHost TEMP_OBJECT_ID; //public IScriptHost TEMP_OBJECT_ID;
public EventManager(ScriptEngine _ScriptEngine) public EventManager(ScriptEngine _ScriptEngine)
{ {
myScriptEngine = _ScriptEngine; myScriptEngine = _ScriptEngine;
// TODO: HOOK EVENTS UP TO SERVER! // TODO: HOOK EVENTS UP TO SERVER!
//myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Start"); //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Start");
// TODO: ADD SERVER HOOK TO LOAD A SCRIPT THROUGH myScriptEngine.ScriptManager // TODO: ADD SERVER HOOK TO LOAD A SCRIPT THROUGH myScriptEngine.ScriptManager
// Hook up a test event to our test form // Hook up a test event to our test form
myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events"); myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events");
myScriptEngine.World.EventManager.OnObjectGrab += new OpenSim.Region.Environment.Scenes.EventManager.ObjectGrabDelegate(touch_start); myScriptEngine.World.EventManager.OnObjectGrab += new OpenSim.Region.Environment.Scenes.EventManager.ObjectGrabDelegate(touch_start);
myScriptEngine.World.EventManager.OnRezScript += new OpenSim.Region.Environment.Scenes.EventManager.NewRezScript(OnRezScript); myScriptEngine.World.EventManager.OnRezScript += new OpenSim.Region.Environment.Scenes.EventManager.NewRezScript(OnRezScript);
myScriptEngine.World.EventManager.OnRemoveScript += new OpenSim.Region.Environment.Scenes.EventManager.RemoveScript(OnRemoveScript); myScriptEngine.World.EventManager.OnRemoveScript += new OpenSim.Region.Environment.Scenes.EventManager.RemoveScript(OnRemoveScript);
} }
public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
//myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Event: touch_start"); //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Event: touch_start");
//Console.WriteLine("touch_start localID: " + localID); //Console.WriteLine("touch_start localID: " + localID);
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] { (int)1 }); myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] { (int)1 });
} }
public void OnRezScript(uint localID, LLUUID itemID, string script) public void OnRezScript(uint localID, LLUUID itemID, string script)
{ {
//myScriptEngine.myScriptManager.StartScript( //myScriptEngine.myScriptManager.StartScript(
// Path.Combine("ScriptEngines", "Default.lsl"), // Path.Combine("ScriptEngines", "Default.lsl"),
// new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost() // new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost()
//); //);
Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + script.Length); Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + script.Length);
myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script); myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script);
} }
public void OnRemoveScript(uint localID, LLUUID itemID) public void OnRemoveScript(uint localID, LLUUID itemID)
{ {
//myScriptEngine.myScriptManager.StartScript( //myScriptEngine.myScriptManager.StartScript(
// Path.Combine("ScriptEngines", "Default.lsl"), // Path.Combine("ScriptEngines", "Default.lsl"),
// new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost() // new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost()
//); //);
Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString());
myScriptEngine.m_ScriptManager.StopScript( myScriptEngine.m_ScriptManager.StopScript(
localID, localID,
itemID itemID
); );
} }
// TODO: Replace placeholders below // TODO: Replace placeholders below
// These needs to be hooked up to OpenSim during init of this class // These needs to be hooked up to OpenSim during init of this class
// then queued in EventQueueManager. // then queued in EventQueueManager.
// When queued in EventQueueManager they need to be LSL compatible (name and params) // When queued in EventQueueManager they need to be LSL compatible (name and params)
//public void state_entry() { } // //public void state_entry() { } //
public void state_exit() { } public void state_exit() { }
//public void touch_start() { } //public void touch_start() { }
public void touch() { } public void touch() { }
public void touch_end() { } public void touch_end() { }
public void collision_start() { } public void collision_start() { }
public void collision() { } public void collision() { }
public void collision_end() { } public void collision_end() { }
public void land_collision_start() { } public void land_collision_start() { }
public void land_collision() { } public void land_collision() { }
public void land_collision_end() { } public void land_collision_end() { }
public void timer() { } public void timer() { }
public void listen() { } public void listen() { }
public void on_rez() { } public void on_rez() { }
public void sensor() { } public void sensor() { }
public void no_sensor() { } public void no_sensor() { }
public void control() { } public void control() { }
public void money() { } public void money() { }
public void email() { } public void email() { }
public void at_target() { } public void at_target() { }
public void not_at_target() { } public void not_at_target() { }
public void at_rot_target() { } public void at_rot_target() { }
public void not_at_rot_target() { } public void not_at_rot_target() { }
public void run_time_permissions() { } public void run_time_permissions() { }
public void changed() { } public void changed() { }
public void attach() { } public void attach() { }
public void dataserver() { } public void dataserver() { }
public void link_message() { } public void link_message() { }
public void moving_start() { } public void moving_start() { }
public void moving_end() { } public void moving_end() { }
public void object_rez() { } public void object_rez() { }
public void remote_data() { } public void remote_data() { }
public void http_response() { } public void http_response() { }
} }
} }

View File

@ -1,321 +1,321 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Reflection; using System.Reflection;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
using libsecondlife; using libsecondlife;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
/// <summary> /// <summary>
/// EventQueueManager handles event queues /// EventQueueManager handles event queues
/// Events are queued and executed in separate thread /// Events are queued and executed in separate thread
/// </summary> /// </summary>
[Serializable] [Serializable]
class EventQueueManager class EventQueueManager
{ {
/// <summary> /// <summary>
/// List of threads processing event queue /// List of threads processing event queue
/// </summary> /// </summary>
private List<Thread> eventQueueThreads = new List<Thread>(); private List<Thread> eventQueueThreads = new List<Thread>();
private object queueLock = new object(); // Mutex lock object private object queueLock = new object(); // Mutex lock object
/// <summary> /// <summary>
/// How many ms to sleep if queue is empty /// How many ms to sleep if queue is empty
/// </summary> /// </summary>
private int nothingToDoSleepms = 50; private int nothingToDoSleepms = 50;
/// <summary> /// <summary>
/// How many threads to process queue with /// How many threads to process queue with
/// </summary> /// </summary>
private int numberOfThreads = 2; private int numberOfThreads = 2;
/// <summary> /// <summary>
/// Queue containing events waiting to be executed /// Queue containing events waiting to be executed
/// </summary> /// </summary>
private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>();
/// <summary> /// <summary>
/// Queue item structure /// Queue item structure
/// </summary> /// </summary>
private struct QueueItemStruct private struct QueueItemStruct
{ {
public uint localID; public uint localID;
public LLUUID itemID; public LLUUID itemID;
public string functionName; public string functionName;
public object[] param; public object[] param;
} }
/// <summary> /// <summary>
/// List of localID locks for mutex processing of script events /// List of localID locks for mutex processing of script events
/// </summary> /// </summary>
private List<uint> objectLocks = new List<uint>(); private List<uint> objectLocks = new List<uint>();
private object tryLockLock = new object(); // Mutex lock object private object tryLockLock = new object(); // Mutex lock object
private ScriptEngine m_ScriptEngine; private ScriptEngine m_ScriptEngine;
public EventQueueManager(ScriptEngine _ScriptEngine) public EventQueueManager(ScriptEngine _ScriptEngine)
{ {
m_ScriptEngine = _ScriptEngine; m_ScriptEngine = _ScriptEngine;
// //
// Start event queue processing threads (worker threads) // Start event queue processing threads (worker threads)
// //
for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++)
{ {
Thread EventQueueThread = new Thread(EventQueueThreadLoop); Thread EventQueueThread = new Thread(EventQueueThreadLoop);
eventQueueThreads.Add(EventQueueThread); eventQueueThreads.Add(EventQueueThread);
EventQueueThread.IsBackground = true; EventQueueThread.IsBackground = true;
EventQueueThread.Priority = ThreadPriority.BelowNormal; EventQueueThread.Priority = ThreadPriority.BelowNormal;
EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount;
EventQueueThread.Start(); EventQueueThread.Start();
} }
} }
~EventQueueManager() ~EventQueueManager()
{ {
// Kill worker threads // Kill worker threads
foreach (Thread EventQueueThread in new System.Collections.ArrayList(eventQueueThreads)) foreach (Thread EventQueueThread in new System.Collections.ArrayList(eventQueueThreads))
{ {
if (EventQueueThread != null && EventQueueThread.IsAlive == true) if (EventQueueThread != null && EventQueueThread.IsAlive == true)
{ {
try try
{ {
EventQueueThread.Abort(); EventQueueThread.Abort();
EventQueueThread.Join(); EventQueueThread.Join();
} }
catch (Exception) catch (Exception)
{ {
//myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString()); //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString());
} }
} }
} }
eventQueueThreads.Clear(); eventQueueThreads.Clear();
// Todo: Clean up our queues // Todo: Clean up our queues
eventQueue.Clear(); eventQueue.Clear();
} }
/// <summary> /// <summary>
/// Queue processing thread loop /// Queue processing thread loop
/// </summary> /// </summary>
private void EventQueueThreadLoop() private void EventQueueThreadLoop()
{ {
//myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned"); //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned");
try try
{ {
QueueItemStruct BlankQIS = new QueueItemStruct(); QueueItemStruct BlankQIS = new QueueItemStruct();
while (true) while (true)
{ {
try try
{ {
QueueItemStruct QIS = BlankQIS; QueueItemStruct QIS = BlankQIS;
bool GotItem = false; bool GotItem = false;
if (eventQueue.Count == 0) if (eventQueue.Count == 0)
{ {
// Nothing to do? Sleep a bit waiting for something to do // Nothing to do? Sleep a bit waiting for something to do
Thread.Sleep(nothingToDoSleepms); Thread.Sleep(nothingToDoSleepms);
} }
else else
{ {
// Something in queue, process // Something in queue, process
//myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", 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 // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD
lock (queueLock) lock (queueLock)
{ {
GotItem = false; GotItem = false;
for (int qc = 0; qc < eventQueue.Count; qc++) for (int qc = 0; qc < eventQueue.Count; qc++)
{ {
// Get queue item // Get queue item
QIS = eventQueue.Dequeue(); QIS = eventQueue.Dequeue();
// Check if object is being processed by someone else // Check if object is being processed by someone else
if (TryLock(QIS.localID) == false) if (TryLock(QIS.localID) == false)
{ {
// Object is already being processed, requeue it // Object is already being processed, requeue it
eventQueue.Enqueue(QIS); eventQueue.Enqueue(QIS);
} }
else else
{ {
// We have lock on an object and can process it // We have lock on an object and can process it
GotItem = true; GotItem = true;
break; break;
} }
} // go through queue } // go through queue
} // lock } // lock
if (GotItem == true) if (GotItem == true)
{ {
// Execute function // Execute function
try try
{ {
m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, QIS.functionName, QIS.param); m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, QIS.functionName, QIS.param);
} }
catch (Exception e) catch (Exception e)
{ {
// DISPLAY ERROR INWORLD // DISPLAY ERROR INWORLD
string text = "Error executing script function \"" + QIS.functionName + "\":\r\n"; string text = "Error executing script function \"" + QIS.functionName + "\":\r\n";
if (e.InnerException != null) if (e.InnerException != null)
{ // Send inner exception { // Send inner exception
text += e.InnerException.Message.ToString(); text += e.InnerException.Message.ToString();
} }
else else
{ // Send normal { // Send normal
text += e.Message.ToString(); text += e.Message.ToString();
} }
try try
{ {
if (text.Length > 1500) if (text.Length > 1500)
text = text.Substring(0, 1500); text = text.Substring(0, 1500);
IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID);
//if (m_host != null) //if (m_host != null)
//{ //{
m_ScriptEngine.World.SimChat(Helpers.StringToField(text), 1, m_host.AbsolutePosition, m_host.Name, m_host.UUID); m_ScriptEngine.World.SimChat(Helpers.StringToField(text), 1, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
} catch { } catch {
//} //}
//else //else
//{ //{
// T oconsole // T oconsole
Console.WriteLine("Unable to send text in-world:\r\n" + text); Console.WriteLine("Unable to send text in-world:\r\n" + text);
} }
} }
finally finally
{ {
ReleaseLock(QIS.localID); ReleaseLock(QIS.localID);
} }
} }
} // Something in queue } // Something in queue
} catch (ThreadAbortException tae) { } catch (ThreadAbortException tae) {
throw tae; throw tae;
} catch (Exception e) { } catch (Exception e) {
Console.WriteLine("Exception in EventQueueThreadLoop: " + e.ToString()); Console.WriteLine("Exception in EventQueueThreadLoop: " + e.ToString());
} }
} // while } // while
} // try } // try
catch (ThreadAbortException) catch (ThreadAbortException)
{ {
//myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message); //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message);
} }
} }
/// <summary> /// <summary>
/// Try to get a mutex lock on localID /// Try to get a mutex lock on localID
/// </summary> /// </summary>
/// <param name="localID"></param> /// <param name="localID"></param>
/// <returns></returns> /// <returns></returns>
private bool TryLock(uint localID) private bool TryLock(uint localID)
{ {
lock (tryLockLock) lock (tryLockLock)
{ {
if (objectLocks.Contains(localID) == true) if (objectLocks.Contains(localID) == true)
{ {
return false; return false;
} }
else else
{ {
objectLocks.Add(localID); objectLocks.Add(localID);
return true; return true;
} }
} }
} }
/// <summary> /// <summary>
/// Release mutex lock on localID /// Release mutex lock on localID
/// </summary> /// </summary>
/// <param name="localID"></param> /// <param name="localID"></param>
private void ReleaseLock(uint localID) private void ReleaseLock(uint localID)
{ {
lock (tryLockLock) lock (tryLockLock)
{ {
if (objectLocks.Contains(localID) == true) if (objectLocks.Contains(localID) == true)
{ {
objectLocks.Remove(localID); objectLocks.Remove(localID);
} }
} }
} }
/// <summary> /// <summary>
/// Add event to event execution queue /// Add event to event execution queue
/// </summary> /// </summary>
/// <param name="localID"></param> /// <param name="localID"></param>
/// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
/// <param name="param">Array of parameters to match event mask</param> /// <param name="param">Array of parameters to match event mask</param>
public void AddToObjectQueue(uint localID, string FunctionName, object[] param) public void AddToObjectQueue(uint localID, string FunctionName, object[] param)
{ {
// Determine all scripts in Object and add to their queue // Determine all scripts in Object and add to their queue
//myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName);
// Do we have any scripts in this object at all? If not, return // Do we have any scripts in this object at all? If not, return
if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false)
{ {
//Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID.");
return; return;
} }
Dictionary<LLUUID, LSL_BaseClass>.KeyCollection scriptKeys = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); Dictionary<LLUUID, LSL_BaseClass>.KeyCollection scriptKeys = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID);
foreach ( LLUUID itemID in scriptKeys ) foreach ( LLUUID itemID in scriptKeys )
{ {
// Add to each script in that object // Add to each script in that object
// TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter? // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter?
AddToScriptQueue(localID, itemID, FunctionName, param); AddToScriptQueue(localID, itemID, FunctionName, param);
} }
} }
/// <summary> /// <summary>
/// Add event to event execution queue /// Add event to event execution queue
/// </summary> /// </summary>
/// <param name="localID"></param> /// <param name="localID"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
/// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
/// <param name="param">Array of parameters to match event mask</param> /// <param name="param">Array of parameters to match event mask</param>
public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, object[] param) public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, object[] param)
{ {
lock (queueLock) lock (queueLock)
{ {
// Create a structure and add data // Create a structure and add data
QueueItemStruct QIS = new QueueItemStruct(); QueueItemStruct QIS = new QueueItemStruct();
QIS.localID = localID; QIS.localID = localID;
QIS.itemID = itemID; QIS.itemID = itemID;
QIS.functionName = FunctionName; QIS.functionName = FunctionName;
QIS.param = param; QIS.param = param;
// Add it to queue // Add it to queue
eventQueue.Enqueue(QIS); eventQueue.Enqueue(QIS);
} }
} }
} }
} }

View File

@ -1,148 +1,148 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using libsecondlife; using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
/// <summary> /// <summary>
/// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc.
/// </summary> /// </summary>
class LSLLongCmdHandler class LSLLongCmdHandler
{ {
private Thread cmdHandlerThread; private Thread cmdHandlerThread;
private int cmdHandlerThreadCycleSleepms = 100; private int cmdHandlerThreadCycleSleepms = 100;
private ScriptEngine m_ScriptEngine; private ScriptEngine m_ScriptEngine;
public LSLLongCmdHandler(ScriptEngine _ScriptEngine) public LSLLongCmdHandler(ScriptEngine _ScriptEngine)
{ {
m_ScriptEngine = _ScriptEngine; m_ScriptEngine = _ScriptEngine;
// Start the thread that will be doing the work // Start the thread that will be doing the work
cmdHandlerThread = new Thread(CmdHandlerThreadLoop); cmdHandlerThread = new Thread(CmdHandlerThreadLoop);
cmdHandlerThread.Name = "CmdHandlerThread"; cmdHandlerThread.Name = "CmdHandlerThread";
cmdHandlerThread.Priority = ThreadPriority.BelowNormal; cmdHandlerThread.Priority = ThreadPriority.BelowNormal;
cmdHandlerThread.IsBackground = true; cmdHandlerThread.IsBackground = true;
cmdHandlerThread.Start(); cmdHandlerThread.Start();
} }
~LSLLongCmdHandler() ~LSLLongCmdHandler()
{ {
// Shut down thread // Shut down thread
try try
{ {
if (cmdHandlerThread != null) if (cmdHandlerThread != null)
{ {
if (cmdHandlerThread.IsAlive == true) if (cmdHandlerThread.IsAlive == true)
{ {
cmdHandlerThread.Abort(); cmdHandlerThread.Abort();
cmdHandlerThread.Join(); cmdHandlerThread.Join();
} }
} }
} }
catch { } catch { }
} }
private void CmdHandlerThreadLoop() private void CmdHandlerThreadLoop()
{ {
while (true) while (true)
{ {
// Check timers // Check timers
CheckTimerEvents(); CheckTimerEvents();
// Sleep before next cycle // Sleep before next cycle
Thread.Sleep(cmdHandlerThreadCycleSleepms); Thread.Sleep(cmdHandlerThreadCycleSleepms);
} }
} }
/// <summary> /// <summary>
/// Remove a specific script (and all its pending commands) /// Remove a specific script (and all its pending commands)
/// </summary> /// </summary>
/// <param name="m_localID"></param> /// <param name="m_localID"></param>
/// <param name="m_itemID"></param> /// <param name="m_itemID"></param>
public void RemoveScript(uint m_localID, LLUUID m_itemID) public void RemoveScript(uint m_localID, LLUUID m_itemID)
{ {
// Remove a specific script // Remove a specific script
// Remove from: Timers // Remove from: Timers
UnSetTimerEvents(m_localID, m_itemID); UnSetTimerEvents(m_localID, m_itemID);
} }
// //
// TIMER // TIMER
// //
private class TimerClass private class TimerClass
{ {
public uint localID; public uint localID;
public LLUUID itemID; public LLUUID itemID;
public double interval; public double interval;
public DateTime next; public DateTime next;
} }
private List<TimerClass> Timers = new List<TimerClass>(); private List<TimerClass> Timers = new List<TimerClass>();
private object ListLock = new object(); private object ListLock = new object();
public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec)
{ {
Console.WriteLine("SetTimerEvent"); Console.WriteLine("SetTimerEvent");
// Always remove first, in case this is a re-set // Always remove first, in case this is a re-set
UnSetTimerEvents(m_localID, m_itemID); UnSetTimerEvents(m_localID, m_itemID);
if (sec == 0) // Disabling timer if (sec == 0) // Disabling timer
return; return;
// Add to timer // Add to timer
TimerClass ts = new TimerClass(); TimerClass ts = new TimerClass();
ts.localID = m_localID; ts.localID = m_localID;
ts.itemID = m_itemID; ts.itemID = m_itemID;
ts.interval = sec; ts.interval = sec;
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
lock (ListLock) lock (ListLock)
{ {
Timers.Add(ts); Timers.Add(ts);
} }
} }
public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID)
{ {
// Remove from timer // Remove from timer
lock (ListLock) lock (ListLock)
{ {
List<TimerClass> NewTimers = new List<TimerClass>(); List<TimerClass> NewTimers = new List<TimerClass>();
foreach (TimerClass ts in Timers) foreach (TimerClass ts in Timers)
{ {
if (ts.localID != m_localID && ts.itemID != m_itemID) if (ts.localID != m_localID && ts.itemID != m_itemID)
{ {
NewTimers.Add(ts); NewTimers.Add(ts);
} }
} }
Timers.Clear(); Timers.Clear();
Timers = NewTimers; Timers = NewTimers;
} }
} }
public void CheckTimerEvents() public void CheckTimerEvents()
{ {
// Nothing to do here? // Nothing to do here?
if (Timers.Count == 0) if (Timers.Count == 0)
return; return;
lock (ListLock) lock (ListLock)
{ {
// Go through all timers // Go through all timers
foreach (TimerClass ts in Timers) foreach (TimerClass ts in Timers)
{ {
// Time has passed? // Time has passed?
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
{ {
// Add it to queue // Add it to queue
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", new object[] { }); m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", new object[] { });
// set next interval // set next interval
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
} }
} }
} // lock } // lock
} }
} }
} }

View File

@ -1,35 +1,35 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.DotNetEngine")] [assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.DotNetEngine")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OpenSim.Region.ScriptEngine.DotNetEngine")] [assembly: AssemblyProduct("OpenSim.Region.ScriptEngine.DotNetEngine")]
[assembly: AssemblyCopyright("Copyright © 2007")] [assembly: AssemblyCopyright("Copyright © 2007")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible // Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from // to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. // COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)] [assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM // The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("2842257e-6fde-4460-9368-4cde57fa9cc4")] [assembly: Guid("2842257e-6fde-4460-9368-4cde57fa9cc4")]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //
// Major Version // Major Version
// Minor Version // Minor Version
// Build Number // Build Number
// Revision // Revision
// //
// You can specify all the values or you can default the Revision and Build Numbers // You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,132 +1,132 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using libsecondlife; using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
/// <summary> /// <summary>
/// This is the root object for ScriptEngine /// This is the root object for ScriptEngine
/// </summary> /// </summary>
[Serializable] [Serializable]
public class ScriptEngine :IRegionModule public class ScriptEngine :IRegionModule
{ {
internal OpenSim.Region.Environment.Scenes.Scene World; internal OpenSim.Region.Environment.Scenes.Scene World;
internal EventManager m_EventManager; // Handles and queues incoming events from OpenSim internal EventManager m_EventManager; // Handles and queues incoming events from OpenSim
internal EventQueueManager m_EventQueueManager; // Executes events internal EventQueueManager m_EventQueueManager; // Executes events
internal ScriptManager m_ScriptManager; // Load, unload and execute scripts internal ScriptManager m_ScriptManager; // Load, unload and execute scripts
internal AppDomainManager m_AppDomainManager; internal AppDomainManager m_AppDomainManager;
internal LSLLongCmdHandler m_LSLLongCmdHandler; internal LSLLongCmdHandler m_LSLLongCmdHandler;
private OpenSim.Framework.Console.LogBase m_log; private OpenSim.Framework.Console.LogBase m_log;
public ScriptEngine() public ScriptEngine()
{ {
//Common.SendToDebug("ScriptEngine Object Initialized"); //Common.SendToDebug("ScriptEngine Object Initialized");
Common.mySE = this; Common.mySE = this;
} }
public LogBase Log public LogBase Log
{ {
get { return m_log; } get { return m_log; }
} }
public void InitializeEngine(OpenSim.Region.Environment.Scenes.Scene Sceneworld, OpenSim.Framework.Console.LogBase logger) public void InitializeEngine(OpenSim.Region.Environment.Scenes.Scene Sceneworld, OpenSim.Framework.Console.LogBase logger)
{ {
World = Sceneworld; World = Sceneworld;
m_log = logger; m_log = logger;
Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing"); Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing");
//m_logger.Status("ScriptEngine", "InitializeEngine"); //m_logger.Status("ScriptEngine", "InitializeEngine");
// Create all objects we'll be using // Create all objects we'll be using
m_EventQueueManager = new EventQueueManager(this); m_EventQueueManager = new EventQueueManager(this);
m_EventManager = new EventManager(this); m_EventManager = new EventManager(this);
m_ScriptManager = new ScriptManager(this); m_ScriptManager = new ScriptManager(this);
m_AppDomainManager = new AppDomainManager(); m_AppDomainManager = new AppDomainManager();
m_LSLLongCmdHandler = new LSLLongCmdHandler(this); m_LSLLongCmdHandler = new LSLLongCmdHandler(this);
// 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?
} }
public void Shutdown() public void Shutdown()
{ {
// We are shutting down // We are shutting down
} }
//// !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app) //// !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app)
//[Obsolete("!!!FOR DEBUGGING ONLY!!!")] //[Obsolete("!!!FOR DEBUGGING ONLY!!!")]
//public void StartScript(string ScriptID, IScriptHost ObjectID) //public void StartScript(string ScriptID, IScriptHost ObjectID)
//{ //{
// this.myEventManager.TEMP_OBJECT_ID = ObjectID; // this.myEventManager.TEMP_OBJECT_ID = ObjectID;
// Log.Status("ScriptEngine", "DEBUG FUNCTION: StartScript: " + ScriptID); // Log.Status("ScriptEngine", "DEBUG FUNCTION: StartScript: " + ScriptID);
// myScriptManager.StartScript(ScriptID, ObjectID); // myScriptManager.StartScript(ScriptID, ObjectID);
//} //}
#region IRegionModule #region IRegionModule
public void Initialise(Scene scene) public void Initialise(Scene scene)
{ {
this.InitializeEngine(scene, MainLog.Instance); this.InitializeEngine(scene, MainLog.Instance);
} }
public void PostInitialise() public void PostInitialise()
{ {
} }
public void CloseDown() public void CloseDown()
{ {
} }
public string GetName() public string GetName()
{ {
return "LSLScriptingModule"; return "LSLScriptingModule";
} }
public bool IsSharedModule() public bool IsSharedModule()
{ {
return false; return false;
} }
#endregion #endregion
} }
} }

View File

@ -1,408 +1,408 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
/* Original code: Tedd Hansen */ /* Original code: Tedd Hansen */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Reflection; using System.Reflection;
using System.Runtime.Remoting; using System.Runtime.Remoting;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Binary;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler; using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler;
using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
using OpenSim.Region.ScriptEngine.Common; using OpenSim.Region.ScriptEngine.Common;
using libsecondlife; using libsecondlife;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
/// <summary> /// <summary>
/// Loads scripts /// Loads scripts
/// Compiles them if necessary /// Compiles them if necessary
/// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution) /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution)
/// </summary> /// </summary>
[Serializable] [Serializable]
public class ScriptManager public class ScriptManager
{ {
#region Declares #region Declares
private Thread scriptLoadUnloadThread; private Thread scriptLoadUnloadThread;
private int scriptLoadUnloadThread_IdleSleepms = 100; private int scriptLoadUnloadThread_IdleSleepms = 100;
private Queue<LoadStruct> loadQueue = new Queue<LoadStruct>(); private Queue<LoadStruct> loadQueue = new Queue<LoadStruct>();
private Queue<UnloadStruct> unloadQueue = new Queue<UnloadStruct>(); private Queue<UnloadStruct> unloadQueue = new Queue<UnloadStruct>();
private struct LoadStruct private struct LoadStruct
{ {
public uint localID; public uint localID;
public LLUUID itemID; public LLUUID itemID;
public string script; public string script;
} }
private struct UnloadStruct private struct UnloadStruct
{ {
public uint localID; public uint localID;
public LLUUID itemID; public LLUUID itemID;
} }
// Object<string, Script<string, script>> // Object<string, Script<string, script>>
// IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
// Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead!
internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>(); internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>();
public Scene World public Scene World
{ {
get get
{ {
return m_scriptEngine.World; return m_scriptEngine.World;
} }
} }
#endregion #endregion
#region Object init/shutdown #region Object init/shutdown
private ScriptEngine m_scriptEngine; private ScriptEngine m_scriptEngine;
public ScriptManager(ScriptEngine scriptEngine) public ScriptManager(ScriptEngine scriptEngine)
{ {
m_scriptEngine = scriptEngine; m_scriptEngine = scriptEngine;
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop); scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop);
scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread"; scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread";
scriptLoadUnloadThread.IsBackground = true; scriptLoadUnloadThread.IsBackground = true;
scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal; scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal;
scriptLoadUnloadThread.Start(); scriptLoadUnloadThread.Start();
} }
~ScriptManager () ~ScriptManager ()
{ {
// Abort load/unload thread // Abort load/unload thread
try try
{ {
if (scriptLoadUnloadThread != null) if (scriptLoadUnloadThread != null)
{ {
if (scriptLoadUnloadThread.IsAlive == true) if (scriptLoadUnloadThread.IsAlive == true)
{ {
scriptLoadUnloadThread.Abort(); scriptLoadUnloadThread.Abort();
scriptLoadUnloadThread.Join(); scriptLoadUnloadThread.Join();
} }
} }
} }
catch catch
{ {
} }
} }
#endregion #endregion
#region Load / Unload scripts (Thread loop) #region Load / Unload scripts (Thread loop)
private void ScriptLoadUnloadThreadLoop() private void ScriptLoadUnloadThreadLoop()
{ {
try try
{ {
while (true) while (true)
{ {
if (loadQueue.Count == 0 && unloadQueue.Count == 0) if (loadQueue.Count == 0 && unloadQueue.Count == 0)
Thread.Sleep(scriptLoadUnloadThread_IdleSleepms); Thread.Sleep(scriptLoadUnloadThread_IdleSleepms);
if (loadQueue.Count > 0) if (loadQueue.Count > 0)
{ {
LoadStruct item = loadQueue.Dequeue(); LoadStruct item = loadQueue.Dequeue();
_StartScript(item.localID, item.itemID, item.script); _StartScript(item.localID, item.itemID, item.script);
} }
if (unloadQueue.Count > 0) if (unloadQueue.Count > 0)
{ {
UnloadStruct item = unloadQueue.Dequeue(); UnloadStruct item = unloadQueue.Dequeue();
_StopScript(item.localID, item.itemID); _StopScript(item.localID, item.itemID);
} }
} }
} }
catch (ThreadAbortException tae) catch (ThreadAbortException tae)
{ {
string a = tae.ToString(); string a = tae.ToString();
a = ""; a = "";
// Expected // Expected
} }
} }
#endregion #endregion
#region Helper functions #region Helper functions
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{ {
//Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name); //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name);
return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null;
} }
#endregion #endregion
#region Internal functions to keep track of script #region Internal functions to keep track of script
internal Dictionary<LLUUID, LSL_BaseClass>.KeyCollection GetScriptKeys(uint localID) internal Dictionary<LLUUID, LSL_BaseClass>.KeyCollection GetScriptKeys(uint localID)
{ {
if (Scripts.ContainsKey(localID) == false) if (Scripts.ContainsKey(localID) == false)
return null; return null;
Dictionary<LLUUID, LSL_BaseClass> Obj; Dictionary<LLUUID, LSL_BaseClass> Obj;
Scripts.TryGetValue(localID, out Obj); Scripts.TryGetValue(localID, out Obj);
return Obj.Keys; return Obj.Keys;
} }
internal LSL_BaseClass GetScript(uint localID, LLUUID itemID) internal LSL_BaseClass GetScript(uint localID, LLUUID itemID)
{ {
if (Scripts.ContainsKey(localID) == false) if (Scripts.ContainsKey(localID) == false)
return null; return null;
Dictionary<LLUUID, LSL_BaseClass> Obj; Dictionary<LLUUID, LSL_BaseClass> Obj;
Scripts.TryGetValue(localID, out Obj); Scripts.TryGetValue(localID, out Obj);
if (Obj.ContainsKey(itemID) == false) if (Obj.ContainsKey(itemID) == false)
return null; return null;
// Get script // Get script
LSL_BaseClass Script; LSL_BaseClass Script;
Obj.TryGetValue(itemID, out Script); Obj.TryGetValue(itemID, out Script);
return Script; return Script;
} }
internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script) internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script)
{ {
// Create object if it doesn't exist // Create object if it doesn't exist
if (Scripts.ContainsKey(localID) == false) if (Scripts.ContainsKey(localID) == false)
{ {
Scripts.Add(localID, new Dictionary<LLUUID, LSL_BaseClass>()); Scripts.Add(localID, new Dictionary<LLUUID, LSL_BaseClass>());
} }
// Delete script if it exists // Delete script if it exists
Dictionary<LLUUID, LSL_BaseClass> Obj; Dictionary<LLUUID, LSL_BaseClass> Obj;
Scripts.TryGetValue(localID, out Obj); Scripts.TryGetValue(localID, out Obj);
if (Obj.ContainsKey(itemID) == true) if (Obj.ContainsKey(itemID) == true)
Obj.Remove(itemID); Obj.Remove(itemID);
// Add to object // Add to object
Obj.Add(itemID, Script); Obj.Add(itemID, Script);
} }
internal void RemoveScript(uint localID, LLUUID itemID) internal void RemoveScript(uint localID, LLUUID itemID)
{ {
// Don't have that object? // Don't have that object?
if (Scripts.ContainsKey(localID) == false) if (Scripts.ContainsKey(localID) == false)
return; return;
// Delete script if it exists // Delete script if it exists
Dictionary<LLUUID, LSL_BaseClass> Obj; Dictionary<LLUUID, LSL_BaseClass> Obj;
Scripts.TryGetValue(localID, out Obj); Scripts.TryGetValue(localID, out Obj);
if (Obj.ContainsKey(itemID) == true) if (Obj.ContainsKey(itemID) == true)
Obj.Remove(itemID); Obj.Remove(itemID);
} }
#endregion #endregion
#region Start/Stop script #region Start/Stop script
/// <summary> /// <summary>
/// Fetches, loads and hooks up a script to an objects events /// Fetches, loads and hooks up a script to an objects events
/// </summary> /// </summary>
/// <param name="itemID"></param> /// <param name="itemID"></param>
/// <param name="localID"></param> /// <param name="localID"></param>
public void StartScript(uint localID, LLUUID itemID, string Script) public void StartScript(uint localID, LLUUID itemID, string Script)
{ {
LoadStruct ls = new LoadStruct(); LoadStruct ls = new LoadStruct();
ls.localID = localID; ls.localID = localID;
ls.itemID = itemID; ls.itemID = itemID;
ls.script = Script; ls.script = Script;
loadQueue.Enqueue(ls); loadQueue.Enqueue(ls);
} }
/// <summary> /// <summary>
/// Disables and unloads a script /// Disables and unloads a script
/// </summary> /// </summary>
/// <param name="localID"></param> /// <param name="localID"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
public void StopScript(uint localID, LLUUID itemID) public void StopScript(uint localID, LLUUID itemID)
{ {
UnloadStruct ls = new UnloadStruct(); UnloadStruct ls = new UnloadStruct();
ls.localID = localID; ls.localID = localID;
ls.itemID = itemID; ls.itemID = itemID;
unloadQueue.Enqueue(ls); unloadQueue.Enqueue(ls);
} }
private void _StartScript(uint localID, LLUUID itemID, string Script) private void _StartScript(uint localID, LLUUID itemID, string Script)
{ {
//IScriptHost root = host.GetRoot(); //IScriptHost root = host.GetRoot();
Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID); Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID);
// We will initialize and start the script. // We will initialize and start the script.
// It will be up to the script itself to hook up the correct events. // It will be up to the script itself to hook up the correct events.
string FileName = ""; string FileName = "";
IScriptHost m_host = World.GetSceneObjectPart(localID); IScriptHost m_host = World.GetSceneObjectPart(localID);
try try
{ {
// Create a new instance of the compiler (currently we don't want reuse) // 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(); OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
// Compile (We assume LSL) // Compile (We assume LSL)
FileName = LSLCompiler.CompileFromLSLText(Script); FileName = LSLCompiler.CompileFromLSLText(Script);
//Console.WriteLine("Compilation of " + FileName + " done"); //Console.WriteLine("Compilation of " + FileName + " done");
// * Insert yield into code // * Insert yield into code
FileName = ProcessYield(FileName); FileName = ProcessYield(FileName);
#if DEBUG #if DEBUG
long before; long before;
before = GC.GetTotalMemory(true); before = GC.GetTotalMemory(true);
#endif #endif
LSL_BaseClass CompiledScript; LSL_BaseClass CompiledScript;
CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(FileName); CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(FileName);
#if DEBUG #if DEBUG
Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before); Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before);
#endif #endif
// Add it to our script memstruct // Add it to our script memstruct
SetScript(localID, itemID, CompiledScript); SetScript(localID, itemID, CompiledScript);
// 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 FullitemID so that it can bring that on to the server whenever needed. // 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(m_scriptEngine, m_host, localID, itemID); LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID);
// Start the script - giving it BuiltIns // Start the script - giving it BuiltIns
CompiledScript.Start(LSLB); CompiledScript.Start(LSLB);
// Fire the first start-event // Fire the first start-event
m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] { }); m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] { });
} }
catch (Exception e) catch (Exception e)
{ {
//m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString()); //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString());
try try
{ {
// DISPLAY ERROR INWORLD // DISPLAY ERROR INWORLD
string text = "Error compiling script:\r\n" + e.Message.ToString(); string text = "Error compiling script:\r\n" + e.Message.ToString();
if (text.Length > 1500) if (text.Length > 1500)
text = text.Substring(0, 1500); text = text.Substring(0, 1500);
World.SimChat(Helpers.StringToField(text), 1, m_host.AbsolutePosition, m_host.Name, m_host.UUID); World.SimChat(Helpers.StringToField(text), 1, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
} }
catch (Exception e2) catch (Exception e2)
{ {
m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString()); m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString());
} }
} }
} }
private void _StopScript(uint localID, LLUUID itemID) private void _StopScript(uint localID, LLUUID itemID)
{ {
// Stop script // Stop script
Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString()); Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString());
// Stop long command on script // Stop long command on script
m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID); m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID);
LSL_BaseClass LSLBC = GetScript(localID, itemID); LSL_BaseClass LSLBC = GetScript(localID, itemID);
if (LSLBC == null) if (LSLBC == null)
return; return;
// TEMP: First serialize it // TEMP: First serialize it
//GetSerializedScript(localID, itemID); //GetSerializedScript(localID, itemID);
try try
{ {
// Get AppDomain // Get AppDomain
AppDomain ad = LSLBC.Exec.GetAppDomain(); AppDomain ad = LSLBC.Exec.GetAppDomain();
// Tell script not to accept new requests // Tell script not to accept new requests
GetScript(localID, itemID).Exec.StopScript(); GetScript(localID, itemID).Exec.StopScript();
// Remove from internal structure // Remove from internal structure
RemoveScript(localID, itemID); RemoveScript(localID, itemID);
// Tell AppDomain that we have stopped script // Tell AppDomain that we have stopped script
m_scriptEngine.m_AppDomainManager.StopScript(ad); m_scriptEngine.m_AppDomainManager.StopScript(ad);
} }
catch(Exception e) catch(Exception e)
{ {
Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + ": " + e.ToString()); Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + ": " + e.ToString());
} }
} }
private string ProcessYield(string FileName) private string ProcessYield(string FileName)
{ {
// TODO: Create a new assembly and copy old but insert Yield Code // TODO: Create a new assembly and copy old but insert Yield Code
//return TempDotNetMicroThreadingCodeInjector.TestFix(FileName); //return TempDotNetMicroThreadingCodeInjector.TestFix(FileName);
return FileName; return FileName;
} }
#endregion #endregion
#region Perform event execution in script #region Perform event execution in script
/// <summary> /// <summary>
/// Execute a LL-event-function in Script /// Execute a LL-event-function in Script
/// </summary> /// </summary>
/// <param name="localID">Object the script is located in</param> /// <param name="localID">Object the script is located in</param>
/// <param name="itemID">Script ID</param> /// <param name="itemID">Script ID</param>
/// <param name="FunctionName">Name of function</param> /// <param name="FunctionName">Name of function</param>
/// <param name="args">Arguments to pass to function</param> /// <param name="args">Arguments to pass to function</param>
internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args) internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args)
{ {
// Execute a function in the script // Execute a function in the script
//m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); //m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName);
LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID); LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID);
if (Script == null) if (Script == null)
return; return;
// Must be done in correct AppDomain, so leaving it up to the script itself // Must be done in correct AppDomain, so leaving it up to the script itself
Script.Exec.ExecuteEvent(FunctionName, args); Script.Exec.ExecuteEvent(FunctionName, args);
} }
#endregion #endregion
#region Script serialization/deserialization #region Script serialization/deserialization
public void GetSerializedScript(uint localID, LLUUID itemID) public void GetSerializedScript(uint localID, LLUUID itemID)
{ {
// Serialize the script and return it // Serialize the script and return it
// Should not be a problem // Should not be a problem
System.IO.FileStream fs = System.IO.File.Create("SERIALIZED_SCRIPT_" + itemID); System.IO.FileStream fs = System.IO.File.Create("SERIALIZED_SCRIPT_" + itemID);
BinaryFormatter b = new BinaryFormatter(); BinaryFormatter b = new BinaryFormatter();
b.Serialize(fs, GetScript(localID,itemID)); b.Serialize(fs, GetScript(localID,itemID));
fs.Close(); fs.Close();
} }
public void PutSerializedScript(uint localID, LLUUID itemID) public void PutSerializedScript(uint localID, LLUUID itemID)
{ {
// Deserialize the script and inject it into an AppDomain // Deserialize the script and inject it into an AppDomain
// How to inject into an AppDomain? // How to inject into an AppDomain?
} }
#endregion #endregion
} }
} }

View File

@ -1,45 +1,45 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Rail.Transformation; using Rail.Transformation;
using Rail.Reflect; using Rail.Reflect;
using Rail.Exceptions; using Rail.Exceptions;
using Rail.MSIL; using Rail.MSIL;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
/// <summary> /// <summary>
/// Tedds Sandbox for RAIL/microtrheading. This class is only for testing purposes! /// Tedds Sandbox for RAIL/microtrheading. This class is only for testing purposes!
/// Its offspring will be the actual implementation. /// Its offspring will be the actual implementation.
/// </summary> /// </summary>
class TempDotNetMicroThreadingCodeInjector class TempDotNetMicroThreadingCodeInjector
{ {
public static string TestFix(string FileName) public static string TestFix(string FileName)
{ {
string ret = System.IO.Path.GetFileNameWithoutExtension(FileName + "_fixed.dll"); string ret = System.IO.Path.GetFileNameWithoutExtension(FileName + "_fixed.dll");
Console.WriteLine("Loading: \"" + FileName + "\""); Console.WriteLine("Loading: \"" + FileName + "\"");
RAssemblyDef rAssembly = RAssemblyDef.LoadAssembly(FileName); RAssemblyDef rAssembly = RAssemblyDef.LoadAssembly(FileName);
//Get the type of the method to copy from assembly Teste2.exe to assembly Teste.exe //Get the type of the method to copy from assembly Teste2.exe to assembly Teste.exe
RTypeDef type = (RTypeDef)rAssembly.RModuleDef.GetType("SecondLife.Script"); RTypeDef type = (RTypeDef)rAssembly.RModuleDef.GetType("SecondLife.Script");
//Get the methods in the type //Get the methods in the type
RMethod[] m = type.GetMethods(); RMethod[] m = type.GetMethods();
//Create a MethodPrologueAdder visitor object with the method to add //Create a MethodPrologueAdder visitor object with the method to add
//and with the flag that enables local variable creation set to true //and with the flag that enables local variable creation set to true
MethodPrologueAdder mpa = new MethodPrologueAdder((RMethodDef)m[0], true); MethodPrologueAdder mpa = new MethodPrologueAdder((RMethodDef)m[0], true);
//Apply the changes to the assembly //Apply the changes to the assembly
rAssembly.Accept(mpa); rAssembly.Accept(mpa);
//Save the new assembly //Save the new assembly
rAssembly.SaveAssembly(ret); rAssembly.SaveAssembly(ret);
return ret; return ret;
} }
} }
} }