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

Unified Diff: runtime/vm/object.h

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/vm/object.h
===================================================================
--- runtime/vm/object.h (revision 40060)
+++ runtime/vm/object.h (working copy)
@@ -1030,6 +1030,7 @@
RawFunction* LookupConstructor(const String& name) const;
RawFunction* LookupConstructorAllowPrivate(const String& name) const;
RawFunction* LookupFactory(const String& name) const;
+ RawFunction* LookupFactoryAllowPrivate(const String& name) const;
RawFunction* LookupFunction(const String& name) const;
RawFunction* LookupFunctionAllowPrivate(const String& name) const;
RawFunction* LookupGetterFunction(const String& name) const;
@@ -5118,8 +5119,8 @@
class Integer : public Number {
public:
static RawInteger* New(const String& str, Heap::Space space = Heap::kNew);
- static RawInteger* NewFromUint64(
- uint64_t value, Heap::Space space = Heap::kNew);
+ static RawInteger* NewFromUint64(uint64_t value,
+ Heap::Space space = Heap::kNew);
// Returns a canonical Integer object allocated in the old gen space.
static RawInteger* NewCanonical(const String& str);
@@ -5135,27 +5136,19 @@
virtual bool CanonicalizeEquals(const Instance& other) const {
return Equals(other);
}
- virtual bool Equals(const Instance& other) const {
- UNREACHABLE();
- return false;
- }
+ virtual bool Equals(const Instance& other) const;
virtual RawObject* HashCode() const { return raw(); }
- // Integer is an abstract class.
- virtual bool IsZero() const {
- UNREACHABLE();
- return false;
- }
- virtual bool IsNegative() const {
- // Number is an abstract class.
- UNREACHABLE();
- return false;
- }
+ virtual bool IsZero() const;
+ virtual bool IsNegative() const;
+
virtual double AsDoubleValue() const;
virtual int64_t AsInt64Value() const;
virtual uint32_t AsTruncatedUint32Value() const;
+ virtual bool FitsIntoSmi() const;
+
// Returns 0, -1 or 1.
virtual int CompareWith(const Integer& other) const;
@@ -5162,6 +5155,7 @@
// Return the most compact presentation of an integer.
RawInteger* AsValidInteger() const;
+ // Returns null to indicate that a bigint operation is required.
RawInteger* ArithmeticOp(Token::Kind operation, const Integer& other) const;
RawInteger* BitOp(Token::Kind operation, const Integer& other) const;
@@ -5169,9 +5163,6 @@
bool CheckJavascriptIntegerOverflow() const;
private:
- // Return an integer in the form of a RawBigint.
- RawBigint* AsBigint() const;
-
OBJECT_IMPLEMENTATION(Integer, Number);
friend class Class;
};
@@ -5199,6 +5190,8 @@
virtual int64_t AsInt64Value() const;
virtual uint32_t AsTruncatedUint32Value() const;
+ virtual bool FitsIntoSmi() const { return true; }
+
virtual int CompareWith(const Integer& other) const;
static intptr_t InstanceSize() { return 0; }
@@ -5285,6 +5278,8 @@
virtual int64_t AsInt64Value() const;
virtual uint32_t AsTruncatedUint32Value() const;
+ virtual bool FitsIntoSmi() const;
+
virtual int CompareWith(const Integer& other) const;
static intptr_t InstanceSize() {
@@ -5308,15 +5303,9 @@
class Bigint : public Integer {
- private:
- typedef uint32_t Chunk;
- typedef uint64_t DoubleChunk;
- static const int kChunkSize = sizeof(Chunk);
-
public:
- virtual bool IsZero() const { return raw_ptr()->signed_length_ == 0; }
- virtual bool IsNegative() const { return raw_ptr()->signed_length_ < 0; }
-
+ virtual bool IsZero() const { return Used() == 0;}
+ virtual bool IsNegative() const { return Neg(); }
virtual bool Equals(const Instance& other) const;
virtual double AsDoubleValue() const;
@@ -5325,71 +5314,79 @@
virtual int CompareWith(const Integer& other) const;
- static const intptr_t kBytesPerElement = kChunkSize;
- static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
+ virtual bool CheckAndCanonicalizeFields(const char** error_str) const;
- static intptr_t InstanceSize() { return 0; }
+ virtual bool FitsIntoSmi() const;
+ bool FitsIntoInt64() const;
+ bool FitsIntoUint64() const;
+ uint64_t AsUint64Value() const;
- static intptr_t InstanceSize(intptr_t len) {
- ASSERT(0 <= len && len <= kMaxElements);
- return RoundedAllocationSize(sizeof(RawBigint) + (len * kBytesPerElement));
+ static intptr_t InstanceSize() {
+ return RoundedAllocationSize(sizeof(RawBigint));
}
- protected:
- // Only Integer::NewXXX is allowed to call Bigint::NewXXX directly.
- friend class Integer;
+ // Accessors used by native calls from Dart.
+ RawBool* neg() const { return raw_ptr()->neg_; }
+ void set_neg(const Bool& value) const;
+ static intptr_t neg_offset() { return OFFSET_OF(RawBigint, neg_); }
+ RawSmi* used() const { return raw_ptr()->used_; }
+ void set_used(const Smi& value) const;
+ static intptr_t used_offset() { return OFFSET_OF(RawBigint, used_); }
+ RawTypedData* digits() const { return raw_ptr()->digits_; }
+ void set_digits(const TypedData& value) const;
+ static intptr_t digits_offset() { return OFFSET_OF(RawBigint, digits_); }
- RawBigint* BigArithmeticOp(Token::Kind operation, const Bigint& other) const;
+ // Accessors used by runtime calls from C++.
+ bool Neg() const;
+ void SetNeg(bool value) const;
+ intptr_t Used() const;
+ void SetUsed(intptr_t value) const;
+ uint32_t DigitAt(intptr_t index) const;
+ void SetDigitAt(intptr_t index, uint32_t value) const;
- static RawBigint* New(const String& str, Heap::Space space = Heap::kNew);
+ const char* ToDecCString(uword (*allocator)(intptr_t size)) const;
+ const char* ToHexCString(uword (*allocator)(intptr_t size)) const;
+ static const intptr_t kExtraDigits = 4; // Same as _Bigint.EXTRA_DIGITS
+ static const intptr_t kBitsPerDigit = 32; // Same as _Bigint.DIGIT_BITS
+ static const int64_t kDigitBase = 1LL << kBitsPerDigit;
+ static const int64_t kDigitMask = kDigitBase - 1;
+
+ static RawBigint* New(Heap::Space space = Heap::kNew);
+
+ static RawBigint* NewFromInt64(int64_t value,
+ Heap::Space space = Heap::kNew);
+
+ static RawBigint* NewFromUint64(uint64_t value,
+ Heap::Space space = Heap::kNew);
+
+ static RawBigint* NewFromShiftedInt64(int64_t value, intptr_t shift,
+ Heap::Space space = Heap::kNew);
+
+ static RawBigint* NewFromCString(const char* str,
+ Heap::Space space = Heap::kNew);
+
// Returns a canonical Bigint object allocated in the old gen space.
static RawBigint* NewCanonical(const String& str);
private:
- Chunk GetChunkAt(intptr_t i) const {
- return *ChunkAddr(i);
- }
+ static RawBigint* NewFromHexCString(const char* str,
+ Heap::Space space = Heap::kNew);
+ static RawBigint* NewFromDecCString(const char* str,
+ Heap::Space space = Heap::kNew);
- void SetChunkAt(intptr_t i, Chunk newValue) const {
- *ChunkAddr(i) = newValue;
- }
+ // Make sure at least 'length' _digits are allocated.
+ // Copy existing _digits if reallocation is necessary.
+ void EnsureLength(intptr_t length, Heap::Space space = Heap::kNew) const;
- // Returns the number of chunks in use.
- intptr_t Length() const {
- intptr_t signed_length = raw_ptr()->signed_length_;
- return Utils::Abs(signed_length);
- }
+ // Do not count zero high digits as used.
+ void Clamp() const;
- // SetLength does not change the sign.
- void SetLength(intptr_t length) const {
- ASSERT(length >= 0);
- bool is_negative = IsNegative();
- raw_ptr()->signed_length_ = length;
- if (is_negative) ToggleSign();
- }
+ bool IsClamped() const;
- void SetSign(bool is_negative) const {
- if (is_negative != IsNegative()) {
- ToggleSign();
- }
- }
-
- void ToggleSign() const {
- raw_ptr()->signed_length_ = -raw_ptr()->signed_length_;
- }
-
- Chunk* ChunkAddr(intptr_t index) const {
- ASSERT(0 <= index);
- ASSERT(index < Length());
- uword digits_start = reinterpret_cast<uword>(raw_ptr()) + sizeof(RawBigint);
- return &(reinterpret_cast<Chunk*>(digits_start)[index]);
- }
-
static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew);
FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer);
- friend class BigintOperations;
friend class Class;
};
@@ -6607,6 +6604,8 @@
return reinterpret_cast<void*>(raw_ptr()->data() + byte_offset);
}
+ virtual bool CanonicalizeEquals(const Instance& other) const;
+
#define TYPED_GETTER_SETTER(name, type) \
type Get##name(intptr_t byte_offset) const { \
return *reinterpret_cast<type*>(DataAddr(byte_offset)); \

Powered by Google App Engine
This is Rietveld 408576698