diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/scripting/Engines/LSLEngine/LSLHandler/LSL_OPCODE_IL_processor.cs | 702 |
1 files changed, 351 insertions, 351 deletions
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/LSLEngine/LSLHandler/LSL_OPCODE_IL_processor.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/LSLEngine/LSLHandler/LSL_OPCODE_IL_processor.cs index 4b8f8d7..46f6845 100644 --- a/OpenSim/Region/Environment/Scenes/scripting/Engines/LSLEngine/LSLHandler/LSL_OPCODE_IL_processor.cs +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/LSLEngine/LSLHandler/LSL_OPCODE_IL_processor.cs | |||
@@ -1,351 +1,351 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ | 2 | * Copyright (c) Contributors, http://www.openmetaverse.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | /* Original code: Tedd Hansen */ | 28 | /* Original code: Tedd Hansen */ |
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using System.Reflection.Emit; | 33 | using System.Reflection.Emit; |
34 | 34 | ||
35 | namespace OpenSim.Region.Scripting.LSL | 35 | namespace OpenSim.Region.Scripting.LSL |
36 | { | 36 | { |
37 | partial class LSO_Parser | 37 | partial class LSO_Parser |
38 | { | 38 | { |
39 | //LSO_Enums MyLSO_Enums = new LSO_Enums(); | 39 | //LSO_Enums MyLSO_Enums = new LSO_Enums(); |
40 | 40 | ||
41 | internal bool LSL_PROCESS_OPCODE(ILGenerator il) | 41 | internal bool LSL_PROCESS_OPCODE(ILGenerator il) |
42 | { | 42 | { |
43 | 43 | ||
44 | byte bp1; | 44 | byte bp1; |
45 | UInt32 u32p1; | 45 | UInt32 u32p1; |
46 | UInt16 opcode = br_read(1)[0]; | 46 | UInt16 opcode = br_read(1)[0]; |
47 | Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString()); | 47 | Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString()); |
48 | string idesc = ((LSO_Enums.Operation_Table)opcode).ToString(); | 48 | string idesc = ((LSO_Enums.Operation_Table)opcode).ToString(); |
49 | switch ((LSO_Enums.Operation_Table)opcode) | 49 | switch ((LSO_Enums.Operation_Table)opcode) |
50 | { | 50 | { |
51 | 51 | ||
52 | case LSO_Enums.Operation_Table.POP: | 52 | case LSO_Enums.Operation_Table.POP: |
53 | case LSO_Enums.Operation_Table.POPL: | 53 | case LSO_Enums.Operation_Table.POPL: |
54 | case LSO_Enums.Operation_Table.POPV: | 54 | case LSO_Enums.Operation_Table.POPV: |
55 | case LSO_Enums.Operation_Table.POPQ: | 55 | case LSO_Enums.Operation_Table.POPQ: |
56 | case LSO_Enums.Operation_Table.POPIP: | 56 | case LSO_Enums.Operation_Table.POPIP: |
57 | case LSO_Enums.Operation_Table.POPBP: | 57 | case LSO_Enums.Operation_Table.POPBP: |
58 | case LSO_Enums.Operation_Table.POPSP: | 58 | case LSO_Enums.Operation_Table.POPSP: |
59 | case LSO_Enums.Operation_Table.POPSLR: | 59 | case LSO_Enums.Operation_Table.POPSLR: |
60 | // ignore -- builds callframe | 60 | // ignore -- builds callframe |
61 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Pop);"); | 61 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Pop);"); |
62 | il.Emit(OpCodes.Pop); | 62 | il.Emit(OpCodes.Pop); |
63 | break; | 63 | break; |
64 | case LSO_Enums.Operation_Table.POPARG: | 64 | case LSO_Enums.Operation_Table.POPARG: |
65 | Common.SendToDebug("Instruction " + idesc + ": Ignored"); | 65 | Common.SendToDebug("Instruction " + idesc + ": Ignored"); |
66 | Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack "); | 66 | Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack "); |
67 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); | 67 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); |
68 | break; | 68 | break; |
69 | 69 | ||
70 | // LONG | 70 | // LONG |
71 | case LSO_Enums.Operation_Table.STORE: | 71 | case LSO_Enums.Operation_Table.STORE: |
72 | case LSO_Enums.Operation_Table.STORES: | 72 | case LSO_Enums.Operation_Table.STORES: |
73 | case LSO_Enums.Operation_Table.STOREL: | 73 | case LSO_Enums.Operation_Table.STOREL: |
74 | case LSO_Enums.Operation_Table.STOREV: | 74 | case LSO_Enums.Operation_Table.STOREV: |
75 | case LSO_Enums.Operation_Table.STOREQ: | 75 | case LSO_Enums.Operation_Table.STOREQ: |
76 | case LSO_Enums.Operation_Table.STOREG: | 76 | case LSO_Enums.Operation_Table.STOREG: |
77 | case LSO_Enums.Operation_Table.STOREGS: | 77 | case LSO_Enums.Operation_Table.STOREGS: |
78 | case LSO_Enums.Operation_Table.STOREGL: | 78 | case LSO_Enums.Operation_Table.STOREGL: |
79 | case LSO_Enums.Operation_Table.STOREGV: | 79 | case LSO_Enums.Operation_Table.STOREGV: |
80 | case LSO_Enums.Operation_Table.STOREGQ: | 80 | case LSO_Enums.Operation_Table.STOREGQ: |
81 | case LSO_Enums.Operation_Table.LOADP: | 81 | case LSO_Enums.Operation_Table.LOADP: |
82 | case LSO_Enums.Operation_Table.LOADSP: | 82 | case LSO_Enums.Operation_Table.LOADSP: |
83 | case LSO_Enums.Operation_Table.LOADLP: | 83 | case LSO_Enums.Operation_Table.LOADLP: |
84 | case LSO_Enums.Operation_Table.LOADVP: | 84 | case LSO_Enums.Operation_Table.LOADVP: |
85 | case LSO_Enums.Operation_Table.LOADQP: | 85 | case LSO_Enums.Operation_Table.LOADQP: |
86 | case LSO_Enums.Operation_Table.PUSH: | 86 | case LSO_Enums.Operation_Table.PUSH: |
87 | case LSO_Enums.Operation_Table.PUSHS: | 87 | case LSO_Enums.Operation_Table.PUSHS: |
88 | case LSO_Enums.Operation_Table.PUSHL: | 88 | case LSO_Enums.Operation_Table.PUSHL: |
89 | case LSO_Enums.Operation_Table.PUSHV: | 89 | case LSO_Enums.Operation_Table.PUSHV: |
90 | case LSO_Enums.Operation_Table.PUSHQ: | 90 | case LSO_Enums.Operation_Table.PUSHQ: |
91 | case LSO_Enums.Operation_Table.PUSHG: | 91 | case LSO_Enums.Operation_Table.PUSHG: |
92 | case LSO_Enums.Operation_Table.PUSHGS: | 92 | case LSO_Enums.Operation_Table.PUSHGS: |
93 | case LSO_Enums.Operation_Table.PUSHGL: | 93 | case LSO_Enums.Operation_Table.PUSHGL: |
94 | case LSO_Enums.Operation_Table.PUSHGV: | 94 | case LSO_Enums.Operation_Table.PUSHGV: |
95 | case LSO_Enums.Operation_Table.PUSHGQ: | 95 | case LSO_Enums.Operation_Table.PUSHGQ: |
96 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); | 96 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); |
97 | break; | 97 | break; |
98 | // None | 98 | // None |
99 | case LSO_Enums.Operation_Table.PUSHIP: | 99 | case LSO_Enums.Operation_Table.PUSHIP: |
100 | case LSO_Enums.Operation_Table.PUSHBP: | 100 | case LSO_Enums.Operation_Table.PUSHBP: |
101 | case LSO_Enums.Operation_Table.PUSHSP: | 101 | case LSO_Enums.Operation_Table.PUSHSP: |
102 | // Push Stack Top (Memory Address) to stack | 102 | // Push Stack Top (Memory Address) to stack |
103 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldc_I4, " + myHeader.SP + ");"); | 103 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldc_I4, " + myHeader.SP + ");"); |
104 | Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack"); | 104 | Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack"); |
105 | il.Emit(OpCodes.Ldc_I4, myHeader.SP); | 105 | il.Emit(OpCodes.Ldc_I4, myHeader.SP); |
106 | break; | 106 | break; |
107 | // BYTE | 107 | // BYTE |
108 | case LSO_Enums.Operation_Table.PUSHARGB: | 108 | case LSO_Enums.Operation_Table.PUSHARGB: |
109 | Common.SendToDebug("Param1: " + br_read(1)[0]); | 109 | Common.SendToDebug("Param1: " + br_read(1)[0]); |
110 | break; | 110 | break; |
111 | // INTEGER | 111 | // INTEGER |
112 | case LSO_Enums.Operation_Table.PUSHARGI: | 112 | case LSO_Enums.Operation_Table.PUSHARGI: |
113 | // TODO: What is size of integer? | 113 | // TODO: What is size of integer? |
114 | u32p1 = BitConverter.ToUInt32(br_read(4), 0); | 114 | u32p1 = BitConverter.ToUInt32(br_read(4), 0); |
115 | Common.SendToDebug("Instruction PUSHSP: il.Emit(OpCodes.Ldc_I4, " + u32p1 + ");"); | 115 | Common.SendToDebug("Instruction PUSHSP: il.Emit(OpCodes.Ldc_I4, " + u32p1 + ");"); |
116 | Common.SendToDebug("Param1: " + u32p1); | 116 | Common.SendToDebug("Param1: " + u32p1); |
117 | il.Emit(OpCodes.Ldc_I4, u32p1); | 117 | il.Emit(OpCodes.Ldc_I4, u32p1); |
118 | break; | 118 | break; |
119 | // FLOAT | 119 | // FLOAT |
120 | case LSO_Enums.Operation_Table.PUSHARGF: | 120 | case LSO_Enums.Operation_Table.PUSHARGF: |
121 | // TODO: What is size of float? | 121 | // TODO: What is size of float? |
122 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); | 122 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); |
123 | break; | 123 | break; |
124 | // STRING | 124 | // STRING |
125 | case LSO_Enums.Operation_Table.PUSHARGS: | 125 | case LSO_Enums.Operation_Table.PUSHARGS: |
126 | string s = Read_String(); | 126 | string s = Read_String(); |
127 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldstr, \"" + s + "\");"); | 127 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldstr, \"" + s + "\");"); |
128 | Common.SendToDebug("Param1: " + s); | 128 | Common.SendToDebug("Param1: " + s); |
129 | il.Emit(OpCodes.Ldstr, s); | 129 | il.Emit(OpCodes.Ldstr, s); |
130 | break; | 130 | break; |
131 | // VECTOR z,y,x | 131 | // VECTOR z,y,x |
132 | case LSO_Enums.Operation_Table.PUSHARGV: | 132 | case LSO_Enums.Operation_Table.PUSHARGV: |
133 | Common.SendToDebug("Param1 Z: " + BitConverter.ToUInt32(br_read(4), 0)); | 133 | Common.SendToDebug("Param1 Z: " + BitConverter.ToUInt32(br_read(4), 0)); |
134 | Common.SendToDebug("Param1 Y: " + BitConverter.ToUInt32(br_read(4), 0)); | 134 | Common.SendToDebug("Param1 Y: " + BitConverter.ToUInt32(br_read(4), 0)); |
135 | Common.SendToDebug("Param1 X: " + BitConverter.ToUInt32(br_read(4), 0)); | 135 | Common.SendToDebug("Param1 X: " + BitConverter.ToUInt32(br_read(4), 0)); |
136 | break; | 136 | break; |
137 | // ROTATION s,z,y,x | 137 | // ROTATION s,z,y,x |
138 | case LSO_Enums.Operation_Table.PUSHARGQ: | 138 | case LSO_Enums.Operation_Table.PUSHARGQ: |
139 | Common.SendToDebug("Param1 S: " + BitConverter.ToUInt32(br_read(4), 0)); | 139 | Common.SendToDebug("Param1 S: " + BitConverter.ToUInt32(br_read(4), 0)); |
140 | Common.SendToDebug("Param1 Z: " + BitConverter.ToUInt32(br_read(4), 0)); | 140 | Common.SendToDebug("Param1 Z: " + BitConverter.ToUInt32(br_read(4), 0)); |
141 | Common.SendToDebug("Param1 Y: " + BitConverter.ToUInt32(br_read(4), 0)); | 141 | Common.SendToDebug("Param1 Y: " + BitConverter.ToUInt32(br_read(4), 0)); |
142 | Common.SendToDebug("Param1 X: " + BitConverter.ToUInt32(br_read(4), 0)); | 142 | Common.SendToDebug("Param1 X: " + BitConverter.ToUInt32(br_read(4), 0)); |
143 | break; | 143 | break; |
144 | // LONG | 144 | // LONG |
145 | case LSO_Enums.Operation_Table.PUSHARGE: | 145 | case LSO_Enums.Operation_Table.PUSHARGE: |
146 | u32p1 = BitConverter.ToUInt32(br_read(4), 0); | 146 | u32p1 = BitConverter.ToUInt32(br_read(4), 0); |
147 | //Common.SendToDebug("Instruction PUSHSP: il.Emit(OpCodes., " + u32p1 + ");"); | 147 | //Common.SendToDebug("Instruction PUSHSP: il.Emit(OpCodes., " + u32p1 + ");"); |
148 | Common.SendToDebug("Instruction " + idesc + ": Ignoring (not in use according to doc)"); | 148 | Common.SendToDebug("Instruction " + idesc + ": Ignoring (not in use according to doc)"); |
149 | //Common.SendToDebug("Instruction " + idesc + ": Description: Pushes X bytes of $00 onto the stack (used to put space for local variable memory for a call)"); | 149 | //Common.SendToDebug("Instruction " + idesc + ": Description: Pushes X bytes of $00 onto the stack (used to put space for local variable memory for a call)"); |
150 | Common.SendToDebug("Param1: " + u32p1); | 150 | Common.SendToDebug("Param1: " + u32p1); |
151 | //il.Emit(OpCodes.ldc_i4, u32p1); | 151 | //il.Emit(OpCodes.ldc_i4, u32p1); |
152 | //if (u32p1 > 0) { | 152 | //if (u32p1 > 0) { |
153 | //for (int _ic=0; _ic < u32p1; _ic++) | 153 | //for (int _ic=0; _ic < u32p1; _ic++) |
154 | //{ | 154 | //{ |
155 | // Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldnull);"); | 155 | // Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldnull);"); |
156 | // il.Emit(OpCodes.Ldnull); | 156 | // il.Emit(OpCodes.Ldnull); |
157 | //} | 157 | //} |
158 | break; | 158 | break; |
159 | // BYTE | 159 | // BYTE |
160 | case LSO_Enums.Operation_Table.ADD: | 160 | case LSO_Enums.Operation_Table.ADD: |
161 | bp1 = br_read(1)[0]; | 161 | bp1 = br_read(1)[0]; |
162 | Common.SendToDebug("Instruction " + idesc + ": Add type: " + ((LSO_Enums.OpCode_Add_TypeDefs)bp1).ToString()); | 162 | Common.SendToDebug("Instruction " + idesc + ": Add type: " + ((LSO_Enums.OpCode_Add_TypeDefs)bp1).ToString()); |
163 | Common.SendToDebug("Param1: " + bp1); | 163 | Common.SendToDebug("Param1: " + bp1); |
164 | switch ((LSO_Enums.OpCode_Add_TypeDefs)bp1) | 164 | switch ((LSO_Enums.OpCode_Add_TypeDefs)bp1) |
165 | { | 165 | { |
166 | case LSO_Enums.OpCode_Add_TypeDefs.String: | 166 | case LSO_Enums.OpCode_Add_TypeDefs.String: |
167 | Common.SendToDebug("Instruction " + idesc | 167 | Common.SendToDebug("Instruction " + idesc |
168 | + ": il.Emit(OpCodes.Call, typeof(System.String).GetMethod(\"Concat\", new Type[] { typeof(object), typeof(object) }));"); | 168 | + ": il.Emit(OpCodes.Call, typeof(System.String).GetMethod(\"Concat\", new Type[] { typeof(object), typeof(object) }));"); |
169 | il.Emit(OpCodes.Call, typeof(System.String).GetMethod | 169 | il.Emit(OpCodes.Call, typeof(System.String).GetMethod |
170 | ("Concat", new Type[] { typeof(object), typeof(object) })); | 170 | ("Concat", new Type[] { typeof(object), typeof(object) })); |
171 | 171 | ||
172 | break; | 172 | break; |
173 | case LSO_Enums.OpCode_Add_TypeDefs.UInt32: | 173 | case LSO_Enums.OpCode_Add_TypeDefs.UInt32: |
174 | default: | 174 | default: |
175 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Add);"); | 175 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Add);"); |
176 | il.Emit(OpCodes.Add); | 176 | il.Emit(OpCodes.Add); |
177 | break; | 177 | break; |
178 | } | 178 | } |
179 | 179 | ||
180 | 180 | ||
181 | //il.Emit(OpCodes.Add, p1); | 181 | //il.Emit(OpCodes.Add, p1); |
182 | break; | 182 | break; |
183 | case LSO_Enums.Operation_Table.SUB: | 183 | case LSO_Enums.Operation_Table.SUB: |
184 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Sub);"); | 184 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Sub);"); |
185 | bp1 = br_read(1)[0]; | 185 | bp1 = br_read(1)[0]; |
186 | Common.SendToDebug("Param1: " + bp1); | 186 | Common.SendToDebug("Param1: " + bp1); |
187 | il.Emit(OpCodes.Sub); | 187 | il.Emit(OpCodes.Sub); |
188 | //il.Emit(OpCodes.Sub, p1); | 188 | //il.Emit(OpCodes.Sub, p1); |
189 | break; | 189 | break; |
190 | case LSO_Enums.Operation_Table.MUL: | 190 | case LSO_Enums.Operation_Table.MUL: |
191 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Mul);"); | 191 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Mul);"); |
192 | bp1 = br_read(1)[0]; | 192 | bp1 = br_read(1)[0]; |
193 | Common.SendToDebug("Param1: " + bp1); | 193 | Common.SendToDebug("Param1: " + bp1); |
194 | il.Emit(OpCodes.Mul); | 194 | il.Emit(OpCodes.Mul); |
195 | //il.Emit(OpCodes.Mul, p1); | 195 | //il.Emit(OpCodes.Mul, p1); |
196 | break; | 196 | break; |
197 | case LSO_Enums.Operation_Table.DIV: | 197 | case LSO_Enums.Operation_Table.DIV: |
198 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Div);"); | 198 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Div);"); |
199 | bp1 = br_read(1)[0]; | 199 | bp1 = br_read(1)[0]; |
200 | Common.SendToDebug("Param1: " + bp1); | 200 | Common.SendToDebug("Param1: " + bp1); |
201 | il.Emit(OpCodes.Div); | 201 | il.Emit(OpCodes.Div); |
202 | //il.Emit(OpCodes.Div, p1); | 202 | //il.Emit(OpCodes.Div, p1); |
203 | break; | 203 | break; |
204 | case LSO_Enums.Operation_Table.EQ: | 204 | case LSO_Enums.Operation_Table.EQ: |
205 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ceq);"); | 205 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ceq);"); |
206 | bp1 = br_read(1)[0]; | 206 | bp1 = br_read(1)[0]; |
207 | Common.SendToDebug("Param1: " + bp1); | 207 | Common.SendToDebug("Param1: " + bp1); |
208 | il.Emit(OpCodes.Ceq); | 208 | il.Emit(OpCodes.Ceq); |
209 | //il.Emit(OpCodes.Ceq, p1); | 209 | //il.Emit(OpCodes.Ceq, p1); |
210 | break; | 210 | break; |
211 | case LSO_Enums.Operation_Table.NEQ: | 211 | case LSO_Enums.Operation_Table.NEQ: |
212 | case LSO_Enums.Operation_Table.LEQ: | 212 | case LSO_Enums.Operation_Table.LEQ: |
213 | case LSO_Enums.Operation_Table.GEQ: | 213 | case LSO_Enums.Operation_Table.GEQ: |
214 | case LSO_Enums.Operation_Table.LESS: | 214 | case LSO_Enums.Operation_Table.LESS: |
215 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Clt_Un);"); | 215 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Clt_Un);"); |
216 | bp1 = br_read(1)[0]; | 216 | bp1 = br_read(1)[0]; |
217 | Common.SendToDebug("Param1: " + bp1); | 217 | Common.SendToDebug("Param1: " + bp1); |
218 | il.Emit(OpCodes.Clt_Un); | 218 | il.Emit(OpCodes.Clt_Un); |
219 | //il.Emit(OpCodes.Clt, p1); | 219 | //il.Emit(OpCodes.Clt, p1); |
220 | break; | 220 | break; |
221 | case LSO_Enums.Operation_Table.GREATER: | 221 | case LSO_Enums.Operation_Table.GREATER: |
222 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Cgt_Un);"); | 222 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Cgt_Un);"); |
223 | bp1 = br_read(1)[0]; | 223 | bp1 = br_read(1)[0]; |
224 | Common.SendToDebug("Param1: " + bp1); | 224 | Common.SendToDebug("Param1: " + bp1); |
225 | il.Emit(OpCodes.Cgt_Un); | 225 | il.Emit(OpCodes.Cgt_Un); |
226 | //il.Emit(OpCodes.Cgt, p1); | 226 | //il.Emit(OpCodes.Cgt, p1); |
227 | break; | 227 | break; |
228 | case LSO_Enums.Operation_Table.MOD: | 228 | case LSO_Enums.Operation_Table.MOD: |
229 | case LSO_Enums.Operation_Table.BOOLOR: | 229 | case LSO_Enums.Operation_Table.BOOLOR: |
230 | bp1 = br_read(1)[0]; | 230 | bp1 = br_read(1)[0]; |
231 | Common.SendToDebug("Param1: " + bp1); | 231 | Common.SendToDebug("Param1: " + bp1); |
232 | break; | 232 | break; |
233 | // LONG | 233 | // LONG |
234 | case LSO_Enums.Operation_Table.JUMP: | 234 | case LSO_Enums.Operation_Table.JUMP: |
235 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); | 235 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); |
236 | break; | 236 | break; |
237 | // BYTE, LONG | 237 | // BYTE, LONG |
238 | case LSO_Enums.Operation_Table.JUMPIF: | 238 | case LSO_Enums.Operation_Table.JUMPIF: |
239 | case LSO_Enums.Operation_Table.JUMPNIF: | 239 | case LSO_Enums.Operation_Table.JUMPNIF: |
240 | Common.SendToDebug("Param1: " + br_read(1)[0]); | 240 | Common.SendToDebug("Param1: " + br_read(1)[0]); |
241 | Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0)); | 241 | Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0)); |
242 | break; | 242 | break; |
243 | // LONG | 243 | // LONG |
244 | case LSO_Enums.Operation_Table.STATE: | 244 | case LSO_Enums.Operation_Table.STATE: |
245 | bp1 = br_read(1)[0]; | 245 | bp1 = br_read(1)[0]; |
246 | //il.Emit(OpCodes.Ld); // Load local variable 0 onto stack | 246 | //il.Emit(OpCodes.Ld); // Load local variable 0 onto stack |
247 | //il.Emit(OpCodes.Ldc_I4, 0); // Push index position | 247 | //il.Emit(OpCodes.Ldc_I4, 0); // Push index position |
248 | //il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value | 248 | //il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value |
249 | //il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value | 249 | //il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value |
250 | break; | 250 | break; |
251 | case LSO_Enums.Operation_Table.CALL: | 251 | case LSO_Enums.Operation_Table.CALL: |
252 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); | 252 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); |
253 | break; | 253 | break; |
254 | // BYTE | 254 | // BYTE |
255 | case LSO_Enums.Operation_Table.CAST: | 255 | case LSO_Enums.Operation_Table.CAST: |
256 | bp1 = br_read(1)[0]; | 256 | bp1 = br_read(1)[0]; |
257 | Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)); | 257 | Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)); |
258 | Common.SendToDebug("Param1: " + bp1); | 258 | Common.SendToDebug("Param1: " + bp1); |
259 | switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1) | 259 | switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1) |
260 | { | 260 | { |
261 | case LSO_Enums.OpCode_Cast_TypeDefs.String: | 261 | case LSO_Enums.OpCode_Cast_TypeDefs.String: |
262 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Calli, typeof(System.Convert).GetMethod(\"ToString\", new Type[] { typeof(object) }));"); | 262 | Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Calli, typeof(System.Convert).GetMethod(\"ToString\", new Type[] { typeof(object) }));"); |
263 | //il.Emit(OpCodes.Box, typeof (UInt32)); | 263 | //il.Emit(OpCodes.Box, typeof (UInt32)); |
264 | il.Emit(OpCodes.Calli, typeof(Common).GetMethod | 264 | il.Emit(OpCodes.Calli, typeof(Common).GetMethod |
265 | ("Cast_ToString", new Type[] { typeof(object) })); | 265 | ("Cast_ToString", new Type[] { typeof(object) })); |
266 | 266 | ||
267 | //il.Emit(OpCodes.Box, typeof(System.UInt32) ); | 267 | //il.Emit(OpCodes.Box, typeof(System.UInt32) ); |
268 | //il.Emit(OpCodes.Box, typeof(string)); | 268 | //il.Emit(OpCodes.Box, typeof(string)); |
269 | 269 | ||
270 | //il.Emit(OpCodes.Conv_R8); | 270 | //il.Emit(OpCodes.Conv_R8); |
271 | //il.Emit(OpCodes.Call, typeof(System.Convert).GetMethod | 271 | //il.Emit(OpCodes.Call, typeof(System.Convert).GetMethod |
272 | // ("ToString", new Type[] { typeof(float) })); | 272 | // ("ToString", new Type[] { typeof(float) })); |
273 | 273 | ||
274 | break; | 274 | break; |
275 | default: | 275 | default: |
276 | Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!"); | 276 | Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!"); |
277 | break; | 277 | break; |
278 | } | 278 | } |
279 | break; | 279 | break; |
280 | // LONG | 280 | // LONG |
281 | case LSO_Enums.Operation_Table.STACKTOS: | 281 | case LSO_Enums.Operation_Table.STACKTOS: |
282 | case LSO_Enums.Operation_Table.STACKTOL: | 282 | case LSO_Enums.Operation_Table.STACKTOL: |
283 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); | 283 | Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0)); |
284 | break; | 284 | break; |
285 | // BYTE | 285 | // BYTE |
286 | case LSO_Enums.Operation_Table.PRINT: | 286 | case LSO_Enums.Operation_Table.PRINT: |
287 | case LSO_Enums.Operation_Table.CALLLIB: | 287 | case LSO_Enums.Operation_Table.CALLLIB: |
288 | Common.SendToDebug("Param1: " + br_read(1)[0]); | 288 | Common.SendToDebug("Param1: " + br_read(1)[0]); |
289 | break; | 289 | break; |
290 | // SHORT | 290 | // SHORT |
291 | case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE: | 291 | case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE: |
292 | // TODO: What is size of short? | 292 | // TODO: What is size of short? |
293 | UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0); | 293 | UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0); |
294 | Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString()); | 294 | Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString()); |
295 | Common.SendToDebug("Param1: " + U16p1); | 295 | Common.SendToDebug("Param1: " + U16p1); |
296 | switch ((LSO_Enums.BuiltIn_Functions)U16p1) | 296 | switch ((LSO_Enums.BuiltIn_Functions)U16p1) |
297 | { | 297 | { |
298 | case LSO_Enums.BuiltIn_Functions.llSay: | 298 | case LSO_Enums.BuiltIn_Functions.llSay: |
299 | Common.SendToDebug("Instruction " + idesc + " " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString() | 299 | Common.SendToDebug("Instruction " + idesc + " " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString() |
300 | + ": Mapped to internal function"); | 300 | + ": Mapped to internal function"); |
301 | 301 | ||
302 | //il.Emit(OpCodes.Ldstr, "INTERNAL COMMAND: llSay({0}, \"{1}\""); | 302 | //il.Emit(OpCodes.Ldstr, "INTERNAL COMMAND: llSay({0}, \"{1}\""); |
303 | //il.Emit(OpCodes.Call, typeof(IL_Helper).GetMethod("ReverseFormatString", | 303 | //il.Emit(OpCodes.Call, typeof(IL_Helper).GetMethod("ReverseFormatString", |
304 | // new Type[] { typeof(string), typeof(UInt32), typeof(string) } | 304 | // new Type[] { typeof(string), typeof(UInt32), typeof(string) } |
305 | //)); | 305 | //)); |
306 | 306 | ||
307 | 307 | ||
308 | //il.Emit(OpCodes.Pop); | 308 | //il.Emit(OpCodes.Pop); |
309 | //il.Emit(OpCodes.Call, | 309 | //il.Emit(OpCodes.Call, |
310 | // typeof(Console).GetMethod("WriteLine", | 310 | // typeof(Console).GetMethod("WriteLine", |
311 | // new Type[] { typeof(string) } | 311 | // new Type[] { typeof(string) } |
312 | //)); | 312 | //)); |
313 | 313 | ||
314 | 314 | ||
315 | il.Emit(OpCodes.Call, | 315 | il.Emit(OpCodes.Call, |
316 | typeof(Common).GetMethod("SendToLog", | 316 | typeof(Common).GetMethod("SendToLog", |
317 | new Type[] { typeof(string) } | 317 | new Type[] { typeof(string) } |
318 | )); | 318 | )); |
319 | 319 | ||
320 | 320 | ||
321 | 321 | ||
322 | //il.Emit(OpCodes.Pop); | 322 | //il.Emit(OpCodes.Pop); |
323 | 323 | ||
324 | //il.Emit(OpCodes.Ldind_I2, 0); | 324 | //il.Emit(OpCodes.Ldind_I2, 0); |
325 | 325 | ||
326 | //il.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(object) })); | 326 | //il.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(object) })); |
327 | //il.EmitCalli(OpCodes.Calli, | 327 | //il.EmitCalli(OpCodes.Calli, |
328 | //il.Emit(OpCodes.Call, typeof().GetMethod | 328 | //il.Emit(OpCodes.Call, typeof().GetMethod |
329 | // ("llSay", new Type[] { typeof(UInt32), typeof(string) })); | 329 | // ("llSay", new Type[] { typeof(UInt32), typeof(string) })); |
330 | break; | 330 | break; |
331 | default: | 331 | default: |
332 | Common.SendToDebug("Instruction " + idesc + ": " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString() + ": INTERNAL COMMAND NOT IMPLEMENTED"); | 332 | Common.SendToDebug("Instruction " + idesc + ": " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString() + ": INTERNAL COMMAND NOT IMPLEMENTED"); |
333 | break; | 333 | break; |
334 | } | 334 | } |
335 | 335 | ||
336 | //Common.SendToDebug("Instruction " + idesc + ": DEBUG: Faking return code:"); | 336 | //Common.SendToDebug("Instruction " + idesc + ": DEBUG: Faking return code:"); |
337 | //Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldc_I4, 0);"); | 337 | //Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Ldc_I4, 0);"); |
338 | //il.Emit(OpCodes.Ldc_I4, 0); | 338 | //il.Emit(OpCodes.Ldc_I4, 0); |
339 | break; | 339 | break; |
340 | 340 | ||
341 | // RETURN | 341 | // RETURN |
342 | case LSO_Enums.Operation_Table.RETURN: | 342 | case LSO_Enums.Operation_Table.RETURN: |
343 | 343 | ||
344 | Common.SendToDebug("Last OPCODE was return command. Code chunk execution complete."); | 344 | Common.SendToDebug("Last OPCODE was return command. Code chunk execution complete."); |
345 | return true; | 345 | return true; |
346 | } | 346 | } |
347 | return false; | 347 | return false; |
348 | } | 348 | } |
349 | 349 | ||
350 | } | 350 | } |
351 | } | 351 | } |