summaryrefslogtreecommitdiff
path: root/amount.cc
diff options
context:
space:
mode:
Diffstat (limited to 'amount.cc')
-rw-r--r--amount.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/amount.cc b/amount.cc
index a2735d37..d9171715 100644
--- a/amount.cc
+++ b/amount.cc
@@ -9,6 +9,8 @@
namespace ledger {
+bool do_cleanup = true;
+
#define BIGINT_BULK_ALLOC 0x0001
class amount_t::bigint_t {
@@ -29,10 +31,7 @@ class amount_t::bigint_t {
: prec(other.prec), flags(0), ref(1), index(0) {
mpz_init_set(val, other.val);
}
- ~bigint_t() {
- assert(ref == 0);
- mpz_clear(val);
- }
+ ~bigint_t();
};
unsigned int sizeof_bigint_t() {
@@ -41,10 +40,16 @@ unsigned int sizeof_bigint_t() {
#define MPZ(x) ((x)->val)
-static mpz_t temp;
-static mpz_t divisor;
+static mpz_t temp;
+static mpz_t divisor;
+
static amount_t::bigint_t true_value;
+inline amount_t::bigint_t::~bigint_t() {
+ assert(ref == 0 || (! do_cleanup && this == &true_value));
+ mpz_clear(val);
+}
+
commodity_t::updater_t * commodity_t::updater = NULL;
commodities_map commodity_t::commodities;
commodity_t * commodity_t::null_commodity;
@@ -83,6 +88,9 @@ static struct _init_amounts {
}
~_init_amounts() {
+ if (! do_cleanup)
+ return;
+
mpz_clear(temp);
mpz_clear(divisor);