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 import "dart:typed_data"; | 5 import "dart:typed_data"; |
6 | 6 |
7 // JSON conversion. | 7 // JSON conversion. |
8 | 8 |
9 patch _parseJson(String json, reviver(var key, var value)) { | 9 patch _parseJson(String json, reviver(var key, var value)) { |
10 _BuildJsonListener listener; | 10 _BuildJsonListener listener; |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 position++; | 551 position++; |
552 if (position == length) break parsing; | 552 if (position == length) break parsing; |
553 char = source.codeUnitAt(position); | 553 char = source.codeUnitAt(position); |
554 } while (CHAR_0 <= char && char <= CHAR_9); | 554 } while (CHAR_0 <= char && char <= CHAR_9); |
555 } | 555 } |
556 } | 556 } |
557 if (!isDouble) { | 557 if (!isDouble) { |
558 listener.handleNumber(intSign * intValue); | 558 listener.handleNumber(intSign * intValue); |
559 return position; | 559 return position; |
560 } | 560 } |
561 // Consider whether we can have an int/double.parse that works on part of | |
562 // a string, to avoid creating the substring. | |
563 String literal = source.substring(start, position); | |
564 // This correctly creates -0.0 for doubles. | 561 // This correctly creates -0.0 for doubles. |
565 listener.handleNumber(double.parse(literal)); | 562 listener.handleNumber(_parseDouble(source, start, position)); |
566 return position; | 563 return position; |
567 } | 564 } |
568 | 565 |
| 566 static double _parseDouble(String str, |
| 567 int start, int end) native "Double_parse"; |
| 568 |
569 void fail(int position, [String message]) { | 569 void fail(int position, [String message]) { |
570 if (message == null) message = "Unexpected character"; | 570 if (message == null) message = "Unexpected character"; |
571 listener.fail(source, position, message); | 571 listener.fail(source, position, message); |
572 // If the listener didn't throw, do it here. | 572 // If the listener didn't throw, do it here. |
573 String slice; | 573 String slice; |
574 int sliceEnd = position + 20; | 574 int sliceEnd = position + 20; |
575 if (sliceEnd > source.length) { | 575 if (sliceEnd > source.length) { |
576 slice = "'${source.substring(position)}'"; | 576 slice = "'${source.substring(position)}'"; |
577 } else { | 577 } else { |
578 slice = "'${source.substring(position, sliceEnd)}...'"; | 578 slice = "'${source.substring(position, sliceEnd)}...'"; |
579 } | 579 } |
580 throw new FormatException("Unexpected character at $position: $slice"); | 580 throw new FormatException("Unexpected character at $position: $slice"); |
581 } | 581 } |
582 } | 582 } |
583 | 583 |
584 // UTF-8 conversion. | 584 // UTF-8 conversion. |
585 | 585 |
586 patch class _Utf8Encoder { | 586 patch class _Utf8Encoder { |
587 /* patch */ static List<int> _createBuffer(int size) => new Uint8List(size); | 587 /* patch */ static List<int> _createBuffer(int size) => new Uint8List(size); |
588 } | 588 } |
OLD | NEW |