OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
6 | 6 |
7 class NsmEmitter extends CodeEmitterHelper { | 7 class NsmEmitter extends CodeEmitterHelper { |
8 final List<Selector> trivialNsmHandlers = <Selector>[]; | 8 final List<Selector> trivialNsmHandlers = <Selector>[]; |
9 | 9 |
10 /// If this is true then we can generate the noSuchMethod handlers at startup | 10 /// If this is true then we can generate the noSuchMethod handlers at startup |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 284 |
285 return statements; | 285 return statements; |
286 } | 286 } |
287 } | 287 } |
288 | 288 |
289 /// When pretty printed, this node computes a diff-encoded string for the list | 289 /// When pretty printed, this node computes a diff-encoded string for the list |
290 /// of given names. | 290 /// of given names. |
291 /// | 291 /// |
292 /// See [buildTrivialNsmHandlers]. | 292 /// See [buildTrivialNsmHandlers]. |
293 class _DiffEncodedListOfNames extends jsAst.DeferredString | 293 class _DiffEncodedListOfNames extends jsAst.DeferredString |
294 implements AstContainer { | 294 implements jsAst.AstContainer { |
295 String _cachedValue; | 295 String _cachedValue; |
296 jsAst.ArrayInitializer ast; | 296 List<jsAst.ArrayInitializer> ast; |
| 297 |
| 298 Iterable<jsAst.Node> get containedNodes => ast; |
297 | 299 |
298 _DiffEncodedListOfNames(Iterable<Iterable<jsAst.Name>> names) { | 300 _DiffEncodedListOfNames(Iterable<Iterable<jsAst.Name>> names) { |
299 // Store the names in ArrayInitializer nodes to make them discoverable | 301 // Store the names in ArrayInitializer nodes to make them discoverable |
300 // by traversals of the ast. | 302 // by traversals of the ast. |
301 ast = new jsAst.ArrayInitializer( | 303 ast = names.map((Iterable i) => new jsAst.ArrayInitializer(i.toList())) |
302 names.map((Iterable i) => new jsAst.ArrayInitializer(i.toList())) | 304 .toList(); |
303 .toList()); | |
304 } | 305 } |
305 | 306 |
306 void _computeDiffEncodingForList(Iterable<jsAst.Name> names, | 307 void _computeDiffEncodingForList(Iterable<jsAst.Name> names, |
307 StringBuffer diffEncoding) { | 308 StringBuffer diffEncoding) { |
308 // Treat string as a number in base 88 with digits in ASCII order from # to | 309 // Treat string as a number in base 88 with digits in ASCII order from # to |
309 // z. The short name sorting is based on length, and uses ASCII order for | 310 // z. The short name sorting is based on length, and uses ASCII order for |
310 // equal length strings so this means that names are ascending. The hash | 311 // equal length strings so this means that names are ascending. The hash |
311 // character, #, is never given as input, but we need it because it's the | 312 // character, #, is never given as input, but we need it because it's the |
312 // implicit leading zero (otherwise we could not code names with leading | 313 // implicit leading zero (otherwise we could not code names with leading |
313 // dollar signs). | 314 // dollar signs). |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 if (diffEncoding.length != 0) { | 361 if (diffEncoding.length != 0) { |
361 diffEncoding.write(','); | 362 diffEncoding.write(','); |
362 } | 363 } |
363 diffEncoding.write(short); | 364 diffEncoding.write(short); |
364 } | 365 } |
365 } | 366 } |
366 } | 367 } |
367 | 368 |
368 String _computeDiffEncoding() { | 369 String _computeDiffEncoding() { |
369 StringBuffer buffer = new StringBuffer(); | 370 StringBuffer buffer = new StringBuffer(); |
370 for (jsAst.ArrayInitializer list in ast.elements) { | 371 for (jsAst.ArrayInitializer list in ast) { |
371 if (buffer.isNotEmpty) { | 372 if (buffer.isNotEmpty) { |
372 // Emit period that resets the diff base to zero when we switch to | 373 // Emit period that resets the diff base to zero when we switch to |
373 // normal calling convention (this avoids the need to code negative | 374 // normal calling convention (this avoids the need to code negative |
374 // diffs). | 375 // diffs). |
375 buffer.write("."); | 376 buffer.write("."); |
376 } | 377 } |
377 List<jsAst.Name> names = list.elements; | 378 List<jsAst.Name> names = list.elements; |
378 _computeDiffEncodingForList(names, buffer); | 379 _computeDiffEncodingForList(names, buffer); |
379 } | 380 } |
380 return '"${buffer.toString()}"'; | 381 return '"${buffer.toString()}"'; |
381 } | 382 } |
382 | 383 |
383 String get value { | 384 String get value { |
384 if (_cachedValue == null) { | 385 if (_cachedValue == null) { |
385 _cachedValue = _computeDiffEncoding(); | 386 _cachedValue = _computeDiffEncoding(); |
386 } | 387 } |
387 | 388 |
388 return _cachedValue; | 389 return _cachedValue; |
389 } | 390 } |
390 } | 391 } |
OLD | NEW |