| Index: vm/object.cc
|
| ===================================================================
|
| --- vm/object.cc (revision 4707)
|
| +++ vm/object.cc (working copy)
|
| @@ -5952,8 +5952,8 @@
|
| const Bigint& big = Bigint::Handle(Bigint::New(str));
|
| if (BigintOperations::FitsIntoSmi(big)) {
|
| return BigintOperations::ToSmi(big);
|
| - } else if (BigintOperations::FitsIntoInt64(big)) {
|
| - return Mint::New(BigintOperations::ToInt64(big));
|
| + } else if (BigintOperations::FitsIntoMint(big)) {
|
| + return Mint::New(BigintOperations::ToMint(big));
|
| } else {
|
| return big.raw();
|
| }
|
| @@ -6170,7 +6170,7 @@
|
| if (other.IsBigint()) {
|
| Bigint& bigi = Bigint::Handle();
|
| bigi ^= other.raw();
|
| - ASSERT(!BigintOperations::FitsIntoInt64(bigi));
|
| + ASSERT(!BigintOperations::FitsIntoMint(bigi));
|
| if (this->IsNegative() == other.IsNegative()) {
|
| return this->IsNegative() ? 1 : -1;
|
| }
|
| @@ -6329,32 +6329,17 @@
|
| Bigint& other_bgi = Bigint::Handle();
|
| other_bgi ^= other.raw();
|
|
|
| - return BN_cmp(BNAddr(), other_bgi.BNAddr()) == 0;
|
| -}
|
| + intptr_t len = this->Length();
|
| + if (len != other_bgi.Length()) {
|
| + return false;
|
| + }
|
|
|
| -
|
| -RawBigint* Bigint::New(const BIGNUM *bn, Heap::Space space) {
|
| - Isolate* isolate = Isolate::Current();
|
| - const Class& cls = Class::Handle(isolate->object_store()->bigint_class());
|
| - Bigint& result = Bigint::Handle();
|
| - {
|
| - RawObject* raw = Object::Allocate(cls,
|
| - Bigint::InstanceSize(bn),
|
| - space);
|
| - NoGCScope no_gc;
|
| - result ^= raw;
|
| - // Danger Will Robinson! Use of OpenSSL internals!
|
| - // Copy the OpenSSL BIGNUM to our own heap. Don't fix up our d
|
| - // pointer, that'll get done for us.
|
| - BIGNUM* our_bn = result.MutableBNAddr();
|
| - // memcpy would be sufficient.
|
| - memmove(our_bn, bn, sizeof *bn);
|
| - memmove(result.BNMemory(), bn->d, bn->top * sizeof(BN_ULONG));
|
| - // We only allocated/copied the active part.
|
| - our_bn->dmax = our_bn->top;
|
| + for (intptr_t i = 0; i < len; i++) {
|
| + if (this->GetChunkAt(i) != other_bgi.GetChunkAt(i)) {
|
| + return false;
|
| + }
|
| }
|
| -
|
| - return result.raw();
|
| + return true;
|
| }
|
|
|
|
|
| @@ -6374,17 +6359,17 @@
|
|
|
|
|
| int64_t Bigint::AsInt64Value() const {
|
| - if (!BigintOperations::FitsIntoInt64(*this)) {
|
| + if (!BigintOperations::FitsIntoMint(*this)) {
|
| UNREACHABLE();
|
| }
|
| - return BigintOperations::ToInt64(*this);
|
| + return BigintOperations::ToMint(*this);
|
| }
|
|
|
|
|
| // For positive values: Smi < Mint < Bigint.
|
| int Bigint::CompareWith(const Integer& other) const {
|
| ASSERT(!FitsIntoSmi(*this));
|
| - ASSERT(!BigintOperations::FitsIntoInt64(*this));
|
| + ASSERT(!BigintOperations::FitsIntoMint(*this));
|
| if (other.IsBigint()) {
|
| Bigint& big = Bigint::Handle();
|
| big ^= other.raw();
|
| @@ -6397,6 +6382,22 @@
|
| }
|
|
|
|
|
| +RawBigint* Bigint::Allocate(intptr_t length, Heap::Space space) {
|
| + ASSERT(length >= 0);
|
| + Isolate* isolate = Isolate::Current();
|
| + const Class& cls = Class::Handle(isolate->object_store()->bigint_class());
|
| + Bigint& result = Bigint::Handle();
|
| + {
|
| + RawObject* raw = Object::Allocate(cls, Bigint::InstanceSize(length), space);
|
| + NoGCScope no_gc;
|
| + result ^= raw;
|
| + result.raw_ptr()->allocated_length_ = length;
|
| + result.raw_ptr()->signed_length_ = length;
|
| + }
|
| + return result.raw();
|
| +}
|
| +
|
| +
|
| static uword ZoneAllocator(intptr_t size) {
|
| Zone* zone = Isolate::Current()->current_zone();
|
| return zone->Allocate(size);
|
| @@ -6404,7 +6405,9 @@
|
|
|
|
|
| const char* Bigint::ToCString() const {
|
| - return BigintOperations::ToDecCString(*this, &ZoneAllocator);
|
| + // TODO(florian): Add a BigintOperations::ToDecCString method and use that
|
| + // here.
|
| + return BigintOperations::ToHexCString(*this, &ZoneAllocator);
|
| }
|
|
|
|
|
|
|