Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #library('dart:_interceptors'); | 5 #library('dart:_interceptors'); |
| 6 | 6 |
| 7 #import('dart:coreimpl'); | 7 #import('dart:coreimpl'); |
| 8 | 8 |
| 9 add$1(var receiver, var value) { | 9 add$1(var receiver, var value) { |
| 10 if (isJsArray(receiver)) { | 10 if (isJsArray(receiver)) { |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 355 return UNINTERCEPTED(receiver.every(f)); | 355 return UNINTERCEPTED(receiver.every(f)); |
| 356 } else { | 356 } else { |
| 357 return Collections.every(receiver, f); | 357 return Collections.every(receiver, f); |
| 358 } | 358 } |
| 359 } | 359 } |
| 360 | 360 |
| 361 // TODO(ngeoffray): Make it possible to have just one "sort" function ends | 361 // TODO(ngeoffray): Make it possible to have just one "sort" function ends |
| 362 // an optional parameter. | 362 // an optional parameter. |
| 363 | 363 |
| 364 sort$0(receiver) { | 364 sort$0(receiver) { |
| 365 if (!isJsArray(receiver)) return UNINTERCEPTED(receiver.sort()); | 365 if (!isJsArray(receiver)) return UNINTERCEPTED(receiver.sort()); |
|
floitsch
2012/10/18 12:27:22
After this if I would call sort$1(receiver, Compar
Lasse Reichstein Nielsen
2012/10/18 13:04:00
The trick is that this is simpler because we know
floitsch
2012/10/18 13:46:51
Since the shortcut only applies when it is going t
| |
| 366 checkMutable(receiver, 'sort'); | 366 checkMutable(receiver, 'sort'); |
| 367 DualPivotQuicksort.sort(receiver, Comparable.compare); | 367 |
| 368 int length = JS('int', '#.length', receiver); | |
| 369 if (length == 0 || length == 1) return; | |
|
Lasse Reichstein Nielsen
2012/10/18 13:04:00
<= 1 should be fine, a JS Array's length can't be
| |
| 370 for (int i = 0; i < length; i++) { | |
| 371 // JavaScript's Array.prototype.sort has wierd semantics for null. | |
| 372 // It won't call compare and automatically pushes null/undefined | |
| 373 // to the end. | |
| 374 if (JS('var', '#[#]', receiver, i) == null) { | |
| 375 var other = JS('var', '#[#]', receiver, 0); | |
| 376 if (i == 0) { | |
| 377 other = JS('var', '#[#]', receiver, 1); | |
| 378 } | |
| 379 // Provoke a null error by comparing null to another element in | |
| 380 // the array. | |
| 381 Comparable.compare(null, other); | |
| 382 } | |
| 383 } | |
| 384 | |
| 385 JS('void', '#.sort(#)', receiver, DART_CLOSURE_TO_JS(Comparable.compare)); | |
| 368 } | 386 } |
| 369 | 387 |
| 370 sort$1(receiver, compare) { | 388 sort$1(receiver, compare) { |
| 371 if (!isJsArray(receiver)) return UNINTERCEPTED(receiver.sort(compare)); | 389 if (!isJsArray(receiver)) return UNINTERCEPTED(receiver.sort(compare)); |
| 372 checkMutable(receiver, 'sort'); | 390 checkMutable(receiver, 'sort'); |
| 373 DualPivotQuicksort.sort(receiver, compare); | 391 int length = JS('int', '#.length', receiver); |
|
floitsch
2012/10/18 12:27:22
Just tell dart2js that receiver is a JavaScript-ar
ahe
2012/11/23 08:43:42
How do I do that?
sra1
2012/11/23 10:57:33
This code is dominated by isJsArray(receiver).
Why
floitsch
2012/11/23 13:00:51
It should be, and now with the new interceptor app
| |
| 392 if (length == 0 || length == 1) return; | |
| 393 bool hasNull = false; | |
| 394 var array = receiver; | |
| 395 for (int i = 0; i < length; i++) { | |
|
floitsch
2012/10/18 12:27:22
Given that you already run through the array, you
sra1
2012/11/23 10:57:33
This assumes compareTo returns num, not int. I'm
| |
| 396 // JavaScript's Array.prototype.sort has wierd semantics for null. | |
|
floitsch
2012/10/18 12:27:22
weird
| |
| 397 // It won't call compare and automatically pushes null/undefined | |
| 398 // to the end. | |
| 399 if (JS('var', '#[#]', array, i) == null) { | |
| 400 if (!hasNull) { | |
| 401 array = JS('var', '#.slice(0)', array); | |
|
floitsch
2012/10/18 12:27:22
Why do we need a copy? To avoid the try/finally?
Lasse Reichstein Nielsen
2012/10/19 07:03:21
Because any NullSentinel in the original array wou
| |
| 402 } | |
| 403 JS('var', '#[#] = #', array, i, const NullSentinel()); | |
| 404 hasNull = true; | |
| 405 } | |
| 406 } | |
| 407 var jsCompare; | |
| 408 if (hasNull) { | |
|
floitsch
2012/10/18 12:27:22
I would special case for the Compare.compare:
if (
| |
| 409 jsCompare = DART_CLOSURE_TO_JS(compareHelperNull); | |
| 410 } else { | |
| 411 jsCompare = DART_CLOSURE_TO_JS(compareHelper); | |
| 412 } | |
| 413 // [DART_CLOSURE_TO_JS] only accepts static or top-level functions. | |
| 414 // So we use [compareHelper] and JavaScript's | |
| 415 // Function.prototype.bind to create a new closure we can safely | |
| 416 // pass to JavaScript. | |
| 417 jsCompare = JS('var', '#.bind(#, #)', jsCompare, null, compare); | |
|
Lasse Reichstein Nielsen
2012/10/18 11:54:50
Is 'bind' fast now? That would be great :)
Try re
| |
| 418 | |
| 419 JS('void', '#.sort(#)', receiver, jsCompare); | |
| 420 | |
| 421 if (hasNull) { | |
| 422 for (int i = 0; i < length; i++) { | |
| 423 var element = JS('var', '#[#]', array, i); | |
| 424 if (const NullSentinel() == element) { | |
| 425 element = null; | |
| 426 } | |
| 427 JS('var', '#[#] = #', receiver, i, element); | |
| 428 } | |
| 429 } | |
| 374 } | 430 } |
| 375 | 431 |
| 376 isNegative(receiver) { | 432 isNegative(receiver) { |
| 377 if (receiver is num) { | 433 if (receiver is num) { |
| 378 return (receiver == 0) ? (1 / receiver) < 0 : receiver < 0; | 434 return (receiver == 0) ? (1 / receiver) < 0 : receiver < 0; |
| 379 } else { | 435 } else { |
| 380 return UNINTERCEPTED(receiver.isNegative()); | 436 return UNINTERCEPTED(receiver.isNegative()); |
| 381 } | 437 } |
| 382 } | 438 } |
| 383 | 439 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 677 } else { | 733 } else { |
| 678 return UNINTERCEPTED(receiver.runtimeType); | 734 return UNINTERCEPTED(receiver.runtimeType); |
| 679 } | 735 } |
| 680 } | 736 } |
| 681 | 737 |
| 682 // TODO(lrn): These getters should be generated automatically for all | 738 // TODO(lrn): These getters should be generated automatically for all |
| 683 // intercepted methods. | 739 // intercepted methods. |
| 684 get$toString(receiver) => () => toString(receiver); | 740 get$toString(receiver) => () => toString(receiver); |
| 685 | 741 |
| 686 get$hashCode(receiver) => () => hashCode(receiver); | 742 get$hashCode(receiver) => () => hashCode(receiver); |
| OLD | NEW |