|
1 function thrower1(x) { |
|
2 throw x + 2; |
|
3 |
|
4 // Dead code, should be ignored. |
|
5 throw ++x; |
|
6 return x; |
|
7 } |
|
8 function test1() { |
|
9 // If we ever inline functions containing JSOP_THROW, |
|
10 // this shouldn't assert. |
|
11 function f(x) { |
|
12 thrower1(x + 1); |
|
13 } |
|
14 for (var i=0; i<11000; i++) { |
|
15 try { |
|
16 f(i); |
|
17 assertEq(0, 1); |
|
18 } catch(e) { |
|
19 assertEq(e, i + 3); |
|
20 } |
|
21 } |
|
22 } |
|
23 test1(); |
|
24 |
|
25 // Test throwing from an uncompilable (interpreted) function. |
|
26 function getException(f) { |
|
27 try { |
|
28 f(); |
|
29 assertEq(0, 1); |
|
30 } catch(e) { |
|
31 return e; |
|
32 } |
|
33 assertEq(0, 1); |
|
34 } |
|
35 |
|
36 function thrower2(x) { |
|
37 if (x > 90) |
|
38 throw x; |
|
39 with ({}) {}; // Abort compilation...(?) |
|
40 } |
|
41 function test2() { |
|
42 for (var i = 0; i < 100; i++) { |
|
43 thrower2(i); |
|
44 } |
|
45 } |
|
46 assertEq(getException(test2), 91); |
|
47 |
|
48 // Throwing |this| from a constructor. |
|
49 function thrower3(x) { |
|
50 this.x = x; |
|
51 if (x > 90) |
|
52 throw this; |
|
53 } |
|
54 function test3() { |
|
55 for (var i=0; i < 100; i++) { |
|
56 new thrower3(i); |
|
57 } |
|
58 } |
|
59 assertEq(getException(test3).x, 91); |
|
60 |
|
61 // Throwing an exception in various loop blocks. |
|
62 var count = 0; |
|
63 function thrower4(x) { |
|
64 throw count++; |
|
65 count += 12345; // Shouldn't be executed. |
|
66 } |
|
67 function test4_1() { |
|
68 var i = 0; |
|
69 for (new thrower4(i); i < 100; i++) { |
|
70 count += 2000; // Shouldn't be executed. |
|
71 } |
|
72 } |
|
73 function test4_2() { |
|
74 for (var i = 0; thrower4(i); i++) { |
|
75 count += 3000; // Shouldn't be executed. |
|
76 } |
|
77 } |
|
78 function test4_3() { |
|
79 for (var i = 0; i < 100; thrower4(i)) { |
|
80 count += 5; |
|
81 } |
|
82 } |
|
83 function test4_4() { |
|
84 for (var i = 0; i < 10; i++) { |
|
85 if (i > 8) |
|
86 thrower4(); |
|
87 count += i; |
|
88 } |
|
89 } |
|
90 for (var i = 0; i < 100; i++) { |
|
91 assertEq(getException(test4_1), count-1); |
|
92 assertEq(getException(test4_2), count-1); |
|
93 assertEq(getException(test4_3), count-1); |
|
94 assertEq(getException(test4_4), count-1); |
|
95 } |
|
96 assertEq(count, 4500); |