aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs84
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs300
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs56
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs60
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs373
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs350
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs79
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs436
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs557
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs722
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs135
11 files changed, 3152 insertions, 0 deletions
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs
new file mode 100644
index 0000000..e1ea916
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs
@@ -0,0 +1,84 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs
new file mode 100644
index 0000000..cfae2c5
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs
@@ -0,0 +1,300 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO.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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs
new file mode 100644
index 0000000..eef9d20
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs
new file mode 100644
index 0000000..89efa6a
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs
@@ -0,0 +1,60 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler;
6using OpenSim.Region.ScriptEngine.Common;
7
8namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
9{
10 public partial class LSL_BaseClass
11 {
12 //public MemoryStream LSLStack = new MemoryStream();
13 public Stack<object> LSLStack = new Stack<object>();
14 public Dictionary<UInt32, object> StaticVariables = new Dictionary<UInt32, object>();
15 public Dictionary<UInt32, object> GlobalVariables = new Dictionary<UInt32, object>();
16 public Dictionary<UInt32, object> LocalVariables = new Dictionary<UInt32, object>();
17 //public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>();
18 //public void AddFunction(String x) {
19 // FunctionList.Add(x);
20 //}
21 //public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>;
22 //public struct StackItemStruct
23 //{
24 // public LSO_Enums.Variable_Type_Codes ItemType;
25 // public object Data;
26 //}
27 public UInt32 State = 0;
28 public LSL_BuiltIn_Commands_Interface LSL_Builtins;
29 public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn()
30 {
31 return LSL_Builtins;
32 }
33
34
35 public LSL_BaseClass() { }
36
37
38 public virtual int OverrideMe()
39 {
40 return 0;
41 }
42 public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins)
43 {
44 LSL_Builtins = LSLBuiltins;
45
46 Common.SendToLog("OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass.Start() called");
47 //LSL_Builtins.llSay(0, "Test");
48 return;
49 }
50
51 public void AddToStatic(UInt32 index, object obj)
52 {
53 Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType());
54 StaticVariables.Add(index, obj);
55 }
56
57
58
59 }
60}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs
new file mode 100644
index 0000000..3782494
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs
@@ -0,0 +1,373 @@
1//using System;
2//using System.Collections.Generic;
3//using System.Text;
4
5//namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs
new file mode 100644
index 0000000..5a2f9be
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs
@@ -0,0 +1,350 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
6{
7 public partial class LSL_BaseClass
8 {
9 /*
10 * OPCODES
11 *
12 * These are internal "assembly" commands,
13 * basic operators like "ADD", "PUSH" and "POP"
14 *
15 * It also contains managed stack and keeps track of internal variables, etc.
16 *
17 */
18
19
20 public void StoreToLocal(UInt32 index)
21 {
22 // TODO: How to determine local?
23 Common.SendToDebug("::StoreToLocal " + index);
24 if (LocalVariables.ContainsKey(index))
25 LocalVariables.Remove(index);
26 LocalVariables.Add(index, LSLStack.Peek());
27 }
28 public void StoreToGlobal(UInt32 index)
29 {
30 Common.SendToDebug("::StoreToGlobal " + index);
31 if (GlobalVariables.ContainsKey(index))
32 GlobalVariables.Remove(index);
33 GlobalVariables.Add(index, LSLStack.Peek());
34 }
35 public void StoreToStatic(UInt32 index)
36 {
37 Common.SendToDebug("::StoreToStatic " + index);
38 //if (StaticVariables.ContainsKey(index))
39 // StaticVariables.Remove(index);
40 StaticVariables.Add(index, LSLStack.Peek());
41 }
42 public void GetFromLocal(UInt32 index)
43 {
44 // TODO: How to determine local?
45 Common.SendToDebug("::GetFromLocal " + index);
46 object ret;
47 LocalVariables.TryGetValue(index, out ret);
48 LSLStack.Push(ret);
49 //return ret;
50 }
51 public void GetFromGlobal(UInt32 index)
52 {
53 Common.SendToDebug("::GetFromGlobal " + index);
54 object ret;
55 GlobalVariables.TryGetValue(index, out ret);
56 LSLStack.Push(ret);
57 //return ret;
58 }
59 public void GetFromStatic(UInt32 index)
60 {
61 Common.SendToDebug("::GetFromStatic " + index);
62 object ret;
63 StaticVariables.TryGetValue(index, out ret);
64 Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString());
65 LSLStack.Push(ret);
66 //return ret;
67 }
68
69 public object POPToStack()
70 {
71 Common.SendToDebug("::POPToStack");
72 //return LSLStack.Pop();
73 object p = LSLStack.Pop();
74 if (p.GetType() == typeof(UInt32))
75 return (UInt32)p;
76 if (p.GetType() == typeof(string))
77 return (string)p;
78 if (p.GetType() == typeof(Int32))
79 return (Int32)p;
80 if (p.GetType() == typeof(UInt16))
81 return (UInt16)p;
82 if (p.GetType() == typeof(float))
83 return (float)p;
84 if (p.GetType() == typeof(LSO_Enums.Vector))
85 return (LSO_Enums.Vector)p;
86 if (p.GetType() == typeof(LSO_Enums.Rotation))
87 return (LSO_Enums.Rotation)p;
88 if (p.GetType() == typeof(LSO_Enums.Key))
89 return (LSO_Enums.Key)p;
90
91 return p;
92 }
93
94 //public object POPToStack(UInt32 count)
95 //{
96 // // POP NUMBER FROM TOP OF STACK
97 // //LSLStack.SetLength(LSLStack.Length - 4);
98 // Common.SendToDebug("::POPToStack " + count);
99 // if (count < 2)
100 // return LSLStack.Pop();
101
102 // Stack<object> s = new Stack<object>();
103 // for (int i = 0; i < count; i++)
104 // {
105 // s.Push(LSLStack.Pop);
106
107 // }
108
109 //}
110
111 public void POP()
112 {
113 // POP NUMBER FROM TOP OF STACK
114 //LSLStack.SetLength(LSLStack.Length - 4);
115 Common.SendToDebug("::POP");
116 if (LSLStack.Count < 1)
117 {
118 //TODO: Temporary fix
119 Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!");
120 }
121 else
122 {
123 LSLStack.Pop();
124 }
125 }
126 public void PUSH(object Param)
127 {
128 if (Param == null)
129 {
130 Common.SendToDebug("::PUSH: <null>");
131 }
132 else
133 {
134
135 //Common.SendToDebug("::PUSH: " + Param.GetType());
136 }
137
138 LSLStack.Push(Param);
139 }
140 public void ADD(UInt32 Param)
141 {
142 Common.SendToDebug("::ADD: " + Param);
143 object o2 = LSLStack.Pop();
144 object o1 = LSLStack.Pop();
145 Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + " (" + o2.ToString() + ")");
146 if (o2.GetType() == typeof(string))
147 {
148 LSLStack.Push((string)o1 + (string)o2);
149 return;
150 }
151 if (o2.GetType() == typeof(UInt32))
152 {
153 LSLStack.Push((UInt32)o1 + (UInt32)o2);
154 return;
155 }
156
157 }
158 public void SUB(UInt32 Param)
159 {
160 Common.SendToDebug("::SUB: " + Param);
161 UInt32 i2 = (UInt32)LSLStack.Pop();
162 UInt32 i1 = (UInt32)LSLStack.Pop();
163 LSLStack.Push((UInt32)(i1 - i2));
164 }
165 public void MUL(UInt32 Param)
166 {
167 Common.SendToDebug("::SUB: " + Param);
168 UInt32 i2 = (UInt32)LSLStack.Pop();
169 UInt32 i1 = (UInt32)LSLStack.Pop();
170 LSLStack.Push((UInt32)(i1 * i2));
171 }
172 public void DIV(UInt32 Param)
173 {
174 Common.SendToDebug("::DIV: " + Param);
175 UInt32 i2 = (UInt32)LSLStack.Pop();
176 UInt32 i1 = (UInt32)LSLStack.Pop();
177 LSLStack.Push((UInt32)(i1 / i2));
178 }
179
180
181 public void MOD(UInt32 Param)
182 {
183 Common.SendToDebug("::MOD: " + Param);
184 UInt32 i2 = (UInt32)LSLStack.Pop();
185 UInt32 i1 = (UInt32)LSLStack.Pop();
186 LSLStack.Push((UInt32)(i1 % i2));
187 }
188 public void EQ(UInt32 Param)
189 {
190 Common.SendToDebug("::EQ: " + Param);
191 UInt32 i2 = (UInt32)LSLStack.Pop();
192 UInt32 i1 = (UInt32)LSLStack.Pop();
193 if (i1 == i2)
194 {
195 LSLStack.Push((UInt32)1);
196 }
197 else
198 {
199 LSLStack.Push((UInt32)0);
200 }
201 }
202 public void NEQ(UInt32 Param)
203 {
204 Common.SendToDebug("::NEQ: " + Param);
205 UInt32 i2 = (UInt32)LSLStack.Pop();
206 UInt32 i1 = (UInt32)LSLStack.Pop();
207 if (i1 != i2)
208 {
209 LSLStack.Push((UInt32)1);
210 }
211 else
212 {
213 LSLStack.Push((UInt32)0);
214 }
215 }
216 public void LEQ(UInt32 Param)
217 {
218 Common.SendToDebug("::LEQ: " + Param);
219 UInt32 i2 = (UInt32)LSLStack.Pop();
220 UInt32 i1 = (UInt32)LSLStack.Pop();
221 if (i1 <= i2)
222 {
223 LSLStack.Push((UInt32)1);
224 }
225 else
226 {
227 LSLStack.Push((UInt32)0);
228 }
229 }
230 public void GEQ(UInt32 Param)
231 {
232 Common.SendToDebug("::GEQ: " + Param);
233 UInt32 i2 = (UInt32)LSLStack.Pop();
234 UInt32 i1 = (UInt32)LSLStack.Pop();
235 if (i1 >= i2)
236 {
237 LSLStack.Push((UInt32)1);
238 }
239 else
240 {
241 LSLStack.Push((UInt32)0);
242 }
243 }
244 public void LESS(UInt32 Param)
245 {
246 Common.SendToDebug("::LESS: " + Param);
247 UInt32 i2 = (UInt32)LSLStack.Pop();
248 UInt32 i1 = (UInt32)LSLStack.Pop();
249 if (i1 < i2)
250 {
251 LSLStack.Push((UInt32)1);
252 }
253 else
254 {
255 LSLStack.Push((UInt32)0);
256 }
257 }
258 public void GREATER(UInt32 Param)
259 {
260 Common.SendToDebug("::GREATER: " + Param);
261 UInt32 i2 = (UInt32)LSLStack.Pop();
262 UInt32 i1 = (UInt32)LSLStack.Pop();
263 if (i1 > i2)
264 {
265 LSLStack.Push((UInt32)1);
266 }
267 else
268 {
269 LSLStack.Push((UInt32)0);
270 }
271 }
272
273
274
275 public void BITAND()
276 {
277 Common.SendToDebug("::BITAND");
278 UInt32 i2 = (UInt32)LSLStack.Pop();
279 UInt32 i1 = (UInt32)LSLStack.Pop();
280 LSLStack.Push((UInt32)(i1 & i2));
281 }
282 public void BITOR()
283 {
284 Common.SendToDebug("::BITOR");
285 UInt32 i2 = (UInt32)LSLStack.Pop();
286 UInt32 i1 = (UInt32)LSLStack.Pop();
287 LSLStack.Push((UInt32)(i1 | i2));
288 }
289 public void BITXOR()
290 {
291 Common.SendToDebug("::BITXOR");
292 UInt32 i2 = (UInt32)LSLStack.Pop();
293 UInt32 i1 = (UInt32)LSLStack.Pop();
294 LSLStack.Push((UInt32)(i1 ^ i2));
295 }
296 public void BOOLAND()
297 {
298 Common.SendToDebug("::BOOLAND");
299 bool b2 = bool.Parse((string)LSLStack.Pop());
300 bool b1 = bool.Parse((string)LSLStack.Pop());
301 if (b1 && b2)
302 {
303 LSLStack.Push((UInt32)1);
304 }
305 else
306 {
307 LSLStack.Push((UInt32)0);
308 }
309 }
310 public void BOOLOR()
311 {
312 Common.SendToDebug("::BOOLOR");
313 bool b2 = bool.Parse((string)LSLStack.Pop());
314 bool b1 = bool.Parse((string)LSLStack.Pop());
315
316 if (b1 || b2)
317 {
318 LSLStack.Push((UInt32)1);
319 }
320 else
321 {
322 LSLStack.Push((UInt32)0);
323 }
324
325 }
326 public void NEG(UInt32 Param)
327 {
328 Common.SendToDebug("::NEG: " + Param);
329 //UInt32 i2 = (UInt32)LSLStack.Pop();
330 UInt32 i1 = (UInt32)LSLStack.Pop();
331 LSLStack.Push((UInt32)(i1 * -1));
332 }
333 public void BITNOT()
334 {
335 //Common.SendToDebug("::BITNOT");
336 //UInt32 i2 = (UInt32)LSLStack.Pop();
337 //UInt32 i1 = (UInt32)LSLStack.Pop();
338 //LSLStack.Push((UInt32)(i1 / i2));
339 }
340 public void BOOLNOT()
341 {
342 //Common.SendToDebug("::BOOLNOT");
343 ////UInt32 i2 = (UInt32)LSLStack.Pop();
344 //UInt32 i1 = (UInt32)LSLStack.Pop();
345 //LSLStack.Push((UInt32)(i1));
346 }
347
348
349 }
350}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs
new file mode 100644
index 0000000..5da1d71
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs
@@ -0,0 +1,79 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs
new file mode 100644
index 0000000..45cca25
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs
@@ -0,0 +1,436 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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;
34using OpenSim.Region.ScriptEngine.Common;
35
36namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
37{
38 partial class LSO_Parser
39 {
40 //internal Stack<Type> ILStack = new Stack<Type>();
41 //LSO_Enums MyLSO_Enums = new LSO_Enums();
42
43 internal bool LSL_PROCESS_OPCODE(ILGenerator il)
44 {
45
46 byte bp1;
47 UInt32 u32p1;
48 float fp1;
49 UInt16 opcode = br_read(1)[0];
50 Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString());
51 string idesc = ((LSO_Enums.Operation_Table)opcode).ToString();
52 switch ((LSO_Enums.Operation_Table)opcode)
53 {
54
55 /***************
56 * IMPLEMENTED *
57 ***************/
58 case LSO_Enums.Operation_Table.NOOP:
59 break;
60 case LSO_Enums.Operation_Table.PUSHSP:
61 // Push Stack Top (Memory Address) to stack
62 Common.SendToDebug("Instruction " + idesc);
63 Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack");
64 IL_Push(il, (UInt32)myHeader.SP);
65 break;
66 // BYTE
67 case LSO_Enums.Operation_Table.PUSHARGB:
68 Common.SendToDebug("Param1: " + br_read(1)[0]);
69 break;
70 // INTEGER
71 case LSO_Enums.Operation_Table.PUSHARGI:
72 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
73 Common.SendToDebug("Instruction " + idesc + ", Param1: " + u32p1);
74 IL_Push(il, u32p1);
75 break;
76 // FLOAT
77 case LSO_Enums.Operation_Table.PUSHARGF:
78 fp1 = BitConverter.ToUInt32(br_read(4), 0);
79 Common.SendToDebug("Instruction " + idesc + ", Param1: " + fp1);
80 IL_Push(il, fp1);
81 break;
82 // STRING
83 case LSO_Enums.Operation_Table.PUSHARGS:
84 string s = Read_String();
85 Common.SendToDebug("Instruction " + idesc + ", Param1: " + s);
86 IL_Debug(il, "OPCODE: " + idesc + ":" + s);
87 IL_Push(il, s);
88 break;
89 // VECTOR z,y,x
90 case LSO_Enums.Operation_Table.PUSHARGV:
91 LSO_Enums.Vector v = new LSO_Enums.Vector();
92 v.Z = BitConverter.ToUInt32(br_read(4), 0);
93 v.Y = BitConverter.ToUInt32(br_read(4), 0);
94 v.X = BitConverter.ToUInt32(br_read(4), 0);
95 Common.SendToDebug("Param1 Z: " + v.Z);
96 Common.SendToDebug("Param1 Y: " + v.Y);
97 Common.SendToDebug("Param1 X: " + v.X);
98 IL_Push(il, v);
99 break;
100 // ROTATION s,z,y,x
101 case LSO_Enums.Operation_Table.PUSHARGQ:
102 LSO_Enums.Rotation r = new LSO_Enums.Rotation();
103 r.S = BitConverter.ToUInt32(br_read(4), 0);
104 r.Z = BitConverter.ToUInt32(br_read(4), 0);
105 r.Y = BitConverter.ToUInt32(br_read(4), 0);
106 r.X = BitConverter.ToUInt32(br_read(4), 0);
107 Common.SendToDebug("Param1 S: " + r.S);
108 Common.SendToDebug("Param1 Z: " + r.Z);
109 Common.SendToDebug("Param1 Y: " + r.Y);
110 Common.SendToDebug("Param1 X: " + r.X);
111 IL_Push(il, r);
112 break;
113
114 case LSO_Enums.Operation_Table.PUSHE:
115 IL_Push(il, (UInt32)0);
116 break;
117
118 case LSO_Enums.Operation_Table.PUSHARGE:
119 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
120 Common.SendToDebug("Param1: " + u32p1);
121 //IL_Push(il, new string(" ".ToCharArray()[0], Convert.ToInt32(u32p1)));
122 IL_Push(il, u32p1);
123 break;
124 // BYTE
125 case LSO_Enums.Operation_Table.ADD:
126 case LSO_Enums.Operation_Table.SUB:
127 case LSO_Enums.Operation_Table.MUL:
128 case LSO_Enums.Operation_Table.DIV:
129 case LSO_Enums.Operation_Table.EQ:
130 case LSO_Enums.Operation_Table.NEQ:
131 case LSO_Enums.Operation_Table.LEQ:
132 case LSO_Enums.Operation_Table.GEQ:
133 case LSO_Enums.Operation_Table.LESS:
134 case LSO_Enums.Operation_Table.GREATER:
135 case LSO_Enums.Operation_Table.NEG:
136 case LSO_Enums.Operation_Table.MOD:
137 bp1 = br_read(1)[0];
138 Common.SendToDebug("Param1: " + bp1);
139 IL_CallBaseFunction(il, idesc, (UInt32)bp1);
140 break;
141
142 // NO ARGUMENTS
143 case LSO_Enums.Operation_Table.BITAND:
144 case LSO_Enums.Operation_Table.BITOR:
145 case LSO_Enums.Operation_Table.BITXOR:
146 case LSO_Enums.Operation_Table.BOOLAND:
147 case LSO_Enums.Operation_Table.BOOLOR:
148 case LSO_Enums.Operation_Table.BITNOT:
149 case LSO_Enums.Operation_Table.BOOLNOT:
150 IL_CallBaseFunction(il, idesc);
151 break;
152 // SHORT
153 case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE:
154 // TODO: What is size of short?
155 UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0);
156 Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString());
157 //Common.SendToDebug("Param1: " + U16p1);
158 string fname = ((LSO_Enums.BuiltIn_Functions)U16p1).ToString();
159
160 bool cmdFound = false;
161 foreach (MethodInfo mi in typeof(LSL_BuiltIn_Commands_Interface).GetMethods())
162 {
163 // Found command
164 if (mi.Name == fname)
165 {
166 il.Emit(OpCodes.Ldarg_0);
167 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("GetLSL_BuiltIn", new Type[] { }));
168 // Pop required number of items from my stack to .Net stack
169 IL_PopToStack(il, mi.GetParameters().Length);
170 il.Emit(OpCodes.Callvirt, mi);
171 cmdFound = true;
172 break;
173 }
174 }
175 if (cmdFound == false)
176 {
177 Common.SendToDebug("ERROR: UNABLE TO LOCATE OPCODE " + idesc + " IN BASECLASS");
178 }
179
180 break;
181
182 // RETURN
183 case LSO_Enums.Operation_Table.RETURN:
184
185 Common.SendToDebug("OPCODE: RETURN");
186 return true;
187
188 case LSO_Enums.Operation_Table.POP:
189 case LSO_Enums.Operation_Table.POPS:
190 case LSO_Enums.Operation_Table.POPL:
191 case LSO_Enums.Operation_Table.POPV:
192 case LSO_Enums.Operation_Table.POPQ:
193 // Pops a specific datatype from the stack
194 // We just ignore the datatype for now
195 IL_Pop(il);
196 break;
197
198 // LONG
199 case LSO_Enums.Operation_Table.STORE:
200 case LSO_Enums.Operation_Table.STORES:
201 case LSO_Enums.Operation_Table.STOREL:
202 case LSO_Enums.Operation_Table.STOREV:
203 case LSO_Enums.Operation_Table.STOREQ:
204 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
205 Common.SendToDebug("Param1: " + u32p1.ToString());
206 IL_CallBaseFunction(il, "StoreToLocal", u32p1);
207 break;
208
209 case LSO_Enums.Operation_Table.STOREG:
210 case LSO_Enums.Operation_Table.STOREGS:
211 case LSO_Enums.Operation_Table.STOREGL:
212 case LSO_Enums.Operation_Table.STOREGV:
213 case LSO_Enums.Operation_Table.STOREGQ:
214 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
215 Common.SendToDebug("Param1: " + u32p1.ToString());
216 IL_CallBaseFunction(il, "StoreToGlobal", u32p1);
217 break;
218
219 case LSO_Enums.Operation_Table.LOADP:
220 case LSO_Enums.Operation_Table.LOADSP:
221 case LSO_Enums.Operation_Table.LOADLP:
222 case LSO_Enums.Operation_Table.LOADVP:
223 case LSO_Enums.Operation_Table.LOADQP:
224 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
225 Common.SendToDebug("Param1: " + u32p1.ToString());
226 IL_CallBaseFunction(il, "StoreToLocal", u32p1);
227 IL_Pop(il);
228 break;
229
230 case LSO_Enums.Operation_Table.LOADGP:
231 case LSO_Enums.Operation_Table.LOADGSP:
232 case LSO_Enums.Operation_Table.LOADGLP:
233 case LSO_Enums.Operation_Table.LOADGVP:
234 case LSO_Enums.Operation_Table.LOADGQP:
235 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
236 Common.SendToDebug("Param1: " + u32p1.ToString());
237 IL_CallBaseFunction(il, "StoreToStatic", u32p1 - 6 + myHeader.GVR);
238 IL_Pop(il);
239 break;
240
241 // PUSH FROM LOCAL FRAME
242 case LSO_Enums.Operation_Table.PUSH:
243 case LSO_Enums.Operation_Table.PUSHS:
244 case LSO_Enums.Operation_Table.PUSHL:
245 case LSO_Enums.Operation_Table.PUSHV:
246 case LSO_Enums.Operation_Table.PUSHQ:
247 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
248 Common.SendToDebug("Param1: " + u32p1.ToString());
249 IL_CallBaseFunction(il, "GetFromLocal", u32p1);
250
251 break;
252
253 // PUSH FROM STATIC FRAME
254 case LSO_Enums.Operation_Table.PUSHG:
255 case LSO_Enums.Operation_Table.PUSHGS:
256 case LSO_Enums.Operation_Table.PUSHGL:
257 case LSO_Enums.Operation_Table.PUSHGV:
258 case LSO_Enums.Operation_Table.PUSHGQ:
259 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
260 Common.SendToDebug("Param1: " + u32p1.ToString());
261 IL_CallBaseFunction(il, "GetFromStatic", u32p1 - 6 + myHeader.GVR);
262 break;
263
264
265 /***********************
266 * NOT IMPLEMENTED YET *
267 ***********************/
268
269
270
271 case LSO_Enums.Operation_Table.POPIP:
272 case LSO_Enums.Operation_Table.POPSP:
273 case LSO_Enums.Operation_Table.POPSLR:
274 case LSO_Enums.Operation_Table.POPARG:
275 case LSO_Enums.Operation_Table.POPBP:
276 //Common.SendToDebug("Instruction " + idesc + ": Ignored");
277 Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack (TODO: Only popping 1)");
278 //Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
279 IL_Pop(il);
280 break;
281
282
283
284 // None
285 case LSO_Enums.Operation_Table.PUSHIP:
286 // PUSH INSTRUCTION POINTER
287 break;
288 case LSO_Enums.Operation_Table.PUSHBP:
289
290 case LSO_Enums.Operation_Table.PUSHEV:
291 break;
292 case LSO_Enums.Operation_Table.PUSHEQ:
293 break;
294
295
296 // LONG
297 case LSO_Enums.Operation_Table.JUMP:
298 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
299 break;
300 // BYTE, LONG
301 case LSO_Enums.Operation_Table.JUMPIF:
302 case LSO_Enums.Operation_Table.JUMPNIF:
303 Common.SendToDebug("Param1: " + br_read(1)[0]);
304 Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0));
305 break;
306 // LONG
307 case LSO_Enums.Operation_Table.STATE:
308 bp1 = br_read(1)[0];
309 //il.Emit(OpCodes.Ld); // Load local variable 0 onto stack
310 //il.Emit(OpCodes.Ldc_I4, 0); // Push index position
311 //il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value
312 //il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value
313 break;
314 case LSO_Enums.Operation_Table.CALL:
315 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
316 Common.SendToDebug("ERROR: Function CALL not implemented yet.");
317 break;
318 // BYTE
319 case LSO_Enums.Operation_Table.CAST:
320 bp1 = br_read(1)[0];
321 Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1));
322 Common.SendToDebug("Param1: " + bp1);
323 switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)
324 {
325 case LSO_Enums.OpCode_Cast_TypeDefs.String:
326 Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Box, ILStack.Pop());");
327 break;
328 default:
329 Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!");
330 break;
331 }
332 break;
333 // LONG
334 case LSO_Enums.Operation_Table.STACKTOS:
335 case LSO_Enums.Operation_Table.STACKTOL:
336 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
337 break;
338 // BYTE
339 case LSO_Enums.Operation_Table.PRINT:
340 case LSO_Enums.Operation_Table.CALLLIB:
341 Common.SendToDebug("Param1: " + br_read(1)[0]);
342 break;
343 }
344 return false;
345 }
346
347 private void IL_PopToStack(ILGenerator il)
348 {
349 IL_PopToStack(il, 1);
350 }
351 private void IL_PopToStack(ILGenerator il, int count)
352 {
353 Common.SendToDebug("IL_PopToStack();");
354 for (int i = 0; i < count; i++)
355 {
356 IL_CallBaseFunction(il, "POPToStack");
357 //il.Emit(OpCodes.Ldarg_0);
358 //il.Emit(OpCodes.Call,
359 // typeof(LSL_BaseClass).GetMethod("POPToStack",
360 // new Type[] { }));
361 }
362 }
363 private void IL_Pop(ILGenerator il)
364 {
365 Common.SendToDebug("IL_Pop();");
366 IL_CallBaseFunction(il, "POP");
367 }
368 private void IL_Debug(ILGenerator il, string text)
369 {
370 il.Emit(OpCodes.Ldstr, text);
371 il.Emit(OpCodes.Call, typeof(Common).GetMethod("SendToDebug",
372 new Type[] { typeof(string) }
373 ));
374 }
375 private void IL_CallBaseFunction(ILGenerator il, string methodname)
376 {
377 il.Emit(OpCodes.Ldarg_0);
378 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { }));
379 }
380 private void IL_CallBaseFunction(ILGenerator il, string methodname, object data)
381 {
382 il.Emit(OpCodes.Ldarg_0);
383 if (data.GetType() == typeof(string))
384 il.Emit(OpCodes.Ldstr, (string)data);
385 if (data.GetType() == typeof(UInt32))
386 il.Emit(OpCodes.Ldc_I4, (UInt32)data);
387 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { data.GetType() }));
388 }
389
390 private void IL_Push(ILGenerator il, object data)
391 {
392 il.Emit(OpCodes.Ldarg_0);
393 Common.SendToDebug("PUSH datatype: " + data.GetType());
394
395 IL_PushDataTypeToILStack(il, data);
396
397 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("PUSH", new Type[] { data.GetType() }));
398
399 }
400
401 private void IL_PushDataTypeToILStack(ILGenerator il, object data)
402 {
403 if (data.GetType() == typeof(UInt16))
404 {
405 il.Emit(OpCodes.Ldc_I4, (UInt16)data);
406 il.Emit(OpCodes.Box, data.GetType());
407 }
408 if (data.GetType() == typeof(UInt32))
409 {
410 il.Emit(OpCodes.Ldc_I4, (UInt32)data);
411 il.Emit(OpCodes.Box, data.GetType());
412 }
413 if (data.GetType() == typeof(Int32))
414 {
415 il.Emit(OpCodes.Ldc_I4, (Int32)data);
416 il.Emit(OpCodes.Box, data.GetType());
417 }
418 if (data.GetType() == typeof(float))
419 {
420 il.Emit(OpCodes.Ldc_I4, (float)data);
421 il.Emit(OpCodes.Box, data.GetType());
422 }
423 if (data.GetType() == typeof(string))
424 il.Emit(OpCodes.Ldstr, (string)data);
425 //if (data.GetType() == typeof(LSO_Enums.Rotation))
426 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Rotation)data);
427 //if (data.GetType() == typeof(LSO_Enums.Vector))
428 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Vector)data);
429 //if (data.GetType() == typeof(LSO_Enums.Key))
430 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Key)data);
431
432 }
433
434
435 }
436}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs
new file mode 100644
index 0000000..3de2a36
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs
@@ -0,0 +1,557 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs
new file mode 100644
index 0000000..8b24e68
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs
@@ -0,0 +1,722 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs
new file mode 100644
index 0000000..f0203b3
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs
@@ -0,0 +1,135 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
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}