| OLD | NEW | 
|---|
| 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dartino 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. | 
| 4 | 4 | 
| 5 library dart.core_patch; | 5 library dart.core_patch; | 
| 6 | 6 | 
| 7 import 'dart:fletch._system' as fletch; | 7 import 'dart:dartino._system' as dartino; | 
| 8 import 'dart:fletch._system' show patch; | 8 import 'dart:dartino._system' show patch; | 
| 9 import 'dart:collection' show LinkedHashMap, UnmodifiableMapView; | 9 import 'dart:collection' show LinkedHashMap, UnmodifiableMapView; | 
| 10 | 10 | 
| 11 part 'bigint.dart'; | 11 part 'bigint.dart'; | 
| 12 part 'case.dart'; | 12 part 'case.dart'; | 
| 13 part 'double.dart'; | 13 part 'double.dart'; | 
| 14 part 'int.dart'; | 14 part 'int.dart'; | 
| 15 part 'regexp.dart'; | 15 part 'regexp.dart'; | 
| 16 part 'string.dart'; | 16 part 'string.dart'; | 
| 17 | 17 | 
| 18 @patch external bool identical(Object a, Object b); | 18 @patch external bool identical(Object a, Object b); | 
| 19 | 19 | 
| 20 @patch int identityHashCode(Object object) { | 20 @patch int identityHashCode(Object object) { | 
| 21   if (object is int) return object; | 21   if (object is int) return object; | 
| 22   return _identityHashCode(object); | 22   return _identityHashCode(object); | 
| 23 } | 23 } | 
| 24 | 24 | 
| 25 @fletch.native external _identityHashCode(Object object); | 25 @dartino.native external _identityHashCode(Object object); | 
| 26 | 26 | 
| 27 @patch class Object { | 27 @patch class Object { | 
| 28   @patch String toString() => '[object Object]'; | 28   @patch String toString() => '[object Object]'; | 
| 29 | 29 | 
| 30   @patch int get hashCode => _identityHashCode(this); | 30   @patch int get hashCode => _identityHashCode(this); | 
| 31 | 31 | 
| 32   @patch noSuchMethod(Invocation invocation) { | 32   @patch noSuchMethod(Invocation invocation) { | 
| 33     if (invocation is fletch.FletchInvocation) { | 33     if (invocation is dartino.DartinoInvocation) { | 
| 34       throw invocation.asNoSuchMethodError; | 34       throw invocation.asNoSuchMethodError; | 
| 35     } | 35     } | 
| 36     // TODO(ahe): Get rid of this call. | 36     // TODO(ahe): Get rid of this call. | 
| 37     fletch.unresolved("<unknown>"); | 37     dartino.unresolved("<unknown>"); | 
| 38   } | 38   } | 
| 39 | 39 | 
| 40   // The noSuchMethod helper is automatically called from the | 40   // The noSuchMethod helper is automatically called from the | 
| 41   // trampoline and it is passed the selector. The arguments | 41   // trampoline and it is passed the selector. The arguments | 
| 42   // to the original call are still present on the stack, so | 42   // to the original call are still present on the stack, so | 
| 43   // it is possible to dig them out if need be. | 43   // it is possible to dig them out if need be. | 
| 44   _noSuchMethod(receiver, receiverClass, receiverSelector) { | 44   _noSuchMethod(receiver, receiverClass, receiverSelector) { | 
| 45     // NOTE: The number and type of arguments here must be kept in sync with: | 45     // NOTE: The number and type of arguments here must be kept in sync with: | 
| 46     //     src/vm/interpreter.cc:HandleEnterNoSuchMethod | 46     //     src/vm/interpreter.cc:HandleEnterNoSuchMethod | 
| 47     return noSuchMethod(new fletch.FletchInvocation( | 47     return noSuchMethod(new dartino.DartinoInvocation( | 
| 48         receiver, receiverClass, receiverSelector)); | 48         receiver, receiverClass, receiverSelector)); | 
| 49   } | 49   } | 
| 50 | 50 | 
| 51   // The noSuchMethod trampoline is automatically generated | 51   // The noSuchMethod trampoline is automatically generated | 
| 52   // by the compiler. It calls the noSuchMethod helper and | 52   // by the compiler. It calls the noSuchMethod helper and | 
| 53   // takes care off removing an arbitrary number of arguments | 53   // takes care off removing an arbitrary number of arguments | 
| 54   // from the caller stack before it returns. | 54   // from the caller stack before it returns. | 
| 55   external _noSuchMethodTrampoline(); | 55   external _noSuchMethodTrampoline(); | 
| 56 } | 56 } | 
| 57 | 57 | 
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 181     } | 181     } | 
| 182     return '[object Object]'; | 182     return '[object Object]'; | 
| 183   } | 183   } | 
| 184 | 184 | 
| 185   @patch StackTrace get stackTrace { | 185   @patch StackTrace get stackTrace { | 
| 186     throw "getter stackTrace is unimplemented"; | 186     throw "getter stackTrace is unimplemented"; | 
| 187   } | 187   } | 
| 188 } | 188 } | 
| 189 | 189 | 
| 190 @patch class Stopwatch { | 190 @patch class Stopwatch { | 
| 191   @patch @fletch.native external static int _now(); | 191   @patch @dartino.native external static int _now(); | 
| 192 | 192 | 
| 193   @patch static int _initTicker() { | 193   @patch static int _initTicker() { | 
| 194     _frequency = _fletchNative_frequency(); | 194     _frequency = _dartinoNative_frequency(); | 
| 195   } | 195   } | 
| 196 | 196 | 
| 197   @fletch.native external static int _fletchNative_frequency(); | 197   @dartino.native external static int _dartinoNative_frequency(); | 
| 198 } | 198 } | 
| 199 | 199 | 
| 200 @patch class RegExp { | 200 @patch class RegExp { | 
| 201   @patch factory RegExp(String source, {bool multiLine: false, | 201   @patch factory RegExp(String source, {bool multiLine: false, | 
| 202                                         bool caseSensitive: true}) { | 202                                         bool caseSensitive: true}) { | 
| 203     return new _MiniExp(source, multiLine, caseSensitive); | 203     return new _MiniExp(source, multiLine, caseSensitive); | 
| 204   } | 204   } | 
| 205 } | 205 } | 
| 206 | 206 | 
| 207 @patch class List { | 207 @patch class List { | 
| 208   @patch factory List([int length]) { | 208   @patch factory List([int length]) { | 
| 209     return fletch.newList(length); | 209     return dartino.newList(length); | 
| 210   } | 210   } | 
| 211 | 211 | 
| 212   @patch factory List.filled(int length, E fill) { | 212   @patch factory List.filled(int length, E fill) { | 
| 213     // All error handling on the length parameter is done at the implementation | 213     // All error handling on the length parameter is done at the implementation | 
| 214     // of new _List. | 214     // of new _List. | 
| 215     var result = fletch.newList(length); | 215     var result = dartino.newList(length); | 
| 216     if (fill != null) { | 216     if (fill != null) { | 
| 217       for (int i = 0; i < length; i++) { | 217       for (int i = 0; i < length; i++) { | 
| 218         result[i] = fill; | 218         result[i] = fill; | 
| 219       } | 219       } | 
| 220     } | 220     } | 
| 221     return result; | 221     return result; | 
| 222   } | 222   } | 
| 223 | 223 | 
| 224   @patch factory List.from(Iterable elements, {bool growable: true}) { | 224   @patch factory List.from(Iterable elements, {bool growable: true}) { | 
| 225     // TODO(ajohnsen): elements.length can be slow if not a List. Consider | 225     // TODO(ajohnsen): elements.length can be slow if not a List. Consider | 
| 226     // fast-path non-list & growable, and create internal helper for non-list & | 226     // fast-path non-list & growable, and create internal helper for non-list & | 
| 227     // non-growable. | 227     // non-growable. | 
| 228     int length = elements.length; | 228     int length = elements.length; | 
| 229     var list; | 229     var list; | 
| 230     if (growable) { | 230     if (growable) { | 
| 231       list = fletch.newList(null); | 231       list = dartino.newList(null); | 
| 232       list.length = length; | 232       list.length = length; | 
| 233     } else { | 233     } else { | 
| 234       list = fletch.newList(length); | 234       list = dartino.newList(length); | 
| 235     } | 235     } | 
| 236     if (elements is List) { | 236     if (elements is List) { | 
| 237       for (int i = 0; i < length; i++) { | 237       for (int i = 0; i < length; i++) { | 
| 238         list[i] = elements[i]; | 238         list[i] = elements[i]; | 
| 239       } | 239       } | 
| 240     } else { | 240     } else { | 
| 241       int i = 0; | 241       int i = 0; | 
| 242       elements.forEach((e) { list[i++] = e; }); | 242       elements.forEach((e) { list[i++] = e; }); | 
| 243     } | 243     } | 
| 244     return list; | 244     return list; | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 287           source.startsWith('+0x')) { | 287           source.startsWith('+0x')) { | 
| 288         if (onError != null) return onError(source); | 288         if (onError != null) return onError(source); | 
| 289         throw new FormatException("Can't parse string as integer", source); | 289         throw new FormatException("Can't parse string as integer", source); | 
| 290       } | 290       } | 
| 291     } else { | 291     } else { | 
| 292       if (radix < 2 || radix > 36) throw new ArgumentError(radix); | 292       if (radix < 2 || radix > 36) throw new ArgumentError(radix); | 
| 293     } | 293     } | 
| 294     return _parse(source, radix, onError); | 294     return _parse(source, radix, onError); | 
| 295   } | 295   } | 
| 296 | 296 | 
| 297   @fletch.native static int _parse( | 297   @dartino.native static int _parse( | 
| 298       String source, | 298       String source, | 
| 299       int radix, | 299       int radix, | 
| 300       int onError(String source)) { | 300       int onError(String source)) { | 
| 301     switch (fletch.nativeError) { | 301     switch (dartino.nativeError) { | 
| 302       case fletch.wrongArgumentType: | 302       case dartino.wrongArgumentType: | 
| 303         throw new ArgumentError(source); | 303         throw new ArgumentError(source); | 
| 304       case fletch.indexOutOfBounds: | 304       case dartino.indexOutOfBounds: | 
| 305         if (onError != null) return onError(source); | 305         if (onError != null) return onError(source); | 
| 306         throw new FormatException("Can't parse string as integer", source); | 306         throw new FormatException("Can't parse string as integer", source); | 
| 307     } | 307     } | 
| 308   } | 308   } | 
| 309 | 309 | 
| 310   @patch factory int.fromEnvironment( | 310   @patch factory int.fromEnvironment( | 
| 311       String name, | 311       String name, | 
| 312       {int defaultValue}) => defaultValue; | 312       {int defaultValue}) => defaultValue; | 
| 313 } | 313 } | 
| 314 | 314 | 
| 315 @patch class double { | 315 @patch class double { | 
| 316   @patch static double parse(String source, [double onError(String source)]) { | 316   @patch static double parse(String source, [double onError(String source)]) { | 
| 317     return _parse(source.trim(), onError); | 317     return _parse(source.trim(), onError); | 
| 318   } | 318   } | 
| 319 | 319 | 
| 320   @fletch.native static double _parse( | 320   @dartino.native static double _parse( | 
| 321       String source, | 321       String source, | 
| 322       double onError(String source)) { | 322       double onError(String source)) { | 
| 323     switch (fletch.nativeError) { | 323     switch (dartino.nativeError) { | 
| 324       case fletch.wrongArgumentType: | 324       case dartino.wrongArgumentType: | 
| 325         throw new ArgumentError(source); | 325         throw new ArgumentError(source); | 
| 326       case fletch.indexOutOfBounds: | 326       case dartino.indexOutOfBounds: | 
| 327         if (onError != null) return onError(source); | 327         if (onError != null) return onError(source); | 
| 328         throw new FormatException("Can't parse string as double", source); | 328         throw new FormatException("Can't parse string as double", source); | 
| 329     } | 329     } | 
| 330   } | 330   } | 
| 331 } | 331 } | 
| 332 | 332 | 
| 333 @patch class DateTime { | 333 @patch class DateTime { | 
| 334   static const _MILLISECOND_INDEX = 0; | 334   static const _MILLISECOND_INDEX = 0; | 
| 335   static const _SECOND_INDEX = 1; | 335   static const _SECOND_INDEX = 1; | 
| 336   static const _MINUTE_INDEX = 2; | 336   static const _MINUTE_INDEX = 2; | 
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 650   static int _timeZoneOffsetInSeconds(int millisecondsSinceEpoch) { | 650   static int _timeZoneOffsetInSeconds(int millisecondsSinceEpoch) { | 
| 651     int equivalentSeconds = _equivalentSeconds(millisecondsSinceEpoch); | 651     int equivalentSeconds = _equivalentSeconds(millisecondsSinceEpoch); | 
| 652     return _timeZoneOffset(equivalentSeconds); | 652     return _timeZoneOffset(equivalentSeconds); | 
| 653   } | 653   } | 
| 654 | 654 | 
| 655   static String _timeZoneName(int millisecondsSinceEpoch) { | 655   static String _timeZoneName(int millisecondsSinceEpoch) { | 
| 656     int equivalentSeconds = _equivalentSeconds(millisecondsSinceEpoch); | 656     int equivalentSeconds = _equivalentSeconds(millisecondsSinceEpoch); | 
| 657     return _timeZone(equivalentSeconds); | 657     return _timeZone(equivalentSeconds); | 
| 658   } | 658   } | 
| 659 | 659 | 
| 660   @fletch.native external static int _getCurrentMs(); | 660   @dartino.native external static int _getCurrentMs(); | 
| 661 | 661 | 
| 662   @fletch.native external static String _timeZone(int clampedSecondsSinceEpoch); | 662   @dartino.native external static String _timeZone(int clampedSecondsSinceEpoch)
     ; | 
| 663 | 663 | 
| 664   @fletch.native external static int _timeZoneOffset( | 664   @dartino.native external static int _timeZoneOffset( | 
| 665       int clampedSecondsSinceEpoch); | 665       int clampedSecondsSinceEpoch); | 
| 666 | 666 | 
| 667   @fletch.native external static int _localTimeZoneOffset(); | 667   @dartino.native external static int _localTimeZoneOffset(); | 
| 668 } | 668 } | 
| 669 | 669 | 
| 670 @patch class Uri { | 670 @patch class Uri { | 
| 671   @patch static Uri get base { | 671   @patch static Uri get base { | 
| 672     return new Uri.file(_base()); | 672     return new Uri.file(_base()); | 
| 673   } | 673   } | 
| 674 | 674 | 
| 675   @patch static bool get _isWindows => false; | 675   @patch static bool get _isWindows => false; | 
| 676 | 676 | 
| 677   @fletch.native static String _base() { | 677   @dartino.native static String _base() { | 
| 678     throw new RangeError("The Uri.base path is too large"); | 678     throw new RangeError("The Uri.base path is too large"); | 
| 679   } | 679   } | 
| 680 | 680 | 
| 681   /// Encodes all characters in the string [text] except for those | 681   /// Encodes all characters in the string [text] except for those | 
| 682   /// that appear in [canonicalTable], and returns the escaped string. | 682   /// that appear in [canonicalTable], and returns the escaped string. | 
| 683   @patch static String _uriEncode( | 683   @patch static String _uriEncode( | 
| 684       List<int> canonicalTable, | 684       List<int> canonicalTable, | 
| 685       String text, | 685       String text, | 
| 686       Encoding encoding, | 686       Encoding encoding, | 
| 687       bool spaceToPlus) { | 687       bool spaceToPlus) { | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 703       } else if (spaceToPlus && byte == _SPACE) { | 703       } else if (spaceToPlus && byte == _SPACE) { | 
| 704         result.writeCharCode(_PLUS); | 704         result.writeCharCode(_PLUS); | 
| 705       } else { | 705       } else { | 
| 706         result.writeCharCode(_PERCENT); | 706         result.writeCharCode(_PERCENT); | 
| 707         byteToHex(byte, result); | 707         byteToHex(byte, result); | 
| 708       } | 708       } | 
| 709     } | 709     } | 
| 710     return result.toString(); | 710     return result.toString(); | 
| 711   } | 711   } | 
| 712 } | 712 } | 
| OLD | NEW | 
|---|