5 // Chris J Breisch (cjbreisch@altavista.net)
6 // Francesco Delfino (pluto@tipic.com)
8 // (C) 2002 Chris J Breisch
9 // 2002 Tipic, Inc (http://www.tipic.com)
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 //namespace Microsoft.VisualBasic.CompilerServices {
38 // [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
39 // sealed public class ObjectType {
42 // public static System.Int32 ObjTst (System.Object o1, System.Object o2, System.Boolean TextCompare) { throw new NotImplementedException (); }
44 // public static System.Object PlusObj (System.Object obj) { throw new NotImplementedException (); }
46 // public static System.Object NegObj (System.Object obj) { throw new NotImplementedException (); }
48 // public static System.Object NotObj (System.Object obj) { throw new NotImplementedException (); }
50 // public static System.Object BitAndObj (System.Object obj1, System.Object obj2) { throw new NotImplementedException (); }
52 // public static System.Object BitOrObj (System.Object obj1, System.Object obj2) { throw new NotImplementedException (); }
54 // public static System.Object BitXorObj (System.Object obj1, System.Object obj2) { throw new NotImplementedException (); }
56 // public static System.Object AddObj (System.Object o1, System.Object o2) { throw new NotImplementedException (); }
58 // public static System.Object SubObj (System.Object o1, System.Object o2) { throw new NotImplementedException (); }
60 // public static System.Object MulObj (System.Object o1, System.Object o2) { throw new NotImplementedException (); }
62 // public static System.Object DivObj (System.Object o1, System.Object o2) { throw new NotImplementedException (); }
64 // public static System.Object PowObj (System.Object obj1, System.Object obj2) { throw new NotImplementedException (); }
66 // public static System.Object ModObj (System.Object o1, System.Object o2) { throw new NotImplementedException (); }
68 // public static System.Object IDivObj (System.Object o1, System.Object o2) { throw new NotImplementedException (); }
70 // public static System.Object XorObj (System.Object obj1, System.Object obj2) { throw new NotImplementedException (); }
72 // public static System.Boolean LikeObj (System.Object vLeft, System.Object vRight, Microsoft.VisualBasic.CompareMethod CompareOption) { throw new NotImplementedException (); }
74 // public static System.Object StrCatObj (System.Object vLeft, System.Object vRight) { throw new NotImplementedException (); }
76 // public static System.Object GetObjectValuePrimitive (System.Object o) { throw new NotImplementedException (); }
85 // Chris J Breisch (cjbreisch@altavista.net)
86 // Francesco Delfino (pluto@tipic.com)
88 // (C) 2002 Chris J Breisch
89 // 2002 Tipic, Inc (http://www.tipic.com)
93 * Copyright (c) 2002-2003 Mainsoft Corporation.
95 * Permission is hereby granted, free of charge, to any person obtaining a
96 * copy of this software and associated documentation files (the "Software"),
97 * to deal in the Software without restriction, including without limitation
98 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
99 * and/or sell copies of the Software, and to permit persons to whom the
100 * Software is furnished to do so, subject to the following conditions:
102 * The above copyright notice and this permission notice shall be included in
103 * all copies or substantial portions of the Software.
105 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
106 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
107 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
108 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
109 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
110 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
111 * DEALINGS IN THE SOFTWARE.
115 using System.Collections;
116 using Microsoft.VisualBasic;
117 namespace Microsoft.VisualBasic.CompilerServices {
118 [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
119 sealed public class ObjectType {
121 private static int[,] ConversionClassTable = new int[13,13];
122 private static Type[,] WiderType = new Type[12,12];
123 private static int [] VType2FromTypeCode = new int[19];
124 private static Type [] tblTypeFromTypeCode = new Type[19];//added tbl prefix to differencate field from method
125 private static int [] VTypeFromTypeCode = new int[19];
126 private static int [] TypeCodeFromVType = new int[13];
129 // WiderType[VType.t_bad][VType.t_bad] = VType.t_bad;
130 // WiderType[VType.t_bad][VType.t_bool] = VType.t_bad;
131 // WiderType[VType.t_bad][VType.t_ui1] = VType.t_bad;
132 // WiderType[VType.t_bad][VType.t_i2] = VType.t_bad;
133 // WiderType[VType.t_bad][VType.t_i4] = VType.t_bad;
134 // WiderType[VType.t_bad][VType.t_i8] = VType.t_bad;
135 // WiderType[VType.t_bad][VType.t_dec] = VType.t_bad;
136 // WiderType[VType.t_bad][VType.t_r4] = VType.t_bad;
137 // WiderType[VType.t_bad][VType.t_r8] = VType.t_bad;
138 // WiderType[VType.t_bad][VType.t_char] = VType.t_bad;
139 // WiderType[VType.t_bad][VType.t_str] = VType.t_bad;
140 // WiderType[VType.t_bad][VType.t_date] = VType.t_bad;
142 // WiderType[VType.t_bool][VType.t_bad] = VType.t_bad;
143 // WiderType[VType.t_bool][VType.t_bool] = VType.t_bool;
144 // WiderType[VType.t_bool][VType.t_ui1] = VType.t_bool;
145 // WiderType[VType.t_bool][VType.t_i2] = VType.t_i2;
146 // WiderType[VType.t_bool][VType.t_i4] = VType.t_i4;
147 // WiderType[VType.t_bool][VType.t_i8] = VType.t_i8;
148 // WiderType[VType.t_bool][VType.t_dec] = VType.t_dec;
149 // WiderType[VType.t_bool][VType.t_r4] = VType.t_r4;
150 // WiderType[VType.t_bool][VType.t_r8] = VType.t_r8;
151 // WiderType[VType.t_bool][VType.t_char] = VType.t_bad;
152 // WiderType[VType.t_bool][VType.t_str] = VType.t_r8;
153 // WiderType[VType.t_bool][VType.t_date] = VType.t_bad;
155 // WiderType[VType.t_ui1][VType.t_bad] = VType.t_bad;
156 // WiderType[VType.t_ui1][VType.t_bool] = VType.t_bool;
157 // WiderType[VType.t_ui1][VType.t_ui1] = VType.t_ui1;
158 // WiderType[VType.t_ui1][VType.t_i2] = VType.t_i2;
159 // WiderType[VType.t_ui1][VType.t_i4] = VType.t_i4;
160 // WiderType[VType.t_ui1][VType.t_i8] = VType.t_i8;
161 // WiderType[VType.t_ui1][VType.t_dec] = VType.t_dec;
162 // WiderType[VType.t_ui1][VType.t_r4] = VType.t_r4;
163 // WiderType[VType.t_ui1][VType.t_r8] = VType.t_r8;
164 // WiderType[VType.t_ui1][VType.t_char] = VType.t_bad;
165 // WiderType[VType.t_ui1][VType.t_str] = VType.t_r8;
166 // WiderType[VType.t_ui1][VType.t_date] = VType.t_bad;
168 // WiderType[VType.t_i2][VType.t_bad] = VType.t_bad;
169 // WiderType[VType.t_i2][VType.t_bool] = VType.t_i2;
170 // WiderType[VType.t_i2][VType.t_ui1] = VType.t_i2;
171 // WiderType[VType.t_i2][VType.t_i2] = VType.t_i2;
172 // WiderType[VType.t_i2][VType.t_i4] = VType.t_i4;
173 // WiderType[VType.t_i2][VType.t_i8] = VType.t_i8;
174 // WiderType[VType.t_i2][VType.t_dec] = VType.t_dec;
175 // WiderType[VType.t_i2][VType.t_r4] = VType.t_r4;
176 // WiderType[VType.t_i2][VType.t_r8] = VType.t_r8;
177 // WiderType[VType.t_i2][VType.t_char] = VType.t_bad;
178 // WiderType[VType.t_i2][VType.t_str] = VType.t_r8;
179 // WiderType[VType.t_i2][VType.t_date] = VType.t_bad;
181 // WiderType[VType.t_i4][VType.t_bad] = VType.t_bad;
182 // WiderType[VType.t_i4][VType.t_bool] = VType.t_i4;
183 // WiderType[VType.t_i4][VType.t_ui1] = VType.t_i4;
184 // WiderType[VType.t_i4][VType.t_i2] = VType.t_i4;
185 // WiderType[VType.t_i4][VType.t_i4] = VType.t_i4;
186 // WiderType[VType.t_i4][VType.t_i8] = VType.t_i8;
187 // WiderType[VType.t_i4][VType.t_dec] = VType.t_dec;
188 // WiderType[VType.t_i4][VType.t_r4] = VType.t_r4;
189 // WiderType[VType.t_i4][VType.t_r8] = VType.t_r8;
190 // WiderType[VType.t_i4][VType.t_char] = VType.t_bad;
191 // WiderType[VType.t_i4][VType.t_str] = VType.t_r8;
192 // WiderType[VType.t_i4][VType.t_date] = VType.t_bad;
194 // WiderType[VType.t_i8][VType.t_bad] = VType.t_bad;
195 // WiderType[VType.t_i8][VType.t_bool] = VType.t_i8;
196 // WiderType[VType.t_i8][VType.t_ui1] = VType.t_i8;
197 // WiderType[VType.t_i8][VType.t_i2] = VType.t_i8;
198 // WiderType[VType.t_i8][VType.t_i4] = VType.t_i8;
199 // WiderType[VType.t_i8][VType.t_i8] = VType.t_i8;
200 // WiderType[VType.t_i8][VType.t_dec] = VType.t_dec;
201 // WiderType[VType.t_i8][VType.t_r4] = VType.t_r4;
202 // WiderType[VType.t_i8][VType.t_r8] = VType.t_r8;
203 // WiderType[VType.t_i8][VType.t_char] = VType.t_bad;
204 // WiderType[VType.t_i8][VType.t_str] = VType.t_r8;
205 // WiderType[VType.t_i8][VType.t_date] = VType.t_bad;
207 // WiderType[VType.t_dec][VType.t_bad] = VType.t_bad;
208 // WiderType[VType.t_dec][VType.t_bool] = VType.t_dec;
209 // WiderType[VType.t_dec][VType.t_ui1] = VType.t_dec;
210 // WiderType[VType.t_dec][VType.t_i2] = VType.t_dec;
211 // WiderType[VType.t_dec][VType.t_i4] = VType.t_dec;
212 // WiderType[VType.t_dec][VType.t_i8] = VType.t_dec;
213 // WiderType[VType.t_dec][VType.t_dec] = VType.t_dec;
214 // WiderType[VType.t_dec][VType.t_r4] = VType.t_r4;
215 // WiderType[VType.t_dec][VType.t_r8] = VType.t_r8;
216 // WiderType[VType.t_dec][VType.t_char] = VType.t_bad;
217 // WiderType[VType.t_dec][VType.t_str] = VType.t_r8;
218 // WiderType[VType.t_dec][VType.t_date] = VType.t_bad;
220 // WiderType[VType.t_r4][VType.t_bad] = VType.t_bad;
221 // WiderType[VType.t_r4][VType.t_bool] = VType.t_r4;
222 // WiderType[VType.t_r4][VType.t_ui1] = VType.t_r4;
223 // WiderType[VType.t_r4][VType.t_i2] = VType.t_r4;
224 // WiderType[VType.t_r4][VType.t_i4] = VType.t_r4;
225 // WiderType[VType.t_r4][VType.t_i8] = VType.t_r4;
226 // WiderType[VType.t_r4][VType.t_dec] = VType.t_r4;
227 // WiderType[VType.t_r4][VType.t_r4] = VType.t_r4;
228 // WiderType[VType.t_r4][VType.t_r8] = VType.t_r8;
229 // WiderType[VType.t_r4][VType.t_char] = VType.t_bad;
230 // WiderType[VType.t_r4][VType.t_str] = VType.t_r8;
231 // WiderType[VType.t_r4][VType.t_date] = VType.t_bad;
233 // WiderType[VType.t_r8][VType.t_bad] = VType.t_bad;
234 // WiderType[VType.t_r8][VType.t_bool] = VType.t_r8;
235 // WiderType[VType.t_r8][VType.t_ui1] = VType.t_r8;
236 // WiderType[VType.t_r8][VType.t_i2] = VType.t_r8;
237 // WiderType[VType.t_r8][VType.t_i4] = VType.t_r8;
238 // WiderType[VType.t_r8][VType.t_i8] = VType.t_r8;
239 // WiderType[VType.t_r8][VType.t_dec] = VType.t_r8;
240 // WiderType[VType.t_r8][VType.t_r4] = VType.t_r8;
241 // WiderType[VType.t_r8][VType.t_r8] = VType.t_r8;
242 // WiderType[VType.t_r8][VType.t_char] = VType.t_bad;
243 // WiderType[VType.t_r8][VType.t_str] = VType.t_r8;
244 // WiderType[VType.t_r8][VType.t_date] = VType.t_bad;
246 // WiderType[VType.t_char][VType.t_bad] = VType.t_bad;
247 // WiderType[VType.t_char][VType.t_bool] = VType.t_bad;
248 // WiderType[VType.t_char][VType.t_ui1] = VType.t_bad;
249 // WiderType[VType.t_char][VType.t_i2] = VType.t_bad;
250 // WiderType[VType.t_char][VType.t_i4] = VType.t_bad;
251 // WiderType[VType.t_char][VType.t_i8] = VType.t_bad;
252 // WiderType[VType.t_char][VType.t_dec] = VType.t_bad;
253 // WiderType[VType.t_char][VType.t_r4] = VType.t_bad;
254 // WiderType[VType.t_char][VType.t_r8] = VType.t_bad;
255 // WiderType[VType.t_char][VType.t_char] = VType.t_char;
256 // WiderType[VType.t_char][VType.t_str] = VType.t_str;
257 // WiderType[VType.t_char][VType.t_date] = VType.t_bad;
259 // WiderType[VType.t_str][VType.t_bad] = VType.t_bad;
260 // WiderType[VType.t_str][VType.t_bool] = VType.t_r8;
261 // WiderType[VType.t_str][VType.t_ui1] = VType.t_r8;
262 // WiderType[VType.t_str][VType.t_i2] = VType.t_r8;
263 // WiderType[VType.t_str][VType.t_i4] = VType.t_r8;
264 // WiderType[VType.t_str][VType.t_i8] = VType.t_r8;
265 // WiderType[VType.t_str][VType.t_dec] = VType.t_r8;
266 // WiderType[VType.t_str][VType.t_r4] = VType.t_r8;
267 // WiderType[VType.t_str][VType.t_r8] = VType.t_r8;
268 // WiderType[VType.t_str][VType.t_char] = VType.t_str;
269 // WiderType[VType.t_str][VType.t_str] = VType.t_str;
270 // WiderType[VType.t_str][VType.t_date] = VType.t_date;
272 // WiderType[VType.t_date][VType.t_bad] = VType.t_bad;
273 // WiderType[VType.t_date][VType.t_bool] = VType.t_bad;
274 // WiderType[VType.t_date][VType.t_ui1] = VType.t_bad;
275 // WiderType[VType.t_date][VType.t_i2] = VType.t_bad;
276 // WiderType[VType.t_date][VType.t_i4] = VType.t_bad;
277 // WiderType[VType.t_date][VType.t_i8] = VType.t_bad;
278 // WiderType[VType.t_date][VType.t_dec] = VType.t_bad;
279 // WiderType[VType.t_date][VType.t_r4] = VType.t_bad;
280 // WiderType[VType.t_date][VType.t_r8] = VType.t_bad;
281 // WiderType[VType.t_date][VType.t_char] = VType.t_bad;
282 // WiderType[VType.t_date][VType.t_str] = VType.t_date;
283 // WiderType[VType.t_date][VType.t_date] = VType.t_date;
285 // ConversionClassTable[VType2.t_bad][VType2.t_bad] = VType2.t_bad;
286 // ConversionClassTable[VType2.t_bad][VType2.t_bool] = VType2.t_bad;
287 // ConversionClassTable[VType2.t_bad][VType2.t_ui1] = VType2.t_bad;
288 // ConversionClassTable[VType2.t_bad][VType2.t_char] = VType2.t_bad;
289 // ConversionClassTable[VType2.t_bad][VType2.t_i2] = VType2.t_bad;
290 // ConversionClassTable[VType2.t_bad][VType2.t_i4] = VType2.t_bad;
291 // ConversionClassTable[VType2.t_bad][VType2.t_i8] = VType2.t_bad;
292 // ConversionClassTable[VType2.t_bad][VType2.t_r4] = VType2.t_bad;
293 // ConversionClassTable[VType2.t_bad][VType2.t_r8] = VType2.t_bad;
294 // ConversionClassTable[VType2.t_bad][VType2.t_date] = VType2.t_bad;
295 // ConversionClassTable[VType2.t_bad][VType2.t_dec] = VType2.t_bad;
296 // ConversionClassTable[VType2.t_bad][VType2.t_ref] = VType2.t_bad;
297 // ConversionClassTable[VType2.t_bad][VType2.t_str] = VType2.t_bad;
299 // ConversionClassTable[VType2.t_bool][VType2.t_bad] = VType2.t_bad;
300 // ConversionClassTable[VType2.t_bool][VType2.t_bool] = VType2.t_bool;
301 // ConversionClassTable[VType2.t_bool][VType2.t_ui1] = VType2.t_ui1;
302 // ConversionClassTable[VType2.t_bool][VType2.t_char] = VType2.t_bad;
303 // ConversionClassTable[VType2.t_bool][VType2.t_i2] = VType2.t_ui1;
304 // ConversionClassTable[VType2.t_bool][VType2.t_i4] = VType2.t_ui1;
305 // ConversionClassTable[VType2.t_bool][VType2.t_i8] = VType2.t_ui1;
306 // ConversionClassTable[VType2.t_bool][VType2.t_r4] = VType2.t_ui1;
307 // ConversionClassTable[VType2.t_bool][VType2.t_r8] = VType2.t_ui1;
308 // ConversionClassTable[VType2.t_bool][VType2.t_bad] = VType2.t_bad;
309 // ConversionClassTable[VType2.t_bool][VType2.t_dec] = VType2.t_ui1;
310 // ConversionClassTable[VType2.t_bool][VType2.t_dec] = VType2.t_bad;
311 // ConversionClassTable[VType2.t_bool][VType2.t_str] = VType2.t_ui1;
313 // ConversionClassTable[VType2.t_ui1][VType2.t_bad] = VType2.t_bad;
314 // ConversionClassTable[VType2.t_ui1][VType2.t_bool] = VType2.t_ui1;
315 // ConversionClassTable[VType2.t_ui1][VType2.t_ui1] = VType2.t_bool;
316 // ConversionClassTable[VType2.t_ui1][VType2.t_char] = VType2.t_bad;
317 // ConversionClassTable[VType2.t_ui1][VType2.t_i2] = VType2.t_ui1;
318 // ConversionClassTable[VType2.t_ui1][VType2.t_i4] = VType2.t_ui1;
319 // ConversionClassTable[VType2.t_ui1][VType2.t_i8] = VType2.t_ui1;
320 // ConversionClassTable[VType2.t_ui1][VType2.t_r4] = VType2.t_ui1;
321 // ConversionClassTable[VType2.t_ui1][VType2.t_r8] = VType2.t_ui1;
322 // ConversionClassTable[VType2.t_ui1][VType2.t_bad] = VType2.t_bad;
323 // ConversionClassTable[VType2.t_ui1][VType2.t_dec] = VType2.t_ui1;
324 // ConversionClassTable[VType2.t_ui1][VType2.t_dec] = VType2.t_bad;
325 // ConversionClassTable[VType2.t_ui1][VType2.t_str] = VType2.t_ui1;
327 // ConversionClassTable[VType2.t_char][VType2.t_bad] = VType2.t_bad;
328 // ConversionClassTable[VType2.t_char][VType2.t_bool] = VType2.t_bad;
329 // ConversionClassTable[VType2.t_char][VType2.t_ui1] = VType2.t_bad;
330 // ConversionClassTable[VType2.t_char][VType2.t_char] = VType2.t_bool;
331 // ConversionClassTable[VType2.t_char][VType2.t_i2] = VType2.t_bad;
332 // ConversionClassTable[VType2.t_char][VType2.t_i4] = VType2.t_bad;
333 // ConversionClassTable[VType2.t_char][VType2.t_i8] = VType2.t_bad;
334 // ConversionClassTable[VType2.t_char][VType2.t_r4] = VType2.t_bad;
335 // ConversionClassTable[VType2.t_char][VType2.t_r8] = VType2.t_bad;
336 // ConversionClassTable[VType2.t_char][VType2.t_bad] = VType2.t_bad;
337 // ConversionClassTable[VType2.t_char][VType2.t_dec] = VType2.t_bad;
338 // ConversionClassTable[VType2.t_char][VType2.t_dec] = VType2.t_bad;
339 // ConversionClassTable[VType2.t_char][VType2.t_str] = VType2.t_ui1;
341 // ConversionClassTable[VType2.t_i2][VType2.t_bad] = VType2.t_bad;
342 // ConversionClassTable[VType2.t_i2][VType2.t_bool] = VType2.t_ui1;
343 // ConversionClassTable[VType2.t_i2][VType2.t_ui1] = VType2.t_char;
344 // ConversionClassTable[VType2.t_i2][VType2.t_char] = VType2.t_bad;
345 // ConversionClassTable[VType2.t_i2][VType2.t_i2] = VType2.t_bool;
346 // ConversionClassTable[VType2.t_i2][VType2.t_i4] = VType2.t_ui1;
347 // ConversionClassTable[VType2.t_i2][VType2.t_i8] = VType2.t_ui1;
348 // ConversionClassTable[VType2.t_i2][VType2.t_r4] = VType2.t_ui1;
349 // ConversionClassTable[VType2.t_i2][VType2.t_r8] = VType2.t_ui1;
350 // ConversionClassTable[VType2.t_i2][VType2.t_bad] = VType2.t_bad;
351 // ConversionClassTable[VType2.t_i2][VType2.t_dec] = VType2.t_ui1;
352 // ConversionClassTable[VType2.t_i2][VType2.t_dec] = VType2.t_bad;
353 // ConversionClassTable[VType2.t_i2][VType2.t_str] = VType2.t_ui1;
355 // ConversionClassTable[VType2.t_i4][VType2.t_bad] = VType2.t_bad;
356 // ConversionClassTable[VType2.t_i4][VType2.t_bool] = VType2.t_ui1;
357 // ConversionClassTable[VType2.t_i4][VType2.t_ui1] = VType2.t_char;
358 // ConversionClassTable[VType2.t_i4][VType2.t_char] = VType2.t_bad;
359 // ConversionClassTable[VType2.t_i4][VType2.t_i2] = VType2.t_char;
360 // ConversionClassTable[VType2.t_i4][VType2.t_i4] = VType2.t_bool;
361 // ConversionClassTable[VType2.t_i4][VType2.t_i8] = VType2.t_ui1;
362 // ConversionClassTable[VType2.t_i4][VType2.t_r4] = VType2.t_ui1;
363 // ConversionClassTable[VType2.t_i4][VType2.t_r8] = VType2.t_ui1;
364 // ConversionClassTable[VType2.t_i4][VType2.t_bad] = VType2.t_bad;
365 // ConversionClassTable[VType2.t_i4][VType2.t_dec] = VType2.t_ui1;
366 // ConversionClassTable[VType2.t_i4][VType2.t_dec] = VType2.t_bad;
367 // ConversionClassTable[VType2.t_i4][VType2.t_str] = VType2.t_ui1;
369 // ConversionClassTable[VType2.t_i8][VType2.t_bad] = VType2.t_bad;
370 // ConversionClassTable[VType2.t_i8][VType2.t_bool] = VType2.t_ui1;
371 // ConversionClassTable[VType2.t_i8][VType2.t_ui1] = VType2.t_char;
372 // ConversionClassTable[VType2.t_i8][VType2.t_char] = VType2.t_bad;
373 // ConversionClassTable[VType2.t_i8][VType2.t_i2] = VType2.t_char;
374 // ConversionClassTable[VType2.t_i8][VType2.t_i4] = VType2.t_char;
375 // ConversionClassTable[VType2.t_i8][VType2.t_i8] = VType2.t_bool;
376 // ConversionClassTable[VType2.t_i8][VType2.t_r4] = VType2.t_ui1;
377 // ConversionClassTable[VType2.t_i8][VType2.t_r8] = VType2.t_ui1;
378 // ConversionClassTable[VType2.t_i8][VType2.t_bad] = VType2.t_bad;
379 // ConversionClassTable[VType2.t_i8][VType2.t_dec] = VType2.t_ui1;
380 // ConversionClassTable[VType2.t_i8][VType2.t_dec] = VType2.t_bad;
381 // ConversionClassTable[VType2.t_i8][VType2.t_str] = VType2.t_ui1;
383 // ConversionClassTable[VType2.t_r4][VType2.t_bad] = VType2.t_bad;
384 // ConversionClassTable[VType2.t_r4][VType2.t_bool] = VType2.t_ui1;
385 // ConversionClassTable[VType2.t_r4][VType2.t_ui1] = VType2.t_char;
386 // ConversionClassTable[VType2.t_r4][VType2.t_char] = VType2.t_bad;
387 // ConversionClassTable[VType2.t_r4][VType2.t_i2] = VType2.t_char;
388 // ConversionClassTable[VType2.t_r4][VType2.t_i4] = VType2.t_char;
389 // ConversionClassTable[VType2.t_r4][VType2.t_i8] = VType2.t_char;
390 // ConversionClassTable[VType2.t_r4][VType2.t_r4] = VType2.t_bool;
391 // ConversionClassTable[VType2.t_r4][VType2.t_r8] = VType2.t_ui1;
392 // ConversionClassTable[VType2.t_r4][VType2.t_bad] = VType2.t_bad;
393 // ConversionClassTable[VType2.t_r4][VType2.t_dec] = VType2.t_char;
394 // ConversionClassTable[VType2.t_r4][VType2.t_dec] = VType2.t_bad;
395 // ConversionClassTable[VType2.t_r4][VType2.t_str] = VType2.t_ui1;
397 // ConversionClassTable[VType2.t_r8][VType2.t_bad] = VType2.t_bad;
398 // ConversionClassTable[VType2.t_r8][VType2.t_bool] = VType2.t_ui1;
399 // ConversionClassTable[VType2.t_r8][VType2.t_ui1] = VType2.t_char;
400 // ConversionClassTable[VType2.t_r8][VType2.t_char] = VType2.t_bad;
401 // ConversionClassTable[VType2.t_r8][VType2.t_i2] = VType2.t_char;
402 // ConversionClassTable[VType2.t_r8][VType2.t_i4] = VType2.t_char;
403 // ConversionClassTable[VType2.t_r8][VType2.t_i8] = VType2.t_char;
404 // ConversionClassTable[VType2.t_r8][VType2.t_r4] = VType2.t_char;
405 // ConversionClassTable[VType2.t_r8][VType2.t_r8] = VType2.t_bool;
406 // ConversionClassTable[VType2.t_r8][VType2.t_bad] = VType2.t_bad;
407 // ConversionClassTable[VType2.t_r8][VType2.t_dec] = VType2.t_char;
408 // ConversionClassTable[VType2.t_r8][VType2.t_dec] = VType2.t_bad;
409 // ConversionClassTable[VType2.t_r8][VType2.t_str] = VType2.t_ui1;
411 // ConversionClassTable[VType2.t_bad][VType2.t_bad] = VType2.t_bad;
412 // ConversionClassTable[VType2.t_bad][VType2.t_bool] = VType2.t_bad;
413 // ConversionClassTable[VType2.t_bad][VType2.t_ui1] = VType2.t_bad;
414 // ConversionClassTable[VType2.t_bad][VType2.t_char] = VType2.t_bad;
415 // ConversionClassTable[VType2.t_bad][VType2.t_i2] = VType2.t_bad;
416 // ConversionClassTable[VType2.t_bad][VType2.t_i4] = VType2.t_bad;
417 // ConversionClassTable[VType2.t_bad][VType2.t_i8] = VType2.t_bad;
418 // ConversionClassTable[VType2.t_bad][VType2.t_r4] = VType2.t_bad;
419 // ConversionClassTable[VType2.t_bad][VType2.t_r8] = VType2.t_bad;
420 // ConversionClassTable[VType2.t_bad][VType2.t_bad] = VType2.t_bool;
421 // ConversionClassTable[VType2.t_bad][VType2.t_dec] = VType2.t_bad;
422 // ConversionClassTable[VType2.t_bad][VType2.t_dec] = VType2.t_bad;
423 // ConversionClassTable[VType2.t_bad][VType2.t_str] = VType2.t_ui1;
425 // ConversionClassTable[VType2.t_dec][VType2.t_bad] = VType2.t_bad;
426 // ConversionClassTable[VType2.t_dec][VType2.t_bool] = VType2.t_ui1;
427 // ConversionClassTable[VType2.t_dec][VType2.t_ui1] = VType2.t_char;
428 // ConversionClassTable[VType2.t_dec][VType2.t_char] = VType2.t_bad;
429 // ConversionClassTable[VType2.t_dec][VType2.t_i2] = VType2.t_char;
430 // ConversionClassTable[VType2.t_dec][VType2.t_i4] = VType2.t_char;
431 // ConversionClassTable[VType2.t_dec][VType2.t_i8] = VType2.t_char;
432 // ConversionClassTable[VType2.t_dec][VType2.t_r4] = VType2.t_ui1;
433 // ConversionClassTable[VType2.t_dec][VType2.t_r8] = VType2.t_ui1;
434 // ConversionClassTable[VType2.t_dec][VType2.t_bad] = VType2.t_bad;
435 // ConversionClassTable[VType2.t_dec][VType2.t_dec] = VType2.t_bool;
436 // ConversionClassTable[VType2.t_dec][VType2.t_dec] = VType2.t_bad;
437 // ConversionClassTable[VType2.t_dec][VType2.t_str] = VType2.t_ui1;
439 // ConversionClassTable[VType2.t_dec][VType2.t_bad] = VType2.t_bad;
440 // ConversionClassTable[VType2.t_dec][VType2.t_bool] = VType2.t_bad;
441 // ConversionClassTable[VType2.t_dec][VType2.t_ui1] = VType2.t_bad;
442 // ConversionClassTable[VType2.t_dec][VType2.t_char] = VType2.t_bad;
443 // ConversionClassTable[VType2.t_dec][VType2.t_i2] = VType2.t_bad;
444 // ConversionClassTable[VType2.t_dec][VType2.t_i4] = VType2.t_bad;
445 // ConversionClassTable[VType2.t_dec][VType2.t_i8] = VType2.t_bad;
446 // ConversionClassTable[VType2.t_dec][VType2.t_r4] = VType2.t_bad;
447 // ConversionClassTable[VType2.t_dec][VType2.t_r8] = VType2.t_bad;
448 // ConversionClassTable[VType2.t_dec][VType2.t_bad] = VType2.t_bad;
449 // ConversionClassTable[VType2.t_dec][VType2.t_dec] = VType2.t_bad;
450 // ConversionClassTable[VType2.t_dec][VType2.t_dec] = VType2.t_bad;
451 // ConversionClassTable[VType2.t_dec][VType2.t_str] = VType2.t_bad;
453 // ConversionClassTable[VType2.t_str][VType2.t_bad] = VType2.t_bad;
454 // ConversionClassTable[VType2.t_str][VType2.t_bool] = VType2.t_ui1;
455 // ConversionClassTable[VType2.t_str][VType2.t_ui1] = VType2.t_ui1;
456 // ConversionClassTable[VType2.t_str][VType2.t_char] = VType2.t_char;
457 // ConversionClassTable[VType2.t_str][VType2.t_i2] = VType2.t_ui1;
458 // ConversionClassTable[VType2.t_str][VType2.t_i4] = VType2.t_ui1;
459 // ConversionClassTable[VType2.t_str][VType2.t_i8] = VType2.t_ui1;
460 // ConversionClassTable[VType2.t_str][VType2.t_r4] = VType2.t_ui1;
461 // ConversionClassTable[VType2.t_str][VType2.t_r8] = VType2.t_ui1;
462 // ConversionClassTable[VType2.t_str][VType2.t_bad] = VType2.t_ui1;
463 // ConversionClassTable[VType2.t_str][VType2.t_dec] = VType2.t_ui1;
464 // ConversionClassTable[VType2.t_str][VType2.t_dec] = VType2.t_bad;
465 // ConversionClassTable[VType2.t_str][VType2.t_str] = VType2.t_bool;
467 // VType2FromTypeCode[TypeCode.Boolean] = VType2.t_bool;
468 // VType2FromTypeCode[TypeCode.Byte] = VType2.t_ui1;
469 // VType2FromTypeCode[TypeCode.Int16] = VType2.t_i2;
470 // VType2FromTypeCode[TypeCode.Int32] = VType2.t_i4;
471 // VType2FromTypeCode[TypeCode.Int64] = VType2.t_i8;
472 // VType2FromTypeCode[TypeCode.Decimal] = VType2.t_dec;
473 // VType2FromTypeCode[TypeCode.Single] = VType2.t_r4;
474 // VType2FromTypeCode[TypeCode.Double] = VType2.t_r8;
475 // VType2FromTypeCode[TypeCode.Char] = VType2.t_char;
476 // VType2FromTypeCode[TypeCode.string] = VType2.t_str;
477 // VType2FromTypeCode[TypeCode.DateTime] = VType2.t_date;
479 // VTypeFromTypeCode[TypeCode.Boolean] = VType.t_bool;
480 // VTypeFromTypeCode[TypeCode.Byte] = VType.t_ui1;
481 // VTypeFromTypeCode[TypeCode.Int16] = VType.t_i2;
482 // VTypeFromTypeCode[TypeCode.Int32] = VType.t_i4;
483 // VTypeFromTypeCode[TypeCode.Int64] = VType.t_i8;
484 // VTypeFromTypeCode[TypeCode.Decimal] = VType.t_dec;
485 // VTypeFromTypeCode[TypeCode.Single] = VType.t_r4;
486 // VTypeFromTypeCode[TypeCode.Double] = VType.t_r8;
487 // VTypeFromTypeCode[TypeCode.Char] = VType.t_char;
488 // VTypeFromTypeCode[TypeCode.string] = VType.t_str;
489 // VTypeFromTypeCode[TypeCode.DateTime] = VType.t_date;
491 // TypeCodeFromVType[VType.t_bool] = TypeCode.Boolean;
492 // TypeCodeFromVType[VType.t_ui1] = TypeCode.Byte;
493 // TypeCodeFromVType[VType.t_i2] = TypeCode.Int16;
494 // TypeCodeFromVType[VType.t_i4] = TypeCode.Int32;
495 // TypeCodeFromVType[VType.t_i8] = TypeCode.Int64;
496 // TypeCodeFromVType[VType.t_dec] = TypeCode.Decimal;
497 // TypeCodeFromVType[VType.t_r4] = TypeCode.Single;
498 // TypeCodeFromVType[VType.t_r8] = TypeCode.Double;
499 // TypeCodeFromVType[VType.t_char] = TypeCode.Char;
500 // TypeCodeFromVType[VType.t_str] = TypeCode.string;
501 // TypeCodeFromVType[VType.t_date] = TypeCode.DateTime;
503 // TypeFromTypeCode[TypeCode.Boolean] = Type.BooleanType;
504 // TypeFromTypeCode[TypeCode.Byte] = Type.ByteType;
505 // TypeFromTypeCode[TypeCode.Int16] = Type.Int16Type;
506 // TypeFromTypeCode[TypeCode.Int32] = Type.Int32Type;
507 // TypeFromTypeCode[TypeCode.Int64] = Type.Int64Type;
508 // TypeFromTypeCode[TypeCode.Decimal] = Type.DecimalType;
509 // TypeFromTypeCode[TypeCode.Single] = Type.SingleType;
510 // TypeFromTypeCode[TypeCode.Double] = Type.DoubleType;
511 // TypeFromTypeCode[TypeCode.Char] = Type.CharType;
512 // TypeFromTypeCode[TypeCode.string] = Type.StringType;
513 // TypeFromTypeCode[TypeCode.DateTime] = Type.DateTimeType;
514 // TypeFromTypeCode[TypeCode.SByte] = Type.SByteType;
515 // TypeFromTypeCode[TypeCode.UInt16] = Type.UInt16Type;
516 // TypeFromTypeCode[TypeCode.UInt32] = Type.UInt32Type;
517 // TypeFromTypeCode[TypeCode.UInt64] = Type.UInt64Type;
518 // TypeFromTypeCode[TypeCode.object] = Type.ObjectType;
519 // TypeFromTypeCode[TypeCode.DBNull] = Type.DBNullType;
522 private static void checkIfAddValidObjects(
527 if (tc1 == TypeCode.Object || tc1 == TypeCode.SByte
528 || tc1 == TypeCode.UInt16 || tc1 == TypeCode.UInt32
529 || tc1 == TypeCode.UInt64)
530 throwNoValidOperator(obj1, obj2);
531 if (tc2 == TypeCode.Object || tc2 == TypeCode.SByte
532 || tc2 == TypeCode.UInt16 || tc2 == TypeCode.UInt32
533 || tc2 == TypeCode.UInt64)
534 throwNoValidOperator(obj1, obj2);
538 public static object AddObj(object obj1, object obj2) {
539 TypeCode tc1 = getTypeCode(obj1);
540 if (obj1 != null && (obj1 is char[]))
541 obj1 = new string((char[]) obj1);
543 TypeCode tc2 = getTypeCode(obj2);
544 if (obj2 != null && (obj2 is char[]))
545 obj2 = new string((char[]) obj2);
547 checkIfAddValidObjects(obj1,obj2,tc1,tc2);
549 if (tc1 == TypeCode.DBNull || tc2 == TypeCode.DBNull)
550 return getAddDBNull(obj1,obj2,tc1,tc2);
551 else if (tc1 == TypeCode.DateTime || tc2 == TypeCode.DateTime)
552 return getAddDateTime(obj1,obj2,tc1,tc2);
553 else if (tc1 == TypeCode.Char || tc2 == TypeCode.Char)
554 return getAddChar(obj1,obj2,tc1,tc2);
556 if (tc1 == TypeCode.Empty)
558 else if (tc2 == TypeCode.Empty)
561 if (tc1 == TypeCode.String && tc2 == TypeCode.String)
562 return StringType.FromObject(obj1) + StringType.FromObject(obj2);
563 else if (tc1 == TypeCode.String || tc2 == TypeCode.String )
564 return getAddStringObject(obj1,obj2,tc1,tc2);
566 if (tc1 == TypeCode.Double || tc2 == TypeCode.Double)
567 return getAddDouble(obj1,obj2,tc1,tc2);
568 else if (tc1 == TypeCode.Single || tc2 == TypeCode.Single)
569 return getAddSingle(obj1,obj2,tc1,tc2);
570 else if(tc1 == TypeCode.Decimal || tc2 == TypeCode.Decimal)
571 return getAddDecimal(obj1,obj2,tc1,tc2);
572 else if (tc1 == TypeCode.Int64 || tc2 == TypeCode.Int64)
573 return getAddInt64(obj1,obj2,tc1,tc2);
574 else if (tc1 == TypeCode.Int32 || tc2 == TypeCode.Int32)
575 return getAddInt32(obj1,obj2,tc1,tc2);
576 else if (tc1 == TypeCode.Int16 || tc2 == TypeCode.Int16)
577 return getAddInt16(obj1,obj2,tc1,tc2);
578 else if (tc1 == TypeCode.Boolean || tc2 == TypeCode.Boolean)
579 return getAddInt16(obj1,obj2,tc1,tc2);
580 else if (tc1 == TypeCode.Byte || tc2 == TypeCode.Byte)
581 return getAddByte(obj1,obj2,tc1,tc2);
583 throwNoValidOperator(obj1, obj2);
587 private static object getAddDBNull(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
588 if (tc1 == TypeCode.DBNull) {
589 if (tc2 == TypeCode.String)
592 throwNoValidOperator(obj1, obj2);
594 else if (tc1 == TypeCode.String)
597 throwNoValidOperator(obj1, obj2);
601 private static object getAddChar(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
602 if (tc1 == TypeCode.Char) {
603 if (tc2 == TypeCode.Char || tc2 == TypeCode.String)
604 return StringType.FromObject(obj1) + StringType.FromObject(obj2);
606 throwNoValidOperator(obj1, obj2);
608 else if (tc2 == TypeCode.Char) {
609 if (tc1 == TypeCode.Char || tc1 == TypeCode.String)
610 return StringType.FromObject(obj1) + StringType.FromObject(obj2);
612 throwNoValidOperator(obj1, obj2);
617 private static object getAddDateTime(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
618 if (tc1 == TypeCode.DateTime) {
619 if (tc2 == TypeCode.DateTime || tc2 == TypeCode.String)
620 return obj1.ToString() + obj2.ToString();
622 throwNoValidOperator(obj1, obj2);
624 else if (tc2 == TypeCode.DateTime) {
625 if (tc1 == TypeCode.DateTime || tc1 == TypeCode.String)
626 return obj1.ToString() + obj2.ToString();
628 throwNoValidOperator(obj1, obj2);
633 private static object getAddByte(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
634 byte d1 = convertObjectToByte(obj1,tc1);
635 byte d2 = convertObjectToByte(obj2,tc2);
636 short s = (short) (d1 + d2);
637 if (s >= 0 && s <= 255)
642 private static object getAddDouble(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
643 double d1 = convertObjectToDouble(obj1,tc1);
644 double d2 = convertObjectToDouble(obj2,tc2);
648 private static object getAddDecimal(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
649 Decimal d1 = convertObjectToDecimal(obj1,tc1);
650 Decimal d2 = convertObjectToDecimal(obj2,tc2);
651 return Decimal.Add(d1,d2);
654 private static object getAddInt64(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
655 Decimal d1 = convertObjectToDecimal(obj1,tc1);
656 Decimal d2 = convertObjectToDecimal(obj2,tc2);
657 Decimal sum = Decimal.Add(d1,d2);
659 Decimal.Compare(sum, new Decimal(long.MaxValue)) <= 0
660 && Decimal.Compare(sum, new Decimal(long.MinValue))
662 return Decimal.ToInt64(sum);
667 private static object getAddInt32(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
668 long d1 = convertObjectToLong(obj1,tc1);
669 long d2 = convertObjectToLong(obj2,tc2);
671 if (sum >= Int32.MinValue && sum <= Int32.MaxValue)
676 private static object getAddInt16(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
677 int d1 = convertObjectToInt(obj1,tc1);
678 int d2 = convertObjectToInt(obj2,tc2);
680 if (sum >= short.MinValue && sum <= short.MaxValue)
686 private static object getAddSingle(object obj1,object obj2,TypeCode tc1,TypeCode tc2) {
687 float d1 = convertObjectToFloat(obj1,tc1);
688 float d2 = convertObjectToFloat(obj2,tc2);
690 double sum = (double) d1 + (double) d2;
691 if (sum <= 3.40282e+038 && sum>= -3.40282e+038)
693 if (Double.IsInfinity(sum) &&
694 (Single.IsInfinity(d1) || Single.IsInfinity(d2)))
700 private static int toVBBool(IConvertible conv) {
701 if (conv.ToBoolean(null))
708 private static object getAddStringObject(object s1, object s2,TypeCode tc1,TypeCode tc2) {
709 double d1 = convertObjectToDouble(s1,tc1);
710 double d2 = convertObjectToDouble(s1,tc2);
715 public static object BitAndObj(object obj1, object obj2) {
716 Type type1 = obj1.GetType();
717 Type type2 = obj2.GetType();
718 TypeCode typeCode = GetWidestType(obj1, obj2, false);
720 if (obj1 == null && obj2 == null)
722 else if (typeCode == TypeCode.Boolean) {
724 return ((bool)obj1) & ((bool)obj2);
725 return ((short)obj1) & ((short)obj2);
727 else if (typeCode == TypeCode.Byte) {
728 byte val = (byte)(ByteType.FromObject(obj1)
729 & ByteType.FromObject(obj2));
730 return createByteAccordingToEnumCond(val,type1,type2,obj1,obj2);
732 else if (typeCode == TypeCode.Int16) {
734 (short)(ShortType.FromObject(obj1)
735 & ShortType.FromObject(obj2));
736 return createShortAccordingToEnumCond(val,type1,type2,obj1,obj2);
738 else if (typeCode == TypeCode.Int32) {
739 Int32 val = IntegerType.FromObject(obj1) & IntegerType.FromObject(obj2);
740 return createIntAccordingToEnumCond(val,type1,type2,obj1,obj2);
742 else if (typeCode == TypeCode.Int64) {
743 long val = LongType.FromObject(obj1) & LongType.FromObject(obj2);
744 return createLongAccordingToEnumCond(val, type1, type2, obj1, obj2);
746 else if (typeCode == TypeCode.Single || typeCode == TypeCode.Double
747 || typeCode == TypeCode.Decimal || typeCode == TypeCode.String) {
748 long val = LongType.FromObject(obj1) & LongType.FromObject(obj2);
752 throw new InvalidCastException(
753 Utils.GetResourceString(
754 "NoValidOperator_TwoOperands",
755 Utils.VBFriendlyName(obj1),
756 Utils.VBFriendlyName(obj2)));
759 private static object createByteAccordingToEnumCond(
765 bool isEnum1 = type1.IsEnum;
766 bool isEmum2 = type2.IsEnum;
767 if (isEnum1 && isEmum2 && type1 != type2)
770 return Enum.ToObject(type1, val);
772 throw new InvalidCastException(
773 Utils.GetResourceString(
774 "NoValidOperator_TwoOperands",
775 Utils.VBFriendlyName(obj1),
776 Utils.VBFriendlyName(obj2)));
777 return Enum.ToObject(type2, val);
780 private static object createShortAccordingToEnumCond(
786 bool isEnum1 = type1.IsEnum;
787 bool isEmum2 = type2.IsEnum;
788 if (isEnum1 && isEmum2 && type1 != type2)
791 return Enum.ToObject(type1, val);
793 throw new InvalidCastException(
794 Utils.GetResourceString(
795 "NoValidOperator_TwoOperands",
796 Utils.VBFriendlyName(obj1),
797 Utils.VBFriendlyName(obj2)));
798 return Enum.ToObject(type2, val);
801 private static object createIntAccordingToEnumCond(
807 bool isEnum1 = type1.IsEnum;
808 bool isEmum2 = type2.IsEnum;
809 if (isEnum1 && isEmum2 && type1 != type2)
812 return Enum.ToObject(type1, val);
814 throw new InvalidCastException(
815 Utils.GetResourceString(
816 "NoValidOperator_TwoOperands",
817 Utils.VBFriendlyName(obj1),
818 Utils.VBFriendlyName(obj2)));
819 return Enum.ToObject(type2, val);
822 private static object createLongAccordingToEnumCond(
828 bool isEnum1 = type1.IsEnum;
829 bool isEmum2 = type2.IsEnum;
830 if (isEnum1 && isEmum2 && type1 != type2)
833 return Enum.ToObject(type1, val);
835 throw new InvalidCastException(
836 Utils.GetResourceString(
837 "NoValidOperator_TwoOperands",
838 Utils.VBFriendlyName(obj1),
839 Utils.VBFriendlyName(obj2)));
840 return Enum.ToObject(type2, val);
844 public static object BitOrObj(object obj1, object obj2) {
845 Type type1 = obj1.GetType();
846 Type type2 = obj2.GetType();
847 TypeCode typeCode = GetWidestType(obj1, obj2, false);
849 if (obj1 == null && obj2 == null)
851 else if (typeCode == TypeCode.Boolean) {
853 return BooleanType.FromObject(obj1)| BooleanType.FromObject(obj2);
854 return (short)( (ushort)ShortType.FromObject(obj1) | (ushort)ShortType.FromObject(obj2));
856 else if (typeCode == TypeCode.Byte) {
857 byte val = (byte)(ByteType.FromObject(obj1)
858 | ByteType.FromObject(obj2));
859 return createByteAccordingToEnumCond(val,type1,type2,obj1,obj2);
861 else if (typeCode == TypeCode.Int16) {
862 short val = (short) ((ushort) ShortType.FromObject(obj1)
863 | (ushort)ShortType.FromObject(obj2));
864 return createShortAccordingToEnumCond(val,type1,type2,obj1,obj2);
866 else if (typeCode == TypeCode.Int32) {
867 Int32 val = IntegerType.FromObject(obj1) | IntegerType.FromObject(obj2);
868 return createIntAccordingToEnumCond(val,type1,type2,obj1,obj2);
870 else if (typeCode == TypeCode.Int64) {
871 long val = LongType.FromObject(obj1) | LongType.FromObject(obj2);
872 return createLongAccordingToEnumCond(val, type1, type2, obj1, obj2);
874 else if (typeCode == TypeCode.Single || typeCode == TypeCode.Double
875 || typeCode == TypeCode.Decimal || typeCode == TypeCode.String) {
876 long val = LongType.FromObject(obj1) | LongType.FromObject(obj2);
880 throw new InvalidCastException(
881 Utils.GetResourceString(
882 "NoValidOperator_TwoOperands",
883 Utils.VBFriendlyName(obj1),
884 Utils.VBFriendlyName(obj2)));
888 public static object BitXorObj(object obj1, object obj2) {
889 Type type1 = obj1.GetType();
890 Type type2 = obj2.GetType();
891 TypeCode typeCode = GetWidestType(obj1, obj2, false);
893 if (obj1 == null && obj2 == null)
895 else if (typeCode == TypeCode.Boolean) {
897 return BooleanType.FromObject(obj1)^ BooleanType.FromObject(obj2);
898 return (short) (ShortType.FromObject(obj1) ^ ShortType.FromObject(obj2));
900 else if (typeCode == TypeCode.Byte) {
901 byte val = (Byte) (ByteType.FromObject(obj1)
902 ^ ByteType.FromObject(obj2));
903 return createByteAccordingToEnumCond(val,type1,type2,obj1,obj2);
905 else if (typeCode == TypeCode.Int16) {
907 (short) (ShortType.FromObject(obj1)
908 ^ ShortType.FromObject(obj2));
909 return createShortAccordingToEnumCond(val,type1,type2,obj1,obj2);
911 else if (typeCode == TypeCode.Int32) {
912 Int32 val = IntegerType.FromObject(obj1) ^ IntegerType.FromObject(obj2);
913 return createIntAccordingToEnumCond(val,type1,type2,obj1,obj2);
915 else if (typeCode == TypeCode.Int64) {
916 long val = LongType.FromObject(obj1) ^ LongType.FromObject(obj2);
917 return createLongAccordingToEnumCond(val, type1, type2, obj1, obj2);
919 else if (typeCode == TypeCode.Single || typeCode == TypeCode.Double
920 || typeCode == TypeCode.Decimal || typeCode == TypeCode.String) {
921 long val = LongType.FromObject(obj1) ^ LongType.FromObject(obj2);
925 throw new InvalidCastException(
926 Utils.GetResourceString(
927 "NoValidOperator_TwoOperands",
928 Utils.VBFriendlyName(obj1),
929 Utils.VBFriendlyName(obj2)));
932 internal static object CTypeHelper(object obj, TypeCode toType) {
936 case TypeCode.Boolean :
937 return BooleanType.FromObject(obj);
939 return ByteType.FromObject(obj);
940 case TypeCode.Int16 :
941 return ShortType.FromObject(obj);
942 case TypeCode.Int32 :
943 return IntegerType.FromObject(obj);
944 case TypeCode.Int64 :
945 return LongType.FromObject(obj);
946 case TypeCode.Decimal :
947 return DecimalType.FromObject(obj);
948 case TypeCode.Single :
949 return SingleType.FromObject(obj);
950 case TypeCode.Double :
951 return DoubleType.FromObject(obj);
952 case TypeCode.String :
953 return StringType.FromObject(obj);
955 return CharType.FromObject(obj);
956 case TypeCode.DateTime :
957 return DateType.FromObject(obj);
961 throw new InvalidCastException(// ClassCastException(
962 Utils.GetResourceString(
963 "InvalidCast_FromTo",
964 Utils.VBFriendlyName(obj),
965 Utils.VBFriendlyName(ObjectType.TypeFromTypeCode(toType))));
970 internal static object CTypeHelper(object obj, Type toType) {
974 //TODO: how to tell if is truly type of object
\r
975 //if (toType == Type.ObjectType)
\r
978 Type type = obj.GetType();
979 if (toType.IsByRef) {
980 toType = toType.GetElementType();
983 // local1 = local1.GetElementType();
987 TypeCode tc = Type.GetTypeCode(toType);
988 if (tc == TypeCode.Object) {
989 if (toType.IsAssignableFrom(type))
992 && toType == typeof (char[])) {
993 return CharArrayType.FromString((string) obj);
996 throw new InvalidCastException(
997 Utils.GetResourceString(
998 "InvalidCast_FromTo",
999 Utils.VBFriendlyName(type),
1000 Utils.VBFriendlyName(toType)));
1003 object retVal = CTypeHelper(obj, tc);
1005 return Enum.ToObject(toType,retVal);
1009 //checked + string//make typecode
1010 internal static TypeCode GetWidestType(TypeCode type1, TypeCode type2) {
1014 if (type1 == TypeCode.Char || type2 == TypeCode.Char) {
1015 if (type1 == TypeCode.Char && type2 == TypeCode.String)
1016 return TypeCode.String;
1017 if (type2 == TypeCode.Char && type1 == TypeCode.String)
1018 return TypeCode.String;
1019 return TypeCode.Empty;
1021 if (type1 == TypeCode.DateTime || type2 == TypeCode.DateTime) {
1022 if (type1 == TypeCode.String && type2 == TypeCode.DateTime)
1023 return TypeCode.DateTime;
1024 if (type2 == TypeCode.String && type1 == TypeCode.DateTime)
1025 return TypeCode.DateTime;
1026 return TypeCode.Empty;
1030 case TypeCode.Boolean :
1032 case TypeCode.Byte :
1034 case TypeCode.String:
1035 return TypeCode.Double;
1038 case TypeCode.Byte :
1040 case TypeCode.String:
1041 return TypeCode.Double;
1044 case TypeCode.Int16 :
1046 case TypeCode.Boolean:
1049 case TypeCode.String:
1050 return TypeCode.Double;
1053 case TypeCode.Int32 :
1055 case TypeCode.Boolean:
1057 case TypeCode.Int16:
1059 case TypeCode.String:
1060 return TypeCode.Double;
1063 case TypeCode.Int64 :
1065 case TypeCode.Single:
1066 case TypeCode.Double:
1067 case TypeCode.Decimal:
1069 case TypeCode.String:
1070 return TypeCode.Double;
1073 case TypeCode.Decimal :
1075 case TypeCode.Single:
1076 case TypeCode.Double:
1078 case TypeCode.String:
1079 return TypeCode.Double;
1082 case TypeCode.Single :
1084 case TypeCode.Double:
1086 case TypeCode.String:
1087 return TypeCode.Double;
1090 case TypeCode.Double :
1092 case TypeCode.String:
1096 case TypeCode.String :
1097 return TypeCode.Double;
1099 return TypeCode.Object;
1102 internal static TypeCode GetWidestType(object obj1, TypeCode typeCode2) {
1105 TypeCode tc1 = getTypeCode(obj1);
1106 return GetWidestType(tc1,typeCode2);
1109 private static TypeCode getTypeCode(object obj) {
1110 IConvertible iConvertible = null;
1112 if (obj is IConvertible) {
1113 iConvertible = (IConvertible)obj;
1115 if (iConvertible != null) {
1116 typeCode = iConvertible.GetTypeCode();
1118 else if (obj == null) {
1119 typeCode = TypeCode.Empty;
1121 else if (obj is string) {
1122 typeCode = TypeCode.String;
1124 else if (obj is char[]) {
1125 typeCode = TypeCode.String;
1128 typeCode = TypeCode.Object;
1133 internal static TypeCode GetWidestType(object obj1, object obj2, bool IsAdd) {
1134 TypeCode typeCode1 = getTypeCode(obj1);
1135 TypeCode typeCode2 = getTypeCode(obj1);
1142 ((typeCode1 == TypeCode.DBNull && typeCode2 == TypeCode.String) ||
1143 (typeCode1 == TypeCode.String && typeCode2 == TypeCode.DBNull)))
1144 return TypeCode.DBNull;
1146 return GetWidestType(typeCode1,typeCode2);
1151 private static TypeCode getTypeCodeFromVType(int vartype) {
1152 throw new NotImplementedException("get typecode from vtype needs help");
1154 //return TypeCodeFromVType[vartype];
1158 private static int getVTypeFromTypeCode(TypeCode type) {
1159 throw new NotImplementedException("get typecode from vtype needs help");
1161 //return VTypeFromTypeCode[type];
1165 public static object GetObjectValuePrimitive(object o) {
1166 if (o == null || !(o is IConvertible))
1168 IConvertible iConv = (IConvertible)o;
1169 TypeCode tc = getTypeCode(o);
1171 //this four type code are converted in this way since they can also
1173 case TypeCode.Byte :
1174 return iConv.ToByte(null);
1175 case TypeCode.Int16 :
1176 return iConv.ToInt16(null);
1177 case TypeCode.Int32 :
1178 return iConv.ToInt32(null);
1179 case TypeCode.Int64 :
1180 return iConv.ToInt64(null);
1187 private static object getDivDecimal(object obj1, object obj2,TypeCode tc1,TypeCode tc2) {
1188 Decimal dec1 = convertObjectToDecimal(obj1,tc1);
1189 Decimal dec2 = convertObjectToDecimal(obj2,tc2);
1191 return Decimal.Divide(dec1, dec2);
1193 catch(OverflowException e) {
1194 e.ToString();//TODO: Dumb way to fix compiler warning about unused e
1195 float val1 = Convert.ToSingle(dec1);
1196 float val2 = Convert.ToSingle(dec2);
1197 float val3 = val1/val2;
1204 private static object getDivDouble(object s1, object s2, TypeCode tc1 ,TypeCode tc2) {
1205 double d1 = convertObjectToDouble(s1,tc1);
1206 double d2 = convertObjectToDouble(s2,tc2);
1211 private static object getDivSingle(object obj1, object obj2,TypeCode tc1 , TypeCode tc2) {
1212 float d1 = convertObjectToFloat(obj1,tc1);
1213 float d2 = convertObjectToFloat(obj2,tc2);
1215 float sum = d1 / d2;
1216 if (float.IsInfinity(d1)) {
1217 if (float.IsInfinity(d1) || float.IsInfinity(d2))
1219 return (double) d1 / (double) d2;
1224 private static void checkIfValidObjects(
1229 if (tc1 == TypeCode.Object || tc1 == TypeCode.DBNull
1230 || tc1 == TypeCode.Char || tc1 == TypeCode.SByte
1231 || tc1 == TypeCode.UInt16 || tc1 == TypeCode.UInt32
1232 || tc1 == TypeCode.UInt64 || tc1 == TypeCode.DateTime)
1233 throwNoValidOperator(obj1, obj2);
1234 if (tc2 == TypeCode.Object || tc2 == TypeCode.DBNull
1235 || tc2 == TypeCode.Char || tc2 == TypeCode.SByte
1236 || tc2 == TypeCode.UInt16 || tc2 == TypeCode.UInt32
1237 || tc2 == TypeCode.UInt64 || tc2 == TypeCode.DateTime)
1238 throwNoValidOperator(obj1, obj2);
1242 public static object DivObj(object o1, object o2) {
1243 TypeCode tc1 = getTypeCode(o1);
1244 TypeCode tc2 = getTypeCode(o2);
1246 checkIfValidObjects(o1,o2,tc1,tc2);
1248 if (tc2 == TypeCode.Empty)
1249 throw new DivideByZeroException(
1250 /*Environment.GetResourceString(*/"Arg_DivideByZero")/*)*/;
1252 if (tc1 == TypeCode.String || tc2 == TypeCode.String)
1253 return getDivDouble(o1,o2,tc1,tc2);
1254 else if (tc1 == TypeCode.Empty)
1255 return getDivDouble((double)0, o2,TypeCode.Double,tc2);
1256 else if (tc1 == TypeCode.Double || tc2 == TypeCode.Double)
1257 return getDivDouble(o1,o2,tc1,tc2);
1258 else if (tc1 == TypeCode.Single || tc2 == TypeCode.Single)
1259 return getDivSingle(o1, o2,tc1,tc2);
1260 else if (tc1 == TypeCode.Decimal || tc2 == TypeCode.Decimal)
1261 return getDivDecimal(o1, o2,tc1,tc2);
1263 return getDivDouble(o1, o2,tc1,tc2);
1267 private static IConvertible toVBBoolConv(IConvertible conv) {
1268 if (conv.ToBoolean(null))
1273 private static object getIDivideByte(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1274 byte d1 = convertObjectToByte(o1,tc1);
1275 byte d2 = convertObjectToByte(o2,tc2);
1279 private static object getIDivideInt16(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1280 short d1 = convertObjectToShort(o1,tc1);
1281 short d2 = convertObjectToShort(o2,tc2);
1282 return (int)((short) (d1 / d2));
1285 private static object getIDivideInt32(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1286 int d1 = convertObjectToInt(o1,tc1);
1287 int d2 = convertObjectToInt(o2,tc2);
1291 private static object getIDivideInt64(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1292 long d1 = convertObjectToLong(o1,tc1);
1293 long d2 = convertObjectToLong(o2,tc2);
1298 public static object IDivObj(object o1, object o2) {
1299 TypeCode tc1 = getTypeCode(o1);
1300 TypeCode tc2 = getTypeCode(o2);
1301 checkIfValidObjects(o1,o2,tc1,tc2);
1303 if (tc2 == TypeCode.Empty)
1304 throw new DivideByZeroException(
1305 /*Environment.GetResourceString(*/"Arg_DivideByZero")/*)*/;
1306 else if (tc1 == TypeCode.Empty) {
1307 if (tc2 == TypeCode.Byte)
1309 else if (tc2 == TypeCode.Int16)
1311 else if (tc2 == TypeCode.Int32)
1316 else if (tc1 == TypeCode.String || tc2 == TypeCode.String ||
1317 tc1 == TypeCode.Decimal || tc2 == TypeCode.Decimal ||
1318 tc1 == TypeCode.Double || tc2 == TypeCode.Double ||
1319 tc1 == TypeCode.Single || tc2 == TypeCode.Single ||
1320 tc1 == TypeCode.Int64 || tc2 == TypeCode.Int64)
1321 return getIDivideInt64(o1,o2,tc1,tc2);
1322 else if (tc1 == TypeCode.Int32 || tc2 == TypeCode.Int32)
1323 return getIDivideInt32(o1,o2,tc1,tc2);
1324 else if (tc1 == TypeCode.Int16 || tc2 == TypeCode.Int16)
1325 return getIDivideInt16(o1,o2,tc1,tc2);
1326 else if (tc1 == TypeCode.Byte || tc2 == TypeCode.Byte)
1327 return getIDivideByte(o1,o2,tc1,tc2);
1329 return getIDivideInt16(o1,o2,tc1,tc2);
1332 private static object negObj(
1338 case TypeCode.Empty :
1340 case TypeCode.Boolean :
1341 if(((bool)obj) == true)return (short)1;
1343 //int boolValue = (((ClrBoolean)obj).ToBoolean(null) == true)? 1 :0;
1344 //return (short)boolValue;
1346 case TypeCode.Byte :
1347 conv = (IConvertible)obj;
1348 short byteValue = (short) (0 - conv.ToByte(null));
1349 return (short)byteValue;
1350 case TypeCode.Int16 :
1351 conv = (IConvertible)obj;
1352 int shortValue = (0 - conv.ToInt16(null));
1353 return (int)shortValue;
1354 case TypeCode.Int32 :
1355 conv = (IConvertible)obj;
1356 long intValue = (0 - conv.ToInt32(null));
1358 case TypeCode.Int64 :
1359 conv = (IConvertible)obj;
1360 Int64 longValue = conv.ToInt64(null);
1361 if (longValue == Int64.MinValue)return Decimal.Negate(conv.ToDecimal(null));
1363 case TypeCode.Decimal :
1364 return Decimal.Negate((Decimal) obj);
1365 case TypeCode.Single :
1367 case TypeCode.Double :
1368 return (double)(0 - (double) obj);
1369 case TypeCode.String :
1370 return (double)(0 - DoubleType.FromString((string) obj));
1373 throw new InvalidCastException(
1374 Utils.GetResourceString(
1375 "NoValidOperator_OneOperand",
1376 Utils.VBFriendlyName(obj)));
1381 internal static bool IsTypeOf(Type typSrc, Type typParent) {
1382 if (typSrc == typParent)
1384 return typSrc.IsSubclassOf(typParent);
1387 internal static Type GetTypeFromTypeCode (TypeCode tc) {
1389 case TypeCode.Boolean:
1390 return typeof (bool);
1392 return typeof (byte);
1394 return typeof (char);
1395 case TypeCode.DateTime:
1396 return typeof (DateTime);
1397 case TypeCode.DBNull:
1398 return typeof (System.DBNull);
1399 case TypeCode.Decimal:
1400 return typeof (decimal);
1401 case TypeCode.Double:
1402 return typeof (double);
1403 case TypeCode.Int16:
1404 return typeof (short);
1405 case TypeCode.Int32:
1406 return typeof (int);
1407 case TypeCode.Int64:
1408 return typeof (long);
1409 case TypeCode.Object:
1410 return typeof (object);
1411 case TypeCode.SByte:
1412 return typeof (sbyte);
1413 case TypeCode.Single:
1414 return typeof (float);
1415 case TypeCode.String:
1416 return typeof (string);
1421 internal static bool ImplicitConversionExists (Type FromType, Type ToType) {
1422 if (FromType == null)
1424 if (ToType == typeof (object))
1426 if (FromType.IsEnum)
1427 FromType = GetTypeFromTypeCode (Type.GetTypeCode (FromType));
1429 ToType = GetTypeFromTypeCode (Type.GetTypeCode (ToType));
1431 if (Utils.IsNumericType (FromType) && Utils.IsNumericType (ToType))
1434 if (IsWideningConversion (FromType, ToType)) {
1438 if (IsNarrowingConversion (FromType, ToType))
1443 internal static bool IsNarrowingConversion (Type FromType, Type ToType) {
1445 if (IsWiderNumeric (FromType, ToType)) // Narrowing Conversion
1448 if (FromType == typeof (object)) // Object can be converted to any type
1451 if (FromType.IsArray || ToType.IsArray)
1454 TypeCode src_type = Type.GetTypeCode (FromType);
1455 TypeCode dest_type = Type.GetTypeCode (ToType);
1456 switch (dest_type) {
1457 case TypeCode.String:
1460 case TypeCode.SByte:
1461 case TypeCode.Int16:
1462 case TypeCode.Int32:
1463 case TypeCode.Int64:
1464 case TypeCode.Decimal:
1465 case TypeCode.Single:
1466 case TypeCode.Double:
1468 case TypeCode.Boolean:
1469 case TypeCode.DateTime:
1470 case TypeCode.Object:
1475 case TypeCode.SByte:
1476 case TypeCode.Int16:
1477 case TypeCode.Int32:
1478 case TypeCode.Int64:
1479 case TypeCode.Decimal:
1480 case TypeCode.Single:
1481 case TypeCode.Double:
1483 case TypeCode.Boolean:
1484 case TypeCode.DateTime:
1486 case TypeCode.String:
1487 case TypeCode.Object :
1492 if (src_type == TypeCode.String && ToType == typeof (char []))
1497 internal static bool IsWideningConversion(Type FromType, Type ToType) {
1498 if (FromType == null)
1500 TypeCode typeCode1 = Type.GetTypeCode(FromType);
1501 TypeCode typeCode2 = Type.GetTypeCode(ToType);
1503 if (FromType == ToType)
1506 if (ToType == typeof (object))
1508 if (IsWiderNumeric (ToType, FromType))
1511 if (typeCode2 == TypeCode.String) {
1512 if (typeCode1 == TypeCode.Char || FromType == typeof (char[]))
1517 if (typeCode1 == TypeCode.String)
1520 if (typeCode1 == TypeCode.DateTime || typeCode2 == TypeCode.DateTime)
1523 if (typeCode1 == TypeCode.Char || typeCode2 == TypeCode.Char)
1526 if (! FromType.IsValueType ) {
1527 if (ToType.IsValueType)
1529 if (!FromType.IsArray || !ToType.IsArray)
1531 return ToType.IsAssignableFrom(FromType);
1533 if (FromType.GetArrayRank() == ToType.GetArrayRank())
1534 return ToType.GetElementType().IsAssignableFrom(FromType.GetElementType());
1538 if (! ToType.IsValueType) {
1539 return ToType.IsAssignableFrom(FromType);
1546 internal static bool IsWiderNumeric(Type Type1, Type Type2) {
1549 TypeCode typeCode1 = Type.GetTypeCode(Type1);
1550 TypeCode typeCode2 = Type.GetTypeCode(Type2);
1551 if (!Utils.IsNumericType(Type1) || !Utils.IsNumericType(Type2)) {
1557 switch (typeCode1) {
1559 case TypeCode.Empty :
1561 case TypeCode.Boolean:
1562 if (typeCode2 == TypeCode.Byte)
1565 case TypeCode.Byte :
1567 case TypeCode.Int16 :
1568 switch (typeCode2) {
1569 case TypeCode.Boolean:
1575 case TypeCode.Int32 :
1576 switch (typeCode2) {
1577 case TypeCode.Boolean:
1579 case TypeCode.Int16:
1584 case TypeCode.Int64 :
1585 switch (typeCode2) {
1586 case TypeCode.Boolean:
1588 case TypeCode.Int16:
1589 case TypeCode.Int32:
1594 case TypeCode.Decimal :
1595 switch (typeCode2) {
1596 case TypeCode.Single:
1597 case TypeCode.Double:
1598 case TypeCode.Empty:
1603 case TypeCode.Single :
1604 switch (typeCode2) {
1605 case TypeCode.Double:
1606 case TypeCode.Empty:
1611 case TypeCode.Double :
1619 public static bool LikeObj(
1622 CompareMethod compareOption) {
1623 return StringType.StrLike(
1624 StringType.FromObject(vLeft),
1625 StringType.FromObject(vRight),
1629 private static object getModByte(object o1,object o2,TypeCode tc1,TypeCode tc2) {
1630 byte i1 = convertObjectToByte(o1,tc1);
1631 byte i2 = convertObjectToByte(o2,tc2);
1632 return (byte) (i1 % i2);
1635 private static object getModDecimal(object o1,object o2,TypeCode tc1,TypeCode tc2) {
1636 Decimal dec1 = convertObjectToDecimal(o1,tc1);
1637 Decimal dec2 = convertObjectToDecimal(o2,tc2);
1638 return Decimal.Remainder(dec1, dec2);
1641 private static object getModDouble(object o1, object o2 , TypeCode tc1,TypeCode tc2) {
1642 double d1 = convertObjectToDouble(o1,tc1);
1643 double d2 = convertObjectToDouble(o1,tc1);
1647 private static object getModInt16(object o1, object o2 , TypeCode tc1,TypeCode tc2) {
1648 short i1 = convertObjectToShort(o1,tc1);
1649 short i2 = convertObjectToShort(o2,tc2);
1650 Int32 mod = i1 % i2;
1651 if (mod < -32768 || mod > 32767)
1656 private static object getModInt32(object o1, object o2 , TypeCode tc1,TypeCode tc2) {
1657 int i1 = convertObjectToInt(o1,tc1);
1658 int i2 = convertObjectToInt(o1,tc1);
1659 long mod = (long) i1 % (long) i2;
1660 if (mod < 2147483648L || mod > 2147483647L)
1665 private static object getModInt64(object o1, object o2 , TypeCode tc1,TypeCode tc2) {
1666 long l1 = convertObjectToLong(o1,tc1);
1667 long l2 = convertObjectToLong(o2,tc2);
1672 public static object ModObj(object o1, object o2) {
1673 TypeCode tc1 = getTypeCode(o1);
1674 TypeCode tc2 = getTypeCode(o2);
1676 checkIfValidObjects(o1,o2,tc1,tc2);
1678 if (tc2 == TypeCode.Empty)
1679 throw new DivideByZeroException(
1680 /*Environment.GetResourceString(*/"Arg_DivideByZero"/*)*/);
1681 else if (tc1 == TypeCode.Empty)
1682 return createZero(tc2);
1683 else if (tc1 == TypeCode.String || tc2 == TypeCode.String)
1684 return getModDouble(o1,o2,tc1,tc2);
1685 else if (tc1 == TypeCode.Double || tc2 == TypeCode.Double)
1686 return getModDouble(o1,o2,tc1,tc2);
1687 else if (tc1 == TypeCode.Single || tc2 == TypeCode.Single)
1688 return getModSingle(o1,o2,tc1,tc2);
1689 else if (tc1 == TypeCode.Decimal || tc2 == TypeCode.Decimal)
1690 return getModDecimal(o1,o2,tc1,tc2);
1691 else if (tc1 == TypeCode.Int64 || tc2 == TypeCode.Int64)
1692 return getModInt64(o1,o2,tc1,tc2);
1693 else if (tc1 == TypeCode.Int32 || tc2 == TypeCode.Int32)
1694 return getModInt32(o1,o2,tc1,tc2);
1695 else if (tc1 == TypeCode.Int16 || tc2 == TypeCode.Int16)
1696 return getModInt16(o1,o2,tc1,tc2);
1697 else if (tc1 == TypeCode.Byte && tc2 == TypeCode.Byte)
1698 return getModByte(o1,o2,tc1,tc2);
1700 return getModInt16(o1,o2,tc1,tc2);
1705 private static int getVType2FromTypeCode(TypeCode typeCode) {
1706 return VType2FromTypeCode[(int)typeCode];
1709 private static object getModSingle(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1710 float sng1 = convertObjectToFloat(o1,tc1);
1711 float sng2 = convertObjectToFloat(o2,tc2);
1712 return (float)(sng1 % sng2);
1715 private static object getMulByte(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1716 byte b1 = convertObjectToByte(o1,tc1);
1717 byte b2 = convertObjectToByte(o2,tc2);
1719 if (i1 >= 0 && i1 <= 255)
1721 if (i1 >= -32768 && i1 <= 32767)
1726 private static object getMulDouble(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1727 double d1 = convertObjectToDouble(o1,tc1);
1728 double d2 = convertObjectToDouble(o2,tc2);
1729 return (double)(d1 * d2);
1732 private static object getMulInt16(object o1,object o2,TypeCode tc1,TypeCode tc2) {
1733 short s1 = convertObjectToShort(o1,tc1);
1734 short s2 = convertObjectToShort(o2,tc2);
1736 if (i1 >= -32768 && i1 <= 32767)
1741 private static object getMulInt32(object o1,object o2,TypeCode tc1,TypeCode tc2) {
1742 int i1 = convertObjectToInt(o1,tc1);
1743 int i2 = convertObjectToInt(o2,tc2);
1744 long l1 = (long) i1 * (long) i2;
1745 if (l1 >= 2147483648L && l1 <= 2147483647L)
1750 private static object getMulSingle(object o1, object o2 , TypeCode tc1,TypeCode tc2) {
1751 float f1 = convertObjectToFloat(o1,tc1);
1752 float f2 = convertObjectToFloat(o2,tc2);
1753 double d = (double) f1 * (double) f2;
1754 if (d <= 3.40282e+038 && d >= -3.40282e+038)
1756 if (double.IsInfinity(d)
1757 && float.IsInfinity(f1)
1758 || float.IsInfinity(f2))
1763 private static object getMulDecimal(object o1, object o2,TypeCode tc1,TypeCode tc2) {
1764 Decimal dec1 = convertObjectToDecimal(o1,tc1);
1765 Decimal dec2 = convertObjectToDecimal(o1,tc1);
1768 Decimal dec3 = Decimal.Multiply(dec1, dec2);
1771 catch (OverflowException exp) {
1772 exp.ToString();//dumb way to fix compiler warning about exp not used
1773 double d1 = Convert.ToDouble(dec1);
1774 double d2 = Convert.ToDouble(dec2);
1776 return (float)(d1 * d2);
1780 private static object getMulInt64(object o1,object o2 , TypeCode tc1,TypeCode tc2) {
1781 long l1 = convertObjectToLong(o1,tc1);
1782 long l2 = convertObjectToLong(o2,tc2);
1783 if (long.MaxValue / Math.Abs(l1) >= Math.Abs(l2))
1786 Decimal dec1 = new Decimal(l1);
1787 Decimal dec2 = new Decimal(l2);
1790 Decimal dec3 = Decimal.Multiply(dec1, dec2);
1793 catch (OverflowException exp) {
1794 exp.ToString();//dumb way to fix exp not used compiler warning
1795 double d1 = (double) l1 * (double) l2;
1801 private static object createZero(TypeCode tc) {
1803 case TypeCode.Boolean:
1807 case TypeCode.Int16:
1809 case TypeCode.Int32:
1811 case TypeCode.Int64:
1813 case TypeCode.Single:
1814 return (float)(0.0f);
1815 case TypeCode.Double:
1817 case TypeCode.Decimal:
1818 return Decimal.Zero;
1819 case TypeCode.String:
1826 public static object MulObj(object o1, object o2) {
1827 TypeCode tc1 = getTypeCode(o1);
1828 TypeCode tc2 = getTypeCode(o2);
1829 checkIfValidObjects(o1,o2,tc1,tc2);
1831 if (tc1 == TypeCode.Empty && tc2 == TypeCode.Empty)
1833 else if (tc1 == TypeCode.Empty)
1834 return createZero(tc2);
1835 else if (tc2 == TypeCode.Empty)
1836 return createZero(tc1);
1837 else if (tc1 == TypeCode.String || tc1 == TypeCode.String)
1838 return getMulDouble(o1,o2,tc1,tc2);
1839 else if (tc1 == TypeCode.Double || tc1 == TypeCode.Double)
1840 return getMulDouble(o1,o2,tc1,tc2);
1841 else if (tc1 == TypeCode.Single || tc1 == TypeCode.Single)
1842 return getMulSingle(o1,o2,tc1,tc2);
1843 else if (tc1 == TypeCode.Decimal || tc1 == TypeCode.Decimal)
1844 return getMulDecimal(o1,o2,tc1,tc2);
1845 else if (tc1 == TypeCode.Int64 || tc1 == TypeCode.Int64)
1846 return getMulInt64(o1,o2,tc1,tc2);
1847 else if (tc1 == TypeCode.Int32 || tc1 == TypeCode.Int32)
1848 return getMulInt32(o1,o2,tc1,tc2);
1849 else if (tc1 == TypeCode.Int16 || tc1 == TypeCode.Int16)
1850 return getMulInt16(o1,o2,tc1,tc2);
1851 else if (tc1 == TypeCode.Byte || tc1 == TypeCode.Byte)
1852 return getMulByte(o1,o2,tc1,tc2);
1854 return getMulInt16(o1,o2,tc1,tc2);
1858 public static object NegObj(object obj) {
1859 TypeCode tc = getTypeCode(obj);
1860 return negObj(obj, tc);
1863 public static object NotObj(object obj) {
1866 TypeCode tc = getTypeCode(obj);
1872 case TypeCode.Boolean :
1874 //new ClrBoolean(!((ClrBoolean)obj).ToBoolean(null));
1875 case TypeCode.Byte :
1876 type = obj.GetType();
1877 conv = (IConvertible)obj;
1878 byte byteVal = (byte) ~(conv.ToByte(null));
1880 return Enum.ToObject(type, byteVal);
1882 case TypeCode.Int16 :
1883 type = obj.GetType();
1884 conv = (IConvertible)obj;
1885 short shortVal = (short) ~(conv.ToInt16(null));
1887 return Enum.ToObject(type, shortVal);
1889 case TypeCode.Int32 :
1890 type = obj.GetType();
1891 conv = (IConvertible)obj;
1892 int intVal = ~(conv.ToInt32(null));
1894 return Enum.ToObject(type, intVal);
1896 case TypeCode.Int64 :
1897 type = obj.GetType();
1898 conv = (IConvertible)obj;
1899 long longVal = ~(conv.ToInt64(null));
1901 return Enum.ToObject(type, longVal);
1903 case TypeCode.Single :
1904 val = LongType.FromObject(obj);
1906 case TypeCode.Double :
1907 val = LongType.FromObject(obj);
1909 case TypeCode.Decimal :
1910 val = LongType.FromObject(obj);
1912 case TypeCode.String :
1913 val = LongType.FromObject(obj);
1917 throw new InvalidCastException(
1918 Utils.GetResourceString(
1919 "NoValidOperator_OneOperand",
1920 Utils.VBFriendlyName(obj)));
1923 private static object createZeroForCompare(TypeCode tc) {
1925 case TypeCode.Boolean:
1931 case TypeCode.Int16:
1933 case TypeCode.Int32:
1935 case TypeCode.Int64:
1937 case TypeCode.Single:
1939 case TypeCode.Double:
1941 case TypeCode.Decimal:
1942 return Decimal.Zero;
1943 case TypeCode.DateTime:
1945 case TypeCode.String:
1952 public static int ObjTst(object o1, object o2, bool textCompare) {
1953 TypeCode tc1 = getTypeCode(o1);
1954 TypeCode tc2 = getTypeCode(o2);
1955 IComparable icomp1 = (IComparable)o1;
1956 IComparable icomp2 = (IComparable)o2;
1958 if (tc1 == TypeCode.Empty && tc2 == TypeCode.Empty)
1960 else if (tc1 == TypeCode.Empty)
1961 return icomp2.CompareTo(createZeroForCompare(tc2));
1962 else if (tc2 == TypeCode.Empty)
1963 return icomp1.CompareTo(createZeroForCompare(tc1));
1964 else if (tc1 == TypeCode.DateTime || tc2 == TypeCode.DateTime)
1965 return getObjTstDateTime(o1,o2,tc1,tc2);
1966 else if (tc1 == TypeCode.Char && tc2 == TypeCode.Char)
1967 return getObjTstChar(o1,o2,tc1,tc2);
1968 else if ((tc1 == TypeCode.Boolean && tc2 == TypeCode.String)||
1969 (tc2 == TypeCode.Boolean && tc1 == TypeCode.String) )
1970 return getObjTstBoolean(o1,o2,tc1,tc2);
1971 else if (tc1 == TypeCode.Double || tc2 == TypeCode.Double)
1972 return getObjTstDouble(o1,o2,tc1,tc2);
1973 else if (tc1 == TypeCode.Single || tc2 == TypeCode.Single)
1974 return getObjTstSingle(o1,o2,tc1,tc2);
1975 else if (tc1 == TypeCode.Decimal || tc2 == TypeCode.Decimal)
1976 return getObjTstDecimal(o1,o2,tc1,tc2);
1977 else if (tc1 == TypeCode.Int64 || tc2 == TypeCode.Int64)
1978 return getObjTstInt64(o1,o2,tc1,tc2);
1979 else if (tc1 == TypeCode.Int32 || tc2 == TypeCode.Int32)
1980 return getObjTstInt32(o1,o2,tc1,tc2);
1981 else if (tc1 == TypeCode.Int16 || tc2 == TypeCode.Int16)
1982 return getObjTstInt16(o1,o2,tc1,tc2);
1983 else if (tc1 == TypeCode.Byte && tc2 == TypeCode.Byte)
1984 return getObjTstByte(o1,o2,tc1,tc2);
1985 else if (tc1 == TypeCode.String || tc2 == TypeCode.String)
1986 return getObjTstString(o1,o2,tc1,tc2);
1988 return getObjTstInt16(o1,o2,tc1,tc2);
1991 private static int getObjTstString(object o1,object o2,TypeCode tc1,TypeCode tc2) {
1992 string s1 = (tc1 == TypeCode.String)?(string)o1:o1.ToString();
1993 string s2 = (tc2 == TypeCode.String)?(string)o2:o2.ToString();
1994 return s1.CompareTo(s2);
1997 private static int getObjTstBoolean(object o1,object o2,TypeCode tc1,TypeCode tc2) {
1998 IConvertible iconv1 = (IConvertible)o1;
1999 IConvertible iconv2 = (IConvertible)o2;
2000 bool b1 = iconv1.ToBoolean(null);
2001 bool b2 = iconv2.ToBoolean(null);
2009 private static int getObjTstByte(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2010 byte by1 = convertObjectToByte(o1,tc1);
2011 byte by2 = convertObjectToByte(o2,tc2);
2019 private static int getObjTstChar(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2020 char ch1 = convertObjectToChar(o1,tc1);
2021 char ch2 = convertObjectToChar(o2,tc2);
2029 private static int getObjTstDateTime(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2030 DateTime var1 = convertObjectToDateTime(o1,tc1);
2031 DateTime var2 = convertObjectToDateTime(o2,tc2);
2032 long time1 = Convert.ToInt32(var1);//Java code var1.getCalendar().getTime().getTime();
2033 long time2 = Convert.ToInt32(var2);//Java code var2.getCalendar().getTime().getTime();
2041 private static int getObjTstDecimal(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2042 Decimal dec1 = convertObjectToDecimal(o1,tc1);
2043 Decimal dec2 = convertObjectToDecimal(o2,tc2);
2044 int res = Decimal.Compare(dec1, dec2);
2052 private static int getObjTstDouble(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2053 double d1 = convertObjectToDouble(o1,tc1);
2054 double d2 = convertObjectToDouble(o2,tc2);
2062 private static int getObjTstInt16(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2063 short s1 = convertObjectToShort(o1,tc1);
2064 short s2 = convertObjectToShort(o2,tc2);
2072 private static int getObjTstInt32(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2073 int i1 = convertObjectToInt(o1,tc1);
2074 int i2 = convertObjectToInt(o2,tc2);
2082 private static int getObjTstInt64(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2083 long l1 = convertObjectToLong(o1,tc1);
2084 long l2 = convertObjectToLong(o1,tc1);
2092 private static int getObjTstSingle(object o1,object o2,TypeCode tc1,TypeCode tc2) {
2093 float f1 = convertObjectToFloat(o1,tc1);
2094 float f2 = convertObjectToFloat(o2,tc2);
2102 public static object PlusObj(object obj) {
2103 TypeCode tc = getTypeCode(obj);
2104 if (tc == TypeCode.Empty)
2106 else if (tc == TypeCode.Boolean) {
2107 IConvertible conv = (IConvertible)obj;
2108 //java return new short((short) conv.ToInt16(null));
2109 return (short)conv.ToInt16(null);//cast to short probably not needed.
2111 else if (tc == TypeCode.String)
2112 return DoubleType.FromObject(obj);
2113 else if (tc == TypeCode.Byte || tc == TypeCode.Int16
2114 || tc == TypeCode.Int32 || tc == TypeCode.Int64
2115 || tc == TypeCode.Single || tc == TypeCode.Double
2116 || tc == TypeCode.Decimal)
2119 throw new InvalidCastException(
2120 Utils.GetResourceString(
2121 "NoValidOperator_OneOperand",
2122 Utils.VBFriendlyName(obj)));
2125 public static object PowObj(object obj1, object obj2) {
2126 if (obj1 == null || obj2 == null)
2128 TypeCode tc1 = getTypeCode(obj1);
2129 TypeCode tc2 = getTypeCode(obj2);
2130 TypeCode widestType = GetWidestType(tc1,tc2);
2132 if (widestType == TypeCode.Byte || widestType == TypeCode.Boolean
2133 || widestType == TypeCode.Int16 || widestType == TypeCode.Int32
2134 || widestType == TypeCode.Int64 || widestType == TypeCode.Single
2135 || widestType == TypeCode.Double || widestType == TypeCode.Decimal
2136 || widestType == TypeCode.String)
2137 return (double)Math.Pow(DoubleType.FromObject(obj1),DoubleType.FromObject(obj2));
2138 //return new ClrDouble(
2139 // java.lang.Math.pow(
2140 // DoubleType.FromObject(obj1),
2141 // DoubleType.FromObject(obj2)));
2143 throw new InvalidCastException(
2144 Utils.GetResourceString(
2145 "NoValidOperator_OneOperand",
2146 Utils.VBFriendlyName(obj1)));
2150 public static object StrCatObj(object vLeft, object vRight) {
2151 if (vLeft is DBNull && vRight is DBNull)
2152 return DBNull.Value;
2153 return StringType.FromObject(vLeft) + StringType.FromObject(vRight);
2156 private static object getSubByte(object o1, object o2 , TypeCode tc1,TypeCode tc2) {
2157 byte byte1 = convertObjectToByte(o1,tc1);
2158 byte byte2 = convertObjectToByte(o2,tc2);
2159 short s = (short) (byte1 - byte2);
2160 if (s >= 0 && s <= 255)
2165 private static object getSubDecimal(object o1, object o2,TypeCode tc1,TypeCode tc2) {
2166 Decimal dec1 = convertObjectToDecimal(o1,tc1);
2167 Decimal dec2 = convertObjectToDecimal(o2,tc2);
2169 Decimal dec3 = Decimal.Subtract(dec1, dec2);
2172 catch (OverflowException exp) {
2173 exp.ToString();//dumb way to fix compiler warning about exp not used
2175 double d1 = Decimal.ToDouble(dec1);
2176 double d2 = Decimal.ToDouble(dec2);
2178 return (double)(d1 * d2);
2182 private static object getSubInt16(object o1, object o2,TypeCode tc1,TypeCode tc2) {
2183 short s1 = convertObjectToShort(o1,tc1);
2184 short s2 = convertObjectToShort(o2,tc2);
2186 if (res >= -32768 && res <= 32767)
2191 private static object getSubInt32(object o1, object o2,TypeCode tc1,TypeCode tc2) {
2192 int i1 = convertObjectToInt(o1,tc1);
2193 int i2 = convertObjectToInt(o2,tc2);
2194 long res = (long) i1 - (long) i2;
2195 if (res >= 2147483648L && res <= 2147483647L)
2200 private static object getSubInt64(object o1, object o2,TypeCode tc1,TypeCode tc2) {
2201 long l1 = convertObjectToLong(o1,tc1);
2202 long l2 = convertObjectToLong(o2,tc2);
2204 //Java code if (Long.MAX_VALUE - java.lang.Math.abs(l1) <= java.lang.Math.abs(l2))
2205 if (long.MaxValue - Math.Abs(l1) <= Math.Abs(l2))
2208 Decimal dec1 = new Decimal(l1);
2209 Decimal dec2 = new Decimal(l2);
2211 Decimal dec3 = Decimal.Subtract(dec1, dec2);
2215 private static object getSubSingle(object o1, object o2 ,TypeCode tc1 ,TypeCode tc2) {
2216 float d1 = convertObjectToFloat(o1,tc1);
2217 float d2 = convertObjectToFloat(o2,tc2);
2218 double res = (double) d1 - (double) d2;
2219 if (res <= 3.40282e+038 && res >= -3.40282e+038)
2221 if (double.IsInfinity(res)
2222 && float.IsInfinity(d1)
2223 || float.IsInfinity(d2))
2228 private static DateTime convertObjectToDateTime(object o1, TypeCode tc1) {
2229 DateTime dateTime = new DateTime(0);//java code null
2232 dateTime = DateType.FromString((string) o1);
2233 else if (o1 is IConvertible) {
2234 dateTime = ((IConvertible) o1).ToDateTime(null);
2240 private static char convertObjectToChar(object o1 , TypeCode tc1) {
2241 char char1 = (char)0;
2244 char1 = CharType.FromString((string)o1);
2245 else if (o1 is IConvertible) {
2246 if (tc1 == TypeCode.Boolean) {
2247 char1 = (char)toVBBool((IConvertible)o1);
2250 char1 = (char)((IConvertible)o1).ToChar(null);
2256 private static byte convertObjectToByte(object o1 , TypeCode tc1) {
2260 byte1 = (byte)ByteType.FromString((string)o1);
2261 else if (o1 is IConvertible) {
2262 if (tc1 == TypeCode.Boolean) {
2263 byte1 = (byte)toVBBool((IConvertible)o1);
2266 byte1 = (byte)((IConvertible)o1).ToByte(null);
2272 private static short convertObjectToShort(object o1 , TypeCode tc1) {
2276 s1 = ShortType.FromString((string)o1);
2277 else if (o1 is IConvertible) {
2278 if (tc1 == TypeCode.Boolean) {
2279 s1 = (short)toVBBool((IConvertible)o1);
2282 s1 = ((IConvertible)o1).ToInt16(null);
2288 private static int convertObjectToInt(object o1 , TypeCode tc1) {
2292 i1 = IntegerType.FromString((string)o1);
2293 else if (o1 is IConvertible) {
2294 if (tc1 == TypeCode.Boolean) {
2295 i1 = (int)toVBBool((IConvertible)o1);
2298 i1 = ((IConvertible)o1).ToInt32(null);
2304 private static Decimal convertObjectToDecimal(object o1 , TypeCode tc1) {
2305 Decimal dec1 = 0;//java code null;
2308 dec1 = DecimalType.FromString((string)o1);
2309 else if (o1 is IConvertible) {
2310 if (tc1 == TypeCode.Boolean) {
2311 dec1 = toVBBoolConv((IConvertible)o1).ToDecimal(null);
2314 dec1 = ((IConvertible)o1).ToDecimal(null);
2320 private static long convertObjectToLong(object o1 , TypeCode tc1) {
2324 l1 = LongType.FromString((string)o1);
2325 else if (o1 is IConvertible) {
2326 if (tc1 == TypeCode.Boolean) {
2327 l1 = (long)toVBBool((IConvertible)o1);
2330 l1 = ((IConvertible)o1).ToInt64(null);
2336 private static float convertObjectToFloat(object o1 , TypeCode tc1) {
2340 d1 = SingleType.FromString((string)o1);
2341 else if (o1 is IConvertible) {
2342 if (tc1 == TypeCode.Boolean) {
2343 d1 = (float)toVBBool((IConvertible)o1);
2346 d1 = ((IConvertible)o1).ToSingle(null);
2352 private static double convertObjectToDouble(object o1 , TypeCode tc1) {
2356 d1 = DoubleType.FromString((string)o1);
2357 else if (o1 is IConvertible) {
2358 if (tc1 == TypeCode.Boolean) {
2359 d1 = (double) toVBBool((IConvertible)o1);
2362 d1 = ((IConvertible)o1).ToDouble(null);
2368 private static object getSubDouble(object s1, object s2,TypeCode tc1,TypeCode tc2) {
2369 double d1 = convertObjectToDouble(s1,tc1);
2370 double d2 = convertObjectToDouble(s2,tc2);
2375 public static object SubObj(object o1, object o2) {
2376 TypeCode tc1 = getTypeCode(o1);
2377 TypeCode tc2 = getTypeCode(o2);
2378 checkIfValidObjects(o1,o2,tc1,tc2);
2380 if (tc1 == TypeCode.Empty && tc2 == TypeCode.Empty)
2382 else if (tc2 == TypeCode.Empty)
2384 else if (tc1 == TypeCode.Empty)
2385 return negObj(o2, tc2);
2386 else if (tc1 == TypeCode.Double || tc2 == TypeCode.Double)
2387 return getSubDouble(o1,o2,tc1,tc2);
2388 else if (tc1 == TypeCode.String || tc2 == TypeCode.String)
2389 return getSubDouble(o1,o2,tc1,tc2);
2390 else if (tc1 == TypeCode.Single || tc2 == TypeCode.Single)
2391 return getSubSingle(o1,o2,tc1,tc2);
2392 else if (tc1 == TypeCode.Decimal || tc2 == TypeCode.Decimal)
2393 return getSubDecimal(o1,o2,tc1,tc2);
2394 else if (tc1 == TypeCode.Int64 || tc2 == TypeCode.Int64)
2395 return getSubInt64(o1,o2,tc1,tc2);
2396 else if (tc1 == TypeCode.Int32 || tc2 == TypeCode.Int32)
2397 return getSubInt32(o1,o2,tc1,tc2);
2398 else if (tc1 == TypeCode.Int16 || tc2 == TypeCode.Int16)
2399 return getSubInt16(o1,o2,tc1,tc2);
2400 else if (tc1 == TypeCode.Byte && tc2 == TypeCode.Byte)
2401 return getSubByte(o1,o2,tc1,tc2);
2403 return getSubInt16(o1,o2,tc1,tc2);
2408 private static void throwNoValidOperator(object obj1, object obj2) {
2409 string obj1MsgStr = "'Nothing'";
2410 string obj2MsgStr = "'Nothing'";
2411 string obj1Name = Utils.VBFriendlyName(obj1);
2412 string obj2Name = Utils.VBFriendlyName(obj2);
2415 Utils.GetResourceString(
2416 "NoValidOperator_StringType1",
2418 else if (obj1 != null)
2420 Utils.GetResourceString(
2421 "NoValidOperator_NonStringType1",
2425 Utils.GetResourceString(
2426 "NoValidOperator_StringType1",
2428 else if (obj2 != null)
2430 Utils.GetResourceString(
2431 "NoValidOperator_NonStringType1",
2434 throw new InvalidCastException(
2435 Utils.GetResourceString(
2436 "NoValidOperator_TwoOperands",
2441 public static object ShiftLeftObj (object o1, int amount) {
2442 IConvertible convertible1 = (IConvertible)o1;
2443 TypeCode tc = getTypeCode(o1);
2445 if (tc == TypeCode.Empty)
2447 else if (tc == TypeCode.Boolean)
2448 return (short) ((((short) - convertible1.ToInt16(null))
2450 else if (tc == TypeCode.Byte)
2451 return (byte) ((convertible1.ToByte(null) << (amount & 7)));
2452 else if (tc == TypeCode.Int16)
2453 return (short) ((convertible1.ToInt16(null) << (amount & 15)));
2454 else if (tc == TypeCode.Int32)
2455 return (int)convertible1.ToInt32(null) << (amount & 31);
2457 tc == TypeCode.Int64
2458 || tc == TypeCode.Single
2459 || tc == TypeCode.Double
2460 || tc == TypeCode.Decimal)
2461 return (Int64)(convertible1.ToInt64(null) << (amount & 63));
2462 else if (tc == TypeCode.String)
2463 return (long)((LongType.FromString(convertible1.ToString(null))
2466 throw new InvalidCastException(
2467 Utils.GetResourceString(
2468 "NoValidOperator_OneOperand",
2469 Utils.VBFriendlyName(o1)));
2472 public static object ShiftRightObj (object o1, int amount) {
2473 IConvertible convertible1 = (IConvertible)o1;
2474 TypeCode tc = getTypeCode(o1);
2476 if (tc == TypeCode.Empty)
2478 else if (tc == TypeCode.Boolean)
2479 return (short) ((((short) - convertible1.ToInt16(null))
2481 else if (tc == TypeCode.Byte)
2482 return (byte) ((convertible1.ToByte(null) >> (amount & 7)));
2483 else if (tc == TypeCode.Int16)
2484 return (short) ((convertible1.ToInt16(null) >> (amount & 15)));
2485 else if (tc == TypeCode.Int32)
2486 return (int)convertible1.ToInt32(null) >> (amount & 31);
2488 tc == TypeCode.Int64
2489 || tc == TypeCode.Single
2490 || tc == TypeCode.Double
2491 || tc == TypeCode.Decimal)
2492 return (long)(convertible1.ToInt64(null) >> (amount & 63));
2493 else if (tc == TypeCode.String)
2494 return (long)(LongType.FromString(convertible1.ToString(null)) >> (amount & 63));
2496 throw new InvalidCastException(
2497 Utils.GetResourceString(
2498 "NoValidOperator_OneOperand",
2499 Utils.VBFriendlyName(o1)));
2503 internal static Type TypeFromTypeCode(TypeCode vartype) {
2504 return TypeFromTypeCode((int)vartype);
2507 internal static Type TypeFromTypeCode(int vartype) {
2508 return tblTypeFromTypeCode[vartype];
2511 public static object XorObj(object obj1, object obj2) {
2512 if (obj1 == null && obj2 == null)
2514 TypeCode tc1 = getTypeCode(obj1);
2515 TypeCode tc2 = getTypeCode(obj2);
2516 TypeCode widestType = GetWidestType(tc1, tc2);
2517 if (widestType == TypeCode.Boolean || widestType == TypeCode.Byte
2518 || widestType == TypeCode.Int16 || widestType == TypeCode.Int32
2519 || widestType == TypeCode.Int64 || widestType == TypeCode.Single
2520 || widestType == TypeCode.Double || widestType == TypeCode.Decimal
2521 || widestType == TypeCode.String) {
2522 bool b1 = BooleanType.FromObject(obj1);
2523 bool b2 = BooleanType.FromObject(obj2);
2524 return (bool)(b1 ^ b2);
2527 throw new InvalidCastException(
2528 Utils.GetResourceString(
2529 "NoValidOperator_TwoOperands",
2530 Utils.VBFriendlyName(obj1),
2531 Utils.VBFriendlyName(obj2)));
2534 // static class VType extends Enum implements IClrInt
2536 // public int value__;
2538 // public static final int t_bad = 0;
2539 // public static final VType _t_bad = new VType(0);
2541 // public static final int t_bool = 1;
2542 // public static final VType _t_bool = new VType(1);
2544 // public static final int t_ui1 = 2;
2545 // public static final VType _t_ui1 = new VType(2);
2547 // public static final int t_i2 = 3;
2548 // public static final VType _t_i2 = new VType(3);
2550 // public static final int t_i4 = 4;
2551 // public static final VType _t_i4 = new VType(4);
2553 // public static final int t_i8 = 5;
2554 // public static final VType _t_i8 = new VType(5);
2556 // public static final int t_dec = 6;
2557 // public static final VType _t_dec = new VType(6);
2559 // public static final int t_r4 = 7;
2560 // public static final VType _t_r4 = new VType(7);
2562 // public static final int t_r8 = 8;
2563 // public static final VType _t_r8 = new VType(8);
2565 // public static final int t_char = 9;
2566 // public static final VType _t_char = new VType(9);
2568 // public static final int t_str = 10;
2569 // public static final VType _t_str = new VType(10);
2571 // public static final int t_date = 11;
2572 // public static final VType _t_date = new VType(11);
2577 // private VType(int value)
2582 // public void __ZeroInit__()
2587 // public void __RealCtor__()
2592 // public VType __Clone__()
2594 // return new VType(value__);
2598 // public int getValue()
2603 // public void setValue(int value)
2608 // public static VType getEnumForValue(int value)
2612 // case t_bad: return _t_bad;
2613 // case t_bool: return _t_bool;
2614 // case t_ui1: return _t_ui1;
2615 // case t_i2: return _t_i2;
2616 // case t_i4: return _t_i4;
2617 // case t_i8: return _t_i8;
2618 // case t_dec: return _t_dec;
2619 // case t_r4: return _t_r4;
2620 // case t_r8: return _t_r8;
2621 // case t_char: return _t_char;
2622 // case t_str: return _t_str;
2623 // case t_date: return _t_date;
2626 // throw new IllegalArgumentException("The value " + value + " is not" +
2627 // " valid for enumeration VType");
2630 // protected object GetValue()
2632 // return new system.ClrInt32(getValue());
2636 // static class VType2 extends Enum implements IClrInt
2638 // public int value__;
2640 // public static final int t_bad = 0;
2641 // public static final VType2 _t_bad = new VType2(0);
2643 // public static final int t_bool = 1;
2644 // public static final VType2 _t_bool = new VType2(1);
2646 // public static final int t_ui1 = 2;
2647 // public static final VType2 _t_ui1 = new VType2(2);
2649 // public static final int t_char = 3;
2650 // public static final VType2 _t_char = new VType2(3);
2652 // public static final int t_i2 = 4;
2653 // public static final VType2 _t_i2 = new VType2(4);
2655 // public static final int t_i4 = 5;
2656 // public static final VType2 _t_i4 = new VType2(5);
2658 // public static final int t_i8 = 6;
2659 // public static final VType2 _t_i8 = new VType2(6);
2661 // public static final int t_r4 = 7;
2662 // public static final VType2 _t_r4 = new VType2(7);
2664 // public static final int t_r8 = 8;
2665 // public static final VType2 _t_r8 = new VType2(8);
2667 // public static final int t_date = 9;
2668 // public static final VType2 _t_date = new VType2(9);
2670 // public static final int t_dec = 10;
2671 // public static final VType2 _t_dec = new VType2(10);
2673 // public static final int t_ref = 11;
2674 // public static final VType2 _t_ref = new VType2(11);
2676 // public static final int t_str = 12;
2677 // public static final VType2 _t_str = new VType2(12);
2682 // private VType2(int value)
2687 // public void __ZeroInit__()
2692 // public void __RealCtor__()
2697 // public VType2 __Clone__()
2699 // return new VType2(value__);
2703 // public int getValue()
2708 // public void setValue(int value)
2713 // public static VType2 getEnumForValue(int value)
2717 // case t_bad: return _t_bad;
2718 // case t_bool: return _t_bool;
2719 // case t_ui1: return _t_ui1;
2720 // case t_char: return _t_char;
2721 // case t_i2: return _t_i2;
2722 // case t_i4: return _t_i4;
2723 // case t_i8: return _t_i8;
2724 // case t_r4: return _t_r4;
2725 // case t_r8: return _t_r8;
2726 // case t_date: return _t_date;
2727 // case t_dec: return _t_dec;
2728 // case t_ref: return _t_ref;
2729 // case t_str: return _t_str;
2732 // throw new IllegalArgumentException("The value " + value + " is not" +
2733 // " valid for enumeration VType2");
2736 // protected object GetValue()
2738 // return new system.ClrInt32(getValue());
2742 // static class CC extends Enum implements IClrInt
2744 // public int value__;
2746 // public static final int Err = 0;
2747 // public static final CC _Err = new CC(0);
2749 // public static final int Same = 1;
2750 // public static final CC _Same = new CC(1);
2752 // public static final int Narr = 2;
2753 // public static final CC _Narr = new CC(2);
2755 // public static final int Wide = 3;
2756 // public static final CC _Wide = new CC(3);
2761 // private CC(int value)
2766 // public void __ZeroInit__()
2771 // public void __RealCtor__()
2776 // public CC __Clone__()
2778 // return new CC(value__);
2781 // public int getValue()
2786 // public void setValue(int value)
2791 // public static CC getEnumForValue(int value)
2795 // case Err: return _Err;
2796 // case Same: return _Same;
2797 // case Narr: return _Narr;
2798 // case Wide: return _Wide;
2801 // throw new IllegalArgumentException("The value " + value + " is not" +
2802 // " valid for enumeration CC");
2805 // protected object GetValue()
2807 // return new system.ClrInt32(getValue());