aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL')
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Common.cs84
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Engine.cs300
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/IL_common_functions.cs56
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs58
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_Builtins.cs373
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_OPCODES.cs342
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_CLRInterface.cs79
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_OPCODE_IL_processor.cs435
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Enums.cs557
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Parser.cs722
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Struct.cs135
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_Interface.cs368
-rw-r--r--OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_TestImplementation.cs386
13 files changed, 3895 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Common.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Common.cs
new file mode 100644
index 0000000..1f24d9b
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Common.cs
@@ -0,0 +1,84 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
34{
35 public static class Common
36 {
37 static public bool Debug = true;
38 static public bool IL_UseTryCatch = true;
39 static public bool IL_CreateConstructor = true;
40 static public bool IL_CreateFunctionList = true;
41 static public bool IL_ProcessCodeChunks = true;
42
43 public delegate void SendToDebugEventDelegate(string Message);
44 public delegate void SendToLogEventDelegate(string Message);
45 static public event SendToDebugEventDelegate SendToDebugEvent;
46 static public event SendToLogEventDelegate SendToLogEvent;
47
48 static public void SendToDebug(string Message)
49 {
50 //if (Debug == true)
51 Console.WriteLine("COMPILER:Debug: " + Message);
52 SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
53 }
54 static public void SendToLog(string Message)
55 {
56 //if (Debug == true)
57 Console.WriteLine("COMPILER:LOG: " + Message);
58 SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
59 }
60 }
61
62 // TEMPORARY TEST THINGIES
63 public static class IL_Helper
64 {
65 public static string ReverseFormatString(string text1, string format)
66 {
67 Common.SendToDebug("ReverseFormatString text1: " + text1);
68 Common.SendToDebug("ReverseFormatString format: " + format);
69 return string.Format(format, text1);
70 }
71 public static string ReverseFormatString(string text1, UInt32 text2, string format)
72 {
73 Common.SendToDebug("ReverseFormatString text1: " + text1);
74 Common.SendToDebug("ReverseFormatString text2: " + text2.ToString());
75 Common.SendToDebug("ReverseFormatString format: " + format);
76 return string.Format(format, text1, text2.ToString());
77 }
78 public static string Cast_ToString(object obj)
79 {
80 Common.SendToDebug("OBJECT TO BE CASTED: " + obj.GetType().ToString());
81 return "ABCDEFGIHJKLMNOPQ123";
82 }
83 }
84}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Engine.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Engine.cs
new file mode 100644
index 0000000..2db35c4
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Engine.cs
@@ -0,0 +1,300 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Reflection;
31using System.Reflection.Emit;
32using System.Threading;
33
34
35namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
36{
37
38
39 public class Engine
40 {
41 //private string LSO_FileName = @"LSO\AdditionTest.lso";
42 private string LSO_FileName;// = @"LSO\CloseToDefault.lso";
43 AppDomain appDomain;
44
45 public string Compile(string LSOFileName)
46 {
47 LSO_FileName = LSOFileName;
48
49
50 //appDomain = AppDomain.CreateDomain("AlternateAppDomain");
51 appDomain = Thread.GetDomain();
52
53 // Create Assembly Name
54 AssemblyName asmName = new AssemblyName();
55 asmName.Name = System.IO.Path.GetFileNameWithoutExtension(LSO_FileName);
56 //asmName.Name = "TestAssembly";
57
58 string DLL_FileName = asmName.Name + ".dll";
59 string DLL_FileName_WithPath = System.IO.Path.GetDirectoryName(LSO_FileName) + @"\" + DLL_FileName;
60
61 Common.SendToLog("LSO File Name: " + System.IO.Path.GetFileName(LSO_FileName));
62 Common.SendToLog("Assembly name: " + asmName.Name);
63 Common.SendToLog("Assembly File Name: " + asmName.Name + ".dll");
64 Common.SendToLog("Starting processing of LSL ByteCode...");
65 Common.SendToLog("");
66
67
68
69 // Create Assembly
70 AssemblyBuilder asmBuilder = appDomain.DefineDynamicAssembly(
71 asmName,
72 AssemblyBuilderAccess.RunAndSave
73 );
74 //// Create Assembly
75 //AssemblyBuilder asmBuilder =
76 // Thread.GetDomain().DefineDynamicAssembly
77 //(asmName, AssemblyBuilderAccess.RunAndSave);
78
79 // Create a module (and save to disk)
80 ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule
81 (asmName.Name,
82 DLL_FileName);
83
84 //Common.SendToDebug("asmName.Name is still \"" + asmName.Name + "\"");
85 // Create a Class (/Type)
86 TypeBuilder typeBuilder = modBuilder.DefineType(
87 "LSL_ScriptObject",
88 TypeAttributes.Public | TypeAttributes.BeforeFieldInit,
89 typeof(OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass));
90 //,
91 // typeof());
92 //, typeof(LSL_BuiltIn_Commands_Interface));
93 //,
94 // typeof(object),
95 // new Type[] { typeof(LSL_CLRInterface.LSLScript) });
96
97
98
99 /*
100 * Generate the IL itself
101 */
102
103 LSO_Parser LSOP = new LSO_Parser(LSO_FileName, typeBuilder);
104 LSOP.OpenFile();
105 LSOP.Parse();
106
107 // Constructor has to be created AFTER LSO_Parser because of accumulated variables
108 if (Common.IL_CreateConstructor)
109 IL_CREATE_CONSTRUCTOR(typeBuilder, LSOP);
110
111 LSOP.CloseFile();
112 /*
113 * Done generating. Create a type and run it.
114 */
115
116
117 Common.SendToLog("Attempting to compile assembly...");
118 // Compile it
119 Type type = typeBuilder.CreateType();
120 Common.SendToLog("Compilation successful!");
121
122 Common.SendToLog("Saving assembly: " + DLL_FileName);
123 asmBuilder.Save(DLL_FileName);
124
125 Common.SendToLog("Returning assembly filename: " + DLL_FileName);
126
127
128 return DLL_FileName;
129
130
131 //Common.SendToLog("Creating an instance of new assembly...");
132 //// Create an instance we can play with
133 ////LSLScript hello = (LSLScript)Activator.CreateInstance(type);
134 ////LSL_CLRInterface.LSLScript MyScript = (LSL_CLRInterface.LSLScript)Activator.CreateInstance(type);
135 //object MyScript = (object)Activator.CreateInstance(type);
136
137
138
139
140
141 //System.Reflection.MemberInfo[] Members = type.GetMembers();
142
143 //Common.SendToLog("Members of assembly " + type.ToString() + ":");
144 //foreach (MemberInfo member in Members)
145 // Common.SendToLog(member.ToString());
146
147
148 //// Play with it
149 ////MyScript.event_state_entry("Test");
150 //object[] args = { null };
151 ////System.Collections.Generic.List<string> Functions = (System.Collections.Generic.List<string>)type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null);
152
153 //string[] ret = { };
154 //if (Common.IL_CreateFunctionList)
155 // ret = (string[])type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null);
156
157 //foreach (string s in ret)
158 //{
159 // Common.SendToLog("");
160 // Common.SendToLog("*** Executing LSL Server Event: " + s);
161 // //object test = type.GetMember(s);
162 // //object runner = type.InvokeMember(s, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, MyScript, args);
163 // //runner();
164 // //objBooks_Late = type.InvokeMember(s, BindingFlags.CreateInstance, null, objApp_Late, null);
165 // type.InvokeMember(s, BindingFlags.InvokeMethod, null, MyScript, new object[] { "Test" });
166
167 //}
168
169
170 }
171
172
173 private static void IL_CREATE_CONSTRUCTOR(TypeBuilder typeBuilder, LSO_Parser LSOP)
174 {
175
176
177 Common.SendToDebug("IL_CREATE_CONSTRUCTOR()");
178 //ConstructorBuilder constructor = typeBuilder.DefineConstructor(
179 // MethodAttributes.Public,
180 // CallingConventions.Standard,
181 // new Type[0]);
182 ConstructorBuilder constructor = typeBuilder.DefineConstructor(
183 MethodAttributes.Public |
184 MethodAttributes.SpecialName |
185 MethodAttributes.RTSpecialName,
186 CallingConventions.Standard,
187 new Type[0]);
188
189 //Define the reflection ConstructorInfor for System.Object
190 ConstructorInfo conObj = typeof(LSL_BaseClass).GetConstructor(new Type[0]);
191
192 //call constructor of base object
193 ILGenerator il = constructor.GetILGenerator();
194
195 il.Emit(OpCodes.Ldarg_0);
196 il.Emit(OpCodes.Call, conObj);
197
198
199 //Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: UInt32 State = 0;");
200 //string FieldName;
201 //// Create state object
202 //FieldName = "State";
203 //FieldBuilder State_fb = typeBuilder.DefineField(
204 // FieldName,
205 // typeof(UInt32),
206 // FieldAttributes.Public);
207 //il.Emit(OpCodes.Ldarg_0);
208 //il.Emit(OpCodes.Ldc_I4, 0);
209 //il.Emit(OpCodes.Stfld, State_fb);
210
211
212 //Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: LSL_BuiltIn_Commands_TestImplementation LSL_BuiltIns = New LSL_BuiltIn_Commands_TestImplementation();");
213 ////Type objType1 = typeof(object);
214 //Type objType1 = typeof(LSL_BuiltIn_Commands_TestImplementation);
215
216 //FieldName = "LSL_BuiltIns";
217 //FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField(
218 // FieldName,
219 // objType1,
220 // FieldAttributes.Public);
221
222 ////LSL_BuiltIn_Commands_TestImplementation _ti = new LSL_BuiltIn_Commands_TestImplementation();
223 //il.Emit(OpCodes.Ldarg_0);
224 ////il.Emit(OpCodes.Ldstr, "Test 123");
225 //il.Emit(OpCodes.Newobj, objType1.GetConstructor(new Type[] { }));
226 //il.Emit(OpCodes.Stfld, LSL_BuiltIns_fb);
227
228 foreach (UInt32 pos in LSOP.StaticBlocks.Keys)
229 {
230 LSO_Struct.StaticBlock sb;
231 LSOP.StaticBlocks.TryGetValue(pos, out sb);
232
233 if (sb.ObjectType > 0 && sb.ObjectType < 8) { // We don't want void or null's
234
235 il.Emit(OpCodes.Ldarg_0);
236 // Push position to stack
237 il.Emit(OpCodes.Ldc_I4, pos);
238 //il.Emit(OpCodes.Box, typeof(UInt32));
239
240
241 Type datatype = null;
242
243 // Push data to stack
244 Common.SendToDebug("Adding to static (" + pos + ") type: " + ((LSO_Enums.Variable_Type_Codes)sb.ObjectType).ToString() + " (" + sb.ObjectType + ")");
245 switch ((LSO_Enums.Variable_Type_Codes)sb.ObjectType)
246 {
247 case LSO_Enums.Variable_Type_Codes.Float:
248 case LSO_Enums.Variable_Type_Codes.Integer:
249 //UInt32
250 il.Emit(OpCodes.Ldc_I4, BitConverter.ToUInt32(sb.BlockVariable, 0));
251 datatype = typeof(UInt32);
252 il.Emit(OpCodes.Box, datatype);
253 break;
254 case LSO_Enums.Variable_Type_Codes.String:
255 case LSO_Enums.Variable_Type_Codes.Key:
256 //String
257 LSO_Struct.HeapBlock hb = LSOP.GetHeap(LSOP.myHeader.HR + BitConverter.ToUInt32(sb.BlockVariable, 0) - 1);
258 il.Emit(OpCodes.Ldstr, System.Text.Encoding.UTF8.GetString(hb.Data));
259 datatype = typeof(string);
260 break;
261 case LSO_Enums.Variable_Type_Codes.Vector:
262 datatype = typeof(LSO_Enums.Vector);
263 //TODO: Not implemented
264 break;
265 case LSO_Enums.Variable_Type_Codes.Rotation:
266 //Object
267 //TODO: Not implemented
268 datatype = typeof(LSO_Enums.Rotation);
269 break;
270 default:
271 datatype = typeof(object);
272 break;
273 }
274
275
276 // Make call
277 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("AddToStatic", new Type[] { typeof(UInt32), datatype }));
278 }
279
280 }
281
282
283
284
285 ////il.Emit(OpCodes.Newobj, typeof(UInt32));
286 //il.Emit(OpCodes.Starg_0);
287 //// Create LSL function library
288 //FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField("LSL_BuiltIns", typeof(LSL_BuiltIn_Commands_Interface), FieldAttributes.Public);
289 //il.Emit(OpCodes.Newobj, typeof(LSL_BuiltIn_Commands_Interface));
290 //il.Emit(OpCodes.Stloc_1);
291
292 il.Emit(OpCodes.Ret);
293 }
294
295
296
297
298 // End of class
299 }
300}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/IL_common_functions.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/IL_common_functions.cs
new file mode 100644
index 0000000..76738b8
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/IL_common_functions.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.Reflection;
33using System.Reflection.Emit;
34
35namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
36{
37 partial class LSO_Parser
38 {
39 private static TypeBuilder CreateType(ModuleBuilder modBuilder, string typeName)
40 {
41 TypeBuilder typeBuilder = modBuilder.DefineType(typeName,
42 TypeAttributes.Public |
43 TypeAttributes.Class |
44 TypeAttributes.AutoClass |
45 TypeAttributes.AnsiClass |
46 TypeAttributes.BeforeFieldInit |
47 TypeAttributes.AutoLayout,
48 typeof(object),
49 new Type[] { typeof(object) });
50 return typeBuilder;
51
52 }
53
54
55 }
56}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs
new file mode 100644
index 0000000..b88a905
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs
@@ -0,0 +1,58 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5
6namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
7{
8 public partial class LSL_BaseClass
9 {
10 //public MemoryStream LSLStack = new MemoryStream();
11 public Stack<object> LSLStack = new Stack<object>();
12 public Dictionary<UInt32, object> StaticVariables = new Dictionary<UInt32, object>();
13 public Dictionary<UInt32, object> GlobalVariables = new Dictionary<UInt32, object>();
14 public Dictionary<UInt32, object> LocalVariables = new Dictionary<UInt32, object>();
15 //public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>();
16 //public void AddFunction(String x) {
17 // FunctionList.Add(x);
18 //}
19 //public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>;
20 //public struct StackItemStruct
21 //{
22 // public LSO_Enums.Variable_Type_Codes ItemType;
23 // public object Data;
24 //}
25 public UInt32 State = 0;
26 public LSL_BuiltIn_Commands_Interface LSL_Builtins;
27 public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn()
28 {
29 return LSL_Builtins;
30 }
31
32
33 public LSL_BaseClass() { }
34
35
36 public virtual int OverrideMe()
37 {
38 return 0;
39 }
40 public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins)
41 {
42 LSL_Builtins = LSLBuiltins;
43
44 Common.SendToLog("OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass.Start() called");
45 //LSL_Builtins.llSay(0, "Test");
46 return;
47 }
48
49 public void AddToStatic(UInt32 index, object obj)
50 {
51 Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType());
52 StaticVariables.Add(index, obj);
53 }
54
55
56
57 }
58}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_Builtins.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_Builtins.cs
new file mode 100644
index 0000000..d6f9a88
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_Builtins.cs
@@ -0,0 +1,373 @@
1//using System;
2//using System.Collections.Generic;
3//using System.Text;
4
5//namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
6//{
7// public partial class LSL_BaseClass
8// {
9
10
11// public float llSin() {
12// float f = (float)LSLStack.Pop();
13// return LSL_Builtins.llSin(f);
14// }
15// public float llCos() {
16// float f = (float)LSLStack.Pop();
17// return LSL_Builtins.llCos(f);
18// }
19// public float llTan() {
20// float f = (float)LSLStack.Pop();
21// return LSL_Builtins.llTan(f);
22// }
23// public float llAtan2() {
24// float x = (float)LSLStack.Pop();
25// float y = (float)LSLStack.Pop();
26// return LSL_Builtins.llAtan2(x, y);
27// }
28// public float llSqrt() {
29// float f = (float)LSLStack.Pop();
30// return LSL_Builtins.llSqrt(f);
31// }
32// float llPow()
33// {
34// float fexponent = (float)LSLStack.Pop();
35// float fbase = (float)LSLStack.Pop();
36// return LSL_Builtins.llPow(fbase, fexponent);
37// }
38// //UInt32 llAbs(UInt32 i){ return; }
39// //float llFabs(float f){ return; }
40// //float llFrand(float mag){ return; }
41// //UInt32 llFloor(float f){ return; }
42// //UInt32 llCeil(float f){ return; }
43// //UInt32 llRound(float f){ return; }
44// //float llVecMag(LSO_Enums.Vector v){ return; }
45// //LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v){ return; }
46// //float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b){ return; }
47// //LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r){ return; }
48// //LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v){ return; }
49// //LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up){ return; }
50// //LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r){ return; }
51// //LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r){ return; }
52// //LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r){ return; }
53// //LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end){ return; }
54// public void llWhisper()
55// {
56// UInt16 i = (UInt16)LSLStack.Pop();
57// string s = (string)LSLStack.Pop();
58// LSL_Builtins.llWhisper(i, s);
59// }
60// public void llSay()
61// {
62// UInt16 i = (UInt16)LSLStack.Pop();
63// string s = (string)LSLStack.Pop();
64// LSL_Builtins.llSay(i, s);
65// }
66// //void llShout(UInt16 channelID, string text);
67// //UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg);
68// //void llListenControl(UInt32 number, UInt32 active);
69// //void llListenRemove(UInt32 number);
70// //void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc);
71// //void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate);
72// //void llSensorRemove();
73// //string llDetectedName(UInt32 number);
74// //LSO_Enums.Key llDetectedKey(UInt32 number);
75// //LSO_Enums.Key llDetectedOwner(UInt32 number);
76// //UInt32 llDetectedType(UInt32 number);
77// //LSO_Enums.Vector llDetectedPos(UInt32 number);
78// //LSO_Enums.Vector llDetectedVel(UInt32 number);
79// //LSO_Enums.Vector llDetectedGrab(UInt32 number);
80// //LSO_Enums.Rotation llDetectedRot(UInt32 number);
81// //UInt32 llDetectedGroup(UInt32 number);
82// //UInt32 llDetectedLinkNumber(UInt32 number);
83// //void llDie();
84// //float llGround(LSO_Enums.Vector offset);
85// //float llCloud(LSO_Enums.Vector offset);
86// //LSO_Enums.Vector llWind(LSO_Enums.Vector offset);
87// //void llSetStatus(UInt32 status, UInt32 value);
88// //UInt32 llGetStatus(UInt32 status);
89// //void llSetScale(LSO_Enums.Vector scale);
90// //LSO_Enums.Vector llGetScale();
91// //void llSetColor();
92// //float llGetAlpha();
93// //void llSetAlpha();
94// //LSO_Enums.Vector llGetColor();
95// //void llSetTexture();
96// //void llScaleTexture();
97// //void llOffsetTexture();
98// //void llRotateTexture();
99// //string llGetTexture();
100// //void llSetPos();
101
102// public void llGetPos() { }
103// public void llGetLocalPos() { }
104// public void llSetRot() { }
105// public void llGetRot() { }
106// public void llGetLocalRot() { }
107// public void llSetForce() { }
108// public void llGetForce() { }
109// public void llTarget() { }
110// public void llTargetRemove() { }
111// public void llRotTarget() { }
112// public void llRotTargetRemove() { }
113// public void llMoveToTarget() { }
114// public void llStopMoveToTarget() { }
115// public void llApplyImpulse() { }
116// public void llApplyRotationalImpulse() { }
117// public void llSetTorque() { }
118// public void llGetTorque() { }
119// public void llSetForceAndTorque() { }
120// public void llGetVel() { }
121// public void llGetAccel() { }
122// public void llGetOmega() { }
123// public void llGetTimeOfDay() { }
124// public void llGetWallclock() { }
125// public void llGetTime() { }
126// public void llResetTime() { }
127// public void llGetAndResetTime() { }
128// public void llSound() { }
129// public void llPlaySound() { }
130// public void llLoopSound() { }
131// public void llLoopSoundMaster() { }
132// public void llLoopSoundSlave() { }
133// public void llPlaySoundSlave() { }
134// public void llTriggerSound() { }
135// public void llStopSound() { }
136// public void llPreloadSound() { }
137// public void llGetSubString() { }
138// public void llDeleteSubString() { }
139// public void llInsertString() { }
140// public void llToUpper() { }
141// public void llToLower() { }
142// public void llGiveMoney() { }
143// public void llMakeExplosion() { }
144// public void llMakeFountain() { }
145// public void llMakeSmoke() { }
146// public void llMakeFire() { }
147// public void llRezObject() { }
148// public void llLookAt() { }
149// public void llStopLookAt() { }
150// public void llSetTimerEvent() { }
151// public void llSleep() { }
152// public void llGetMass() { }
153// public void llCollisionFilter() { }
154// public void llTakeControls() { }
155// public void llReleaseControls() { }
156// public void llAttachToAvatar() { }
157// public void llDetachFromAvatar() { }
158// public void llTakeCamera() { }
159// public void llReleaseCamera() { }
160// public void llGetOwner() { }
161// public void llInstantMessage() { }
162// public void llEmail() { }
163// public void llGetNextEmail() { }
164// public void llGetKey() { }
165// public void llSetBuoyancy() { }
166// public void llSetHoverHeight() { }
167// public void llStopHover() { }
168// public void llMinEventDelay() { }
169// public void llSoundPreload() { }
170// public void llRotLookAt() { }
171// public void llStringLength() { }
172// public void llStartAnimation() { }
173// public void llStopAnimation() { }
174// public void llPointAt() { }
175// public void llStopPointAt() { }
176// public void llTargetOmega() { }
177// public void llGetStartParameter() { }
178// public void llGodLikeRezObject() { }
179// public void llRequestPermissions() { }
180// public void llGetPermissionsKey() { }
181// public void llGetPermissions() { }
182// public void llGetLinkNumber() { }
183// public void llSetLinkColor() { }
184// public void llCreateLink() { }
185// public void llBreakLink() { }
186// public void llBreakAllLinks() { }
187// public void llGetLinkKey() { }
188// public void llGetLinkName() { }
189// public void llGetInventoryNumber() { }
190// public void llGetInventoryName() { }
191// public void llSetScriptState() { }
192// public void llGetEnergy() { }
193// public void llGiveInventory() { }
194// public void llRemoveInventory() { }
195// public void llSetText() { }
196// public void llWater() { }
197// public void llPassTouches() { }
198// public void llRequestAgentData() { }
199// public void llRequestInventoryData() { }
200// public void llSetDamage() { }
201// public void llTeleportAgentHome() { }
202// public void llModifyLand() { }
203// public void llCollisionSound() { }
204// public void llCollisionSprite() { }
205// public void llGetAnimation() { }
206// public void llResetScript() { }
207// public void llMessageLinked() { }
208// public void llPushObject() { }
209// public void llPassCollisions() { }
210// public void llGetScriptName() { }
211// public void llGetNumberOfSides() { }
212// public void llAxisAngle2Rot() { }
213// public void llRot2Axis() { }
214// public void llRot2Angle() { }
215// public void llAcos() { }
216// public void llAsin() { }
217// public void llAngleBetween() { }
218// public void llGetInventoryKey() { }
219// public void llAllowInventoryDrop() { }
220// public void llGetSunDirection() { }
221// public void llGetTextureOffset() { }
222// public void llGetTextureScale() { }
223// public void llGetTextureRot() { }
224// public void llSubStringIndex() { }
225// public void llGetOwnerKey() { }
226// public void llGetCenterOfMass() { }
227// public void llListSort() { }
228// public void llGetListLength() { }
229// public void llList2Integer() { }
230// public void llList2Float() { }
231// public void llList2String() { }
232// public void llList2Key() { }
233// public void llList2Vector() { }
234// public void llList2Rot() { }
235// public void llList2List() { }
236// public void llDeleteSubList() { }
237// public void llGetListEntryType() { }
238// public void llList2CSV() { }
239// public void llCSV2List() { }
240// public void llListRandomize() { }
241// public void llList2ListStrided() { }
242// public void llGetRegionCorner() { }
243// public void llListInsertList() { }
244// public void llListFindList() { }
245// public void llGetObjectName() { }
246// public void llSetObjectName() { }
247// public void llGetDate() { }
248// public void llEdgeOfWorld() { }
249// public void llGetAgentInfo() { }
250// public void llAdjustSoundVolume() { }
251// public void llSetSoundQueueing() { }
252// public void llSetSoundRadius() { }
253// public void llKey2Name() { }
254// public void llSetTextureAnim() { }
255// public void llTriggerSoundLimited() { }
256// public void llEjectFromLand() { }
257// public void llParseString2List() { }
258// public void llOverMyLand() { }
259// public void llGetLandOwnerAt() { }
260// public void llGetNotecardLine() { }
261// public void llGetAgentSize() { }
262// public void llSameGroup() { }
263// public void llUnSit() { }
264// public void llGroundSlope() { }
265// public void llGroundNormal() { }
266// public void llGroundContour() { }
267// public void llGetAttached() { }
268// public void llGetFreeMemory() { }
269// public void llGetRegionName() { }
270// public void llGetRegionTimeDilation() { }
271// public void llGetRegionFPS() { }
272// public void llParticleSystem() { }
273// public void llGroundRepel() { }
274// public void llGiveInventoryList() { }
275// public void llSetVehicleType() { }
276// public void llSetVehicleFloatParam() { }
277// public void llSetVehicleVectorParam() { }
278// public void llSetVehicleRotationParam() { }
279// public void llSetVehicleFlags() { }
280// public void llRemoveVehicleFlags() { }
281// public void llSitTarget() { }
282// public void llAvatarOnSitTarget() { }
283// public void llAddToLandPassList() { }
284// public void llSetTouchText() { }
285// public void llSetSitText() { }
286// public void llSetCameraEyeOffset() { }
287// public void llSetCameraAtOffset() { }
288// public void llDumpList2String() { }
289// public void llScriptDanger() { }
290// public void llDialog() { }
291// public void llVolumeDetect() { }
292// public void llResetOtherScript() { }
293// public void llGetScriptState() { }
294// public void llRemoteLoadScript() { }
295// public void llSetRemoteScriptAccessPin() { }
296// public void llRemoteLoadScriptPin() { }
297// public void llOpenRemoteDataChannel() { }
298// public void llSendRemoteData() { }
299// public void llRemoteDataReply() { }
300// public void llCloseRemoteDataChannel() { }
301// public void llMD5String() { }
302// public void llSetPrimitiveParams() { }
303// public void llStringToBase64() { }
304// public void llBase64ToString() { }
305// public void llXorBase64Strings() { }
306// public void llRemoteDataSetRegion() { }
307// public void llLog10() { }
308// public void llLog() { }
309// public void llGetAnimationList() { }
310// public void llSetParcelMusicURL() { }
311// public void llGetRootPosition() { }
312// public void llGetRootRotation() { }
313// public void llGetObjectDesc() { }
314// public void llSetObjectDesc() { }
315// public void llGetCreator() { }
316// public void llGetTimestamp() { }
317// public void llSetLinkAlpha() { }
318// public void llGetNumberOfPrims() { }
319// public void llGetNumberOfNotecardLines() { }
320// public void llGetBoundingBox() { }
321// public void llGetGeometricCenter() { }
322// public void llGetPrimitiveParams() { }
323// public void llIntegerToBase64() { }
324// public void llBase64ToInteger() { }
325// public void llGetGMTclock() { }
326// public void llGetSimulatorHostname() { }
327// public void llSetLocalRot() { }
328// public void llParseStringKeepNulls() { }
329// public void llRezAtRoot() { }
330// public void llGetObjectPermMask() { }
331// public void llSetObjectPermMask() { }
332// public void llGetInventoryPermMask() { }
333// public void llSetInventoryPermMask() { }
334// public void llGetInventoryCreator() { }
335// public void llOwnerSay() { }
336// public void llRequestSimulatorData() { }
337// public void llForceMouselook() { }
338// public void llGetObjectMass() { }
339// public void llListReplaceList() { }
340// public void llLoadURL() { }
341// public void llParcelMediaCommandList() { }
342// public void llParcelMediaQuery() { }
343// public void llModPow() { }
344// public void llGetInventoryType() { }
345// public void llSetPayPrice() { }
346// public void llGetCameraPos() { }
347// public void llGetCameraRot() { }
348// public void llSetPrimURL() { }
349// public void llRefreshPrimURL() { }
350// public void llEscapeURL() { }
351// public void llUnescapeURL() { }
352// public void llMapDestination() { }
353// public void llAddToLandBanList() { }
354// public void llRemoveFromLandPassList() { }
355// public void llRemoveFromLandBanList() { }
356// public void llSetCameraParams() { }
357// public void llClearCameraParams() { }
358// public void llListStatistics() { }
359// public void llGetUnixTime() { }
360// public void llGetParcelFlags() { }
361// public void llGetRegionFlags() { }
362// public void llXorBase64StringsCorrect() { }
363// public void llHTTPRequest() { }
364// public void llResetLandBanList() { }
365// public void llResetLandPassList() { }
366// public void llGetParcelPrimCount() { }
367// public void llGetParcelPrimOwners() { }
368// public void llGetObjectPrimCount() { }
369// public void llGetParcelMaxPrims() { }
370// public void llGetParcelDetails() { }
371
372// }
373//}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_OPCODES.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_OPCODES.cs
new file mode 100644
index 0000000..b771678
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass_OPCODES.cs
@@ -0,0 +1,342 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
6{
7 public partial class LSL_BaseClass
8 {
9
10
11
12 public void StoreToLocal(UInt32 index)
13 {
14 // TODO: How to determine local?
15 Common.SendToDebug("::StoreToLocal " + index);
16 if (LocalVariables.ContainsKey(index))
17 LocalVariables.Remove(index);
18 LocalVariables.Add(index, LSLStack.Peek());
19 }
20 public void StoreToGlobal(UInt32 index)
21 {
22 Common.SendToDebug("::StoreToGlobal " + index);
23 if (GlobalVariables.ContainsKey(index))
24 GlobalVariables.Remove(index);
25 GlobalVariables.Add(index, LSLStack.Peek());
26 }
27 public void StoreToStatic(UInt32 index)
28 {
29 Common.SendToDebug("::StoreToStatic " + index);
30 //if (StaticVariables.ContainsKey(index))
31 // StaticVariables.Remove(index);
32 StaticVariables.Add(index, LSLStack.Peek());
33 }
34 public void GetFromLocal(UInt32 index)
35 {
36 // TODO: How to determine local?
37 Common.SendToDebug("::GetFromLocal " + index);
38 object ret;
39 LocalVariables.TryGetValue(index, out ret);
40 LSLStack.Push(ret);
41 //return ret;
42 }
43 public void GetFromGlobal(UInt32 index)
44 {
45 Common.SendToDebug("::GetFromGlobal " + index);
46 object ret;
47 GlobalVariables.TryGetValue(index, out ret);
48 LSLStack.Push(ret);
49 //return ret;
50 }
51 public void GetFromStatic(UInt32 index)
52 {
53 Common.SendToDebug("::GetFromStatic " + index);
54 object ret;
55 StaticVariables.TryGetValue(index, out ret);
56 Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString());
57 LSLStack.Push(ret);
58 //return ret;
59 }
60
61 public object POPToStack()
62 {
63 Common.SendToDebug("::POPToStack");
64 //return LSLStack.Pop();
65 object p = LSLStack.Pop();
66 if (p.GetType() == typeof(UInt32))
67 return (UInt32)p;
68 if (p.GetType() == typeof(string))
69 return (string)p;
70 if (p.GetType() == typeof(Int32))
71 return (Int32)p;
72 if (p.GetType() == typeof(UInt16))
73 return (UInt16)p;
74 if (p.GetType() == typeof(float))
75 return (float)p;
76 if (p.GetType() == typeof(LSO_Enums.Vector))
77 return (LSO_Enums.Vector)p;
78 if (p.GetType() == typeof(LSO_Enums.Rotation))
79 return (LSO_Enums.Rotation)p;
80 if (p.GetType() == typeof(LSO_Enums.Key))
81 return (LSO_Enums.Key)p;
82
83 return p;
84 }
85
86 //public object POPToStack(UInt32 count)
87 //{
88 // // POP NUMBER FROM TOP OF STACK
89 // //LSLStack.SetLength(LSLStack.Length - 4);
90 // Common.SendToDebug("::POPToStack " + count);
91 // if (count < 2)
92 // return LSLStack.Pop();
93
94 // Stack<object> s = new Stack<object>();
95 // for (int i = 0; i < count; i++)
96 // {
97 // s.Push(LSLStack.Pop);
98
99 // }
100
101 //}
102
103 public void POP()
104 {
105 // POP NUMBER FROM TOP OF STACK
106 //LSLStack.SetLength(LSLStack.Length - 4);
107 Common.SendToDebug("::POP");
108 if (LSLStack.Count < 1)
109 {
110 //TODO: Temporary fix
111 Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!");
112 }
113 else
114 {
115 LSLStack.Pop();
116 }
117 }
118 public void PUSH(object Param)
119 {
120 if (Param == null)
121 {
122 Common.SendToDebug("::PUSH: <null>");
123 }
124 else
125 {
126
127 //Common.SendToDebug("::PUSH: " + Param.GetType());
128 }
129
130 LSLStack.Push(Param);
131 }
132 public void ADD(UInt32 Param)
133 {
134 Common.SendToDebug("::ADD: " + Param);
135 object o2 = LSLStack.Pop();
136 object o1 = LSLStack.Pop();
137 Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + " (" + o2.ToString() + ")");
138 if (o2.GetType() == typeof(string))
139 {
140 LSLStack.Push((string)o1 + (string)o2);
141 return;
142 }
143 if (o2.GetType() == typeof(UInt32))
144 {
145 LSLStack.Push((UInt32)o1 + (UInt32)o2);
146 return;
147 }
148
149 }
150 public void SUB(UInt32 Param)
151 {
152 Common.SendToDebug("::SUB: " + Param);
153 UInt32 i2 = (UInt32)LSLStack.Pop();
154 UInt32 i1 = (UInt32)LSLStack.Pop();
155 LSLStack.Push((UInt32)(i1 - i2));
156 }
157 public void MUL(UInt32 Param)
158 {
159 Common.SendToDebug("::SUB: " + Param);
160 UInt32 i2 = (UInt32)LSLStack.Pop();
161 UInt32 i1 = (UInt32)LSLStack.Pop();
162 LSLStack.Push((UInt32)(i1 * i2));
163 }
164 public void DIV(UInt32 Param)
165 {
166 Common.SendToDebug("::DIV: " + Param);
167 UInt32 i2 = (UInt32)LSLStack.Pop();
168 UInt32 i1 = (UInt32)LSLStack.Pop();
169 LSLStack.Push((UInt32)(i1 / i2));
170 }
171
172
173 public void MOD(UInt32 Param)
174 {
175 Common.SendToDebug("::MOD: " + Param);
176 UInt32 i2 = (UInt32)LSLStack.Pop();
177 UInt32 i1 = (UInt32)LSLStack.Pop();
178 LSLStack.Push((UInt32)(i1 % i2));
179 }
180 public void EQ(UInt32 Param)
181 {
182 Common.SendToDebug("::EQ: " + Param);
183 UInt32 i2 = (UInt32)LSLStack.Pop();
184 UInt32 i1 = (UInt32)LSLStack.Pop();
185 if (i1 == i2)
186 {
187 LSLStack.Push((UInt32)1);
188 }
189 else
190 {
191 LSLStack.Push((UInt32)0);
192 }
193 }
194 public void NEQ(UInt32 Param)
195 {
196 Common.SendToDebug("::NEQ: " + Param);
197 UInt32 i2 = (UInt32)LSLStack.Pop();
198 UInt32 i1 = (UInt32)LSLStack.Pop();
199 if (i1 != i2)
200 {
201 LSLStack.Push((UInt32)1);
202 }
203 else
204 {
205 LSLStack.Push((UInt32)0);
206 }
207 }
208 public void LEQ(UInt32 Param)
209 {
210 Common.SendToDebug("::LEQ: " + Param);
211 UInt32 i2 = (UInt32)LSLStack.Pop();
212 UInt32 i1 = (UInt32)LSLStack.Pop();
213 if (i1 <= i2)
214 {
215 LSLStack.Push((UInt32)1);
216 }
217 else
218 {
219 LSLStack.Push((UInt32)0);
220 }
221 }
222 public void GEQ(UInt32 Param)
223 {
224 Common.SendToDebug("::GEQ: " + Param);
225 UInt32 i2 = (UInt32)LSLStack.Pop();
226 UInt32 i1 = (UInt32)LSLStack.Pop();
227 if (i1 >= i2)
228 {
229 LSLStack.Push((UInt32)1);
230 }
231 else
232 {
233 LSLStack.Push((UInt32)0);
234 }
235 }
236 public void LESS(UInt32 Param)
237 {
238 Common.SendToDebug("::LESS: " + Param);
239 UInt32 i2 = (UInt32)LSLStack.Pop();
240 UInt32 i1 = (UInt32)LSLStack.Pop();
241 if (i1 < i2)
242 {
243 LSLStack.Push((UInt32)1);
244 }
245 else
246 {
247 LSLStack.Push((UInt32)0);
248 }
249 }
250 public void GREATER(UInt32 Param)
251 {
252 Common.SendToDebug("::GREATER: " + Param);
253 UInt32 i2 = (UInt32)LSLStack.Pop();
254 UInt32 i1 = (UInt32)LSLStack.Pop();
255 if (i1 > i2)
256 {
257 LSLStack.Push((UInt32)1);
258 }
259 else
260 {
261 LSLStack.Push((UInt32)0);
262 }
263 }
264
265
266
267 public void BITAND()
268 {
269 Common.SendToDebug("::BITAND");
270 UInt32 i2 = (UInt32)LSLStack.Pop();
271 UInt32 i1 = (UInt32)LSLStack.Pop();
272 LSLStack.Push((UInt32)(i1 & i2));
273 }
274 public void BITOR()
275 {
276 Common.SendToDebug("::BITOR");
277 UInt32 i2 = (UInt32)LSLStack.Pop();
278 UInt32 i1 = (UInt32)LSLStack.Pop();
279 LSLStack.Push((UInt32)(i1 | i2));
280 }
281 public void BITXOR()
282 {
283 Common.SendToDebug("::BITXOR");
284 UInt32 i2 = (UInt32)LSLStack.Pop();
285 UInt32 i1 = (UInt32)LSLStack.Pop();
286 LSLStack.Push((UInt32)(i1 ^ i2));
287 }
288 public void BOOLAND()
289 {
290 Common.SendToDebug("::BOOLAND");
291 bool b2 = bool.Parse((string)LSLStack.Pop());
292 bool b1 = bool.Parse((string)LSLStack.Pop());
293 if (b1 && b2)
294 {
295 LSLStack.Push((UInt32)1);
296 }
297 else
298 {
299 LSLStack.Push((UInt32)0);
300 }
301 }
302 public void BOOLOR()
303 {
304 Common.SendToDebug("::BOOLOR");
305 bool b2 = bool.Parse((string)LSLStack.Pop());
306 bool b1 = bool.Parse((string)LSLStack.Pop());
307
308 if (b1 || b2)
309 {
310 LSLStack.Push((UInt32)1);
311 }
312 else
313 {
314 LSLStack.Push((UInt32)0);
315 }
316
317 }
318 public void NEG(UInt32 Param)
319 {
320 Common.SendToDebug("::NEG: " + Param);
321 //UInt32 i2 = (UInt32)LSLStack.Pop();
322 UInt32 i1 = (UInt32)LSLStack.Pop();
323 LSLStack.Push((UInt32)(i1 * -1));
324 }
325 public void BITNOT()
326 {
327 //Common.SendToDebug("::BITNOT");
328 //UInt32 i2 = (UInt32)LSLStack.Pop();
329 //UInt32 i1 = (UInt32)LSLStack.Pop();
330 //LSLStack.Push((UInt32)(i1 / i2));
331 }
332 public void BOOLNOT()
333 {
334 //Common.SendToDebug("::BOOLNOT");
335 ////UInt32 i2 = (UInt32)LSLStack.Pop();
336 //UInt32 i1 = (UInt32)LSLStack.Pop();
337 //LSLStack.Push((UInt32)(i1));
338 }
339
340
341 }
342}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_CLRInterface.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_CLRInterface.cs
new file mode 100644
index 0000000..84cb20c
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_CLRInterface.cs
@@ -0,0 +1,79 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
34{
35 public class LSL_CLRInterface
36 {
37 public interface LSLScript
38 {
39 //public virtual void Run(object arg)
40 //{
41 //}
42 //void Run(object arg);
43
44 //void event_state_entry(object arg);
45 //void event_state_exit();
46 //void event_touch_start(object arg);
47 //void event_touch();
48 //void event_touch_end();
49 //void event_collision_start();
50 //void event_collision();
51 //void event_collision_end();
52 //void event_land_collision_start();
53 //void event_land_collision();
54 //void event_land_collision_end();
55 //void event_timer();
56 //void event_listen();
57 //void event_on_rez();
58 //void event_sensor();
59 //void event_no_sensor();
60 //void event_control();
61 //void event_money();
62 //void event_email();
63 //void event_at_target();
64 //void event_not_at_target();
65 //void event_at_rot_target();
66 //void event_not_at_rot_target();
67 //void event_run_time_permissions();
68 //void event_changed();
69 //void event_attach();
70 //void event_dataserver();
71 //void event_link_message();
72 //void event_moving_start();
73 //void event_moving_end();
74 //void event_object_rez();
75 //void event_remote_data();
76 //void event_http_response();
77 }
78 }
79}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_OPCODE_IL_processor.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_OPCODE_IL_processor.cs
new file mode 100644
index 0000000..8836195
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_OPCODE_IL_processor.cs
@@ -0,0 +1,435 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.Reflection;
33using System.Reflection.Emit;
34
35namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
36{
37 partial class LSO_Parser
38 {
39 //internal Stack<Type> ILStack = new Stack<Type>();
40 //LSO_Enums MyLSO_Enums = new LSO_Enums();
41
42 internal bool LSL_PROCESS_OPCODE(ILGenerator il)
43 {
44
45 byte bp1;
46 UInt32 u32p1;
47 float fp1;
48 UInt16 opcode = br_read(1)[0];
49 Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString());
50 string idesc = ((LSO_Enums.Operation_Table)opcode).ToString();
51 switch ((LSO_Enums.Operation_Table)opcode)
52 {
53
54 /***************
55 * IMPLEMENTED *
56 ***************/
57 case LSO_Enums.Operation_Table.NOOP:
58 break;
59 case LSO_Enums.Operation_Table.PUSHSP:
60 // Push Stack Top (Memory Address) to stack
61 Common.SendToDebug("Instruction " + idesc);
62 Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack");
63 IL_Push(il, (UInt32)myHeader.SP);
64 break;
65 // BYTE
66 case LSO_Enums.Operation_Table.PUSHARGB:
67 Common.SendToDebug("Param1: " + br_read(1)[0]);
68 break;
69 // INTEGER
70 case LSO_Enums.Operation_Table.PUSHARGI:
71 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
72 Common.SendToDebug("Instruction " + idesc + ", Param1: " + u32p1);
73 IL_Push(il, u32p1);
74 break;
75 // FLOAT
76 case LSO_Enums.Operation_Table.PUSHARGF:
77 fp1 = BitConverter.ToUInt32(br_read(4), 0);
78 Common.SendToDebug("Instruction " + idesc + ", Param1: " + fp1);
79 IL_Push(il, fp1);
80 break;
81 // STRING
82 case LSO_Enums.Operation_Table.PUSHARGS:
83 string s = Read_String();
84 Common.SendToDebug("Instruction " + idesc + ", Param1: " + s);
85 IL_Debug(il, "OPCODE: " + idesc + ":" + s);
86 IL_Push(il, s);
87 break;
88 // VECTOR z,y,x
89 case LSO_Enums.Operation_Table.PUSHARGV:
90 LSO_Enums.Vector v = new LSO_Enums.Vector();
91 v.Z = BitConverter.ToUInt32(br_read(4), 0);
92 v.Y = BitConverter.ToUInt32(br_read(4), 0);
93 v.X = BitConverter.ToUInt32(br_read(4), 0);
94 Common.SendToDebug("Param1 Z: " + v.Z);
95 Common.SendToDebug("Param1 Y: " + v.Y);
96 Common.SendToDebug("Param1 X: " + v.X);
97 IL_Push(il, v);
98 break;
99 // ROTATION s,z,y,x
100 case LSO_Enums.Operation_Table.PUSHARGQ:
101 LSO_Enums.Rotation r = new LSO_Enums.Rotation();
102 r.S = BitConverter.ToUInt32(br_read(4), 0);
103 r.Z = BitConverter.ToUInt32(br_read(4), 0);
104 r.Y = BitConverter.ToUInt32(br_read(4), 0);
105 r.X = BitConverter.ToUInt32(br_read(4), 0);
106 Common.SendToDebug("Param1 S: " + r.S);
107 Common.SendToDebug("Param1 Z: " + r.Z);
108 Common.SendToDebug("Param1 Y: " + r.Y);
109 Common.SendToDebug("Param1 X: " + r.X);
110 IL_Push(il, r);
111 break;
112
113 case LSO_Enums.Operation_Table.PUSHE:
114 IL_Push(il, (UInt32)0);
115 break;
116
117 case LSO_Enums.Operation_Table.PUSHARGE:
118 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
119 Common.SendToDebug("Param1: " + u32p1);
120 //IL_Push(il, new string(" ".ToCharArray()[0], Convert.ToInt32(u32p1)));
121 IL_Push(il, u32p1);
122 break;
123 // BYTE
124 case LSO_Enums.Operation_Table.ADD:
125 case LSO_Enums.Operation_Table.SUB:
126 case LSO_Enums.Operation_Table.MUL:
127 case LSO_Enums.Operation_Table.DIV:
128 case LSO_Enums.Operation_Table.EQ:
129 case LSO_Enums.Operation_Table.NEQ:
130 case LSO_Enums.Operation_Table.LEQ:
131 case LSO_Enums.Operation_Table.GEQ:
132 case LSO_Enums.Operation_Table.LESS:
133 case LSO_Enums.Operation_Table.GREATER:
134 case LSO_Enums.Operation_Table.NEG:
135 case LSO_Enums.Operation_Table.MOD:
136 bp1 = br_read(1)[0];
137 Common.SendToDebug("Param1: " + bp1);
138 IL_CallBaseFunction(il, idesc, (UInt32)bp1);
139 break;
140
141 // NO ARGUMENTS
142 case LSO_Enums.Operation_Table.BITAND:
143 case LSO_Enums.Operation_Table.BITOR:
144 case LSO_Enums.Operation_Table.BITXOR:
145 case LSO_Enums.Operation_Table.BOOLAND:
146 case LSO_Enums.Operation_Table.BOOLOR:
147 case LSO_Enums.Operation_Table.BITNOT:
148 case LSO_Enums.Operation_Table.BOOLNOT:
149 IL_CallBaseFunction(il, idesc);
150 break;
151 // SHORT
152 case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE:
153 // TODO: What is size of short?
154 UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0);
155 Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString());
156 //Common.SendToDebug("Param1: " + U16p1);
157 string fname = ((LSO_Enums.BuiltIn_Functions)U16p1).ToString();
158
159 bool cmdFound = false;
160 foreach (MethodInfo mi in typeof(LSL_BuiltIn_Commands_Interface).GetMethods())
161 {
162 // Found command
163 if (mi.Name == fname)
164 {
165 il.Emit(OpCodes.Ldarg_0);
166 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("GetLSL_BuiltIn", new Type[] { }));
167 // Pop required number of items from my stack to .Net stack
168 IL_PopToStack(il, mi.GetParameters().Length);
169 il.Emit(OpCodes.Callvirt, mi);
170 cmdFound = true;
171 break;
172 }
173 }
174 if (cmdFound == false)
175 {
176 Common.SendToDebug("ERROR: UNABLE TO LOCATE OPCODE " + idesc + " IN BASECLASS");
177 }
178
179 break;
180
181 // RETURN
182 case LSO_Enums.Operation_Table.RETURN:
183
184 Common.SendToDebug("OPCODE: RETURN");
185 return true;
186
187 case LSO_Enums.Operation_Table.POP:
188 case LSO_Enums.Operation_Table.POPS:
189 case LSO_Enums.Operation_Table.POPL:
190 case LSO_Enums.Operation_Table.POPV:
191 case LSO_Enums.Operation_Table.POPQ:
192 // Pops a specific datatype from the stack
193 // We just ignore the datatype for now
194 IL_Pop(il);
195 break;
196
197 // LONG
198 case LSO_Enums.Operation_Table.STORE:
199 case LSO_Enums.Operation_Table.STORES:
200 case LSO_Enums.Operation_Table.STOREL:
201 case LSO_Enums.Operation_Table.STOREV:
202 case LSO_Enums.Operation_Table.STOREQ:
203 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
204 Common.SendToDebug("Param1: " + u32p1.ToString());
205 IL_CallBaseFunction(il, "StoreToLocal", u32p1);
206 break;
207
208 case LSO_Enums.Operation_Table.STOREG:
209 case LSO_Enums.Operation_Table.STOREGS:
210 case LSO_Enums.Operation_Table.STOREGL:
211 case LSO_Enums.Operation_Table.STOREGV:
212 case LSO_Enums.Operation_Table.STOREGQ:
213 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
214 Common.SendToDebug("Param1: " + u32p1.ToString());
215 IL_CallBaseFunction(il, "StoreToGlobal", u32p1);
216 break;
217
218 case LSO_Enums.Operation_Table.LOADP:
219 case LSO_Enums.Operation_Table.LOADSP:
220 case LSO_Enums.Operation_Table.LOADLP:
221 case LSO_Enums.Operation_Table.LOADVP:
222 case LSO_Enums.Operation_Table.LOADQP:
223 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
224 Common.SendToDebug("Param1: " + u32p1.ToString());
225 IL_CallBaseFunction(il, "StoreToLocal", u32p1);
226 IL_Pop(il);
227 break;
228
229 case LSO_Enums.Operation_Table.LOADGP:
230 case LSO_Enums.Operation_Table.LOADGSP:
231 case LSO_Enums.Operation_Table.LOADGLP:
232 case LSO_Enums.Operation_Table.LOADGVP:
233 case LSO_Enums.Operation_Table.LOADGQP:
234 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
235 Common.SendToDebug("Param1: " + u32p1.ToString());
236 IL_CallBaseFunction(il, "StoreToStatic", u32p1 - 6 + myHeader.GVR);
237 IL_Pop(il);
238 break;
239
240 // PUSH FROM LOCAL FRAME
241 case LSO_Enums.Operation_Table.PUSH:
242 case LSO_Enums.Operation_Table.PUSHS:
243 case LSO_Enums.Operation_Table.PUSHL:
244 case LSO_Enums.Operation_Table.PUSHV:
245 case LSO_Enums.Operation_Table.PUSHQ:
246 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
247 Common.SendToDebug("Param1: " + u32p1.ToString());
248 IL_CallBaseFunction(il, "GetFromLocal", u32p1);
249
250 break;
251
252 // PUSH FROM STATIC FRAME
253 case LSO_Enums.Operation_Table.PUSHG:
254 case LSO_Enums.Operation_Table.PUSHGS:
255 case LSO_Enums.Operation_Table.PUSHGL:
256 case LSO_Enums.Operation_Table.PUSHGV:
257 case LSO_Enums.Operation_Table.PUSHGQ:
258 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
259 Common.SendToDebug("Param1: " + u32p1.ToString());
260 IL_CallBaseFunction(il, "GetFromStatic", u32p1 - 6 + myHeader.GVR);
261 break;
262
263
264 /***********************
265 * NOT IMPLEMENTED YET *
266 ***********************/
267
268
269
270 case LSO_Enums.Operation_Table.POPIP:
271 case LSO_Enums.Operation_Table.POPSP:
272 case LSO_Enums.Operation_Table.POPSLR:
273 case LSO_Enums.Operation_Table.POPARG:
274 case LSO_Enums.Operation_Table.POPBP:
275 //Common.SendToDebug("Instruction " + idesc + ": Ignored");
276 Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack (TODO: Only popping 1)");
277 //Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
278 IL_Pop(il);
279 break;
280
281
282
283 // None
284 case LSO_Enums.Operation_Table.PUSHIP:
285 // PUSH INSTRUCTION POINTER
286 break;
287 case LSO_Enums.Operation_Table.PUSHBP:
288
289 case LSO_Enums.Operation_Table.PUSHEV:
290 break;
291 case LSO_Enums.Operation_Table.PUSHEQ:
292 break;
293
294
295 // LONG
296 case LSO_Enums.Operation_Table.JUMP:
297 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
298 break;
299 // BYTE, LONG
300 case LSO_Enums.Operation_Table.JUMPIF:
301 case LSO_Enums.Operation_Table.JUMPNIF:
302 Common.SendToDebug("Param1: " + br_read(1)[0]);
303 Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0));
304 break;
305 // LONG
306 case LSO_Enums.Operation_Table.STATE:
307 bp1 = br_read(1)[0];
308 //il.Emit(OpCodes.Ld); // Load local variable 0 onto stack
309 //il.Emit(OpCodes.Ldc_I4, 0); // Push index position
310 //il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value
311 //il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value
312 break;
313 case LSO_Enums.Operation_Table.CALL:
314 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
315 Common.SendToDebug("ERROR: Function CALL not implemented yet.");
316 break;
317 // BYTE
318 case LSO_Enums.Operation_Table.CAST:
319 bp1 = br_read(1)[0];
320 Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1));
321 Common.SendToDebug("Param1: " + bp1);
322 switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)
323 {
324 case LSO_Enums.OpCode_Cast_TypeDefs.String:
325 Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Box, ILStack.Pop());");
326 break;
327 default:
328 Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!");
329 break;
330 }
331 break;
332 // LONG
333 case LSO_Enums.Operation_Table.STACKTOS:
334 case LSO_Enums.Operation_Table.STACKTOL:
335 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
336 break;
337 // BYTE
338 case LSO_Enums.Operation_Table.PRINT:
339 case LSO_Enums.Operation_Table.CALLLIB:
340 Common.SendToDebug("Param1: " + br_read(1)[0]);
341 break;
342 }
343 return false;
344 }
345
346 private void IL_PopToStack(ILGenerator il)
347 {
348 IL_PopToStack(il, 1);
349 }
350 private void IL_PopToStack(ILGenerator il, int count)
351 {
352 Common.SendToDebug("IL_PopToStack();");
353 for (int i = 0; i < count; i++)
354 {
355 IL_CallBaseFunction(il, "POPToStack");
356 //il.Emit(OpCodes.Ldarg_0);
357 //il.Emit(OpCodes.Call,
358 // typeof(LSL_BaseClass).GetMethod("POPToStack",
359 // new Type[] { }));
360 }
361 }
362 private void IL_Pop(ILGenerator il)
363 {
364 Common.SendToDebug("IL_Pop();");
365 IL_CallBaseFunction(il, "POP");
366 }
367 private void IL_Debug(ILGenerator il, string text)
368 {
369 il.Emit(OpCodes.Ldstr, text);
370 il.Emit(OpCodes.Call, typeof(Common).GetMethod("SendToDebug",
371 new Type[] { typeof(string) }
372 ));
373 }
374 private void IL_CallBaseFunction(ILGenerator il, string methodname)
375 {
376 il.Emit(OpCodes.Ldarg_0);
377 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { }));
378 }
379 private void IL_CallBaseFunction(ILGenerator il, string methodname, object data)
380 {
381 il.Emit(OpCodes.Ldarg_0);
382 if (data.GetType() == typeof(string))
383 il.Emit(OpCodes.Ldstr, (string)data);
384 if (data.GetType() == typeof(UInt32))
385 il.Emit(OpCodes.Ldc_I4, (UInt32)data);
386 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { data.GetType() }));
387 }
388
389 private void IL_Push(ILGenerator il, object data)
390 {
391 il.Emit(OpCodes.Ldarg_0);
392 Common.SendToDebug("PUSH datatype: " + data.GetType());
393
394 IL_PushDataTypeToILStack(il, data);
395
396 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("PUSH", new Type[] { data.GetType() }));
397
398 }
399
400 private void IL_PushDataTypeToILStack(ILGenerator il, object data)
401 {
402 if (data.GetType() == typeof(UInt16))
403 {
404 il.Emit(OpCodes.Ldc_I4, (UInt16)data);
405 il.Emit(OpCodes.Box, data.GetType());
406 }
407 if (data.GetType() == typeof(UInt32))
408 {
409 il.Emit(OpCodes.Ldc_I4, (UInt32)data);
410 il.Emit(OpCodes.Box, data.GetType());
411 }
412 if (data.GetType() == typeof(Int32))
413 {
414 il.Emit(OpCodes.Ldc_I4, (Int32)data);
415 il.Emit(OpCodes.Box, data.GetType());
416 }
417 if (data.GetType() == typeof(float))
418 {
419 il.Emit(OpCodes.Ldc_I4, (float)data);
420 il.Emit(OpCodes.Box, data.GetType());
421 }
422 if (data.GetType() == typeof(string))
423 il.Emit(OpCodes.Ldstr, (string)data);
424 //if (data.GetType() == typeof(LSO_Enums.Rotation))
425 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Rotation)data);
426 //if (data.GetType() == typeof(LSO_Enums.Vector))
427 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Vector)data);
428 //if (data.GetType() == typeof(LSO_Enums.Key))
429 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Key)data);
430
431 }
432
433
434 }
435}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Enums.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Enums.cs
new file mode 100644
index 0000000..f3eef3d
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Enums.cs
@@ -0,0 +1,557 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
34{
35 public static class LSO_Enums
36 {
37 //public System.Collections.Generic.Dictionary<Byte, Type> OpCode_Add_Types;
38
39 //LSO_Enums() {
40 // OpCode_Add_Types.Add(51, typeof(String));
41 // OpCode_Add_Types.Add(17, typeof(UInt32));
42 //}
43
44 [Serializable]
45 public enum OpCode_Add_TypeDefs
46 {
47 String = 51,
48 UInt32 = 17
49 }
50 [Serializable]
51 public enum OpCode_Cast_TypeDefs
52 {
53 String = 19
54 }
55
56 [Serializable]
57 public struct Key
58 {
59 public string KeyString;
60 }
61
62 [Serializable]
63 public struct Vector
64 {
65 public UInt32 Z;
66 public UInt32 Y;
67 public UInt32 X;
68 }
69 [Serializable]
70 public struct Rotation
71 {
72 public UInt32 S;
73 public UInt32 Z;
74 public UInt32 Y;
75 public UInt32 X;
76 }
77 [Serializable]
78 public enum Variable_Type_Codes
79 {
80 Void = 0,
81 Integer = 1,
82 Float = 2,
83 String = 3,
84 Key = 4,
85 Vector = 5,
86 Rotation = 6,
87 List = 7,
88 Null = 8
89 }
90 [Serializable]
91 public enum Event_Mask_Values
92 {
93 state_entry = 0,
94 state_exit = 1,
95 touch_start = 2,
96 touch = 3,
97 touch_end = 4,
98 collision_start = 5,
99 collision = 6,
100 collision_end = 7,
101 land_collision_start = 8,
102 land_collision = 9,
103 land_collision_end = 10,
104 timer = 11,
105 listen = 12,
106 on_rez = 13,
107 sensor = 14,
108 no_sensor = 15,
109 control = 16,
110 money = 17,
111 email = 18,
112 at_target = 19,
113 not_at_target = 20,
114 at_rot_target = 21,
115 not_at_rot_target = 22,
116 run_time_permissions = 23,
117 changed = 24,
118 attach = 25,
119 dataserver = 26,
120 link_message = 27,
121 moving_start = 28,
122 moving_end = 29,
123 object_rez = 30,
124 remote_data = 31,
125 http_response = 32
126 }
127 [Serializable]
128 public enum Operation_Table
129 {
130 NOOP = 0x0,
131 POP = 0x1,
132 POPS = 0x2,
133 POPL = 0x3,
134 POPV = 0x4,
135 POPQ = 0x5,
136 POPARG = 0x6,
137 POPIP = 0x7,
138 POPBP = 0x8,
139 POPSP = 0x9,
140 POPSLR = 0xa,
141 DUP = 0x20,
142 DUPS = 0x21,
143 DUPL = 0x22,
144 DUPV = 0x23,
145 DUPQ = 0x24,
146 STORE = 0x30,
147 STORES = 0x31,
148 STOREL = 0x32,
149 STOREV = 0x33,
150 STOREQ = 0x34,
151 STOREG = 0x35,
152 STOREGS = 0x36,
153 STOREGL = 0x37,
154 STOREGV = 0x38,
155 STOREGQ = 0x39,
156 LOADP = 0x3a,
157 LOADSP = 0x3b,
158 LOADLP = 0x3c,
159 LOADVP = 0x3d,
160 LOADQP = 0x3e,
161 LOADGP = 0x3f,
162 LOADGSP = 0x40,
163 LOADGLP = 0x41,
164 LOADGVP = 0x42,
165 LOADGQP = 0x43,
166 PUSH = 0x50,
167 PUSHS = 0x51,
168 PUSHL = 0x52,
169 PUSHV = 0x53,
170 PUSHQ = 0x54,
171 PUSHG = 0x55,
172 PUSHGS = 0x56,
173 PUSHGL = 0x57,
174 PUSHGV = 0x58,
175 PUSHGQ = 0x59,
176 PUSHIP = 0x5a,
177 PUSHBP = 0x5b,
178 PUSHSP = 0x5c,
179 PUSHARGB = 0x5d,
180 PUSHARGI = 0x5e,
181 PUSHARGF = 0x5f,
182 PUSHARGS = 0x60,
183 PUSHARGV = 0x61,
184 PUSHARGQ = 0x62,
185 PUSHE = 0x63,
186 PUSHEV = 0x64,
187 PUSHEQ = 0x65,
188 PUSHARGE = 0x66,
189 ADD = 0x70,
190 SUB = 0x71,
191 MUL = 0x72,
192 DIV = 0x73,
193 MOD = 0x74,
194 EQ = 0x75,
195 NEQ = 0x76,
196 LEQ = 0x77,
197 GEQ = 0x78,
198 LESS = 0x79,
199 GREATER = 0x7a,
200 BITAND = 0x7b,
201 BITOR = 0x7c,
202 BITXOR = 0x7d,
203 BOOLAND = 0x7e,
204 BOOLOR = 0x7f,
205 NEG = 0x80,
206 BITNOT = 0x81,
207 BOOLNOT = 0x82,
208 JUMP = 0x90,
209 JUMPIF = 0x91,
210 JUMPNIF = 0x92,
211 STATE = 0x93,
212 CALL = 0x94,
213 RETURN = 0x95,
214 CAST = 0xa0,
215 STACKTOS = 0xb0,
216 STACKTOL = 0xb1,
217 PRINT = 0xc0,
218 CALLLIB = 0xd0,
219 CALLLIB_TWO_BYTE = 0xd1,
220 SHL = 0xe0,
221 SHR = 0xe1
222 }
223 [Serializable]
224 public enum BuiltIn_Functions
225 {
226 llSin = 0,
227 llCos = 1,
228 llTan = 2,
229 llAtan2 = 3,
230 llSqrt = 4,
231 llPow = 5,
232 llAbs = 6,
233 llFabs = 7,
234 llFrand = 8,
235 llFloor = 9,
236 llCeil = 10,
237 llRound = 11,
238 llVecMag = 12,
239 llVecNorm = 13,
240 llVecDist = 14,
241 llRot2Euler = 15,
242 llEuler2Rot = 16,
243 llAxes2Rot = 17,
244 llRot2Fwd = 18,
245 llRot2Left = 19,
246 llRot2Up = 20,
247 llRotBetween = 21,
248 llWhisper = 22,
249 llSay = 23,
250 llShout = 24,
251 llListen = 25,
252 llListenControl = 26,
253 llListenRemove = 27,
254 llSensor = 28,
255 llSensorRepeat = 29,
256 llSensorRemove = 30,
257 llDetectedName = 31,
258 llDetectedKey = 32,
259 llDetectedOwner = 33,
260 llDetectedType = 34,
261 llDetectedPos = 35,
262 llDetectedVel = 36,
263 llDetectedGrab = 37,
264 llDetectedRot = 38,
265 llDetectedGroup = 39,
266 llDetectedLinkNumber = 40,
267 llDie = 41,
268 llGround = 42,
269 llCloud = 43,
270 llWind = 44,
271 llSetStatus = 45,
272 llGetStatus = 46,
273 llSetScale = 47,
274 llGetScale = 48,
275 llSetColor = 49,
276 llGetAlpha = 50,
277 llSetAlpha = 51,
278 llGetColor = 52,
279 llSetTexture = 53,
280 llScaleTexture = 54,
281 llOffsetTexture = 55,
282 llRotateTexture = 56,
283 llGetTexture = 57,
284 llSetPos = 58,
285 llGetPos = 59,
286 llGetLocalPos = 60,
287 llSetRot = 61,
288 llGetRot = 62,
289 llGetLocalRot = 63,
290 llSetForce = 64,
291 llGetForce = 65,
292 llTarget = 66,
293 llTargetRemove = 67,
294 llRotTarget = 68,
295 llRotTargetRemove = 69,
296 llMoveToTarget = 70,
297 llStopMoveToTarget = 71,
298 llApplyImpulse = 72,
299 llApplyRotationalImpulse = 73,
300 llSetTorque = 74,
301 llGetTorque = 75,
302 llSetForceAndTorque = 76,
303 llGetVel = 77,
304 llGetAccel = 78,
305 llGetOmega = 79,
306 llGetTimeOfDay = 80,
307 llGetWallclock = 81,
308 llGetTime = 82,
309 llResetTime = 83,
310 llGetAndResetTime = 84,
311 llSound = 85,
312 llPlaySound = 86,
313 llLoopSound = 87,
314 llLoopSoundMaster = 88,
315 llLoopSoundSlave = 89,
316 llPlaySoundSlave = 90,
317 llTriggerSound = 91,
318 llStopSound = 92,
319 llPreloadSound = 93,
320 llGetSubString = 94,
321 llDeleteSubString = 95,
322 llInsertString = 96,
323 llToUpper = 97,
324 llToLower = 98,
325 llGiveMoney = 99,
326 llMakeExplosion = 100,
327 llMakeFountain = 101,
328 llMakeSmoke = 102,
329 llMakeFire = 103,
330 llRezObject = 104,
331 llLookAt = 105,
332 llStopLookAt = 106,
333 llSetTimerEvent = 107,
334 llSleep = 108,
335 llGetMass = 109,
336 llCollisionFilter = 110,
337 llTakeControls = 111,
338 llReleaseControls = 112,
339 llAttachToAvatar = 113,
340 llDetachFromAvatar = 114,
341 llTakeCamera = 115,
342 llReleaseCamera = 116,
343 llGetOwner = 117,
344 llInstantMessage = 118,
345 llEmail = 119,
346 llGetNextEmail = 120,
347 llGetKey = 121,
348 llSetBuoyancy = 122,
349 llSetHoverHeight = 123,
350 llStopHover = 124,
351 llMinEventDelay = 125,
352 llSoundPreload = 126,
353 llRotLookAt = 127,
354 llStringLength = 128,
355 llStartAnimation = 129,
356 llStopAnimation = 130,
357 llPointAt = 131,
358 llStopPointAt = 132,
359 llTargetOmega = 133,
360 llGetStartParameter = 134,
361 llGodLikeRezObject = 135,
362 llRequestPermissions = 136,
363 llGetPermissionsKey = 137,
364 llGetPermissions = 138,
365 llGetLinkNumber = 139,
366 llSetLinkColor = 140,
367 llCreateLink = 141,
368 llBreakLink = 142,
369 llBreakAllLinks = 143,
370 llGetLinkKey = 144,
371 llGetLinkName = 145,
372 llGetInventoryNumber = 146,
373 llGetInventoryName = 147,
374 llSetScriptState = 148,
375 llGetEnergy = 149,
376 llGiveInventory = 150,
377 llRemoveInventory = 151,
378 llSetText = 152,
379 llWater = 153,
380 llPassTouches = 154,
381 llRequestAgentData = 155,
382 llRequestInventoryData = 156,
383 llSetDamage = 157,
384 llTeleportAgentHome = 158,
385 llModifyLand = 159,
386 llCollisionSound = 160,
387 llCollisionSprite = 161,
388 llGetAnimation = 162,
389 llResetScript = 163,
390 llMessageLinked = 164,
391 llPushObject = 165,
392 llPassCollisions = 166,
393 llGetScriptName = 167,
394 llGetNumberOfSides = 168,
395 llAxisAngle2Rot = 169,
396 llRot2Axis = 170,
397 llRot2Angle = 171,
398 llAcos = 172,
399 llAsin = 173,
400 llAngleBetween = 174,
401 llGetInventoryKey = 175,
402 llAllowInventoryDrop = 176,
403 llGetSunDirection = 177,
404 llGetTextureOffset = 178,
405 llGetTextureScale = 179,
406 llGetTextureRot = 180,
407 llSubStringIndex = 181,
408 llGetOwnerKey = 182,
409 llGetCenterOfMass = 183,
410 llListSort = 184,
411 llGetListLength = 185,
412 llList2Integer = 186,
413 llList2Float = 187,
414 llList2String = 188,
415 llList2Key = 189,
416 llList2Vector = 190,
417 llList2Rot = 191,
418 llList2List = 192,
419 llDeleteSubList = 193,
420 llGetListEntryType = 194,
421 llList2CSV = 195,
422 llCSV2List = 196,
423 llListRandomize = 197,
424 llList2ListStrided = 198,
425 llGetRegionCorner = 199,
426 llListInsertList = 200,
427 llListFindList = 201,
428 llGetObjectName = 202,
429 llSetObjectName = 203,
430 llGetDate = 204,
431 llEdgeOfWorld = 205,
432 llGetAgentInfo = 206,
433 llAdjustSoundVolume = 207,
434 llSetSoundQueueing = 208,
435 llSetSoundRadius = 209,
436 llKey2Name = 210,
437 llSetTextureAnim = 211,
438 llTriggerSoundLimited = 212,
439 llEjectFromLand = 213,
440 llParseString2List = 214,
441 llOverMyLand = 215,
442 llGetLandOwnerAt = 216,
443 llGetNotecardLine = 217,
444 llGetAgentSize = 218,
445 llSameGroup = 219,
446 llUnSit = 220,
447 llGroundSlope = 221,
448 llGroundNormal = 222,
449 llGroundContour = 223,
450 llGetAttached = 224,
451 llGetFreeMemory = 225,
452 llGetRegionName = 226,
453 llGetRegionTimeDilation = 227,
454 llGetRegionFPS = 228,
455 llParticleSystem = 229,
456 llGroundRepel = 230,
457 llGiveInventoryList = 231,
458 llSetVehicleType = 232,
459 llSetVehicleFloatParam = 233,
460 llSetVehicleVectorParam = 234,
461 llSetVehicleRotationParam = 235,
462 llSetVehicleFlags = 236,
463 llRemoveVehicleFlags = 237,
464 llSitTarget = 238,
465 llAvatarOnSitTarget = 239,
466 llAddToLandPassList = 240,
467 llSetTouchText = 241,
468 llSetSitText = 242,
469 llSetCameraEyeOffset = 243,
470 llSetCameraAtOffset = 244,
471 llDumpList2String = 245,
472 llScriptDanger = 246,
473 llDialog = 247,
474 llVolumeDetect = 248,
475 llResetOtherScript = 249,
476 llGetScriptState = 250,
477 llRemoteLoadScript = 251,
478 llSetRemoteScriptAccessPin = 252,
479 llRemoteLoadScriptPin = 253,
480 llOpenRemoteDataChannel = 254,
481 llSendRemoteData = 255,
482 llRemoteDataReply = 256,
483 llCloseRemoteDataChannel = 257,
484 llMD5String = 258,
485 llSetPrimitiveParams = 259,
486 llStringToBase64 = 260,
487 llBase64ToString = 261,
488 llXorBase64Strings = 262,
489 llRemoteDataSetRegion = 263,
490 llLog10 = 264,
491 llLog = 265,
492 llGetAnimationList = 266,
493 llSetParcelMusicURL = 267,
494 llGetRootPosition = 268,
495 llGetRootRotation = 269,
496 llGetObjectDesc = 270,
497 llSetObjectDesc = 271,
498 llGetCreator = 272,
499 llGetTimestamp = 273,
500 llSetLinkAlpha = 274,
501 llGetNumberOfPrims = 275,
502 llGetNumberOfNotecardLines = 276,
503 llGetBoundingBox = 277,
504 llGetGeometricCenter = 278,
505 llGetPrimitiveParams = 279,
506 llIntegerToBase64 = 280,
507 llBase64ToInteger = 281,
508 llGetGMTclock = 282,
509 llGetSimulatorHostname = 283,
510 llSetLocalRot = 284,
511 llParseStringKeepNulls = 285,
512 llRezAtRoot = 286,
513 llGetObjectPermMask = 287,
514 llSetObjectPermMask = 288,
515 llGetInventoryPermMask = 289,
516 llSetInventoryPermMask = 290,
517 llGetInventoryCreator = 291,
518 llOwnerSay = 292,
519 llRequestSimulatorData = 293,
520 llForceMouselook = 294,
521 llGetObjectMass = 295,
522 llListReplaceList = 296,
523 llLoadURL = 297,
524 llParcelMediaCommandList = 298,
525 llParcelMediaQuery = 299,
526 llModPow = 300,
527 llGetInventoryType = 301,
528 llSetPayPrice = 302,
529 llGetCameraPos = 303,
530 llGetCameraRot = 304,
531 llSetPrimURL = 305,
532 llRefreshPrimURL = 306,
533 llEscapeURL = 307,
534 llUnescapeURL = 308,
535 llMapDestination = 309,
536 llAddToLandBanList = 310,
537 llRemoveFromLandPassList = 311,
538 llRemoveFromLandBanList = 312,
539 llSetCameraParams = 313,
540 llClearCameraParams = 314,
541 llListStatistics = 315,
542 llGetUnixTime = 316,
543 llGetParcelFlags = 317,
544 llGetRegionFlags = 318,
545 llXorBase64StringsCorrect = 319,
546 llHTTPRequest = 320,
547 llResetLandBanList = 321,
548 llResetLandPassList = 322,
549 llGetParcelPrimCount = 323,
550 llGetParcelPrimOwners = 324,
551 llGetObjectPrimCount = 325,
552 llGetParcelMaxPrims = 326,
553 llGetParcelDetails = 327
554 }
555
556 }
557}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Parser.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Parser.cs
new file mode 100644
index 0000000..b486c46
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Parser.cs
@@ -0,0 +1,722 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.IO;
33using System.Reflection;
34using System.Reflection.Emit;
35
36namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
37{
38 partial class LSO_Parser
39 {
40 private string FileName;
41 private FileStream fs;
42 private BinaryReader br;
43 internal LSO_Struct.Header myHeader;
44 internal Dictionary<long, LSO_Struct.StaticBlock> StaticBlocks = new Dictionary<long, LSO_Struct.StaticBlock>();
45 //private System.Collections.Hashtable StaticBlocks = new System.Collections.Hashtable();
46
47 private TypeBuilder typeBuilder;
48 private System.Collections.Generic.List<string> EventList = new System.Collections.Generic.List<string>();
49
50 public LSO_Parser(string _FileName, TypeBuilder _typeBuilder)
51 {
52 FileName = _FileName;
53 typeBuilder = _typeBuilder;
54 }
55
56 internal void OpenFile()
57 {
58 // Open
59 Common.SendToDebug("Opening filename: " + FileName);
60 fs = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
61 br = new BinaryReader(fs, Encoding.BigEndianUnicode);
62
63 }
64 internal void CloseFile()
65 {
66
67 // Close
68 br.Close();
69 fs.Close();
70 }
71
72
73 /// <summary>
74 /// Parse LSO file.
75 /// </summary>
76 public void Parse()
77 {
78
79
80
81 // The LSO Format consist of 6 major blocks: header, statics, functions, states, heap, and stack.
82
83
84 // HEADER BLOCK
85 Common.SendToDebug("Reading HEADER BLOCK at: 0");
86 fs.Seek(0, SeekOrigin.Begin);
87 myHeader = new LSO_Struct.Header();
88 myHeader.TM = BitConverter.ToUInt32(br_read(4), 0);
89 myHeader.IP = BitConverter.ToUInt32(br_read(4), 0);
90 myHeader.VN = BitConverter.ToUInt32(br_read(4), 0);
91 myHeader.BP = BitConverter.ToUInt32(br_read(4), 0);
92 myHeader.SP = BitConverter.ToUInt32(br_read(4), 0);
93 myHeader.HR = BitConverter.ToUInt32(br_read(4), 0);
94 myHeader.HP = BitConverter.ToUInt32(br_read(4), 0);
95 myHeader.CS = BitConverter.ToUInt32(br_read(4), 0);
96 myHeader.NS = BitConverter.ToUInt32(br_read(4), 0);
97 myHeader.CE = BitConverter.ToUInt32(br_read(4), 0);
98 myHeader.IE = BitConverter.ToUInt32(br_read(4), 0);
99 myHeader.ER = BitConverter.ToUInt32(br_read(4), 0);
100 myHeader.FR = BitConverter.ToUInt32(br_read(4), 0);
101 myHeader.SLR = BitConverter.ToUInt32(br_read(4), 0);
102 myHeader.GVR = BitConverter.ToUInt32(br_read(4), 0);
103 myHeader.GFR = BitConverter.ToUInt32(br_read(4), 0);
104 myHeader.PR = BitConverter.ToUInt32(br_read(4), 0);
105 myHeader.ESR = BitConverter.ToUInt32(br_read(4), 0);
106 myHeader.SR = BitConverter.ToUInt32(br_read(4), 0);
107 myHeader.NCE = BitConverter.ToUInt64(br_read(8), 0);
108 myHeader.NIE = BitConverter.ToUInt64(br_read(8), 0);
109 myHeader.NER = BitConverter.ToUInt64(br_read(8), 0);
110
111 // Print Header Block to debug
112 Common.SendToDebug("TM - Top of memory (size): " + myHeader.TM);
113 Common.SendToDebug("IP - Instruction Pointer (0=not running): " + myHeader.IP);
114 Common.SendToDebug("VN - Version number: " + myHeader.VN);
115 Common.SendToDebug("BP - Local Frame Pointer: " + myHeader.BP);
116 Common.SendToDebug("SP - Stack Pointer: " + myHeader.SP);
117 Common.SendToDebug("HR - Heap Register: " + myHeader.HR);
118 Common.SendToDebug("HP - Heap Pointer: " + myHeader.HP);
119 Common.SendToDebug("CS - Current State: " + myHeader.CS);
120 Common.SendToDebug("NS - Next State: " + myHeader.NS);
121 Common.SendToDebug("CE - Current Events: " + myHeader.CE);
122 Common.SendToDebug("IE - In Event: " + myHeader.IE);
123 Common.SendToDebug("ER - Event Register: " + myHeader.ER);
124 Common.SendToDebug("FR - Fault Register: " + myHeader.FR);
125 Common.SendToDebug("SLR - Sleep Register: " + myHeader.SLR);
126 Common.SendToDebug("GVR - Global Variable Register: " + myHeader.GVR);
127 Common.SendToDebug("GFR - Global Function Register: " + myHeader.GFR);
128 Common.SendToDebug("PR - Parameter Register: " + myHeader.PR);
129 Common.SendToDebug("ESR - Energy Supply Register: " + myHeader.ESR);
130 Common.SendToDebug("SR - State Register: " + myHeader.SR);
131 Common.SendToDebug("NCE - 64-bit Current Events: " + myHeader.NCE);
132 Common.SendToDebug("NIE - 64-bit In Events: " + myHeader.NIE);
133 Common.SendToDebug("NER - 64-bit Event Register: " + myHeader.NER);
134 Common.SendToDebug("Read position when exiting HEADER BLOCK: " + fs.Position);
135
136 // STATIC BLOCK
137 Common.SendToDebug("Reading STATIC BLOCK at: " + myHeader.GVR);
138 fs.Seek(myHeader.GVR, SeekOrigin.Begin);
139 int StaticBlockCount = 0;
140 // Read function blocks until we hit GFR
141 while (fs.Position < myHeader.GFR)
142 {
143 StaticBlockCount++;
144 long startReadPos = fs.Position;
145 Common.SendToDebug("Reading Static Block " + StaticBlockCount + " at: " + startReadPos);
146
147 //fs.Seek(myHeader.GVR, SeekOrigin.Begin);
148 LSO_Struct.StaticBlock myStaticBlock = new LSO_Struct.StaticBlock();
149 myStaticBlock.Static_Chunk_Header_Size = BitConverter.ToUInt32(br_read(4), 0);
150 myStaticBlock.ObjectType = br_read(1)[0];
151 Common.SendToDebug("Static Block ObjectType: " + ((LSO_Enums.Variable_Type_Codes)myStaticBlock.ObjectType).ToString());
152 myStaticBlock.Unknown = br_read(1)[0];
153 // Size of datatype varies -- what about strings?
154 if (myStaticBlock.ObjectType != 0)
155 myStaticBlock.BlockVariable = br_read(getObjectSize(myStaticBlock.ObjectType));
156
157 StaticBlocks.Add((UInt32)startReadPos, myStaticBlock);
158
159 }
160 Common.SendToDebug("Number of Static Blocks read: " + StaticBlockCount);
161
162
163 // FUNCTION BLOCK
164 // Always right after STATIC BLOCK
165 LSO_Struct.FunctionBlock myFunctionBlock = new LSO_Struct.FunctionBlock();
166 if (myHeader.GFR == myHeader.SR)
167 {
168 // If GFR and SR are at same position then there is no fuction block
169 Common.SendToDebug("No FUNCTION BLOCK found");
170 }
171 else
172 {
173 Common.SendToDebug("Reading FUNCTION BLOCK at: " + myHeader.GFR);
174 fs.Seek(myHeader.GFR, SeekOrigin.Begin);
175 myFunctionBlock.FunctionCount = BitConverter.ToUInt32(br_read(4), 0);
176 Common.SendToDebug("Number of functions in Fuction Block: " + myFunctionBlock.FunctionCount);
177 if (myFunctionBlock.FunctionCount > 0)
178 {
179 myFunctionBlock.CodeChunkPointer = new UInt32[myFunctionBlock.FunctionCount];
180 for (int i = 0; i < myFunctionBlock.FunctionCount; i++)
181 {
182 Common.SendToDebug("Reading function " + i + " at: " + fs.Position);
183 // TODO: ADD TO FUNCTION LIST (How do we identify it later?)
184 // Note! Absolute position
185 myFunctionBlock.CodeChunkPointer[i] = BitConverter.ToUInt32(br_read(4), 0) + myHeader.GFR;
186 Common.SendToDebug("Fuction " + i + " code chunk position: " + myFunctionBlock.CodeChunkPointer[i]);
187 }
188 }
189 }
190
191
192 // STATE FRAME BLOCK
193 // Always right after FUNCTION BLOCK
194 Common.SendToDebug("Reading STATE BLOCK at: " + myHeader.SR);
195 fs.Seek(myHeader.SR, SeekOrigin.Begin);
196 LSO_Struct.StateFrameBlock myStateFrameBlock = new LSO_Struct.StateFrameBlock();
197 myStateFrameBlock.StateCount = BitConverter.ToUInt32(br_read(4), 0);
198 if (myStateFrameBlock.StateCount > 0)
199 {
200 // Initialize array
201 myStateFrameBlock.StatePointer = new LSO_Struct.StatePointerBlock[myStateFrameBlock.StateCount];
202 for (int i = 0; i < myStateFrameBlock.StateCount; i++)
203 {
204 Common.SendToDebug("Reading STATE POINTER BLOCK " + (i + 1) + " at: " + fs.Position);
205 // Position is relative to state frame
206 myStateFrameBlock.StatePointer[i].Location = myHeader.SR + BitConverter.ToUInt32(br_read(4), 0);
207 myStateFrameBlock.StatePointer[i].EventMask = new System.Collections.BitArray(br_read(8));
208 Common.SendToDebug("Pointer: " + myStateFrameBlock.StatePointer[i].Location);
209 Common.SendToDebug("Total potential EventMask bits: " + myStateFrameBlock.StatePointer[i].EventMask.Count);
210
211 //// Read STATE BLOCK
212 //long CurPos = fs.Position;
213 //fs.Seek(CurPos, SeekOrigin.Begin);
214
215 }
216 }
217
218
219 // STATE BLOCK
220 // For each StateFrameBlock there is one StateBlock with multiple event handlers
221
222 if (myStateFrameBlock.StateCount > 0)
223 {
224 // Go through all State Frame Pointers found
225 for (int i = 0; i < myStateFrameBlock.StateCount; i++)
226 {
227
228 fs.Seek(myStateFrameBlock.StatePointer[i].Location, SeekOrigin.Begin);
229 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " at: " + fs.Position);
230
231 // READ: STATE BLOCK HEADER
232 myStateFrameBlock.StatePointer[i].StateBlock = new LSO_Struct.StateBlock();
233 myStateFrameBlock.StatePointer[i].StateBlock.StartPos = (UInt32)fs.Position; // Note
234 myStateFrameBlock.StatePointer[i].StateBlock.HeaderSize = BitConverter.ToUInt32(br_read(4), 0);
235 myStateFrameBlock.StatePointer[i].StateBlock.Unknown = br_read(1)[0];
236 myStateFrameBlock.StatePointer[i].StateBlock.EndPos = (UInt32)fs.Position; // Note
237 Common.SendToDebug("State block Start Pos: " + myStateFrameBlock.StatePointer[i].StateBlock.StartPos);
238 Common.SendToDebug("State block Header Size: " + myStateFrameBlock.StatePointer[i].StateBlock.HeaderSize);
239 Common.SendToDebug("State block Header End Pos: " + myStateFrameBlock.StatePointer[i].StateBlock.EndPos);
240
241 // We need to count number of bits flagged in EventMask?
242
243
244 // for each bit in myStateFrameBlock.StatePointer[i].EventMask
245
246 // ADDING TO ALL RIGHT NOW, SHOULD LIMIT TO ONLY THE ONES IN USE
247 //TODO: Create event hooks
248 myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers = new LSO_Struct.StateBlockHandler[myStateFrameBlock.StatePointer[i].EventMask.Count - 1];
249 for (int ii = 0; ii < myStateFrameBlock.StatePointer[i].EventMask.Count - 1; ii++)
250 {
251
252 if (myStateFrameBlock.StatePointer[i].EventMask.Get(ii) == true)
253 {
254 // We got an event
255 // READ: STATE BLOCK HANDLER
256 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " HANDLER matching EVENT MASK " + ii + " (" + ((LSO_Enums.Event_Mask_Values)ii).ToString() + ") at: " + fs.Position);
257 myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer = myStateFrameBlock.StatePointer[i].StateBlock.EndPos + BitConverter.ToUInt32(br_read(4), 0);
258 myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CallFrameSize = BitConverter.ToUInt32(br_read(4), 0);
259 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " HANDLER EVENT MASK " + ii + " (" + ((LSO_Enums.Event_Mask_Values)ii).ToString() + ") Code Chunk Pointer: " + myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer);
260 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " HANDLER EVENT MASK " + ii + " (" + ((LSO_Enums.Event_Mask_Values)ii).ToString() + ") Call Frame Size: " + myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CallFrameSize);
261 }
262 }
263 }
264 }
265
266
267
268
269 //// READ FUNCTION CODE CHUNKS
270 //// Functions + Function start pos (GFR)
271 //// TODO: Somehow be able to identify and reference this
272 //LSO_Struct.CodeChunk[] myFunctionCodeChunk;
273 //if (myFunctionBlock.FunctionCount > 0)
274 //{
275 // myFunctionCodeChunk = new LSO_Struct.CodeChunk[myFunctionBlock.FunctionCount];
276 // for (int i = 0; i < myFunctionBlock.FunctionCount; i++)
277 // {
278 // Common.SendToDebug("Reading Function Code Chunk " + i);
279 // myFunctionCodeChunk[i] = GetCodeChunk((UInt32)myFunctionBlock.CodeChunkPointer[i]);
280 // }
281
282 //}
283 // READ EVENT CODE CHUNKS
284 LSO_Struct.CodeChunk[] myEventCodeChunk;
285 if (myStateFrameBlock.StateCount > 0)
286 {
287 myEventCodeChunk = new LSO_Struct.CodeChunk[myStateFrameBlock.StateCount];
288 for (int i = 0; i < myStateFrameBlock.StateCount; i++)
289 {
290 // TODO: Somehow organize events and functions so they can be found again,
291 // two level search ain't no good
292 for (int ii = 0; ii < myStateFrameBlock.StatePointer[i].EventMask.Count - 1; ii++)
293 {
294
295
296 if (myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer > 0)
297 {
298 Common.SendToDebug("Reading Event Code Chunk state " + i + ", event " + (LSO_Enums.Event_Mask_Values)ii);
299
300
301 // Override a Method / Function
302 string eventname = i + "_event_" + (LSO_Enums.Event_Mask_Values)ii;
303 Common.SendToDebug("Event Name: " + eventname);
304 if (Common.IL_ProcessCodeChunks)
305 {
306 EventList.Add(eventname);
307
308 // JUMP TO CODE PROCESSOR
309 ProcessCodeChunk(myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer, typeBuilder, eventname);
310 }
311 }
312
313 }
314
315 }
316
317 }
318
319
320
321
322 if (Common.IL_CreateFunctionList)
323 IL_INSERT_FUNCTIONLIST();
324
325 }
326
327 internal LSO_Struct.HeapBlock GetHeap(UInt32 pos)
328 {
329 // HEAP BLOCK
330 // TODO:? Special read for strings/keys (null terminated) and lists (pointers to other HEAP entries)
331 Common.SendToDebug("Reading HEAP BLOCK at: " + pos);
332 fs.Seek(pos, SeekOrigin.Begin);
333
334 LSO_Struct.HeapBlock myHeapBlock = new LSO_Struct.HeapBlock();
335 myHeapBlock.DataBlockSize = BitConverter.ToInt32(br_read(4), 0);
336 myHeapBlock.ObjectType = br_read(1)[0];
337 myHeapBlock.ReferenceCount = BitConverter.ToUInt16(br_read(2), 0);
338 //myHeapBlock.Data = br_read(getObjectSize(myHeapBlock.ObjectType));
339 // Don't read it reversed
340 myHeapBlock.Data = new byte[myHeapBlock.DataBlockSize - 1];
341 br.Read(myHeapBlock.Data, 0, myHeapBlock.DataBlockSize - 1);
342
343
344 Common.SendToDebug("Heap Block Data Block Size: " + myHeapBlock.DataBlockSize);
345 Common.SendToDebug("Heap Block ObjectType: " + ((LSO_Enums.Variable_Type_Codes)myHeapBlock.ObjectType).ToString());
346 Common.SendToDebug("Heap Block Reference Count: " + myHeapBlock.ReferenceCount);
347
348 return myHeapBlock;
349 }
350 private byte[] br_read(int len)
351 {
352 if (len <= 0)
353 return null;
354
355 try
356 {
357 byte[] bytes = new byte[len];
358 for (int i = len - 1; i > -1; i--)
359 bytes[i] = br.ReadByte();
360 return bytes;
361 }
362 catch (Exception e)
363 {
364 Common.SendToDebug("Exception: " + e.ToString());
365 throw (e);
366 }
367 }
368 //private byte[] br_read_smallendian(int len)
369 //{
370 // byte[] bytes = new byte[len];
371 // br.Read(bytes,0, len);
372 // return bytes;
373 //}
374 private Type getLLObjectType(byte objectCode)
375 {
376 switch ((LSO_Enums.Variable_Type_Codes)objectCode)
377 {
378 case LSO_Enums.Variable_Type_Codes.Void: return typeof(void);
379 case LSO_Enums.Variable_Type_Codes.Integer: return typeof(UInt32);
380 case LSO_Enums.Variable_Type_Codes.Float: return typeof(float);
381 case LSO_Enums.Variable_Type_Codes.String: return typeof(string);
382 case LSO_Enums.Variable_Type_Codes.Key: return typeof(string);
383 case LSO_Enums.Variable_Type_Codes.Vector: return typeof(LSO_Enums.Vector);
384 case LSO_Enums.Variable_Type_Codes.Rotation: return typeof(LSO_Enums.Rotation);
385 case LSO_Enums.Variable_Type_Codes.List:
386 Common.SendToDebug("TODO: List datatype not implemented yet!");
387 return typeof(System.Collections.ArrayList);
388 case LSO_Enums.Variable_Type_Codes.Null:
389 Common.SendToDebug("TODO: Datatype null is not implemented, using string instead.!");
390 return typeof(string);
391 default:
392 Common.SendToDebug("Lookup of LSL datatype " + objectCode + " to .Net datatype failed: Unknown LSL datatype. Defaulting to object.");
393 return typeof(object);
394 }
395 }
396 private int getObjectSize(byte ObjectType)
397 {
398 switch ((LSO_Enums.Variable_Type_Codes)ObjectType)
399 {
400 case LSO_Enums.Variable_Type_Codes.Integer:
401 case LSO_Enums.Variable_Type_Codes.Float:
402 case LSO_Enums.Variable_Type_Codes.String:
403 case LSO_Enums.Variable_Type_Codes.Key:
404 case LSO_Enums.Variable_Type_Codes.List:
405 return 4;
406 case LSO_Enums.Variable_Type_Codes.Vector:
407 return 12;
408 case LSO_Enums.Variable_Type_Codes.Rotation:
409 return 16;
410 default:
411 return 0;
412 }
413 }
414 private string Read_String()
415 {
416 string ret = "";
417 byte reader = br_read(1)[0];
418 while (reader != 0x000)
419 {
420 ret += (char)reader;
421 reader = br_read(1)[0];
422 }
423 return ret;
424 }
425
426 /// <summary>
427 /// Reads a code chunk and creates IL
428 /// </summary>
429 /// <param name="pos">Absolute position in file. REMEMBER TO ADD myHeader.GFR!</param>
430 /// <param name="typeBuilder">TypeBuilder for assembly</param>
431 /// <param name="eventname">Name of event (function) to generate</param>
432 private void ProcessCodeChunk(UInt32 pos, TypeBuilder typeBuilder, string eventname)
433 {
434
435 LSO_Struct.CodeChunk myCodeChunk = new LSO_Struct.CodeChunk();
436
437 Common.SendToDebug("Reading Function Code Chunk at: " + pos);
438 fs.Seek(pos, SeekOrigin.Begin);
439 myCodeChunk.CodeChunkHeaderSize = BitConverter.ToUInt32(br_read(4), 0);
440 Common.SendToDebug("CodeChunk Header Size: " + myCodeChunk.CodeChunkHeaderSize);
441 // Read until null
442 myCodeChunk.Comment = Read_String();
443 Common.SendToDebug("Function comment: " + myCodeChunk.Comment);
444 myCodeChunk.ReturnTypePos = br_read(1)[0];
445 myCodeChunk.ReturnType = GetStaticBlock((long)myCodeChunk.ReturnTypePos + (long)myHeader.GVR);
446 Common.SendToDebug("Return type #" + myCodeChunk.ReturnType.ObjectType + ": " + ((LSO_Enums.Variable_Type_Codes)myCodeChunk.ReturnType.ObjectType).ToString());
447
448
449 // TODO: How to determine number of codechunks -- does this method work?
450 myCodeChunk.CodeChunkArguments = new System.Collections.Generic.List<LSO_Struct.CodeChunkArgument>();
451 byte reader = br_read(1)[0];
452 reader = br_read(1)[0];
453
454 // NOTE ON CODE CHUNK ARGUMENTS
455 // This determins type definition
456 int ccount = 0;
457 while (reader != 0x000)
458 {
459 ccount++;
460 Common.SendToDebug("Reading Code Chunk Argument " + ccount);
461 LSO_Struct.CodeChunkArgument CCA = new LSO_Struct.CodeChunkArgument();
462 CCA.FunctionReturnTypePos = reader;
463 reader = br_read(1)[0];
464 CCA.NullString = reader;
465 CCA.FunctionReturnType = GetStaticBlock(CCA.FunctionReturnTypePos + myHeader.GVR);
466 myCodeChunk.CodeChunkArguments.Add(CCA);
467 Common.SendToDebug("Code Chunk Argument " + ccount + " type #" + CCA.FunctionReturnType.ObjectType + ": " + (LSO_Enums.Variable_Type_Codes)CCA.FunctionReturnType.ObjectType);
468 }
469 // Create string array
470 Type[] MethodArgs = new Type[myCodeChunk.CodeChunkArguments.Count];
471 for (int _ic = 0; _ic < myCodeChunk.CodeChunkArguments.Count; _ic++)
472 {
473 MethodArgs[_ic] = getLLObjectType(myCodeChunk.CodeChunkArguments[_ic].FunctionReturnType.ObjectType);
474 Common.SendToDebug("Method argument " + _ic + ": " + getLLObjectType(myCodeChunk.CodeChunkArguments[_ic].FunctionReturnType.ObjectType).ToString());
475 }
476 // End marker is 0x000
477 myCodeChunk.EndMarker = reader;
478
479
480 //
481 // Emit: START OF METHOD (FUNCTION)
482 //
483
484 Common.SendToDebug("CLR:" + eventname + ":MethodBuilder methodBuilder = typeBuilder.DefineMethod...");
485 MethodBuilder methodBuilder = typeBuilder.DefineMethod(eventname,
486 MethodAttributes.Public,
487 typeof(void),
488 new Type[] { typeof(object) });
489 //MethodArgs);
490 //typeof(void), //getLLObjectType(myCodeChunk.ReturnType),
491 // new Type[] { typeof(object) }, //);
492
493 //Common.SendToDebug("CLR:" + eventname + ":typeBuilder.DefineMethodOverride(methodBuilder...");
494 //typeBuilder.DefineMethodOverride(methodBuilder,
495 // typeof(LSL_CLRInterface.LSLScript).GetMethod(eventname));
496
497 // Create the IL generator
498
499 Common.SendToDebug("CLR:" + eventname + ":ILGenerator il = methodBuilder.GetILGenerator();");
500 ILGenerator il = methodBuilder.GetILGenerator();
501
502
503 if (Common.IL_UseTryCatch)
504 IL_INSERT_TRY(il, eventname);
505
506
507
508 // Push Console.WriteLine command to stack ... Console.WriteLine("Hello World!");
509 //Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Call...");
510 //il.Emit(OpCodes.Call, typeof(Console).GetMethod
511 // ("WriteLine", new Type[] { typeof(string) }));
512
513 //Common.SendToDebug("STARTUP: il.Emit(OpCodes.Ldc_I4_S, 0);");
514
515 //il.Emit(OpCodes.Ldc_I4_S, 0);
516 for (int _ic = 0; _ic < myCodeChunk.CodeChunkArguments.Count; _ic++)
517 {
518 Common.SendToDebug("PARAMS: il.Emit(OpCodes.Ldarg, " + _ic + ");");
519 il.Emit(OpCodes.Ldarg, _ic);
520 }
521
522
523
524 //
525 // CALLING OPCODE PROCESSOR, one command at the time TO GENERATE IL
526 //
527 bool FoundRet = false;
528 while (FoundRet == false)
529 {
530 FoundRet = LSL_PROCESS_OPCODE(il);
531 }
532
533
534 if (Common.IL_UseTryCatch)
535 IL_INSERT_END_TRY(il, eventname);
536
537 // Emit: RETURN FROM METHOD
538 il.Emit(OpCodes.Ret);
539
540 return;
541
542 }
543
544 private void IL_INSERT_FUNCTIONLIST()
545 {
546
547 Common.SendToDebug("Creating function list");
548
549
550 string eventname = "GetFunctions";
551
552 Common.SendToDebug("Creating IL " + eventname);
553 // Define a private String field.
554 //FieldBuilder myField = myTypeBuilder.DefineField("EventList", typeof(String[]), FieldAttributes.Public);
555
556
557 //FieldBuilder mem = typeBuilder.DefineField("mem", typeof(Array), FieldAttributes.Private);
558
559
560
561 MethodBuilder methodBuilder = typeBuilder.DefineMethod(eventname,
562 MethodAttributes.Public,
563 typeof(string[]),
564 null);
565
566 //typeBuilder.DefineMethodOverride(methodBuilder,
567 // typeof(LSL_CLRInterface.LSLScript).GetMethod(eventname));
568
569 ILGenerator il = methodBuilder.GetILGenerator();
570
571
572
573
574 // IL_INSERT_TRY(il, eventname);
575
576 // // Push string to stack
577 // il.Emit(OpCodes.Ldstr, "Inside " + eventname);
578
579 //// Push Console.WriteLine command to stack ... Console.WriteLine("Hello World!");
580 //il.Emit(OpCodes.Call, typeof(Console).GetMethod
581 // ("WriteLine", new Type[] { typeof(string) }));
582
583 //initIL.Emit(OpCodes.Newobj, typeof(string[]));
584
585 //string[] MyArray = new string[2] { "TestItem1" , "TestItem2" };
586
587 ////il.Emit(OpCodes.Ldarg_0);
588
589 il.DeclareLocal(typeof(string[]));
590
591 ////il.Emit(OpCodes.Ldarg_0);
592 il.Emit(OpCodes.Ldc_I4, EventList.Count); // Specify array length
593 il.Emit(OpCodes.Newarr, typeof(String)); // create new string array
594 il.Emit(OpCodes.Stloc_0); // Store array as local variable 0 in stack
595 ////SetFunctionList
596
597 for (int lv = 0; lv < EventList.Count; lv++)
598 {
599 il.Emit(OpCodes.Ldloc_0); // Load local variable 0 onto stack
600 il.Emit(OpCodes.Ldc_I4, lv); // Push index position
601 il.Emit(OpCodes.Ldstr, EventList[lv]); // Push value
602 il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value
603
604 //il.Emit(OpCodes.Ldarg_0);
605 //il.Emit(OpCodes.Ldstr, EventList[lv]); // Push value
606 //il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("AddFunction", new Type[] { typeof(string) }));
607
608 }
609
610
611
612 // IL_INSERT_END_TRY(il, eventname);
613
614
615 il.Emit(OpCodes.Ldloc_0); // Load local variable 0 onto stack
616 // il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("SetFunctionList", new Type[] { typeof(Array) }));
617
618 il.Emit(OpCodes.Ret); // Return
619
620 }
621
622
623 private void IL_INSERT_TRY(ILGenerator il, string eventname)
624 {
625 /*
626 * CLR TRY
627 */
628 //Common.SendToDebug("CLR:" + eventname + ":il.BeginExceptionBlock()");
629 il.BeginExceptionBlock();
630
631 // Push "Hello World!" string to stack
632 //Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Ldstr...");
633 //il.Emit(OpCodes.Ldstr, "Starting CLR dynamic execution of: " + eventname);
634
635 }
636
637 private void IL_INSERT_END_TRY(ILGenerator il, string eventname)
638 {
639 /*
640 * CATCH
641 */
642 Common.SendToDebug("CLR:" + eventname + ":il.BeginCatchBlock(typeof(Exception));");
643 il.BeginCatchBlock(typeof(Exception));
644
645 // Push "Hello World!" string to stack
646 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Ldstr...");
647 il.Emit(OpCodes.Ldstr, "Execption executing dynamic CLR function " + eventname + ": ");
648
649 //call void [mscorlib]System.Console::WriteLine(string)
650 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Call...");
651 il.Emit(OpCodes.Call, typeof(Console).GetMethod
652 ("Write", new Type[] { typeof(string) }));
653
654 //callvirt instance string [mscorlib]System.Exception::get_Message()
655 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Callvirt...");
656 il.Emit(OpCodes.Callvirt, typeof(Exception).GetMethod
657 ("get_Message"));
658
659 //call void [mscorlib]System.Console::WriteLine(string)
660 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Call...");
661 il.Emit(OpCodes.Call, typeof(Console).GetMethod
662 ("WriteLine", new Type[] { typeof(string) }));
663
664 /*
665 * CLR END TRY
666 */
667 //Common.SendToDebug("CLR:" + eventname + ":il.EndExceptionBlock();");
668 il.EndExceptionBlock();
669 }
670
671 private LSO_Struct.StaticBlock GetStaticBlock(long pos)
672 {
673 long FirstPos = fs.Position;
674 try
675 {
676 UInt32 position = (UInt32)pos;
677 // STATIC BLOCK
678 Common.SendToDebug("Reading STATIC BLOCK at: " + position);
679 fs.Seek(position, SeekOrigin.Begin);
680
681 if (StaticBlocks.ContainsKey(position) == true)
682 {
683 Common.SendToDebug("Found cached STATIC BLOCK");
684
685
686
687 return StaticBlocks[pos];
688 }
689
690 //int StaticBlockCount = 0;
691 // Read function blocks until we hit GFR
692 //while (fs.Position < myHeader.GFR)
693 //{
694 //StaticBlockCount++;
695
696 //Common.SendToDebug("Reading Static Block at: " + position);
697
698 //fs.Seek(myHeader.GVR, SeekOrigin.Begin);
699 LSO_Struct.StaticBlock myStaticBlock = new LSO_Struct.StaticBlock();
700 myStaticBlock.Static_Chunk_Header_Size = BitConverter.ToUInt32(br_read(4), 0);
701 myStaticBlock.ObjectType = br_read(1)[0];
702 Common.SendToDebug("Static Block ObjectType: " + ((LSO_Enums.Variable_Type_Codes)myStaticBlock.ObjectType).ToString());
703 myStaticBlock.Unknown = br_read(1)[0];
704 // Size of datatype varies
705 if (myStaticBlock.ObjectType != 0)
706 myStaticBlock.BlockVariable = br_read(getObjectSize(myStaticBlock.ObjectType));
707
708 StaticBlocks.Add(position, myStaticBlock);
709 //}
710 Common.SendToDebug("Done reading Static Block.");
711 return myStaticBlock;
712 }
713 finally
714 {
715 // Go back to original read pos
716 fs.Seek(FirstPos, SeekOrigin.Begin);
717 }
718
719 }
720
721 }
722}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Struct.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Struct.cs
new file mode 100644
index 0000000..8ea618c
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSO_Struct.cs
@@ -0,0 +1,135 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29
30using System;
31using System.Collections.Generic;
32using System.Text;
33
34namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
35{
36 static class LSO_Struct
37 {
38
39 public struct Header
40 {
41 public UInt32 TM;
42 public UInt32 IP;
43 public UInt32 VN;
44 public UInt32 BP;
45 public UInt32 SP;
46 public UInt32 HR;
47 public UInt32 HP;
48 public UInt32 CS;
49 public UInt32 NS;
50 public UInt32 CE;
51 public UInt32 IE;
52 public UInt32 ER;
53 public UInt32 FR;
54 public UInt32 SLR;
55 public UInt32 GVR;
56 public UInt32 GFR;
57 public UInt32 PR;
58 public UInt32 ESR;
59 public UInt32 SR;
60 public UInt64 NCE;
61 public UInt64 NIE;
62 public UInt64 NER;
63 }
64
65 public struct StaticBlock
66 {
67 public UInt32 Static_Chunk_Header_Size;
68 public byte ObjectType;
69 public byte Unknown;
70 public byte[] BlockVariable;
71 }
72 /* Not actually a structure
73 public struct StaticBlockVariable
74 {
75 public UInt32 Integer1;
76 public UInt32 Float1;
77 public UInt32 HeapPointer_String;
78 public UInt32 HeapPointer_Key;
79 public byte[] Vector_12;
80 public byte[] Rotation_16;
81 public UInt32 Pointer_List_Structure;
82 } */
83 public struct HeapBlock
84 {
85 public Int32 DataBlockSize;
86 public byte ObjectType;
87 public UInt16 ReferenceCount;
88 public byte[] Data;
89 }
90 public struct StateFrameBlock
91 {
92 public UInt32 StateCount;
93 public StatePointerBlock[] StatePointer;
94 }
95 public struct StatePointerBlock
96 {
97 public UInt32 Location;
98 public System.Collections.BitArray EventMask;
99 public StateBlock StateBlock;
100 }
101 public struct StateBlock
102 {
103 public UInt32 StartPos;
104 public UInt32 EndPos;
105 public UInt32 HeaderSize;
106 public byte Unknown;
107 public StateBlockHandler[] StateBlockHandlers;
108 }
109 public struct StateBlockHandler
110 {
111 public UInt32 CodeChunkPointer;
112 public UInt32 CallFrameSize;
113 }
114 public struct FunctionBlock
115 {
116 public UInt32 FunctionCount;
117 public UInt32[] CodeChunkPointer;
118 }
119 public struct CodeChunk
120 {
121 public UInt32 CodeChunkHeaderSize;
122 public string Comment;
123 public System.Collections.Generic.List<CodeChunkArgument> CodeChunkArguments;
124 public byte EndMarker;
125 public byte ReturnTypePos;
126 public StaticBlock ReturnType;
127 }
128 public struct CodeChunkArgument
129 {
130 public byte FunctionReturnTypePos;
131 public byte NullString;
132 public StaticBlock FunctionReturnType;
133 }
134 }
135}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_Interface.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_Interface.cs
new file mode 100644
index 0000000..b6f2889
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_Interface.cs
@@ -0,0 +1,368 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
34{
35 public interface LSL_BuiltIn_Commands_Interface
36 {
37 float llSin(float f);
38 float llCos(float f);
39 float llTan(float f);
40 float llAtan2(float x, float y);
41 float llSqrt(float f);
42 float llPow(float fbase, float fexponent);
43 UInt32 llAbs(UInt32 i);
44 float llFabs(float f);
45 float llFrand(float mag);
46 UInt32 llFloor(float f);
47 UInt32 llCeil(float f);
48 UInt32 llRound(float f);
49 float llVecMag(LSO_Enums.Vector v);
50 LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v);
51 float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b);
52 LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r);
53 LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v);
54 LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up);
55 LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r);
56 LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r);
57 LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r);
58 LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end);
59 void llWhisper(UInt16 channelID, string text);
60 //void llSay(UInt32 channelID, string text);
61 void llSay(object channelID, object text);
62 void llShout(UInt16 channelID, string text);
63 UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg);
64 void llListenControl(UInt32 number, UInt32 active);
65 void llListenRemove(UInt32 number);
66 void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc);
67 void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate);
68 void llSensorRemove();
69 string llDetectedName(UInt32 number);
70 LSO_Enums.Key llDetectedKey(UInt32 number);
71 LSO_Enums.Key llDetectedOwner(UInt32 number);
72 UInt32 llDetectedType(UInt32 number);
73 LSO_Enums.Vector llDetectedPos(UInt32 number);
74 LSO_Enums.Vector llDetectedVel(UInt32 number);
75 LSO_Enums.Vector llDetectedGrab(UInt32 number);
76 LSO_Enums.Rotation llDetectedRot(UInt32 number);
77 UInt32 llDetectedGroup(UInt32 number);
78 UInt32 llDetectedLinkNumber(UInt32 number);
79 void llDie();
80 float llGround(LSO_Enums.Vector offset);
81 float llCloud(LSO_Enums.Vector offset);
82 LSO_Enums.Vector llWind(LSO_Enums.Vector offset);
83 void llSetStatus(UInt32 status, UInt32 value);
84 UInt32 llGetStatus(UInt32 status);
85 void llSetScale(LSO_Enums.Vector scale);
86 LSO_Enums.Vector llGetScale();
87 void llSetColor(LSO_Enums.Vector color, UInt32 face);
88 float llGetAlpha(UInt32 face);
89 void llSetAlpha(float alpha, UInt32 face);
90 LSO_Enums.Vector llGetColor(UInt32 face);
91 void llSetTexture(string texture, UInt32 face);
92 void llScaleTexture(float u, float v, UInt32 face);
93 void llOffsetTexture(float u, float v, UInt32 face);
94 void llRotateTexture(float rotation, UInt32 face);
95 string llGetTexture(UInt32 face);
96 void llSetPos(LSO_Enums.Vector pos);
97
98 void llGetPos();
99 void llGetLocalPos();
100 void llSetRot();
101 void llGetRot();
102 void llGetLocalRot();
103 void llSetForce();
104 void llGetForce();
105 void llTarget();
106 void llTargetRemove();
107 void llRotTarget();
108 void llRotTargetRemove();
109 void llMoveToTarget();
110 void llStopMoveToTarget();
111 void llApplyImpulse();
112 void llApplyRotationalImpulse();
113 void llSetTorque();
114 void llGetTorque();
115 void llSetForceAndTorque();
116 void llGetVel();
117 void llGetAccel();
118 void llGetOmega();
119 void llGetTimeOfDay();
120 void llGetWallclock();
121 void llGetTime();
122 void llResetTime();
123 void llGetAndResetTime();
124 void llSound();
125 void llPlaySound();
126 void llLoopSound();
127 void llLoopSoundMaster();
128 void llLoopSoundSlave();
129 void llPlaySoundSlave();
130 void llTriggerSound();
131 void llStopSound();
132 void llPreloadSound();
133 void llGetSubString();
134 void llDeleteSubString();
135 void llInsertString();
136 void llToUpper();
137 void llToLower();
138 void llGiveMoney();
139 void llMakeExplosion();
140 void llMakeFountain();
141 void llMakeSmoke();
142 void llMakeFire();
143 void llRezObject();
144 void llLookAt();
145 void llStopLookAt();
146 void llSetTimerEvent();
147 void llSleep();
148 void llGetMass();
149 void llCollisionFilter();
150 void llTakeControls();
151 void llReleaseControls();
152 void llAttachToAvatar();
153 void llDetachFromAvatar();
154 void llTakeCamera();
155 void llReleaseCamera();
156 void llGetOwner();
157 void llInstantMessage();
158 void llEmail();
159 void llGetNextEmail();
160 void llGetKey();
161 void llSetBuoyancy();
162 void llSetHoverHeight();
163 void llStopHover();
164 void llMinEventDelay();
165 void llSoundPreload();
166 void llRotLookAt();
167 void llStringLength();
168 void llStartAnimation();
169 void llStopAnimation();
170 void llPointAt();
171 void llStopPointAt();
172 void llTargetOmega();
173 void llGetStartParameter();
174 void llGodLikeRezObject();
175 void llRequestPermissions();
176 void llGetPermissionsKey();
177 void llGetPermissions();
178 void llGetLinkNumber();
179 void llSetLinkColor();
180 void llCreateLink();
181 void llBreakLink();
182 void llBreakAllLinks();
183 void llGetLinkKey();
184 void llGetLinkName();
185 void llGetInventoryNumber();
186 void llGetInventoryName();
187 void llSetScriptState();
188 void llGetEnergy();
189 void llGiveInventory();
190 void llRemoveInventory();
191 void llSetText();
192 void llWater();
193 void llPassTouches();
194 void llRequestAgentData();
195 void llRequestInventoryData();
196 void llSetDamage();
197 void llTeleportAgentHome();
198 void llModifyLand();
199 void llCollisionSound();
200 void llCollisionSprite();
201 void llGetAnimation();
202 void llResetScript();
203 void llMessageLinked();
204 void llPushObject();
205 void llPassCollisions();
206 void llGetScriptName();
207 void llGetNumberOfSides();
208 void llAxisAngle2Rot();
209 void llRot2Axis();
210 void llRot2Angle();
211 void llAcos();
212 void llAsin();
213 void llAngleBetween();
214 void llGetInventoryKey();
215 void llAllowInventoryDrop();
216 void llGetSunDirection();
217 void llGetTextureOffset();
218 void llGetTextureScale();
219 void llGetTextureRot();
220 void llSubStringIndex();
221 void llGetOwnerKey();
222 void llGetCenterOfMass();
223 void llListSort();
224 void llGetListLength();
225 void llList2Integer();
226 void llList2Float();
227 void llList2String();
228 void llList2Key();
229 void llList2Vector();
230 void llList2Rot();
231 void llList2List();
232 void llDeleteSubList();
233 void llGetListEntryType();
234 void llList2CSV();
235 void llCSV2List();
236 void llListRandomize();
237 void llList2ListStrided();
238 void llGetRegionCorner();
239 void llListInsertList();
240 void llListFindList();
241 void llGetObjectName();
242 void llSetObjectName();
243 void llGetDate();
244 void llEdgeOfWorld();
245 void llGetAgentInfo();
246 void llAdjustSoundVolume();
247 void llSetSoundQueueing();
248 void llSetSoundRadius();
249 void llKey2Name();
250 void llSetTextureAnim();
251 void llTriggerSoundLimited();
252 void llEjectFromLand();
253 void llParseString2List();
254 void llOverMyLand();
255 void llGetLandOwnerAt();
256 void llGetNotecardLine();
257 void llGetAgentSize();
258 void llSameGroup();
259 void llUnSit();
260 void llGroundSlope();
261 void llGroundNormal();
262 void llGroundContour();
263 void llGetAttached();
264 void llGetFreeMemory();
265 void llGetRegionName();
266 void llGetRegionTimeDilation();
267 void llGetRegionFPS();
268 void llParticleSystem();
269 void llGroundRepel();
270 void llGiveInventoryList();
271 void llSetVehicleType();
272 void llSetVehicleFloatParam();
273 void llSetVehicleVectorParam();
274 void llSetVehicleRotationParam();
275 void llSetVehicleFlags();
276 void llRemoveVehicleFlags();
277 void llSitTarget();
278 void llAvatarOnSitTarget();
279 void llAddToLandPassList();
280 void llSetTouchText();
281 void llSetSitText();
282 void llSetCameraEyeOffset();
283 void llSetCameraAtOffset();
284 void llDumpList2String();
285 void llScriptDanger();
286 void llDialog();
287 void llVolumeDetect();
288 void llResetOtherScript();
289 void llGetScriptState();
290 void llRemoteLoadScript();
291 void llSetRemoteScriptAccessPin();
292 void llRemoteLoadScriptPin();
293 void llOpenRemoteDataChannel();
294 void llSendRemoteData();
295 void llRemoteDataReply();
296 void llCloseRemoteDataChannel();
297 void llMD5String();
298 void llSetPrimitiveParams();
299 void llStringToBase64();
300 void llBase64ToString();
301 void llXorBase64Strings();
302 void llRemoteDataSetRegion();
303 void llLog10();
304 void llLog();
305 void llGetAnimationList();
306 void llSetParcelMusicURL();
307 void llGetRootPosition();
308 void llGetRootRotation();
309 void llGetObjectDesc();
310 void llSetObjectDesc();
311 void llGetCreator();
312 void llGetTimestamp();
313 void llSetLinkAlpha();
314 void llGetNumberOfPrims();
315 void llGetNumberOfNotecardLines();
316 void llGetBoundingBox();
317 void llGetGeometricCenter();
318 void llGetPrimitiveParams();
319 void llIntegerToBase64();
320 void llBase64ToInteger();
321 void llGetGMTclock();
322 void llGetSimulatorHostname();
323 void llSetLocalRot();
324 void llParseStringKeepNulls();
325 void llRezAtRoot();
326 void llGetObjectPermMask();
327 void llSetObjectPermMask();
328 void llGetInventoryPermMask();
329 void llSetInventoryPermMask();
330 void llGetInventoryCreator();
331 void llOwnerSay();
332 void llRequestSimulatorData();
333 void llForceMouselook();
334 void llGetObjectMass();
335 void llListReplaceList();
336 void llLoadURL();
337 void llParcelMediaCommandList();
338 void llParcelMediaQuery();
339 void llModPow();
340 void llGetInventoryType();
341 void llSetPayPrice();
342 void llGetCameraPos();
343 void llGetCameraRot();
344 void llSetPrimURL();
345 void llRefreshPrimURL();
346 void llEscapeURL();
347 void llUnescapeURL();
348 void llMapDestination();
349 void llAddToLandBanList();
350 void llRemoveFromLandPassList();
351 void llRemoveFromLandBanList();
352 void llSetCameraParams();
353 void llClearCameraParams();
354 void llListStatistics();
355 void llGetUnixTime();
356 void llGetParcelFlags();
357 void llGetRegionFlags();
358 void llXorBase64StringsCorrect();
359 void llHTTPRequest();
360 void llResetLandBanList();
361 void llResetLandPassList();
362 void llGetParcelPrimCount();
363 void llGetParcelPrimOwners();
364 void llGetObjectPrimCount();
365 void llGetParcelMaxPrims();
366 void llGetParcelDetails();
367 }
368}
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_TestImplementation.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_TestImplementation.cs
new file mode 100644
index 0000000..bbdafad
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Server API/LSL_BuiltIn_Commands_TestImplementation.cs
@@ -0,0 +1,386 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
34{
35 public class LSL_BuiltIn_Commands_TestImplementation : LSL_BuiltIn_Commands_Interface
36 {
37 public LSL_BuiltIn_Commands_TestImplementation(string FullScriptID)
38 {
39 Common.SendToDebug("LSL_BuiltIn_Commands_TestImplementation: Creating object for FullScriptID: " + FullScriptID);
40 }
41
42
43 public float llSin(float f) { return 0; }
44 public float llCos(float f) { return 0; }
45 public float llTan(float f) { return 0; }
46 public float llAtan2(float x, float y) { return 0; }
47 public float llSqrt(float f) { return 0; }
48 public float llPow(float fbase, float fexponent) { return 0; }
49 public UInt32 llAbs(UInt32 i) { return 0; }
50 public float llFabs(float f) { return 0; }
51 public float llFrand(float mag) { return 0; }
52 public UInt32 llFloor(float f) { return 0; }
53 public UInt32 llCeil(float f) { return 0; }
54 public UInt32 llRound(float f) { return 0; }
55 public float llVecMag(LSO_Enums.Vector v) { return 0; }
56 public LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v) { return new LSO_Enums.Vector(); }
57 public float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b) { return 0; }
58 public LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r) { return new LSO_Enums.Vector(); }
59 public LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v) { return new LSO_Enums.Rotation(); }
60 public LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up) { return new LSO_Enums.Rotation(); }
61 public LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r) { return new LSO_Enums.Vector(); }
62 public LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r) { return new LSO_Enums.Vector(); }
63 public LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r) { return new LSO_Enums.Vector(); }
64 public LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end) { return new LSO_Enums.Rotation(); }
65 public void llWhisper(UInt16 channelID, string text)
66 {
67 Common.SendToDebug("INTERNAL FUNCTION llWhisper(" + channelID + ", \"" + text + "\");");
68 Common.SendToLog("llWhisper Channel " + channelID + ", Text: \"" + text + "\"");
69 }
70 //public void llSay(UInt32 channelID, string text)
71 public void llSay(object channelID, object text)
72 {
73 Common.SendToDebug("INTERNAL FUNCTION llSay(" + (UInt32)channelID + ", \"" + (string)text + "\");");
74 Common.SendToLog("llSay Channel " + (UInt32)channelID + ", Text: \"" + (string)text + "\"");
75 }
76 public void llShout(UInt16 channelID, string text) { return; }
77 public UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg) { return 0; }
78 public void llListenControl(UInt32 number, UInt32 active) { return; }
79 public void llListenRemove(UInt32 number) { return; }
80 public void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc) { return; }
81 public void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate) { return; }
82 public void llSensorRemove() { return; }
83 public string llDetectedName(UInt32 number) { return ""; }
84 public LSO_Enums.Key llDetectedKey(UInt32 number) { return new LSO_Enums.Key(); }
85 public LSO_Enums.Key llDetectedOwner(UInt32 number) { return new LSO_Enums.Key(); }
86 public UInt32 llDetectedType(UInt32 number) { return 0; }
87 public LSO_Enums.Vector llDetectedPos(UInt32 number) { return new LSO_Enums.Vector(); }
88 public LSO_Enums.Vector llDetectedVel(UInt32 number) { return new LSO_Enums.Vector(); }
89 public LSO_Enums.Vector llDetectedGrab(UInt32 number) { return new LSO_Enums.Vector(); }
90 public LSO_Enums.Rotation llDetectedRot(UInt32 number) { return new LSO_Enums.Rotation(); }
91 public UInt32 llDetectedGroup(UInt32 number) { return 0; }
92 public UInt32 llDetectedLinkNumber(UInt32 number) { return 0; }
93 public void llDie() { return; }
94 public float llGround(LSO_Enums.Vector offset) { return 0; }
95 public float llCloud(LSO_Enums.Vector offset) { return 0; }
96 public LSO_Enums.Vector llWind(LSO_Enums.Vector offset) { return new LSO_Enums.Vector(); }
97 public void llSetStatus(UInt32 status, UInt32 value) { return; }
98 public UInt32 llGetStatus(UInt32 status) { return 0; }
99 public void llSetScale(LSO_Enums.Vector scale) { return; }
100 public LSO_Enums.Vector llGetScale() { return new LSO_Enums.Vector(); }
101 public void llSetColor(LSO_Enums.Vector color, UInt32 face) { return; }
102 public float llGetAlpha(UInt32 face) { return 0; }
103 public void llSetAlpha(float alpha, UInt32 face) { return; }
104 public LSO_Enums.Vector llGetColor(UInt32 face) { return new LSO_Enums.Vector(); }
105 public void llSetTexture(string texture, UInt32 face) { return; }
106 public void llScaleTexture(float u, float v, UInt32 face) { return; }
107 public void llOffsetTexture(float u, float v, UInt32 face) { return; }
108 public void llRotateTexture(float rotation, UInt32 face) { return; }
109 public string llGetTexture(UInt32 face) { return ""; }
110 public void llSetPos(LSO_Enums.Vector pos) { return; }
111
112
113 public void llGetPos() { }
114 public void llGetLocalPos() { }
115 public void llSetRot() { }
116 public void llGetRot() { }
117 public void llGetLocalRot() { }
118 public void llSetForce() { }
119 public void llGetForce() { }
120 public void llTarget() { }
121 public void llTargetRemove() { }
122 public void llRotTarget() { }
123 public void llRotTargetRemove() { }
124 public void llMoveToTarget() { }
125 public void llStopMoveToTarget() { }
126 public void llApplyImpulse() { }
127 public void llApplyRotationalImpulse() { }
128 public void llSetTorque() { }
129 public void llGetTorque() { }
130 public void llSetForceAndTorque() { }
131 public void llGetVel() { }
132 public void llGetAccel() { }
133 public void llGetOmega() { }
134 public void llGetTimeOfDay() { }
135 public void llGetWallclock() { }
136 public void llGetTime() { }
137 public void llResetTime() { }
138 public void llGetAndResetTime() { }
139 public void llSound() { }
140 public void llPlaySound() { }
141 public void llLoopSound() { }
142 public void llLoopSoundMaster() { }
143 public void llLoopSoundSlave() { }
144 public void llPlaySoundSlave() { }
145 public void llTriggerSound() { }
146 public void llStopSound() { }
147 public void llPreloadSound() { }
148 public void llGetSubString() { }
149 public void llDeleteSubString() { }
150 public void llInsertString() { }
151 public void llToUpper() { }
152 public void llToLower() { }
153 public void llGiveMoney() { }
154 public void llMakeExplosion() { }
155 public void llMakeFountain() { }
156 public void llMakeSmoke() { }
157 public void llMakeFire() { }
158 public void llRezObject() { }
159 public void llLookAt() { }
160 public void llStopLookAt() { }
161 public void llSetTimerEvent() { }
162 public void llSleep() { }
163 public void llGetMass() { }
164 public void llCollisionFilter() { }
165 public void llTakeControls() { }
166 public void llReleaseControls() { }
167 public void llAttachToAvatar() { }
168 public void llDetachFromAvatar() { }
169 public void llTakeCamera() { }
170 public void llReleaseCamera() { }
171 public void llGetOwner() { }
172 public void llInstantMessage() { }
173 public void llEmail() { }
174 public void llGetNextEmail() { }
175 public void llGetKey() { }
176 public void llSetBuoyancy() { }
177 public void llSetHoverHeight() { }
178 public void llStopHover() { }
179 public void llMinEventDelay() { }
180 public void llSoundPreload() { }
181 public void llRotLookAt() { }
182 public void llStringLength() { }
183 public void llStartAnimation() { }
184 public void llStopAnimation() { }
185 public void llPointAt() { }
186 public void llStopPointAt() { }
187 public void llTargetOmega() { }
188 public void llGetStartParameter() { }
189 public void llGodLikeRezObject() { }
190 public void llRequestPermissions() { }
191 public void llGetPermissionsKey() { }
192 public void llGetPermissions() { }
193 public void llGetLinkNumber() { }
194 public void llSetLinkColor() { }
195 public void llCreateLink() { }
196 public void llBreakLink() { }
197 public void llBreakAllLinks() { }
198 public void llGetLinkKey() { }
199 public void llGetLinkName() { }
200 public void llGetInventoryNumber() { }
201 public void llGetInventoryName() { }
202 public void llSetScriptState() { }
203 public void llGetEnergy() { }
204 public void llGiveInventory() { }
205 public void llRemoveInventory() { }
206 public void llSetText() { }
207 public void llWater() { }
208 public void llPassTouches() { }
209 public void llRequestAgentData() { }
210 public void llRequestInventoryData() { }
211 public void llSetDamage() { }
212 public void llTeleportAgentHome() { }
213 public void llModifyLand() { }
214 public void llCollisionSound() { }
215 public void llCollisionSprite() { }
216 public void llGetAnimation() { }
217 public void llResetScript() { }
218 public void llMessageLinked() { }
219 public void llPushObject() { }
220 public void llPassCollisions() { }
221 public void llGetScriptName() { }
222 public void llGetNumberOfSides() { }
223 public void llAxisAngle2Rot() { }
224 public void llRot2Axis() { }
225 public void llRot2Angle() { }
226 public void llAcos() { }
227 public void llAsin() { }
228 public void llAngleBetween() { }
229 public void llGetInventoryKey() { }
230 public void llAllowInventoryDrop() { }
231 public void llGetSunDirection() { }
232 public void llGetTextureOffset() { }
233 public void llGetTextureScale() { }
234 public void llGetTextureRot() { }
235 public void llSubStringIndex() { }
236 public void llGetOwnerKey() { }
237 public void llGetCenterOfMass() { }
238 public void llListSort() { }
239 public void llGetListLength() { }
240 public void llList2Integer() { }
241 public void llList2Float() { }
242 public void llList2String() { }
243 public void llList2Key() { }
244 public void llList2Vector() { }
245 public void llList2Rot() { }
246 public void llList2List() { }
247 public void llDeleteSubList() { }
248 public void llGetListEntryType() { }
249 public void llList2CSV() { }
250 public void llCSV2List() { }
251 public void llListRandomize() { }
252 public void llList2ListStrided() { }
253 public void llGetRegionCorner() { }
254 public void llListInsertList() { }
255 public void llListFindList() { }
256 public void llGetObjectName() { }
257 public void llSetObjectName() { }
258 public void llGetDate() { }
259 public void llEdgeOfWorld() { }
260 public void llGetAgentInfo() { }
261 public void llAdjustSoundVolume() { }
262 public void llSetSoundQueueing() { }
263 public void llSetSoundRadius() { }
264 public void llKey2Name() { }
265 public void llSetTextureAnim() { }
266 public void llTriggerSoundLimited() { }
267 public void llEjectFromLand() { }
268 public void llParseString2List() { }
269 public void llOverMyLand() { }
270 public void llGetLandOwnerAt() { }
271 public void llGetNotecardLine() { }
272 public void llGetAgentSize() { }
273 public void llSameGroup() { }
274 public void llUnSit() { }
275 public void llGroundSlope() { }
276 public void llGroundNormal() { }
277 public void llGroundContour() { }
278 public void llGetAttached() { }
279 public void llGetFreeMemory() { }
280 public void llGetRegionName() { }
281 public void llGetRegionTimeDilation() { }
282 public void llGetRegionFPS() { }
283 public void llParticleSystem() { }
284 public void llGroundRepel() { }
285 public void llGiveInventoryList() { }
286 public void llSetVehicleType() { }
287 public void llSetVehicleFloatParam() { }
288 public void llSetVehicleVectorParam() { }
289 public void llSetVehicleRotationParam() { }
290 public void llSetVehicleFlags() { }
291 public void llRemoveVehicleFlags() { }
292 public void llSitTarget() { }
293 public void llAvatarOnSitTarget() { }
294 public void llAddToLandPassList() { }
295 public void llSetTouchText() { }
296 public void llSetSitText() { }
297 public void llSetCameraEyeOffset() { }
298 public void llSetCameraAtOffset() { }
299 public void llDumpList2String() { }
300 public void llScriptDanger() { }
301 public void llDialog() { }
302 public void llVolumeDetect() { }
303 public void llResetOtherScript() { }
304 public void llGetScriptState() { }
305 public void llRemoteLoadScript() { }
306 public void llSetRemoteScriptAccessPin() { }
307 public void llRemoteLoadScriptPin() { }
308 public void llOpenRemoteDataChannel() { }
309 public void llSendRemoteData() { }
310 public void llRemoteDataReply() { }
311 public void llCloseRemoteDataChannel() { }
312 public void llMD5String() { }
313 public void llSetPrimitiveParams() { }
314 public void llStringToBase64() { }
315 public void llBase64ToString() { }
316 public void llXorBase64Strings() { }
317 public void llRemoteDataSetRegion() { }
318 public void llLog10() { }
319 public void llLog() { }
320 public void llGetAnimationList() { }
321 public void llSetParcelMusicURL() { }
322 public void llGetRootPosition() { }
323 public void llGetRootRotation() { }
324 public void llGetObjectDesc() { }
325 public void llSetObjectDesc() { }
326 public void llGetCreator() { }
327 public void llGetTimestamp() { }
328 public void llSetLinkAlpha() { }
329 public void llGetNumberOfPrims() { }
330 public void llGetNumberOfNotecardLines() { }
331 public void llGetBoundingBox() { }
332 public void llGetGeometricCenter() { }
333 public void llGetPrimitiveParams() { }
334 public void llIntegerToBase64() { }
335 public void llBase64ToInteger() { }
336 public void llGetGMTclock() { }
337 public void llGetSimulatorHostname() { }
338 public void llSetLocalRot() { }
339 public void llParseStringKeepNulls() { }
340 public void llRezAtRoot() { }
341 public void llGetObjectPermMask() { }
342 public void llSetObjectPermMask() { }
343 public void llGetInventoryPermMask() { }
344 public void llSetInventoryPermMask() { }
345 public void llGetInventoryCreator() { }
346 public void llOwnerSay() { }
347 public void llRequestSimulatorData() { }
348 public void llForceMouselook() { }
349 public void llGetObjectMass() { }
350 public void llListReplaceList() { }
351 public void llLoadURL() { }
352 public void llParcelMediaCommandList() { }
353 public void llParcelMediaQuery() { }
354 public void llModPow() { }
355 public void llGetInventoryType() { }
356 public void llSetPayPrice() { }
357 public void llGetCameraPos() { }
358 public void llGetCameraRot() { }
359 public void llSetPrimURL() { }
360 public void llRefreshPrimURL() { }
361 public void llEscapeURL() { }
362 public void llUnescapeURL() { }
363 public void llMapDestination() { }
364 public void llAddToLandBanList() { }
365 public void llRemoveFromLandPassList() { }
366 public void llRemoveFromLandBanList() { }
367 public void llSetCameraParams() { }
368 public void llClearCameraParams() { }
369 public void llListStatistics() { }
370 public void llGetUnixTime() { }
371 public void llGetParcelFlags() { }
372 public void llGetRegionFlags() { }
373 public void llXorBase64StringsCorrect() { }
374 public void llHTTPRequest() { }
375 public void llResetLandBanList() { }
376 public void llResetLandPassList() { }
377 public void llGetParcelPrimCount() { }
378 public void llGetParcelPrimOwners() { }
379 public void llGetObjectPrimCount() { }
380 public void llGetParcelMaxPrims() { }
381 public void llGetParcelDetails() { }
382
383
384
385 }
386}