Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 // Test that optimized JSArray indexers enerate the same error as dyncamically | |
| 6 // dispatched calls. | |
| 7 | |
| 8 import 'package:expect/expect.dart'; | |
| 9 | |
| 10 @NoInline() @AssumeDynamic() | |
| 11 confuse(x) => x; | |
| 12 | |
| 13 | |
| 14 Error getError(action()) { | |
| 15 try { | |
| 16 action(); | |
| 17 Expect.fail('must throw'); | |
|
Lasse Reichstein Nielsen
2015/09/11 06:16:57
Move this outside the try/catch, otherwise you'll
sra1
2015/09/11 17:33:34
Done.
| |
| 18 } catch (e) { | |
| 19 return e; | |
| 20 } | |
| 21 } | |
| 22 | |
| 23 indexErrorContainsIndex() { | |
| 24 fault(i) { | |
|
Lasse Reichstein Nielsen
2015/09/11 06:16:58
You could write this as:
fault(i) => () => confu
sra1
2015/09/11 17:33:34
Done.
| |
| 25 return confuse([])[i]; | |
| 26 } | |
| 27 | |
| 28 var e1 = getError(() => fault(1234)); | |
| 29 var e2 = getError(() => fault(1234000)); | |
| 30 var e3 = getError(() => fault(1234000000000)); | |
| 31 | |
| 32 Expect.equals('$e1', '$e2'.replaceAll('000', '')); | |
| 33 Expect.equals('$e1', '$e3'.replaceAll('000', '')); | |
| 34 Expect.equals('$e1'.length + 3, '$e2'.length); | |
| 35 Expect.equals('$e1'.length + 9, '$e3'.length); | |
| 36 } | |
| 37 | |
| 38 indexEmpty() { | |
| 39 fault1() { | |
| 40 // Single indexing might go via one-shot interceptor that might have an | |
| 41 // accelerated path. | |
| 42 return confuse([])[0]; | |
| 43 } | |
| 44 | |
| 45 fault2() { | |
| 46 var a = []; | |
| 47 while (confuse(false)) a.add(1); | |
| 48 // Easily inferred type and open coded indexer. | |
| 49 return a[0]; | |
| 50 } | |
| 51 | |
| 52 fault3() { | |
| 53 var a = confuse([]); | |
| 54 // Multiple indexing might go via shared interceptor. | |
| 55 return [a[0], a[1], a[2]]; | |
| 56 } | |
| 57 | |
| 58 var e1 = getError(fault1); | |
| 59 var e2 = getError(fault2); | |
| 60 var e3 = getError(fault3); | |
| 61 | |
| 62 Expect.equals('$e1', '$e2'); | |
| 63 Expect.equals('$e1', '$e3'); | |
| 64 } | |
| 65 | |
| 66 indexHugeEmpty() { | |
| 67 int HUGE; | |
| 68 | |
| 69 fault1() { | |
| 70 return confuse([])[HUGE]; | |
| 71 } | |
| 72 | |
| 73 fault2() { | |
| 74 var a = []; | |
| 75 while (confuse(false)) a.add(1); | |
| 76 return a[HUGE]; | |
| 77 } | |
| 78 | |
| 79 fault3() { | |
| 80 var a = confuse([]); | |
| 81 return [a[HUGE], a[1], a[2]]; | |
| 82 } | |
| 83 | |
| 84 HUGE = 1000000000000; | |
|
Lasse Reichstein Nielsen
2015/09/11 06:16:57
Why not initialize HUGE above?
If there is a reaso
sra1
2015/09/11 17:33:34
Done.
| |
| 85 var e1 = getError(fault1); | |
| 86 var e2 = getError(fault2); | |
| 87 var e3 = getError(fault3); | |
| 88 | |
| 89 Expect.equals('$e1', '$e2'); | |
| 90 Expect.equals('$e1', '$e3'); | |
| 91 } | |
| 92 | |
| 93 indexNonempty() { | |
| 94 fault1() { | |
| 95 // Single indexing might go via one-shot interceptor that might have an | |
| 96 // accelerated path. | |
| 97 return confuse([1])[1]; | |
| 98 } | |
| 99 | |
| 100 fault2() { | |
| 101 var a = [1]; | |
| 102 while (confuse(false)) a.add(1); | |
| 103 // Easily inferred type and open coded indexer. | |
| 104 return a[1]; | |
| 105 } | |
| 106 | |
| 107 fault3() { | |
| 108 var a = confuse([1]); | |
| 109 // Multiple indexing might go via shared interceptor. | |
| 110 return [a[0], a[1], a[2]]; | |
| 111 } | |
| 112 | |
| 113 var e1 = getError(fault1); | |
| 114 var e2 = getError(fault2); | |
| 115 var e3 = getError(fault3); | |
| 116 | |
| 117 Expect.equals('$e1', '$e2'); | |
| 118 Expect.equals('$e1', '$e3'); | |
| 119 } | |
|
Lasse Reichstein Nielsen
2015/09/11 06:16:57
Could these tests be parameterized with (list, ind
sra1
2015/09/11 17:33:34
I'm wary that making the code general will inhibit
| |
| 120 | |
| 121 indexHugeNonempty() { | |
| 122 int HUGE; | |
| 123 | |
| 124 fault1() { | |
| 125 return confuse([1])[HUGE]; | |
| 126 } | |
| 127 | |
| 128 fault2() { | |
| 129 var a = [1]; | |
| 130 while (confuse(false)) a.add(1); | |
| 131 return a[HUGE]; | |
| 132 } | |
| 133 | |
| 134 fault3() { | |
| 135 var a = confuse([1]); | |
| 136 return [a[HUGE], a[1], a[2]]; | |
| 137 } | |
| 138 | |
| 139 HUGE = 1000000000000; | |
| 140 var e1 = getError(fault1); | |
| 141 var e2 = getError(fault2); | |
| 142 var e3 = getError(fault3); | |
| 143 | |
| 144 Expect.equals('$e1', '$e2'); | |
| 145 Expect.equals('$e1', '$e3'); | |
| 146 } | |
| 147 | |
| 148 indexSetEmpty() { | |
| 149 fault1() { | |
| 150 // Single indexing might go via one-shot interceptor that has an accelerated | |
| 151 // path. | |
| 152 confuse([])[0] = 0; | |
| 153 } | |
| 154 | |
| 155 fault2() { | |
| 156 var a = []; | |
| 157 while (confuse(false)) a.add(1); | |
| 158 // Easily inferred type and open coded indexer. | |
| 159 a[0] = 0; | |
| 160 return a; | |
| 161 } | |
| 162 | |
| 163 fault3() { | |
| 164 var a = confuse([]); | |
| 165 // Multiple indexing might go via shared interceptor. | |
| 166 a[0] = 0; | |
| 167 a[1] = 0; | |
| 168 a[2] = 0; | |
| 169 return a; | |
| 170 } | |
| 171 | |
| 172 var e1 = getError(fault1); | |
| 173 var e2 = getError(fault2); | |
| 174 var e3 = getError(fault3); | |
| 175 | |
| 176 Expect.equals('$e1', '$e2'); | |
| 177 Expect.equals('$e1', '$e3'); | |
| 178 } | |
| 179 | |
| 180 indexSetNonempty() { | |
|
Lasse Reichstein Nielsen
2015/09/11 06:16:57
No Huge version of indexSet tests?
sra1
2015/09/11 17:33:34
Added in the 'variable' tests.
| |
| 181 fault1() { | |
| 182 // Single indexing might go via one-shot interceptor that has an accelerated | |
| 183 // path. | |
| 184 confuse([1])[1] = 0; | |
| 185 } | |
| 186 | |
| 187 fault2() { | |
| 188 var a = [1]; | |
| 189 while (confuse(false)) a.add(1); | |
| 190 // Easily inferred type and open coded indexer. | |
| 191 a[1] = 0; | |
| 192 return a; | |
| 193 } | |
| 194 | |
| 195 fault3() { | |
| 196 var a = confuse([1]); | |
| 197 // Multiple indexing might go via shared interceptor. | |
| 198 a[0] = 0; | |
| 199 a[1] = 0; | |
| 200 a[2] = 0; | |
| 201 return a; | |
| 202 } | |
| 203 | |
| 204 var e1 = getError(fault1); | |
| 205 var e2 = getError(fault2); | |
| 206 var e3 = getError(fault3); | |
| 207 | |
| 208 Expect.equals('$e1', '$e2'); | |
| 209 Expect.equals('$e1', '$e3'); | |
| 210 } | |
| 211 | |
| 212 main() { | |
| 213 indexErrorContainsIndex(); | |
| 214 indexEmpty(); | |
| 215 indexHugeEmpty(); | |
| 216 indexNonempty(); | |
| 217 indexHugeNonempty(); | |
| 218 indexSetEmpty(); | |
| 219 indexSetNonempty(); | |
|
Lasse Reichstein Nielsen
2015/09/11 06:16:57
Maybe also test negative indices.
sra1
2015/09/11 17:33:34
Done.
| |
| 220 } | |
| OLD | NEW |