Index: frog/lib/corelib_impl.dart |
diff --git a/frog/lib/corelib_impl.dart b/frog/lib/corelib_impl.dart |
deleted file mode 100644 |
index 7bb743345561f2cb44398f390ab913620bc2aa29..0000000000000000000000000000000000000000 |
--- a/frog/lib/corelib_impl.dart |
+++ /dev/null |
@@ -1,529 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-#library("dart:coreimpl"); |
- |
-#source("../../corelib/src/implementation/dual_pivot_quicksort.dart"); |
-#source("../../corelib/src/implementation/duration_implementation.dart"); |
-#source("../../corelib/src/implementation/exceptions.dart"); |
-#source("../../corelib/src/implementation/collections.dart"); |
-#source("../../corelib/src/implementation/future_implementation.dart"); |
-#source("../../corelib/src/implementation/hash_map_set.dart"); |
-// TODO(jimhug): Re-explore tradeoffs with using builtin JS maps. |
-#source("../../corelib/src/implementation/linked_hash_map.dart"); |
-#source("../../corelib/src/implementation/maps.dart"); |
-#source("../../corelib/src/implementation/options.dart"); |
-#source("../../corelib/src/implementation/queue.dart"); |
-#source("../../corelib/src/implementation/stopwatch_implementation.dart"); |
-#source("../../corelib/src/implementation/splay_tree.dart"); |
- |
-#source("string_buffer.dart"); |
-#source("string_base.dart"); |
-#source("string_implementation.dart"); |
-#source("arrays.dart"); |
-#source("date_implementation.dart"); |
- |
-#source("function_implementation.dart"); |
- |
-/** |
- * The default implementation of the [List<E>] interface. Essentially a growable |
- * array that will expand automatically as more elements are added. |
- */ |
-class ListFactory<E> implements List<E> native "Array" { |
- ListFactory([int length]) native; |
- |
- // TODO(jmesserly): type parameters aren't working here |
- factory ListFactory.from(Iterable other) { |
- final list = []; |
- for (final e in other) { |
- list.add(e); |
- } |
- return list; |
- } |
- |
- // TODO(jimhug): Only works for Arrays. |
- factory ListFactory.fromList(List other, int startIndex, int endIndex) |
- native 'return other.slice(startIndex, endIndex);'; |
- |
- int length; // all fields on natives are implied native. |
- |
- // List<E> members: |
- E operator [](int index) native; |
- void operator []=(int index, E value) native; |
- void add(E value) native "this.push(value);"; |
- void addLast(E value) native "this.push(value);"; |
- void addAll(Collection<E> collection) { |
- for (E item in collection) add(item); |
- } |
- void sort(int compare(E a, E b)) native; |
- void copyFrom(List<Object> src, int srcStart, int dstStart, int count) native; |
- int indexOf(E element, [int start]) native; |
- int lastIndexOf(E element, [int start]) native; |
- void clear() { length = 0; } |
- |
- E removeLast() native "return this.pop();"; |
- |
- E last() => this[this.length-1]; |
- |
- ListFactory<E> getRange(int start, int rangeLength) { |
- if (rangeLength == 0) return []; |
- if (rangeLength < 0) throw new IllegalArgumentException('length'); |
- if (start < 0 || start + rangeLength > this.length) |
- throw new IndexOutOfRangeException(start); |
- return this._slice(start, start + rangeLength); |
- } |
- |
- void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0]) { |
- // length of 0 prevails and should not throw exceptions. |
- if (rangeLength == 0) return; |
- if (rangeLength < 0) { |
- throw new IllegalArgumentException('length is negative'); |
- } |
- |
- if (start < 0) throw new IndexOutOfRangeException(start); |
- |
- int end = start + rangeLength; |
- if (end > this.length) throw new IndexOutOfRangeException(end); |
- |
- if (startFrom < 0) throw new IndexOutOfRangeException(startFrom); |
- |
- int endFrom = startFrom + rangeLength; |
- if (endFrom > from.length) throw new IndexOutOfRangeException(endFrom); |
- |
- for (var i = 0; i < rangeLength; ++i) |
- this[start + i] = from[startFrom + i]; |
- } |
- |
- void removeRange(int start, int rangeLength) { |
- if (rangeLength == 0) return; |
- if (rangeLength < 0) throw new IllegalArgumentException('length'); |
- if (start < 0 || start + rangeLength > this.length) |
- throw new IndexOutOfRangeException(start); |
- this._splice(start, rangeLength); |
- } |
- |
- void insertRange(int start, int rangeLength, [E initialValue]) { |
- if (rangeLength == 0) return; |
- if (rangeLength < 0) throw new IllegalArgumentException('length'); |
- if (start < 0 || start > this.length) |
- throw new IndexOutOfRangeException(start); |
- |
- // Splice in the values with a minimum of array allocations. |
- var args = new ListFactory(rangeLength + 2); |
- args[0] = start; |
- args[1] = 0; |
- for (var i = 0; i < rangeLength; i++) { |
- args[i + 2] = initialValue; |
- } |
- this._splice_apply(args); |
- } |
- |
- // Collection<E> members: |
- void forEach(void f(E element)) native; |
- ListFactory<E> filter(bool f(E element)) native; |
- ListFactory map(f(E element)) native; |
- bool every(bool f(E element)) native; |
- bool some(bool f(E element)) native; |
- bool isEmpty() => length == 0; |
- |
- // Iterable<E> members: |
- Iterator<E> iterator() => new ListIterator(this); |
- |
- String toString() => Collections.collectionToString(this); |
- |
- // Native methods. |
- ListFactory<E> _slice(start, end) native 'slice'; |
- void _splice(start, length) native 'splice'; |
- void _splice_apply(args) native 'this.splice.apply(this, args)'; |
-} |
- |
-// Iterator for lists. |
-class ListIterator<T> implements Iterator<T> { |
- ListIterator(List<T> array) |
- : _array = array, |
- _pos = 0 { |
- } |
- |
- bool hasNext() { |
- return _array.length > _pos; |
- } |
- |
- T next() { |
- // TODO(jmesserly): this check is redundant in a for-in loop |
- // Must we do it? |
- if (!hasNext()) { |
- throw const NoMoreElementsException(); |
- } |
- return _array[_pos++]; |
- } |
- |
- final List<T> _array; |
- int _pos; |
-} |
- |
-// TODO(jimhug): Enforce immutability on IE |
-ImmutableList _constList(List other) native ''' |
- other.__proto__ = ImmutableList.prototype; |
- return other; |
-''' |
-{ new ImmutableList(other.length); } |
- |
- |
-/** An immutable list. Attempting to modify the list will throw an exception. */ |
-class ImmutableList<E> extends ListFactory<E> { |
- // TODO(jimhug): Can this go away now? |
- int get length() native "return this.length;"; |
- |
- void set length(int length) { |
- throw const IllegalAccessException(); |
- } |
- |
- ImmutableList(int length) : super(length); |
- |
- factory ImmutableList.from(List other) { |
- return _constList(other); |
- } |
- |
- void operator []=(int index, E value) { |
- throw const IllegalAccessException(); |
- } |
- |
- void copyFrom(List src, int srcStart, int dstStart, int count) { |
- throw const IllegalAccessException(); |
- } |
- |
- void setRange(int start, int length, List<E> from, [int startFrom = 0]) { |
- throw const IllegalAccessException(); |
- } |
- |
- void removeRange(int start, int length) { |
- throw const IllegalAccessException(); |
- } |
- |
- void insertRange(int start, int length, [E initialValue = null]) { |
- throw const IllegalAccessException(); |
- } |
- |
- void sort(int compare(E a, E b)) { |
- throw const IllegalAccessException(); |
- } |
- |
- void add(E element) { |
- throw const IllegalAccessException(); |
- } |
- |
- void addLast(E element) { |
- throw const IllegalAccessException(); |
- } |
- |
- void addAll(Collection<E> elements) { |
- throw const IllegalAccessException(); |
- } |
- |
- void clear() { |
- throw const IllegalAccessException(); |
- } |
- |
- E removeLast() { |
- throw const IllegalAccessException(); |
- } |
- |
- String toString() => Collections.collectionToString(this); |
-} |
- |
- |
-LinkedHashMapImplementation _map(List itemsAndKeys) { |
- LinkedHashMapImplementation ret = new LinkedHashMapImplementation(); |
- for (int i=0; i < itemsAndKeys.length;) { |
- ret[itemsAndKeys[i++]] = itemsAndKeys[i++]; |
- } |
- return ret; |
-} |
- |
-ImmutableMap _constMap(List itemsAndKeys) { |
- return new ImmutableMap(itemsAndKeys); |
-} |
- |
-/** An immutable map. */ |
-class ImmutableMap<K, V> implements Map<K, V> { |
- final Map<K, V> _internal; |
- |
- ImmutableMap(List keyValuePairs) : _internal = _map(keyValuePairs); |
- |
- V operator [](K key) => _internal[key]; |
- |
- bool isEmpty() => _internal.isEmpty(); |
- |
- int get length() => _internal.length; |
- |
- void forEach(void f(K key, V value)) { |
- _internal.forEach(f); |
- } |
- |
- Collection<K> getKeys() => _internal.getKeys(); |
- |
- Collection<V> getValues() => _internal.getValues(); |
- |
- bool containsKey(K key) => _internal.containsKey(key); |
- |
- bool containsValue(V value) => _internal.containsValue(value); |
- |
- void operator []=(K key, V value) { |
- throw const IllegalAccessException(); |
- } |
- |
- V putIfAbsent(K key, V ifAbsent()) { |
- throw const IllegalAccessException(); |
- } |
- |
- void clear() { |
- throw const IllegalAccessException(); |
- } |
- |
- V remove(K key) { |
- throw const IllegalAccessException(); |
- } |
- |
- String toString() => Maps.mapToString(this); |
-} |
- |
- |
-// TODO(jmesserly): this should wrap real RegExp when we can |
-// We can't do it yet because we'd need a way to redirect the const |
-// default constructor. |
-// TODO(jimhug): One way to resolve this is to make the const constructor |
-// very special in order for it to generate JS regex literals into the code |
-// and then treat the constructor as a factory. |
-class JSSyntaxRegExp implements RegExp { |
- final String pattern; |
- final bool multiLine; |
- final bool ignoreCase; |
- |
- const JSSyntaxRegExp(String pattern, [bool multiLine, bool ignoreCase]): |
- this._create(pattern, |
- (multiLine == true ? 'm' : '') + (ignoreCase == true ? 'i' : '')); |
- |
- const JSSyntaxRegExp._create(String pattern, String flags) native |
- '''this.re = new RegExp(pattern, flags); |
- this.pattern = pattern; |
- this.multiLine = this.re.multiline; |
- this.ignoreCase = this.re.ignoreCase;'''; |
- |
- Match firstMatch(String str) { |
- List<String> m = _exec(str); |
- return m == null ? null |
- : new MatchImplementation(pattern, str, _matchStart(m), _lastIndex, m); |
- } |
- |
- List<String> _exec(String str) native "return this.re.exec(str);" { |
- // Note: this code is just a hint to tell the frog compiler the dependencies |
- // this native code might have. It is not an implementation. |
- return []; |
- } |
- int _matchStart(m) native "return m.index;"; |
- int get _lastIndex() native "return this.re.lastIndex;"; |
- |
- bool hasMatch(String str) native "return this.re.test(str);"; |
- |
- String stringMatch(String str) { |
- var match = firstMatch(str); |
- return match === null ? null : match.group(0); |
- } |
- |
- Iterable<Match> allMatches(String str) => new _AllMatchesIterable(this, str); |
- |
- /** |
- * Returns a new RegExp with the same pattern as this one and with the |
- * "global" flag set. This allows us to match this RegExp against a string |
- * multiple times, to support things like [allMatches] and |
- * [String.replaceAll]. |
- * |
- * Note that the returned RegExp disobeys the normal API in that it maintains |
- * state about the location of the last match. |
- */ |
- JSSyntaxRegExp get _global() => new JSSyntaxRegExp._create(pattern, |
- 'g' + (multiLine ? 'm' : '') + (ignoreCase ? 'i' : '')); |
-} |
- |
-class MatchImplementation implements Match { |
- const MatchImplementation( |
- String this.pattern, |
- String this.str, |
- int this._start, |
- int this._end, |
- List<String> this._groups); |
- |
- final String pattern; |
- final String str; |
- final int _start; |
- final int _end; |
- final List<String> _groups; |
- |
- int start() => _start; |
- int end() => _end; |
- String group(int groupIndex) => _groups[groupIndex]; |
- String operator [](int groupIndex) => _groups[groupIndex]; |
- int groupCount() => _groups.length; |
- |
- List<String> groups(List<int> groupIndices) { |
- List<String> out = []; |
- groupIndices.forEach((int groupIndex) => out.add(_groups[groupIndex])); |
- return out; |
- } |
-} |
- |
-class _AllMatchesIterable implements Iterable<Match> { |
- final JSSyntaxRegExp _re; |
- final String _str; |
- |
- const _AllMatchesIterable(this._re, this._str); |
- |
- Iterator<Match> iterator() => new _AllMatchesIterator(_re, _str); |
-} |
- |
-class _AllMatchesIterator implements Iterator<Match> { |
- final RegExp _re; |
- final String _str; |
- Match _next; |
- bool _done; |
- |
- _AllMatchesIterator(JSSyntaxRegExp re, String this._str) |
- : _done = false, _re = re._global; |
- |
- Match next() { |
- if (!hasNext()) { |
- throw const NoMoreElementsException(); |
- } |
- |
- // _next is set by #hasNext |
- var result = _next; |
- _next = null; |
- return result; |
- } |
- |
- bool hasNext() { |
- if (_done) { |
- return false; |
- } else if (_next != null) { |
- return true; |
- } |
- |
- _next = _re.firstMatch(_str); |
- if (_next == null) { |
- _done = true; |
- return false; |
- } else { |
- return true; |
- } |
- } |
-} |
- |
- |
-class NumImplementation implements int, double native "Number" { |
- // Arithmetic operations. |
- num operator +(num other) native; |
- num operator -(num other) native; |
- num operator *(num other) native; |
- num operator %(num other) native; |
- num operator /(num other) native; |
- // Truncating division. |
- // TODO(jimhug): Implement |
- num operator ~/(num other) native; |
- // The unary '-' operator. |
- num operator negate() native "'use strict'; return -this;"; |
- |
- // Relational operations. |
- bool operator <(num other) native; |
- bool operator <=(num other) native; |
- bool operator >(num other) native; |
- bool operator >=(num other) native; |
- |
- bool operator ==(var other) native; |
- |
- // Bitwise operations |
- int operator &(int other) native; |
- int operator |(int other) native; |
- int operator ^(int other) native; |
- int operator ~() native; |
- int operator <<(int shiftAmount) native; |
- int operator >>(int shiftAmount) native; |
- |
- |
- // TODO(jimhug): Move these out of methods to avoid boxing when not needed. |
- // TODO(jmesserly): for now I'm avoiding boxing with "use strict", however, |
- // we might want to do something better. It would be nice if operators and |
- // methods on String/num were handled in a uniform way. |
- num remainder(num other) native "'use strict'; return this % other;"; |
- |
- bool isEven() native "'use strict'; return ((this & 1) == 0);"; |
- bool isOdd() native "'use strict'; return ((this & 1) == 1);"; |
- bool isNaN() native "'use strict'; return isNaN(this);"; |
- bool isNegative() native |
- "'use strict'; return this == 0 ? (1 / this) < 0 : this < 0;"; |
- bool isInfinite() native |
- "'use strict'; return (this == Infinity) || (this == -Infinity);"; |
- |
- num abs() native "'use strict'; return Math.abs(this);"; |
- num round() native "'use strict'; return Math.round(this);"; |
- num floor() native "'use strict'; return Math.floor(this);"; |
- num ceil() native "'use strict'; return Math.ceil(this);"; |
- num truncate() native |
- "'use strict'; return (this < 0) ? Math.ceil(this) : Math.floor(this);"; |
- |
- int hashCode() native "'use strict'; return this & 0x1FFFFFFF;"; |
- |
- // If truncated is -0.0 return +0. The test will also trigger for positive |
- // 0s but that's not a problem. |
- int toInt() native ''' |
- 'use strict'; |
- if (isNaN(this)) \$throw(new BadNumberFormatException("NaN")); |
- if ((this == Infinity) || (this == -Infinity)) { |
- \$throw(new BadNumberFormatException("Infinity")); |
- } |
- var truncated = (this < 0) ? Math.ceil(this) : Math.floor(this); |
- if (truncated == -0.0) return 0; |
- return truncated;''' { throw new BadNumberFormatException(""); } |
- |
- double toDouble() native "'use strict'; return this + 0;"; |
- |
- String toStringAsFixed(int fractionDigits) native |
- "'use strict'; return this.toFixed(fractionDigits);"; |
- String toStringAsExponential(int fractionDigits) native |
- "'use strict'; return this.toExponential(fractionDigits)"; |
- String toStringAsPrecision(int precision) native |
- "'use strict'; return this.toPrecision(precision)"; |
- String toRadixString(int radix) native |
- "'use strict'; return this.toString(radix)"; |
- |
- // CompareTo has to give a complete order, including -0/+0, NaN and |
- // Infinities. |
- // Order is: -Inf < .. < -0.0 < 0.0 .. < +inf < NaN. |
- int compareTo(NumImplementation other) { |
- // Don't use the 'this' object (which is a JS Number object), but get the |
- // primitive JS number by invoking toDouble(). |
- num thisValue = toDouble(); |
- // Remember that NaN return false for any comparison. |
- if (thisValue < other) { |
- return -1; |
- } else if (thisValue > other) { |
- return 1; |
- } else if (thisValue == other) { |
- if (thisValue == 0) { |
- bool thisIsNegative = isNegative(); |
- bool otherIsNegative = other.isNegative(); |
- if (thisIsNegative == otherIsNegative) return 0; |
- if (thisIsNegative) return -1; |
- return 1; |
- } |
- return 0; |
- } else if (isNaN()) { |
- if (other.isNaN()) { |
- return 0; |
- } |
- return 1; |
- } else { |
- return -1; |
- } |
- } |
-} |