blob: 6a6227cee5245b3f1bf633aa6fad4d30ced6694b [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian Carlstrom9f30b382011-08-28 22:41:38 -070016
Ian Rogersdd7bf562013-01-11 18:02:45 -080017class Main extends IntMathBase {
Brian Carlstrom9f30b382011-08-28 22:41:38 -070018
19 public static boolean mBoolean1, mBoolean2;
20 public static byte mByte1, mByte2;
21 public static char mChar1, mChar2;
22 public static short mShort1, mShort2;
23 public static int mInt1, mInt2;
24 public static float mFloat1, mFloat2;
25 public static long mLong1, mLong2;
26 public static double mDouble1, mDouble2;
27 public static volatile long mVolatileLong1, mVolatileLong2;
28
29
30 private int foo_;
31
Ian Rogersdd7bf562013-01-11 18:02:45 -080032 public Main(int stuff) {
buzbee4a3164f2011-09-03 11:25:10 -070033 super();
Brian Carlstrom9f30b382011-08-28 22:41:38 -070034 foo_ = stuff;
35 }
36
Ian Rogersdd7bf562013-01-11 18:02:45 -080037 public Main() {
buzbee4a3164f2011-09-03 11:25:10 -070038 super();
Brian Carlstrom9f30b382011-08-28 22:41:38 -070039 foo_ = 123;
40 }
41
buzbeef0cde542011-09-13 14:55:02 -070042 /* Regression test: triggered an SSA renaming bug. */
43 static long divideLongByBillion(long a) {
44 long quot;
45 long rem;
46
47 if (a >= 0) {
48 long bLong = 1000000000L;
49 quot = (a / bLong);
50 rem = (a % bLong);
51 } else {
52 /*
53 * Make the dividend positive shifting it right by 1 bit then get
54 * the quotient an remainder and correct them properly
55 */
56 long aPos = a >>> 1;
57 long bPos = 1000000000L >>> 1;
58 quot = aPos / bPos;
59 rem = aPos % bPos;
60 // double the remainder and add 1 if 'a' is odd
61 rem = (rem << 1) + (a & 1);
62 }
63 return ((rem << 32) | (quot & 0xFFFFFFFFL));
64 }
65
66
buzbee2a475e72011-09-07 17:19:17 -070067 static int instanceTest(int x) {
68 IntMathBase a = new IntMathBase();
Ian Rogersdd7bf562013-01-11 18:02:45 -080069 Main b = new Main();
buzbee2a475e72011-09-07 17:19:17 -070070
Brian Carlstrom5d40f182011-09-26 22:29:18 -070071 if (!(null instanceof IntMathBase)) {
72 x = x + 42;
73 }
74
buzbee2a475e72011-09-07 17:19:17 -070075 if (a instanceof IntMathBase) {
76 x = x * 2;
77 }
78
Ian Rogersdd7bf562013-01-11 18:02:45 -080079 if (a instanceof Main) {
buzbee2a475e72011-09-07 17:19:17 -070080 x = x + 13;
81 }
82
83 if (b instanceof IntMathBase) {
84 x = x -1;
85 }
86
Ian Rogersdd7bf562013-01-11 18:02:45 -080087 if (b instanceof Main) {
buzbee2a475e72011-09-07 17:19:17 -070088 x = x + 1333;
89 }
90 return x;
91 }
92
buzbee4a3164f2011-09-03 11:25:10 -070093 int tryThing() {
94 int val = super.tryThing();
95 return val + 10;
96 }
97
98 static int superTest(int x) {
Ian Rogersdd7bf562013-01-11 18:02:45 -080099 Main instance = new Main();
100 Main base = instance;
buzbee4a3164f2011-09-03 11:25:10 -0700101 int val1 = instance.tryThing();
102 int val2 = base.tryThing();
103 return val1 + val2 + x;
104 }
105
buzbee561227c2011-09-02 15:28:19 -0700106 static int constClassTest(int x) {
107 Class c = String.class;
108 if (c != null) {
109 return x * 2;
110 } else {
111 return x;
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700112 }
buzbee561227c2011-09-02 15:28:19 -0700113 }
114
buzbee1b4c8592011-08-31 10:43:51 -0700115 static int constStringTest(int x) {
buzbee1b4c8592011-08-31 10:43:51 -0700116 String str = "Hello World!";
buzbee2a475e72011-09-07 17:19:17 -0700117 return x + str.length();
buzbee1b4c8592011-08-31 10:43:51 -0700118 }
119
120 static void throwNullPointerException() {
121 throw new NullPointerException();
122 }
123
Ian Rogers93dd9662011-09-17 23:21:22 -0700124 static void throwImplicitNullPointerException() {
125 throw null;
126 }
127
buzbee1b4c8592011-08-31 10:43:51 -0700128 static int catchBlock(int x) {
129 try {
Ian Rogers93dd9662011-09-17 23:21:22 -0700130 if (x == 1000) {
131 x += 123;
132 throwNullPointerException();
133 } else {
134 x += 321;
135 throwImplicitNullPointerException();
136 }
buzbee1b4c8592011-08-31 10:43:51 -0700137 } catch (NullPointerException npe) {
138 x += 456;
139 }
140 return x;
141 }
142
buzbeee9a72f62011-09-04 17:59:07 -0700143 static int catchBlockNoThrow(int x) {
144 try {
145 x += 123;
146 } catch (NullPointerException npe) {
147 x += 456;
148 }
149 return x;
150 }
151
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700152 static int staticFieldTest(int x) {
153 mBoolean1 = true;
154 mBoolean2 = false;
155 mByte1 = 127;
156 mByte2 = -128;
157 mChar1 = 32767;
158 mChar2 = 65535;
159 mShort1 = 32767;
160 mShort2 = -32768;
161 mInt1 = 65537;
162 mInt2 = -65537;
163 mFloat1 = 3.1415f;
164 mFloat2 = -1.0f / 0.0f; // -inf
165 mLong1 = 1234605616436508552L; // 0x1122334455667788
166 mLong2 = -1234605616436508552L;
167 mDouble1 = 3.1415926535;
168 mDouble2 = 1.0 / 0.0; // +inf
169 mVolatileLong1 = mLong1 - 1;
170 mVolatileLong2 = mLong2 + 1;
171
172 if (!mBoolean1) { return 10; }
173 if (mBoolean2) { return 11; }
174 if (mByte1 != 127) { return 12; }
175 if (mByte2 != -128) { return 13; }
176 if (mChar1 != 32767) { return 14; }
177 if (mChar2 != 65535) { return 15; }
178 if (mShort1 != 32767) { return 16; }
179 if (mShort2 != -32768) { return 17; }
180 if (mInt1 != 65537) { return 18; }
181 if (mInt2 != -65537) { return 19; }
182 if (!(mFloat1 > 3.141f && mFloat1 < 3.142f)) { return 20; }
183 if (mFloat2 >= mFloat1) { return 21; }
184 if (mLong1 != 1234605616436508552L) { return 22; }
185 if (mLong2 != -1234605616436508552L) { return 23; }
186 if (!(mDouble1 > 3.141592653 && mDouble1 < 3.141592654)) { return 24; }
187 if (mDouble2 <= mDouble1) { return 25; }
188 if (mVolatileLong1 != 1234605616436508551L) { return 26; }
189 if (mVolatileLong2 != -1234605616436508551L) { return 27; }
190
191 return 1000 + x;
192 }
193
194 /*
195 * Try to cause some unary operations.
196 */
197 static int unopTest(int x) {
198 x = -x;
199 x ^= 0xffffffff;
200 return x;
201 }
202
203 static int shiftTest1() {
204 final int[] mBytes = {
205 0x11, 0x22, 0x33, 0x44, 0x88, 0x99, 0xaa, 0xbb
206 };
207 long l;
208 int i1, i2;
209
210 if (mBytes[0] != 0x11) return 20;
211 if (mBytes[1] != 0x22) return 21;
212 if (mBytes[2] != 0x33) return 22;
213 if (mBytes[3] != 0x44) return 23;
214 if (mBytes[4] != 0x88) return 24;
215 if (mBytes[5] != 0x99) return 25;
216 if (mBytes[6] != 0xaa) return 26;
217 if (mBytes[7] != 0xbb) return 27;
218
219 i1 = mBytes[0] | mBytes[1] << 8 | mBytes[2] << 16 | mBytes[3] << 24;
220 i2 = mBytes[4] | mBytes[5] << 8 | mBytes[6] << 16 | mBytes[7] << 24;
221 l = i1 | ((long)i2 << 32);
222
223 if (i1 != 0x44332211) { return 0x80000000 | i1; }
224 if (i2 != 0xbbaa9988) { return 2; }
225 if (l != 0xbbaa998844332211L) { return 3; }
226
227 l = (long)mBytes[0]
228 | (long)mBytes[1] << 8
229 | (long)mBytes[2] << 16
230 | (long)mBytes[3] << 24
231 | (long)mBytes[4] << 32
232 | (long)mBytes[5] << 40
233 | (long)mBytes[6] << 48
234 | (long)mBytes[7] << 56;
235
236 if (l != 0xbbaa998844332211L) { return 4; }
237 return 0;
238 }
239
240 static int shiftTest2() {
241
242 long a = 0x11;
243 long b = 0x22;
244 long c = 0x33;
245 long d = 0x44;
246 long e = 0x55;
247 long f = 0x66;
248 long g = 0x77;
249 long h = 0x88;
250
251 long result = ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
252 (e << 24) | (f << 16) | (g << 8) | h);
253
254 if (result != 0x1122334455667788L) { return 1; }
255 return 0;
256 }
257
258 static int unsignedShiftTest() {
259 byte b = -4;
260 short s = -4;
261 char c = 0xfffc;
262 int i = -4;
263
264 b >>>= 4;
265 s >>>= 4;
266 c >>>= 4;
267 i >>>= 4;
268
269 if ((int) b != -1) { return 1; }
270 if ((int) s != -1) { return 2; }
271 if ((int) c != 0x0fff) { return 3; }
272 if (i != 268435455) { return 4; }
273 return 0;
274 }
275
276 static int convTest() {
277
278 float f;
279 double d;
280 int i;
281 long l;
282
283 /* int --> long */
284 i = 7654;
285 l = (long) i;
286 if (l != 7654L) { return 1; }
287
288 i = -7654;
289 l = (long) i;
290 if (l != -7654L) { return 2; }
291
292 /* long --> int (with truncation) */
293 l = 5678956789L;
294 i = (int) l;
295 if (i != 1383989493) { return 3; }
296
297 l = -5678956789L;
298 i = (int) l;
299 if (i != -1383989493) { return 4; }
Ian Rogersef6a7762013-12-19 17:58:05 -0800300
301 /* long --> double */
302 l = 0x7FFFFFFFL;
303 d = (double) l;
304 if (Double.doubleToRawLongBits(d) != 0x41dfffffffc00000L) { return 5; }
305
306 l = 0xFFFFFFFFL;
307 d = (double) l;
308 if (Double.doubleToRawLongBits(d) != 0x41efffffffe00000L) { return 6; }
309
310 l = 0x7FFFFFFFFFFFFFFFL;
311 d = (double) l;
312 if (Double.doubleToRawLongBits(d) != 0x43e0000000000000L) { return 7; }
313
314 l = 0xFFFFFFFFFFFFFFFFL;
315 d = (double) l;
316 if (Double.doubleToRawLongBits(d) != 0xbff0000000000000L) { return 8; }
317
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700318 return 0;
319 }
320
321 static int charSubTest() {
322
323 char char1 = 0x00e9;
324 char char2 = 0xffff;
325 int i;
326
327 /* chars are unsigned-expanded to ints before subtraction */
328 i = char1 - char2;
329 if (i != 0xffff00ea) { return 1; }
330 return 0;
331 }
332
333 /*
334 * We pass in the arguments and return the results so the compiler
335 * doesn't do the math for us. (x=70000, y=-3)
336 */
337 static int intOperTest(int x, int y) {
338 int[] results = new int[10];
339
340 /* this seems to generate "op-int" instructions */
341 results[0] = x + y;
342 results[1] = x - y;
343 results[2] = x * y;
344 results[3] = x * x;
345 results[4] = x / y;
346 results[5] = x % -y;
347 results[6] = x & y;
348 results[7] = x | y;
349 results[8] = x ^ y;
350
351 /* this seems to generate "op-int/2addr" instructions */
352 results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
353
354 /* check this edge case while we're here (div-int/2addr) */
355 int minInt = -2147483648;
356 int negOne = -results[5];
357 int plusOne = 1;
358 int result = (((minInt + plusOne) - plusOne) / negOne) / negOne;
TDYa127f8641ce2012-04-02 06:40:40 -0700359 int shouldBeZero = minInt % negOne;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700360
361 if (result != minInt) { return 1;};
362 if (results[0] != 69997) { return 2;};
363 if (results[1] != 70003) { return 3;};
364 if (results[2] != -210000) { return 4;};
365 if (results[3] != 605032704) { return 5;};
366 if (results[4] != -23333) { return 6;};
367 if (results[5] != 1) { return 7;};
368 if (results[6] != 70000) { return 8;};
369 if (results[7] != -3) { return 9;};
370 if (results[8] != -70003) { return 10;};
371 if (results[9] != 70000) { return 11;};
TDYa127f8641ce2012-04-02 06:40:40 -0700372 if (shouldBeZero != 0) { return 12;};
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700373
374 return 0;
375 }
376
377 /*
378 * More operations, this time with 16-bit constants. (x=77777)
379 */
380 static int lit16Test(int x) {
381
Douglas Leungf9a627f2015-04-08 15:53:58 -0700382 int[] results = new int[10];
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700383
384 /* try to generate op-int/lit16" instructions */
385 results[0] = x + 1000;
386 results[1] = 1000 - x;
387 results[2] = x * 1000;
388 results[3] = x / 1000;
389 results[4] = x % 1000;
390 results[5] = x & 1000;
391 results[6] = x | -1000;
392 results[7] = x ^ -1000;
Douglas Leungf9a627f2015-04-08 15:53:58 -0700393 /* use an 16-bit constant that has its MSB (bit-15) set */
394 results[8] = x / 32769;
395 results[9] = x / -32769;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700396
397 if (results[0] != 78777) { return 1; }
398 if (results[1] != -76777) { return 2; }
399 if (results[2] != 77777000) { return 3; }
400 if (results[3] != 77) { return 4; }
401 if (results[4] != 777) { return 5; }
402 if (results[5] != 960) { return 6; }
403 if (results[6] != -39) { return 7; }
404 if (results[7] != -76855) { return 8; }
Douglas Leungf9a627f2015-04-08 15:53:58 -0700405 if (results[8] != 2) { return 9; }
406 if (results[9] != -2) { return 10; }
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700407 return 0;
408 }
409
410 /*
411 * More operations, this time with 8-bit constants. (x=-55555)
412 */
413 static int lit8Test(int x) {
414
415 int[] results = new int[8];
416
417 /* try to generate op-int/lit8" instructions */
418 results[0] = x + 10;
419 results[1] = 10 - x;
420 results[2] = x * 10;
421 results[3] = x / 10;
422 results[4] = x % 10;
423 results[5] = x & 10;
424 results[6] = x | -10;
425 results[7] = x ^ -10;
426 int minInt = -2147483648;
427 int result = minInt / -1;
428 if (result != minInt) {return 1; }
429 if (results[0] != -55545) {return 2; }
430 if (results[1] != 55565) {return 3; }
431 if (results[2] != -555550) {return 4; }
432 if (results[3] != -5555) {return 5; }
433 if (results[4] != -5) {return 6; }
434 if (results[5] != 8) {return 7; }
435 if (results[6] != -1) {return 8; }
436 if (results[7] != 55563) {return 9; }
437 return 0;
438 }
439
440
441 /*
442 * Shift some data. (value=0xff00aa01, dist=8)
443 */
444 static int intShiftTest(int value, int dist) {
445 int results[] = new int[4];
446 results[0] = value << dist;
447 results[1] = value >> dist;
448 results[2] = value >>> dist;
449 results[3] = (((value << dist) >> dist) >>> dist) << dist;
450 if (results[0] != 0x00aa0100) {return 1; }
451 if (results[1] != 0xffff00aa) {return 2; }
452 if (results[2] != 0x00ff00aa) {return 3; }
453 if (results[3] != 0xaa00) {return 4; }
454 return 0;
455 }
456
457 /*
458 * We pass in the arguments and return the results so the compiler
459 * doesn't do the math for us. (x=70000000000, y=-3)
460 */
461 static int longOperTest(long x, long y) {
462 long[] results = new long[10];
463
464 /* this seems to generate "op-long" instructions */
465 results[0] = x + y;
466 results[1] = x - y;
467 results[2] = x * y;
468 results[3] = x * x;
469 results[4] = x / y;
470 results[5] = x % -y;
471 results[6] = x & y;
472 results[7] = x | y;
473 results[8] = x ^ y;
474 /* this seems to generate "op-long/2addr" instructions */
475 results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
476 /* check this edge case while we're here (div-long/2addr) */
477 long minLong = -9223372036854775808L;
478 long negOne = -results[5];
479 long plusOne = 1;
480 long result = (((minLong + plusOne) - plusOne) / negOne) / negOne;
481 if (result != minLong) { return 1; }
482 if (results[0] != 69999999997L) { return 2; }
483 if (results[1] != 70000000003L) { return 3; }
484 if (results[2] != -210000000000L) { return 4; }
485 if (results[3] != -6833923606740729856L) { return 5; } // overflow
486 if (results[4] != -23333333333L) { return 6; }
487 if (results[5] != 1) { return 7; }
488 if (results[6] != 70000000000L) { return 8; }
489 if (results[7] != -3) { return 9; }
490 if (results[8] != -70000000003L) { return 10; }
491 if (results[9] != 70000000000L) { return 11; }
492 if (results.length != 10) { return 12; }
493 return 0;
494 }
495
496 /*
497 * Shift some data. (value=0xd5aa96deff00aa01, dist=16)
498 */
499 static long longShiftTest(long value, int dist) {
500 long results[] = new long[4];
501 results[0] = value << dist;
502 results[1] = value >> dist;
503 results[2] = value >>> dist;
504 results[3] = (((value << dist) >> dist) >>> dist) << dist;
505 if (results[0] != 0x96deff00aa010000L) { return results[0]; }
506 if (results[1] != 0xffffd5aa96deff00L) { return results[1]; }
507 if (results[2] != 0x0000d5aa96deff00L) { return results[2]; }
508 if (results[3] != 0xffff96deff000000L) { return results[3]; }
509 if (results.length != 4) { return 5; }
510
511 return results[0]; // test return-long
512 }
513
514 static int switchTest(int a) {
515 int res = 1234;
516
517 switch (a) {
518 case -1: res = 1; return res;
519 case 0: res = 2; return res;
520 case 1: /*correct*/ break;
521 case 2: res = 3; return res;
522 case 3: res = 4; return res;
523 case 4: res = 5; return res;
524 default: res = 6; return res;
525 }
526 switch (a) {
527 case 3: res = 7; return res;
528 case 4: res = 8; return res;
529 default: /*correct*/ break;
530 }
531
532 a = 0x12345678;
533
534 switch (a) {
535 case 0x12345678: /*correct*/ break;
536 case 0x12345679: res = 9; return res;
537 default: res = 1; return res;
538 }
539 switch (a) {
540 case 57: res = 10; return res;
541 case -6: res = 11; return res;
542 case 0x12345678: /*correct*/ break;
543 case 22: res = 12; return res;
544 case 3: res = 13; return res;
545 default: res = 14; return res;
546 }
547 switch (a) {
548 case -6: res = 15; return res;
549 case 3: res = 16; return res;
550 default: /*correct*/ break;
551 }
552
553 a = -5;
554 switch (a) {
555 case 12: res = 17; return res;
556 case -5: /*correct*/ break;
557 case 0: res = 18; return res;
558 default: res = 19; return res;
559 }
560
561 switch (a) {
562 default: /*correct*/ break;
563 }
564 return res;
565 }
566 /*
567 * Test the integer comparisons in various ways.
568 */
569 static int testIntCompare(int minus, int plus, int plus2, int zero) {
570 int res = 1111;
571
572 if (minus > plus)
573 return 1;
574 if (minus >= plus)
575 return 2;
576 if (plus < minus)
577 return 3;
578 if (plus <= minus)
579 return 4;
580 if (plus == minus)
581 return 5;
582 if (plus != plus2)
583 return 6;
584
585 /* try a branch-taken */
586 if (plus != minus) {
587 res = res;
588 } else {
589 return 7;
590 }
591
592 if (minus > 0)
593 return 8;
594 if (minus >= 0)
595 return 9;
596 if (plus < 0)
597 return 10;
598 if (plus <= 0)
599 return 11;
600 if (plus == 0)
601 return 12;
602 if (zero != 0)
603 return 13;
604
605 if (zero == 0) {
606 res = res;
607 } else {
608 return 14;
609 }
610 return res;
611 }
612
613 /*
614 * Test cmp-long.
615 *
616 * minus=-5, alsoMinus=0xFFFFFFFF00000009, plus=4, alsoPlus=8
617 */
618 static int testLongCompare(long minus, long alsoMinus, long plus,
619 long alsoPlus) {
620 int res = 2222;
621
622 if (minus > plus)
623 return 2;
624 if (plus < minus)
625 return 3;
626 if (plus == minus)
627 return 4;
628
629 if (plus >= plus+1)
630 return 5;
631 if (minus >= minus+1)
632 return 6;
633
634 /* try a branch-taken */
635 if (plus != minus) {
636 res = res;
637 } else {
638 return 7;
639 }
640
641 /* compare when high words are equal but low words differ */
642 if (plus > alsoPlus)
643 return 8;
644 if (alsoPlus < plus)
645 return 9;
646 if (alsoPlus == plus)
647 return 10;
648
649 /* high words are equal, low words have apparently different signs */
650 if (minus < alsoMinus) // bug!
651 return 11;
652 if (alsoMinus > minus)
653 return 12;
654 if (alsoMinus == minus)
655 return 13;
656
657 return res;
658 }
659
660 /*
661 * Test cmpl-float and cmpg-float.
662 */
663 static int testFloatCompare(float minus, float plus, float plus2,
664 float nan) {
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700665 if (minus > plus)
jeffhao644d5312012-05-03 19:04:49 -0700666 return 1;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700667 if (plus < minus)
jeffhao644d5312012-05-03 19:04:49 -0700668 return 2;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700669 if (plus == minus)
jeffhao644d5312012-05-03 19:04:49 -0700670 return 3;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700671 if (plus != plus2)
jeffhao644d5312012-05-03 19:04:49 -0700672 return 4;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700673
674 if (plus <= nan)
jeffhao644d5312012-05-03 19:04:49 -0700675 return 5;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700676 if (plus >= nan)
jeffhao644d5312012-05-03 19:04:49 -0700677 return 6;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700678 if (minus <= nan)
jeffhao644d5312012-05-03 19:04:49 -0700679 return 7;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700680 if (minus >= nan)
jeffhao644d5312012-05-03 19:04:49 -0700681 return 8;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700682 if (nan >= plus)
jeffhao644d5312012-05-03 19:04:49 -0700683 return 9;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700684 if (nan <= plus)
jeffhao644d5312012-05-03 19:04:49 -0700685 return 10;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700686
687 if (nan == nan)
jeffhao644d5312012-05-03 19:04:49 -0700688 return 11;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700689
jeffhao644d5312012-05-03 19:04:49 -0700690 return 3333;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700691 }
692
693 static int testDoubleCompare(double minus, double plus, double plus2,
694 double nan) {
695
696 int res = 4444;
697
698 if (minus > plus)
699 return 1;
700 if (plus < minus)
701 return 2;
702 if (plus == minus)
703 return 3;
704 if (plus != plus2)
705 return 4;
706
707 if (plus <= nan)
708 return 5;
709 if (plus >= nan)
710 return 6;
711 if (minus <= nan)
712 return 7;
713 if (minus >= nan)
714 return 8;
715 if (nan >= plus)
716 return 9;
717 if (nan <= plus)
718 return 10;
719
720 if (nan == nan)
721 return 11;
722 return res;
723 }
724
725 static int fibonacci(int n) {
726 if (n == 0) {
727 return 0;
728 } else if (n == 1) {
729 return 1;
730 } else {
731 return fibonacci(n - 1) + fibonacci(n - 2);
732 }
733 }
734
buzbeee9a72f62011-09-04 17:59:07 -0700735 static int throwAndCatch() {
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700736 try {
737 throwNullPointerException();
738 return 1;
739 } catch (NullPointerException npe) {
740 return 0;
741 }
buzbeee9a72f62011-09-04 17:59:07 -0700742 }
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700743
744 static int manyArgs(int a0, long a1, int a2, long a3, int a4, long a5,
745 int a6, int a7, double a8, float a9, double a10, short a11, int a12,
746 char a13, int a14, int a15, byte a16, boolean a17, int a18, int a19,
747 long a20, long a21, int a22, int a23, int a24, int a25, int a26)
748 {
749 if (a0 != 0) return 0;
750 if (a1 != 1L) return 1;
751 if (a2 != 2) return 2;
752 if (a3 != 3L) return 3;
753 if (a4 != 4) return 4;
754 if (a5 != 5L) return 5;
755 if (a6 != 6) return 6;
756 if (a7 != 7) return 7;
757 if (a8 != 8.0) return 8;
758 if (a9 != 9.0f) return 9;
759 if (a10 != 10.0) return 10;
760 if (a11 != (short)11) return 11;
761 if (a12 != 12) return 12;
762 if (a13 != (char)13) return 13;
763 if (a14 != 14) return 14;
764 if (a15 != 15) return 15;
765 if (a16 != (byte)-16) return 16;
766 if (a17 != true) return 17;
767 if (a18 != 18) return 18;
768 if (a19 != 19) return 19;
769 if (a20 != 20L) return 20;
770 if (a21 != 21L) return 21;
771 if (a22 != 22) return 22;
772 if (a23 != 23) return 23;
773 if (a24 != 24) return 24;
774 if (a25 != 25) return 25;
775 if (a26 != 26) return 26;
776 return -1;
777 }
778
779 int virtualCall(int a)
780 {
781 return a * 2;
782 }
783
784 void setFoo(int a)
785 {
786 foo_ = a;
787 }
788
789 int getFoo()
790 {
791 return foo_;
792 }
793
794 static int staticCall(int a)
795 {
Ian Rogersdd7bf562013-01-11 18:02:45 -0800796 Main foo = new Main();
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700797 return foo.virtualCall(a);
798 }
799
800 static int testIGetPut(int a)
801 {
Ian Rogersdd7bf562013-01-11 18:02:45 -0800802 Main foo = new Main(99);
803 Main foo123 = new Main();
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700804 int z = foo.getFoo();
805 z += a;
806 z += foo123.getFoo();
807 foo.setFoo(z);
808 return foo.getFoo();
809 }
810
Ian Rogersff1ed472011-09-20 13:46:24 -0700811 static int throwClassCast(Object o) {
812 return ((Integer)o).intValue();
813 }
814
815 static int testClassCast() {
816 int res = 0;
817 try {
818 res += throwClassCast(Integer.valueOf(123));
819 } catch(ClassCastException e) {
820 res += 456;
821 }
822 try {
823 res += throwClassCast(new Short((short)321));
824 } catch(ClassCastException e) {
825 res += 765;
826 }
827 return res;
828 }
829
Ian Rogerse51a5112011-09-23 14:16:35 -0700830 static void throwArrayStoreException(Object[] array, Object element) {
831 array[0] = element;
832 }
833
834 static int testArrayStoreException() {
835 int res=0;
836 Object[] array = new Number[2];
837 try {
838 throwArrayStoreException(array, null);
839 res += 1;
840 } catch(ArrayStoreException e) {
841 res += 2;
842 }
843 try {
844 throwArrayStoreException(array, Integer.valueOf(1));
845 res += 10;
846 } catch(ArrayStoreException e) {
847 res += 20;
848 }
849 try {
850 throwArrayStoreException(array, "hello MTV-44");
851 res += 100;
852 } catch(ArrayStoreException e) {
853 res += 200;
854 }
855 return res;
856 }
857
Ian Rogers932746a2011-09-22 18:57:50 -0700858 static long recursion_count_;
859 static void throwStackOverflow(long l) {
860 recursion_count_++;
861 throwStackOverflow(recursion_count_);
862 }
863
864 static long testStackOverflow() {
865 try {
866 throwStackOverflow(0);
867 if (recursion_count_ != 0) {
868 return recursion_count_;
869 } else {
870 return -1;
871 }
872 } catch(StackOverflowError soe) {
873 return 0;
874 }
875 }
876
Ian Rogersb886da82011-09-23 16:27:54 -0700877 static int testArrayAllocation() {
878 int res = 0;
879 try {
880 int[] x = new int[-1];
881 res += 1;
882 } catch (NegativeArraySizeException e) {
883 res += 2;
884 }
885 try {
886 int[] x = new int [1];
887 res += 10;
888 } catch (Throwable e) {
889 res += 20;
890 }
891 return res;
892 }
893
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700894 public static void main(String[] args) {
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700895 boolean failure = false;
buzbeef0cde542011-09-13 14:55:02 -0700896 int res;
897 long lres;
898
899 lres = divideLongByBillion(123000000000L);
900 if (lres == 123) {
901 System.out.println("divideLongByBillion PASSED");
902 } else {
903 System.out.println("divideLongByBillion FAILED: " + lres);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700904 failure = true;
buzbeef0cde542011-09-13 14:55:02 -0700905 }
906 res = unopTest(38);
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700907 if (res == 37) {
buzbee1da522d2011-09-04 11:22:20 -0700908 System.out.println("unopTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700909 } else {
buzbee1da522d2011-09-04 11:22:20 -0700910 System.out.println("unopTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700911 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700912 }
913 res = shiftTest1();
914 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700915 System.out.println("shiftTest1 PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700916 } else {
buzbee1da522d2011-09-04 11:22:20 -0700917 System.out.println("shiftTest1 FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700918 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700919 }
920 res = shiftTest2();
921 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700922 System.out.println("shiftTest2 PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700923 } else {
buzbee1da522d2011-09-04 11:22:20 -0700924 System.out.println("shiftTest2 FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700925 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700926 }
927 res = unsignedShiftTest();
928 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700929 System.out.println("unsignedShiftTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700930 } else {
buzbee1da522d2011-09-04 11:22:20 -0700931 System.out.println("unsignedShiftTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700932 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700933 }
934 res = convTest();
935 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700936 System.out.println("convTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700937 } else {
buzbee1da522d2011-09-04 11:22:20 -0700938 System.out.println("convTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700939 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700940 }
941 res = charSubTest();
942 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700943 System.out.println("charSubTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700944 } else {
buzbee1da522d2011-09-04 11:22:20 -0700945 System.out.println("charSubTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700946 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700947 }
948 res = intOperTest(70000, -3);
949 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700950 System.out.println("intOperTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700951 } else {
buzbee1da522d2011-09-04 11:22:20 -0700952 System.out.println("intOperTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700953 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700954 }
Brian Carlstrom25c33252011-09-18 15:58:35 -0700955 res = lit16Test(77777);
956 if (res == 0) {
957 System.out.println("lit16Test PASSED");
958 } else {
959 System.out.println("lit16Test FAILED: " + res);
960 failure = true;
961 }
962 res = lit8Test(-55555);
963 if (res == 0) {
964 System.out.println("lit8Test PASSED");
965 } else {
966 System.out.println("lit8Test FAILED: " + res);
967 failure = true;
968 }
969 res = intShiftTest(0xff00aa01, 8);
970 if (res == 0) {
971 System.out.println("intShiftTest PASSED");
972 } else {
973 System.out.println("intShiftTest FAILED: " + res);
974 failure = true;
975 }
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700976 res = longOperTest(70000000000L, -3L);
977 if (res == 0) {
buzbee1da522d2011-09-04 11:22:20 -0700978 System.out.println("longOperTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700979 } else {
buzbee1da522d2011-09-04 11:22:20 -0700980 System.out.println("longOperTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700981 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700982 }
buzbeef0cde542011-09-13 14:55:02 -0700983 lres = longShiftTest(0xd5aa96deff00aa01L, 16);
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700984 if (lres == 0x96deff00aa010000L) {
buzbee1da522d2011-09-04 11:22:20 -0700985 System.out.println("longShiftTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700986 } else {
Dmitry Petrochenkof71f9502014-06-10 02:45:42 +0700987 System.out.println("longShiftTest FAILED: " + lres);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700988 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700989 }
990
991 res = switchTest(1);
992 if (res == 1234) {
buzbee1da522d2011-09-04 11:22:20 -0700993 System.out.println("switchTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700994 } else {
buzbee1da522d2011-09-04 11:22:20 -0700995 System.out.println("switchTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -0700996 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700997 }
998
999 res = testIntCompare(-5, 4, 4, 0);
1000 if (res == 1111) {
buzbee1da522d2011-09-04 11:22:20 -07001001 System.out.println("testIntCompare PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001002 } else {
buzbee1da522d2011-09-04 11:22:20 -07001003 System.out.println("testIntCompare FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001004 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001005 }
1006
1007 res = testLongCompare(-5L, -4294967287L, 4L, 8L);
1008 if (res == 2222) {
buzbee1da522d2011-09-04 11:22:20 -07001009 System.out.println("testLongCompare PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001010 } else {
buzbee1da522d2011-09-04 11:22:20 -07001011 System.out.println("testLongCompare FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001012 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001013 }
1014
1015 res = testFloatCompare(-5.0f, 4.0f, 4.0f, (1.0f/0.0f) / (1.0f/0.0f));
1016 if (res == 3333) {
buzbee1da522d2011-09-04 11:22:20 -07001017 System.out.println("testFloatCompare PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001018 } else {
buzbee1da522d2011-09-04 11:22:20 -07001019 System.out.println("testFloatCompare FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001020 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001021 }
1022
1023 res = testDoubleCompare(-5.0, 4.0, 4.0, (1.0/0.0) / (1.0/0.0));
1024 if (res == 4444) {
buzbee1da522d2011-09-04 11:22:20 -07001025 System.out.println("testDoubleCompare PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001026 } else {
buzbee1da522d2011-09-04 11:22:20 -07001027 System.out.println("testDoubleCompare FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001028 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001029 }
1030
1031 res = fibonacci(10);
1032 if (res == 55) {
buzbee1da522d2011-09-04 11:22:20 -07001033 System.out.println("fibonacci PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001034 } else {
buzbee1da522d2011-09-04 11:22:20 -07001035 System.out.println("fibonacci FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001036 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001037 }
1038
buzbeee9a72f62011-09-04 17:59:07 -07001039 res = throwAndCatch();
1040 if (res == 0) {
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001041 System.out.println("throwAndCatch PASSED");
buzbeee9a72f62011-09-04 17:59:07 -07001042 } else {
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001043 System.out.println("throwAndCatch FAILED: " + res);
1044 failure = true;
buzbeee9a72f62011-09-04 17:59:07 -07001045 }
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001046
Ian Rogersff1ed472011-09-20 13:46:24 -07001047 res = testClassCast();
1048 if (res == 888) {
1049 System.out.println("testClassCast PASSED");
1050 } else {
1051 System.out.println("testClassCast FAILED: " + res);
1052 failure = true;
1053 }
1054
Ian Rogerse51a5112011-09-23 14:16:35 -07001055 res = testArrayStoreException();
1056 if (res == 211) {
1057 System.out.println("testArrayStore PASSED");
1058 } else {
1059 System.out.println("testArrayStore FAILED: " + res);
1060 failure = true;
1061 }
1062
Ian Rogers932746a2011-09-22 18:57:50 -07001063 lres= testStackOverflow();
1064 if (lres == 0) {
1065 System.out.println("testStackOverflow PASSED");
1066 } else {
1067 System.out.println("testStackOverflow FAILED: " + lres);
1068 failure = true;
1069 }
1070
Ian Rogersb886da82011-09-23 16:27:54 -07001071 res = testArrayAllocation();
1072 if (res == 12) {
1073 System.out.println("testArrayAllocation PASSED");
1074 } else {
1075 System.out.println("testArrayAllocation FAILED: " + res);
1076 failure = true;
1077 }
1078
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001079 res = manyArgs(0, 1L, 2, 3L, 4, 5L, 6, 7, 8.0, 9.0f, 10.0,
1080 (short)11, 12, (char)13, 14, 15, (byte)-16, true, 18,
1081 19, 20L, 21L, 22, 23, 24, 25, 26);
1082 if (res == -1) {
buzbee1da522d2011-09-04 11:22:20 -07001083 System.out.println("manyArgs PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001084 } else {
buzbee1da522d2011-09-04 11:22:20 -07001085 System.out.println("manyArgs FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001086 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001087 }
1088
1089 res = staticCall(3);
1090 if (res == 6) {
buzbee1da522d2011-09-04 11:22:20 -07001091 System.out.println("virtualCall PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001092 } else {
buzbee1da522d2011-09-04 11:22:20 -07001093 System.out.println("virtualCall FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001094 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001095 }
1096
1097 res = testIGetPut(111);
1098 if (res == 333) {
buzbee1da522d2011-09-04 11:22:20 -07001099 System.out.println("testGetPut PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001100 } else {
buzbee1da522d2011-09-04 11:22:20 -07001101 System.out.println("testGetPut FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001102 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001103 }
1104
1105 res = staticFieldTest(404);
1106 if (res == 1404) {
buzbee1da522d2011-09-04 11:22:20 -07001107 System.out.println("staticFieldTest PASSED");
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001108 } else {
buzbee1da522d2011-09-04 11:22:20 -07001109 System.out.println("staticFieldTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001110 failure = true;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001111 }
buzbee1b4c8592011-08-31 10:43:51 -07001112
1113 res = catchBlock(1000);
1114 if (res == 1579) {
Brian Carlstrom25c33252011-09-18 15:58:35 -07001115 System.out.println("catchBlock(1000) PASSED");
buzbee1b4c8592011-08-31 10:43:51 -07001116 } else {
Brian Carlstrom25c33252011-09-18 15:58:35 -07001117 System.out.println("catchBlock(1000) FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001118 failure = true;
buzbee1b4c8592011-08-31 10:43:51 -07001119 }
Brian Carlstrom25c33252011-09-18 15:58:35 -07001120 res = catchBlock(7000);
1121 if (res == 7777) {
1122 System.out.println("catchBlock(7000) PASSED");
1123 } else {
1124 System.out.println("catchBlock(7000) FAILED: " + res);
1125 failure = true;
1126 }
buzbeee9a72f62011-09-04 17:59:07 -07001127 res = catchBlockNoThrow(1000);
1128 if (res == 1123) {
1129 System.out.println("catchBlockNoThrow PASSED");
1130 } else {
1131 System.out.println("catchBlockNoThrow FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001132 failure = true;
buzbeee9a72f62011-09-04 17:59:07 -07001133 }
1134
buzbee4a3164f2011-09-03 11:25:10 -07001135 res = superTest(4141);
1136 if (res == 4175) {
buzbee1da522d2011-09-04 11:22:20 -07001137 System.out.println("superTest PASSED");
buzbee4a3164f2011-09-03 11:25:10 -07001138 } else {
buzbee1da522d2011-09-04 11:22:20 -07001139 System.out.println("superTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001140 failure = true;
buzbee4a3164f2011-09-03 11:25:10 -07001141 }
buzbee2a475e72011-09-07 17:19:17 -07001142
Brian Carlstrom25c33252011-09-18 15:58:35 -07001143 res = constClassTest(1111);
1144 if (res == 2222) {
1145 System.out.println("constClassTest PASSED");
1146 } else {
1147 System.out.println("constClassTest FAILED: " + res);
1148 failure = true;
1149 }
1150
buzbee2a475e72011-09-07 17:19:17 -07001151 res = constStringTest(10);
1152 if (res == 22) {
Brian Carlstrom25c33252011-09-18 15:58:35 -07001153 System.out.println("constStringTest PASSED");
buzbee2a475e72011-09-07 17:19:17 -07001154 } else {
Brian Carlstrom25c33252011-09-18 15:58:35 -07001155 System.out.println("constStringTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001156 failure = true;
buzbee2a475e72011-09-07 17:19:17 -07001157 }
1158
1159 res = instanceTest(10);
Brian Carlstrom5d40f182011-09-26 22:29:18 -07001160 if (res == 1436) {
buzbee2a475e72011-09-07 17:19:17 -07001161 System.out.println("instanceTest PASSED");
1162 } else {
1163 System.out.println("instanceTest FAILED: " + res);
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001164 failure = true;
buzbee2a475e72011-09-07 17:19:17 -07001165 }
Brian Carlstrombbf1e412011-09-18 14:14:51 -07001166
1167 System.exit(failure ? 1 : 0);
buzbee4a3164f2011-09-03 11:25:10 -07001168 }
1169}
1170
1171class IntMathBase {
1172 IntMathBase() {
1173 }
1174
1175 int tryThing() {
1176 return 7;
Brian Carlstrom9f30b382011-08-28 22:41:38 -07001177 }
1178}