From 8ee8016545be67179cb7c8fb1d12ccb60758aa66 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sat, 27 Oct 2012 16:03:17 -0700 Subject: [PATCH] Fix bug with STAmount::zero(). --- src/Amount.cpp | 1 - src/SerializedTypes.h | 17 +++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index bfcd5e27a..cacfe72a1 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -780,7 +780,6 @@ STAmount operator+(const STAmount& v1, const STAmount& v2) if (v1.mIsNative) return STAmount(v1.getFName(), v1.getSNValue() + v2.getSNValue()); - int ov1 = v1.mOffset, ov2 = v2.mOffset; int64 vv1 = static_cast(v1.mValue), vv2 = static_cast(v2.mValue); if (v1.mIsNegative) vv1 = -vv1; diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index 80f5ca110..f54c377cf 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -200,12 +200,12 @@ class STAmount : public SerializedType // Low 56 bits are value, legal range is 10^15 to (10^16 - 1) inclusive protected: - uint160 mCurrency; - uint160 mIssuer; // Only for access, not compared. + uint160 mCurrency; // Compared by ==. Always update mIsNative. + uint160 mIssuer; // Not compared by ==. 0 for XNS. uint64 mValue; int mOffset; - bool mIsNative; // True for native stamps, ripple stamps are not native. + bool mIsNative; // Always !mCurrency. Native is XNS. bool mIsNegative; void canonicalize(); @@ -282,12 +282,17 @@ public: bool isGEZero() const { return !mIsNegative; } operator bool() const { return !isZero(); } - void negate() { if (!isZero()) mIsNegative = !mIsNegative; } - void zero() { mOffset = mIsNative ? -100 : 0; mValue = 0; mIsNegative = false; } + STAmount* negate() { if (!isZero()) mIsNegative = !mIsNegative; return this; } + STAmount* zero() { mOffset = mIsNative ? 0 : -100; mValue = 0; mIsNegative = false; return this; } + + // Zero while copying currency and issuer. + STAmount* zero(const STAmount& saTmpl) + { mCurrency = saTmpl.mCurrency; mIssuer = saTmpl.mIssuer; mIsNative = saTmpl.mIsNative; return zero(); } + int compare(const STAmount&) const; const uint160& getIssuer() const { return mIssuer; } - void setIssuer(const uint160& uIssuer) { mIssuer = uIssuer; } + STAmount* setIssuer(const uint160& uIssuer) { mIssuer = uIssuer; return this; } const uint160& getCurrency() const { return mCurrency; } bool setValue(const std::string& sAmount);