| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // Unit test of the [NativeBehavior.processSpecString] method. | 5 // Unit test of the [NativeBehavior.processSpecString] method. |
| 6 | 6 |
| 7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
| 8 import 'package:compiler/src/native/native.dart'; | 8 import 'package:compiler/src/native/native.dart'; |
| 9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; | 9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; |
| 10 import 'package:compiler/src/diagnostics/messages.dart'; | 10 import 'package:compiler/src/diagnostics/messages.dart'; |
| 11 import 'package:compiler/src/universe/side_effects.dart' | 11 import 'package:compiler/src/universe/side_effects.dart' show SideEffects; |
| 12 show SideEffects; | |
| 13 | 12 |
| 14 const OBJECT = 'Object'; | 13 const OBJECT = 'Object'; |
| 15 const NULL = 'Null'; | 14 const NULL = 'Null'; |
| 16 | 15 |
| 17 class Listener extends DiagnosticReporter { | 16 class Listener extends DiagnosticReporter { |
| 18 String errorMessage; | 17 String errorMessage; |
| 19 internalError(spannable, message) { | 18 internalError(spannable, message) { |
| 20 errorMessage = message; | 19 errorMessage = message; |
| 21 throw "error"; | 20 throw "error"; |
| 22 } | 21 } |
| 23 | 22 |
| 24 reportError(message, [infos = const <DiagnosticMessage>[]]) { | 23 reportError(message, [infos = const <DiagnosticMessage>[]]) { |
| 25 errorMessage = | 24 errorMessage = |
| 26 '${message.message.arguments}'; // E.g. "{text: Duplicate tag 'new'.}" | 25 '${message.message.arguments}'; // E.g. "{text: Duplicate tag 'new'.}" |
| 27 throw "error"; | 26 throw "error"; |
| 28 } | 27 } |
| 29 | 28 |
| 30 @override | 29 @override |
| 31 DiagnosticMessage createMessage(spannable, messageKind, | 30 DiagnosticMessage createMessage(spannable, messageKind, |
| 32 [arguments = const {}]) { | 31 [arguments = const {}]) { |
| 33 return new DiagnosticMessage(null, spannable, | 32 return new DiagnosticMessage(null, spannable, |
| 34 MessageTemplate.TEMPLATES[messageKind].message(arguments)); | 33 MessageTemplate.TEMPLATES[messageKind].message(arguments)); |
| 35 } | 34 } |
| 36 | 35 |
| 37 noSuchMethod(_) => null; | 36 noSuchMethod(_) => null; |
| 38 } | 37 } |
| 39 | 38 |
| 40 void test(String specString, | 39 void test(String specString, |
| 41 {List returns, | 40 {List returns, |
| 42 List creates, | 41 List creates, |
| 43 SideEffects expectedSideEffects, | 42 SideEffects expectedSideEffects, |
| 44 NativeThrowBehavior expectedThrows, | 43 NativeThrowBehavior expectedThrows, |
| 45 bool expectedNew, | 44 bool expectedNew, |
| 46 bool expectedGvn, | 45 bool expectedGvn, |
| 47 bool expectError: false}) { | 46 bool expectError: false}) { |
| 48 List actualReturns = []; | 47 List actualReturns = []; |
| 49 List actualCreates = []; | 48 List actualCreates = []; |
| 50 SideEffects actualSideEffects; | 49 SideEffects actualSideEffects; |
| 51 NativeThrowBehavior actualThrows; | 50 NativeThrowBehavior actualThrows; |
| 52 bool actualNew; | 51 bool actualNew; |
| 53 bool actualGvn; | 52 bool actualGvn; |
| 54 Listener listener = new Listener(); | 53 Listener listener = new Listener(); |
| 55 try { | 54 try { |
| 56 NativeBehavior.processSpecString( | 55 NativeBehavior.processSpecString(listener, null, specString, |
| 57 listener, | 56 setSideEffects: (effects) => actualSideEffects = effects, |
| 58 null, | 57 setThrows: (b) => actualThrows = b, |
| 59 specString, | 58 setIsAllocation: (b) => actualNew = b, |
| 60 setSideEffects: (effects) { actualSideEffects = effects; }, | 59 setUseGvn: (b) => actualGvn = b, |
| 61 setThrows: (b) { actualThrows = b; }, | |
| 62 setIsAllocation: (b) { actualNew = b; }, | |
| 63 setUseGvn: (b) { actualGvn = b; }, | |
| 64 resolveType: (t) => t, | 60 resolveType: (t) => t, |
| 65 typesReturned: actualReturns, typesInstantiated: actualCreates, | 61 typesReturned: actualReturns, |
| 66 objectType: OBJECT, nullType: NULL); | 62 typesInstantiated: actualCreates, |
| 63 objectType: OBJECT, |
| 64 nullType: NULL); |
| 67 } catch (e) { | 65 } catch (e) { |
| 68 Expect.isTrue(expectError, 'Unexpected error "$specString"'); | 66 Expect.isTrue(expectError, 'Unexpected error "$specString"'); |
| 69 Expect.isNotNull(listener.errorMessage, 'Error message expected.'); | 67 Expect.isNotNull(listener.errorMessage, 'Error message expected.'); |
| 70 return; | 68 return; |
| 71 } | 69 } |
| 72 Expect.isFalse(expectError, 'Missing error for "$specString".'); | 70 Expect.isFalse(expectError, 'Missing error for "$specString".'); |
| 73 Expect.isNull(listener.errorMessage, 'Unexpected error.'); | 71 Expect.isNull(listener.errorMessage, 'Unexpected error.'); |
| 74 if (returns != null) { | 72 if (returns != null) { |
| 75 Expect.listEquals(returns, actualReturns, 'Unexpected returns.'); | 73 Expect.listEquals(returns, actualReturns, 'Unexpected returns.'); |
| 76 } | 74 } |
| 77 if (creates != null) { | 75 if (creates != null) { |
| 78 Expect.listEquals(creates, actualCreates, 'Unexpected creates.'); | 76 Expect.listEquals(creates, actualCreates, 'Unexpected creates.'); |
| 79 } | 77 } |
| 80 Expect.equals(expectedSideEffects, actualSideEffects); | 78 Expect.equals(expectedSideEffects, actualSideEffects); |
| 81 Expect.equals(expectedThrows, actualThrows); | 79 Expect.equals(expectedThrows, actualThrows); |
| 82 Expect.equals(expectedNew, actualNew); | 80 Expect.equals(expectedNew, actualNew); |
| 83 Expect.equals(expectedGvn, actualGvn); | 81 Expect.equals(expectedGvn, actualGvn); |
| 84 } | 82 } |
| 85 | 83 |
| 86 void testWithSideEffects(String specString, | 84 void testWithSideEffects(String specString, |
| 87 {List returns, | 85 {List returns, List creates, bool expectError: false}) { |
| 88 List creates, | |
| 89 bool expectError: false}) { | |
| 90 | |
| 91 void sideEffectsTest(String newSpecString, SideEffects expectedSideEffects, | 86 void sideEffectsTest(String newSpecString, SideEffects expectedSideEffects, |
| 92 {bool sideEffectsExpectError}) { | 87 {bool sideEffectsExpectError}) { |
| 93 test(newSpecString, | 88 test(newSpecString, |
| 94 returns: returns, | 89 returns: returns, |
| 95 creates: creates, | 90 creates: creates, |
| 96 expectedSideEffects: expectedSideEffects, | 91 expectedSideEffects: expectedSideEffects, |
| 97 expectError: sideEffectsExpectError == null | 92 expectError: sideEffectsExpectError == null |
| 98 ? expectError | 93 ? expectError |
| 99 : sideEffectsExpectError); | 94 : sideEffectsExpectError); |
| 100 } | 95 } |
| 101 | 96 |
| 102 SideEffects emptySideEffects = new SideEffects.empty(); | 97 SideEffects emptySideEffects = new SideEffects.empty(); |
| 103 sideEffectsTest(specString + "effects:none;depends:none;", | 98 sideEffectsTest(specString + "effects:none;depends:none;", emptySideEffects); |
| 104 emptySideEffects); | 99 sideEffectsTest(specString + "depends:none;effects:none;", emptySideEffects); |
| 105 sideEffectsTest(specString + "depends:none;effects:none;", | 100 sideEffectsTest("effects:none;depends:none;" + specString, emptySideEffects); |
| 106 emptySideEffects); | 101 sideEffectsTest("depends:none;effects:none;" + specString, emptySideEffects); |
| 107 sideEffectsTest("effects:none;depends:none;" + specString, | |
| 108 emptySideEffects); | |
| 109 sideEffectsTest("depends:none;effects:none;" + specString, | |
| 110 emptySideEffects); | |
| 111 | 102 |
| 112 SideEffects effects = new SideEffects(); | 103 SideEffects effects = new SideEffects(); |
| 113 effects.clearChangesIndex(); | 104 effects.clearChangesIndex(); |
| 114 effects.clearAllDependencies(); | 105 effects.clearAllDependencies(); |
| 115 sideEffectsTest(specString + "effects:no-index;depends:none;", effects); | 106 sideEffectsTest(specString + "effects:no-index;depends:none;", effects); |
| 116 | 107 |
| 117 effects = new SideEffects(); | 108 effects = new SideEffects(); |
| 118 effects.clearAllSideEffects(); | 109 effects.clearAllSideEffects(); |
| 119 effects.clearDependsOnIndexStore(); | 110 effects.clearDependsOnIndexStore(); |
| 120 sideEffectsTest(specString + "effects:none;depends:no-index;", effects); | 111 sideEffectsTest(specString + "effects:none;depends:no-index;", effects); |
| 121 | 112 |
| 122 effects = new SideEffects(); | 113 effects = new SideEffects(); |
| 123 effects.clearChangesInstanceProperty(); | 114 effects.clearChangesInstanceProperty(); |
| 124 effects.clearChangesStaticProperty(); | 115 effects.clearChangesStaticProperty(); |
| 125 effects.clearAllDependencies(); | 116 effects.clearAllDependencies(); |
| 126 sideEffectsTest(specString + "effects:no-instance,no-static;depends:none;", | 117 sideEffectsTest( |
| 127 effects); | 118 specString + "effects:no-instance,no-static;depends:none;", effects); |
| 128 | 119 |
| 129 effects = new SideEffects(); | 120 effects = new SideEffects(); |
| 130 effects.clearAllSideEffects(); | 121 effects.clearAllSideEffects(); |
| 131 effects.clearDependsOnInstancePropertyStore(); | 122 effects.clearDependsOnInstancePropertyStore(); |
| 132 effects.clearDependsOnStaticPropertyStore(); | 123 effects.clearDependsOnStaticPropertyStore(); |
| 133 sideEffectsTest(specString + "effects:none;depends:no-instance,no-static;", | 124 sideEffectsTest( |
| 134 effects); | 125 specString + "effects:none;depends:no-instance,no-static;", effects); |
| 135 | 126 |
| 136 effects = new SideEffects(); | 127 effects = new SideEffects(); |
| 137 effects.clearChangesInstanceProperty(); | 128 effects.clearChangesInstanceProperty(); |
| 138 effects.clearChangesStaticProperty(); | 129 effects.clearChangesStaticProperty(); |
| 139 effects.clearDependsOnIndexStore(); | 130 effects.clearDependsOnIndexStore(); |
| 140 sideEffectsTest( | 131 sideEffectsTest( |
| 141 specString + "effects:no-instance,no-static;depends:no-index;", effects); | 132 specString + "effects:no-instance,no-static;depends:no-index;", effects); |
| 142 | 133 |
| 143 effects = new SideEffects(); | 134 effects = new SideEffects(); |
| 144 effects.clearChangesIndex(); | 135 effects.clearChangesIndex(); |
| 145 effects.clearDependsOnInstancePropertyStore(); | 136 effects.clearDependsOnInstancePropertyStore(); |
| 146 effects.clearDependsOnStaticPropertyStore(); | 137 effects.clearDependsOnStaticPropertyStore(); |
| 147 sideEffectsTest( | 138 sideEffectsTest( |
| 148 specString + "effects:no-index;depends:no-instance,no-static;", effects); | 139 specString + "effects:no-index;depends:no-instance,no-static;", effects); |
| 149 | 140 |
| 150 effects = new SideEffects(); | 141 effects = new SideEffects(); |
| 151 effects.clearChangesIndex(); | 142 effects.clearChangesIndex(); |
| 152 sideEffectsTest(specString + "effects:no-index;depends:all;", effects); | 143 sideEffectsTest(specString + "effects:no-index;depends:all;", effects); |
| 153 | 144 |
| 154 effects = new SideEffects(); | 145 effects = new SideEffects(); |
| 155 effects.clearDependsOnIndexStore(); | 146 effects.clearDependsOnIndexStore(); |
| 156 sideEffectsTest(specString + "effects:all;depends:no-index;", effects); | 147 sideEffectsTest(specString + "effects:all;depends:no-index;", effects); |
| 157 | 148 |
| 158 effects = new SideEffects(); | 149 effects = new SideEffects(); |
| 159 effects.clearChangesInstanceProperty(); | 150 effects.clearChangesInstanceProperty(); |
| 160 effects.clearChangesStaticProperty(); | 151 effects.clearChangesStaticProperty(); |
| 161 sideEffectsTest(specString + "effects:no-instance,no-static;depends:all;", | 152 sideEffectsTest( |
| 162 effects); | 153 specString + "effects:no-instance,no-static;depends:all;", effects); |
| 163 | 154 |
| 164 effects = new SideEffects(); | 155 effects = new SideEffects(); |
| 165 effects.clearDependsOnInstancePropertyStore(); | 156 effects.clearDependsOnInstancePropertyStore(); |
| 166 effects.clearDependsOnStaticPropertyStore(); | 157 effects.clearDependsOnStaticPropertyStore(); |
| 167 sideEffectsTest(specString + "effects:all;depends:no-instance,no-static;", | 158 sideEffectsTest( |
| 168 effects); | 159 specString + "effects:all;depends:no-instance,no-static;", effects); |
| 169 | 160 |
| 170 sideEffectsTest(specString + "effects:no-instance,no-static;", | 161 sideEffectsTest(specString + "effects:no-instance,no-static;", effects, |
| 171 effects, | 162 sideEffectsExpectError: true); |
| 172 sideEffectsExpectError: true); | |
| 173 | 163 |
| 174 sideEffectsTest(specString + "depends:no-instance,no-static;", | 164 sideEffectsTest(specString + "depends:no-instance,no-static;", effects, |
| 175 effects, | 165 sideEffectsExpectError: true); |
| 176 sideEffectsExpectError: true); | |
| 177 | 166 |
| 178 sideEffectsTest(specString + "effects:none;", | 167 sideEffectsTest(specString + "effects:none;", effects, |
| 179 effects, | 168 sideEffectsExpectError: true); |
| 180 sideEffectsExpectError: true); | |
| 181 | 169 |
| 182 sideEffectsTest(specString + "depends:all;", | 170 sideEffectsTest(specString + "depends:all;", effects, |
| 183 effects, | 171 sideEffectsExpectError: true); |
| 184 sideEffectsExpectError: true); | |
| 185 | 172 |
| 186 sideEffectsTest(specString + "effects:no-instance,no-static;depends:foo;", | 173 sideEffectsTest( |
| 187 effects, | 174 specString + "effects:no-instance,no-static;depends:foo;", effects, |
| 188 sideEffectsExpectError: true); | 175 sideEffectsExpectError: true); |
| 189 | 176 |
| 190 sideEffectsTest(specString + "effects:foo;depends:no-instance,no-static;", | 177 sideEffectsTest( |
| 191 effects, | 178 specString + "effects:foo;depends:no-instance,no-static;", effects, |
| 192 sideEffectsExpectError: true); | 179 sideEffectsExpectError: true); |
| 193 | 180 |
| 194 sideEffectsTest(specString + "effects:all;depends:foo", | 181 sideEffectsTest(specString + "effects:all;depends:foo", effects, |
| 195 effects, | 182 sideEffectsExpectError: true); |
| 196 sideEffectsExpectError: true); | |
| 197 | 183 |
| 198 sideEffectsTest(specString + "effects:foo;depends:none;", | 184 sideEffectsTest(specString + "effects:foo;depends:none;", effects, |
| 199 effects, | 185 sideEffectsExpectError: true); |
| 200 sideEffectsExpectError: true); | |
| 201 | 186 |
| 202 sideEffectsTest(specString + "effects:;depends:none;", | 187 sideEffectsTest(specString + "effects:;depends:none;", effects, |
| 203 effects, | 188 sideEffectsExpectError: true); |
| 204 sideEffectsExpectError: true); | |
| 205 | 189 |
| 206 sideEffectsTest(specString + "effects:all;depends:;", | 190 sideEffectsTest(specString + "effects:all;depends:;", effects, |
| 207 effects, | 191 sideEffectsExpectError: true); |
| 208 sideEffectsExpectError: true); | |
| 209 } | 192 } |
| 210 | 193 |
| 211 void main() { | 194 void main() { |
| 212 test('void', returns: [], creates: []); | 195 test('void', returns: [], creates: []); |
| 213 test('', returns: [OBJECT, NULL], creates: []); | 196 test('', returns: [OBJECT, NULL], creates: []); |
| 214 test('var', returns: [OBJECT, NULL], creates: []); | 197 test('var', returns: [OBJECT, NULL], creates: []); |
| 215 test('A', returns: ['A'], creates: ['A']); | 198 test('A', returns: ['A'], creates: ['A']); |
| 216 test('A|B', returns: ['A', 'B'], creates: ['A', 'B']); | 199 test('A|B', returns: ['A', 'B'], creates: ['A', 'B']); |
| 217 test('A|B|C', returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 200 test('A|B|C', returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
| 218 | 201 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 235 test('returns:var;creates:', returns: [OBJECT, NULL], creates: []); | 218 test('returns:var;creates:', returns: [OBJECT, NULL], creates: []); |
| 236 test('returns:A;creates:', returns: ['A'], creates: []); | 219 test('returns:A;creates:', returns: ['A'], creates: []); |
| 237 test('returns:A|B;creates:;', returns: ['A', 'B'], creates: []); | 220 test('returns:A|B;creates:;', returns: ['A', 'B'], creates: []); |
| 238 test('returns:A|B|C;creates:;', returns: ['A', 'B', 'C'], creates: []); | 221 test('returns:A|B|C;creates:;', returns: ['A', 'B', 'C'], creates: []); |
| 239 | 222 |
| 240 test('returns:void;creates:A;', returns: [], creates: ['A']); | 223 test('returns:void;creates:A;', returns: [], creates: ['A']); |
| 241 test('returns:;creates:A|B;', returns: [OBJECT, NULL], creates: ['A', 'B']); | 224 test('returns:;creates:A|B;', returns: [OBJECT, NULL], creates: ['A', 'B']); |
| 242 test('returns:var;creates:A|B|C;', | 225 test('returns:var;creates:A|B|C;', |
| 243 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); | 226 returns: [OBJECT, NULL], creates: ['A', 'B', 'C']); |
| 244 test('returns:A; creates:A|B|C; ', returns: ['A'], creates: ['A', 'B', 'C']); | 227 test('returns:A; creates:A|B|C; ', returns: ['A'], creates: ['A', 'B', 'C']); |
| 245 test(' returns:A|B; creates:A|C;', | 228 test(' returns:A|B; creates:A|C;', returns: ['A', 'B'], creates: ['A', 'C']); |
| 246 returns: ['A', 'B'], creates: ['A', 'C']); | |
| 247 test(' returns:A|B|C; creates:A; ', | 229 test(' returns:A|B|C; creates:A; ', |
| 248 returns: ['A', 'B', 'C'], creates: ['A']); | 230 returns: ['A', 'B', 'C'], creates: ['A']); |
| 249 | 231 |
| 250 testWithSideEffects('returns:void;', returns: [], creates: []); | 232 testWithSideEffects('returns:void;', returns: [], creates: []); |
| 251 testWithSideEffects('returns:void;', returns: [], creates: []); | 233 testWithSideEffects('returns:void;', returns: [], creates: []); |
| 252 testWithSideEffects('returns:;', returns: [OBJECT, NULL], creates: []); | 234 testWithSideEffects('returns:;', returns: [OBJECT, NULL], creates: []); |
| 253 testWithSideEffects('returns:var;', returns: [OBJECT, NULL], creates: []); | 235 testWithSideEffects('returns:var;', returns: [OBJECT, NULL], creates: []); |
| 254 testWithSideEffects('returns:A;', returns: ['A'], creates: ['A']); | 236 testWithSideEffects('returns:A;', returns: ['A'], creates: ['A']); |
| 255 testWithSideEffects('returns:A|B;', | 237 testWithSideEffects('returns:A|B;', returns: ['A', 'B'], creates: ['A', 'B']); |
| 256 returns: ['A', 'B'], creates: ['A', 'B']); | |
| 257 testWithSideEffects('returns:A|B|C;', | 238 testWithSideEffects('returns:A|B|C;', |
| 258 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 239 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
| 259 testWithSideEffects('returns: A| B |C ;', | 240 testWithSideEffects('returns: A| B |C ;', |
| 260 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); | 241 returns: ['A', 'B', 'C'], creates: ['A', 'B', 'C']); |
| 261 | 242 |
| 262 testWithSideEffects('creates:void;', expectError: true); | 243 testWithSideEffects('creates:void;', expectError: true); |
| 263 testWithSideEffects('creates:;', creates: []); | 244 testWithSideEffects('creates:;', creates: []); |
| 264 testWithSideEffects('creates:var;', creates: []); | 245 testWithSideEffects('creates:var;', creates: []); |
| 265 testWithSideEffects('creates:A;', returns: [], creates: ['A']); | 246 testWithSideEffects('creates:A;', returns: [], creates: ['A']); |
| 266 testWithSideEffects('creates:A|B;', returns: [], creates: ['A', 'B']); | 247 testWithSideEffects('creates:A|B;', returns: [], creates: ['A', 'B']); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 test('gvn:false', expectedGvn: false); | 287 test('gvn:false', expectedGvn: false); |
| 307 test('returns:A;gvn:true', returns: ['A'], expectedGvn: true); | 288 test('returns:A;gvn:true', returns: ['A'], expectedGvn: true); |
| 308 test(' gvn : true ; returns:A;', returns: ['A'], expectedGvn: true); | 289 test(' gvn : true ; returns:A;', returns: ['A'], expectedGvn: true); |
| 309 test('gvn:true;returns:A;gvn:true', expectError: true); | 290 test('gvn:true;returns:A;gvn:true', expectError: true); |
| 310 | 291 |
| 311 test('gvn: true; new: true', expectError: true); | 292 test('gvn: true; new: true', expectError: true); |
| 312 test('gvn: true; new: false', expectedGvn: true, expectedNew: false); | 293 test('gvn: true; new: false', expectedGvn: true, expectedNew: false); |
| 313 test('gvn: false; new: true', expectedGvn: false, expectedNew: true); | 294 test('gvn: false; new: true', expectedGvn: false, expectedNew: true); |
| 314 test('gvn: false; new: false', expectedGvn: false, expectedNew: false); | 295 test('gvn: false; new: false', expectedGvn: false, expectedNew: false); |
| 315 } | 296 } |
| OLD | NEW |