From 98fdeb2d99b58d8df510f337f9dc1e21b549c639 Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 13 Aug 2013 15:28:56 +0800 Subject: fixed bug in PromObj --- types.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'types.cpp') diff --git a/types.cpp b/types.cpp index 6a24239..7eae0f6 100644 --- a/types.cpp +++ b/types.cpp @@ -389,16 +389,24 @@ VectReprCons::VectReprCons(VecObj *_ptr, EvalObj *_ori) : PromObj::PromObj(EvalObj *exp) : EvalObj(CLS_SIM_OBJ | CLS_PROM_OBJ), entry(new Pair(exp, empty_list)), mem(NULL) { + gc.attach(entry); entry->next = NULL; } +PromObj::~PromObj() { + gc.expose(entry); + gc.expose(mem); +} + Pair *PromObj::get_entry() { return entry; } ReprCons *PromObj::get_repr_cons() { return new ReprStr("#"); } EvalObj *PromObj::get_mem() { return mem; } -void PromObj::feed_mem(EvalObj *res) { mem = res; } +void PromObj::feed_mem(EvalObj *res) { + gc.attach(mem = res); +} string double_to_str(double val, bool force_sign = false) { @@ -573,8 +581,10 @@ void CompNumObj::sub(NumObj *_r) { void CompNumObj::mul(NumObj *_r) { CompNumObj *r = static_cast(_r); - A = A * C - B * D; - B = B * C + A * D; + double ra = A * C - B * D; + double rb = B * C + A * D; + A = ra; + B = rb; } void CompNumObj::div(NumObj *_r) { @@ -583,8 +593,10 @@ void CompNumObj::div(NumObj *_r) { if (f == 0) throw NormalError(RUN_ERR_NUMERIC_OVERFLOW); f = 1 / f; - A = (A * C + B * D) * f, - B = (B * C - A * D) * f; + double ra = (A * C + B * D) * f; + double rb = (B * C - A * D) * f; + A = ra; + B = rb; } bool NumObj::lt(NumObj *_r) { -- cgit v1.2.3