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

Unified Diff: vm/bigint_operations.h

Issue 9481019: Changes to get rid of dependency on openssl in the dart VM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 10 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
« no previous file with comments | « platform/globals.h ('k') | vm/bigint_operations.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: vm/bigint_operations.h
===================================================================
--- vm/bigint_operations.h (revision 4707)
+++ vm/bigint_operations.h (working copy)
@@ -1,19 +1,12 @@
-// Copyright (c) 2011, 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.
+// Copyright 2012 Google Inc. All Rights Reserved.
#ifndef VM_BIGINT_OPERATIONS_H_
#define VM_BIGINT_OPERATIONS_H_
-#include "vm/heap.h"
+#include "platform/utils.h"
+
#include "vm/object.h"
-#include "vm/token.h"
-// This should be folded into OpenSSL
-#undef BN_abs_is_word
-#define BN_abs_is_word(a, w) (((a)->top == 1) \
- && ((a)->d[0] == static_cast<BN_ULONG>(w)))
-
namespace dart {
class BigintOperations : public AllStatic {
@@ -33,29 +26,28 @@
// only contain hex-digits. No sign or leading "0x" is allowed.
static RawBigint* FromHexCString(const char* str,
Heap::Space space = Heap::kNew);
+
// The given string must be a nul-terminated string of decimal digits. It
// must only contain decimal digits (0-9). No sign is allowed. Leading
// zeroes are ignored.
static RawBigint* FromDecimalCString(const char* str,
- Heap::Space space = Heap::kNew);
- // Converts the bigint to a string. The returned string is prepended by
+ Heap::Space space = Heap::kNew);
+
+ // Converts the bigint to a HEX string. The returned string is prepended by
// a "0x" (after the optional minus-sign).
- static const char* ToHexCString(const BIGNUM* bn,
+ static const char* ToHexCString(intptr_t length,
+ bool is_negative,
+ void* data,
uword (*allocator)(intptr_t size));
+
static const char* ToHexCString(const Bigint& bigint,
uword (*allocator)(intptr_t size));
- // Converts the bigint to a string.
- static const char* ToDecCString(const BIGNUM* bn,
- uword (*allocator)(intptr_t size));
- static const char* ToDecCString(const Bigint& bigint,
- uword (*allocator)(intptr_t size));
-
static bool FitsIntoSmi(const Bigint& bigint);
static RawSmi* ToSmi(const Bigint& bigint);
- static bool FitsIntoInt64(const Bigint& bigint);
- static int64_t ToInt64(const Bigint& bigint);
+ static bool FitsIntoMint(const Bigint& bigint);
+ static int64_t ToMint(const Bigint& bigint);
static bool FitsIntoUint64(const Bigint& bigint);
static uint64_t ToUint64(const Bigint& bigint);
@@ -63,8 +55,14 @@
static RawDouble* ToDouble(const Bigint& bigint);
- static RawBigint* Add(const Bigint& a, const Bigint& b);
- static RawBigint* Subtract(const Bigint& a, const Bigint& b);
+ static RawBigint* Add(const Bigint& a, const Bigint& b) {
+ bool negate_b = false;
+ return AddSubtract(a, b, negate_b);
+ }
+ static RawBigint* Subtract(const Bigint& a, const Bigint& b) {
+ bool negate_b = true;
+ return AddSubtract(a, b, negate_b);
+ }
static RawBigint* Multiply(const Bigint& a, const Bigint& b);
// TODO(floitsch): what to do for divisions by zero.
static RawBigint* Divide(const Bigint& a, const Bigint& b);
@@ -77,27 +75,60 @@
static RawBigint* BitOr(const Bigint& a, const Bigint& b);
static RawBigint* BitXor(const Bigint& a, const Bigint& b);
static RawBigint* BitNot(const Bigint& bigint);
- static RawInteger* BitAndWithSmi(const Bigint& bigint, const Smi& smi);
- static RawInteger* BitOrWithSmi(const Bigint& bigint, const Smi& smi);
- static RawInteger* BitXorWithSmi(const Bigint& bigint, const Smi& smi);
static int Compare(const Bigint& a, const Bigint& b);
+ static bool IsClamped(const Bigint& bigint) {
+ intptr_t length = bigint.Length();
+ return (length == 0) || (bigint.GetChunkAt(length - 1) != 0);
+ }
private:
- static BIGNUM* TmpBN();
- static BN_CTX* TmpBNCtx();
+ typedef Bigint::Chunk Chunk;
+ typedef Bigint::DoubleChunk DoubleChunk;
+ static const int kDigitBitSize = 28;
+ static const Chunk kDigitMask = (static_cast<Chunk>(1) << kDigitBitSize) - 1;
+ static const Chunk kDigitMaxValue = kDigitMask;
+ static const int kChunkSize = sizeof(Chunk);
+ static const int kChunkBitSize = kChunkSize * kBitsPerByte;
+
+ static RawBigint* Zero() { return Bigint::Allocate(0); }
static RawBigint* One() {
- Bigint& result = Bigint::Handle(NewFromInt64(1));
+ Bigint& result = Bigint::Handle(Bigint::Allocate(1));
+ result.SetChunkAt(0, 1);
return result.raw();
}
- static RawBigint* BitTT(const Bigint& a, const Bigint& b, bool tt[4]);
- // The following function only works for bit-and and bit-or.
- static RawSmi* BitOpWithSmi(Token::Kind kind,
- const Bigint& bigint,
- const Smi& smi);
+ static RawBigint* MinusOne() {
+ Bigint& result = Bigint::Handle(One());
+ result.ToggleSign();
+ return result.raw();
+ }
+ // Performs an addition or subtraction depending on the negate_b argument.
+ static RawBigint* AddSubtract(const Bigint& a,
+ const Bigint& b,
+ bool negate_b);
+
+ static int UnsignedCompare(const Bigint& a, const Bigint& b);
+ static int UnsignedCompareNonClamped(const Bigint& a, const Bigint& b);
+ static RawBigint* UnsignedAdd(const Bigint& a, const Bigint& b);
+ static RawBigint* UnsignedSubtract(const Bigint& a, const Bigint& b);
+
+ static RawBigint* MultiplyWithDigit(const Bigint& bigint, Chunk digit);
+ static RawBigint* DigitsShiftLeft(const Bigint& bigint, intptr_t amount) {
+ return ShiftLeft(bigint, amount * kDigitBitSize);
+ }
+ static void DivideRemainder(const Bigint& a, const Bigint& b,
+ Bigint* quotient, Bigint* remainder);
+
+ // Removes leading zero-chunks by adjusting the bigint's length.
+ static void Clamp(const Bigint& bigint);
+
+ static RawBigint* Copy(const Bigint& bigint);
+
+ static int CountBits(Chunk digit);
+
DISALLOW_IMPLICIT_CONSTRUCTORS(BigintOperations);
};
« no previous file with comments | « platform/globals.h ('k') | vm/bigint_operations.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698