Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Unified Diff: runtime/lib/integers.dart

Issue 509153003: New bigint implementation in the vm. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/lib/integers.dart
===================================================================
--- runtime/lib/integers.dart (revision 40060)
+++ runtime/lib/integers.dart (working copy)
@@ -5,27 +5,33 @@
// TODO(srdjan): fix limitations.
// - shift amount must be a Smi.
class _IntegerImplementation extends _Num {
- factory _IntegerImplementation._uninstantiable() {
- throw new UnsupportedError(
- "_IntegerImplementation can only be allocated by the VM");
- }
+ // The Dart class _Bigint extending _IntegerImplementation requires a
+ // default constructor.
Type get runtimeType => int;
num operator +(num other) {
- return other._addFromInteger(this);
+ var result = other._addFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._addFromInteger(this);
}
num operator -(num other) {
- return other._subFromInteger(this);
+ var result = other._subFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._subFromInteger(this);
}
num operator *(num other) {
- return other._mulFromInteger(this);
+ var result = other._mulFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._mulFromInteger(this);
}
num operator ~/(num other) {
if ((other is int) && (other == 0)) {
throw const IntegerDivisionByZeroException();
}
- return other._truncDivFromInteger(this);
+ var result = other._truncDivFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._truncDivFromInteger(this);
}
num operator /(num other) {
return this.toDouble() / other.toDouble();
@@ -34,19 +40,27 @@
if ((other is int) && (other == 0)) {
throw const IntegerDivisionByZeroException();
}
- return other._moduloFromInteger(this);
+ var result = other._moduloFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._moduloFromInteger(this);
}
int operator -() {
return 0 - this;
}
int operator &(int other) {
- return other._bitAndFromInteger(this);
+ var result = other._bitAndFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._bitAndFromInteger(this);
}
int operator |(int other) {
- return other._bitOrFromInteger(this);
+ var result = other._bitOrFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._bitOrFromInteger(this);
}
int operator ^(int other) {
- return other._bitXorFromInteger(this);
+ var result = other._bitXorFromInteger(this);
+ if (result != null) return result;
+ return other._toBigint()._bitXorFromInteger(this);
}
num remainder(num other) {
return other._remainderFromInteger(this);
@@ -63,10 +77,14 @@
return other - (other ~/ this) * this;
}
int operator >>(int other) {
- return other._shrFromInt(this);
+ var result = other._shrFromInt(this);
+ if (result != null) return result;
+ return other._toBigint()._shrFromInt(this);
}
int operator <<(int other) {
- return other._shlFromInt(this);
+ var result = other._shlFromInt(this);
+ if (result != null) return result;
+ return other._toBigint()._shlFromInt(this);
}
bool operator <(num other) {
return other > this;
@@ -182,6 +200,7 @@
int toInt() { return this; }
double toDouble() { return new _Double.fromInteger(this); }
+ _Bigint _toBigint() { return new _Bigint()._setInt(this); }
String toStringAsFixed(int fractionDigits) {
return this.toDouble().toStringAsFixed(fractionDigits);
@@ -464,31 +483,3 @@
}
int _shlFromInt(int other) native "Mint_shlFromInt";
}
-
-// A number that can be represented as Smi or Mint will never be represented as
-// Bigint.
-class _Bigint extends _IntegerImplementation implements int {
- factory _Bigint._uninstantiable() {
- throw new UnsupportedError(
- "_Bigint can only be allocated by the VM");
- }
- int get _identityHashCode {
- return this;
- }
- int operator ~() native "Bigint_bitNegate";
- int get bitLength native "Bigint_bitLength";
-
- // Shift by bigint exceeds range that can be handled by the VM.
- int _shrFromInt(int other) {
- if (other < 0) {
- return -1;
- } else {
- return 0;
- }
- }
- int _shlFromInt(int other) native "Bigint_shlFromInt";
-
- int pow(int exponent) {
- throw "Bigint.pow not implemented";
- }
-}
« runtime/lib/bigint.dart ('K') | « runtime/lib/integers.cc ('k') | runtime/lib/math.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698