From 8b6b9e9ac34e81a4801d4caabfcd0cc9453c6d9c Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa <vsc@dcc.fc.up.pt> Date: Mon, 15 Mar 2010 14:17:30 +0000 Subject: [PATCH] we don't need to wakeup variables that have no attributes, even if they have been bound. --- C/attvar.c | 4 ++++ C/globals.c | 5 +++++ C/utilpreds.c | 20 ++++++-------------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/C/attvar.c b/C/attvar.c index 23fdc83ab..3fefd0597 100644 --- a/C/attvar.c +++ b/C/attvar.c @@ -137,6 +137,10 @@ WakeAttVar(CELL* pt1, CELL reg2) CELL *myH = H; CELL *bind_ptr; + if (IsVarTerm(Deref(attv->Atts))) { + /* no attributes to wake */ + return; + } if (IsVarTerm(reg2)) { if (pt1 == VarOfTerm(reg2)) return; diff --git a/C/globals.c b/C/globals.c index 1bbf726bd..240c9171d 100644 --- a/C/globals.c +++ b/C/globals.c @@ -527,6 +527,8 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop /* restore our nice, friendly, term to its original state */ HB = HB0; clean_dirty_tr(TR0); + /* follow chain of multi-assigned variables */ + close_attvar_chain(dvarsmin, dvarsmax); return 0; overflow: @@ -545,6 +547,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop } #endif reset_trail(TR0); + reset_attvars(dvarsmin, dvarsmax); return -1; heap_overflow: @@ -563,6 +566,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop } #endif reset_trail(TR0); + reset_attvars(dvarsmin, dvarsmax); return -2; trail_overflow: @@ -581,6 +585,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop } #endif reset_trail(TR0); + reset_attvars(dvarsmin, dvarsmax); return -4; } diff --git a/C/utilpreds.c b/C/utilpreds.c index 9cf729b64..ec9439430 100644 --- a/C/utilpreds.c +++ b/C/utilpreds.c @@ -307,20 +307,8 @@ copy_complex_term(CELL *pt0, CELL *pt0_end, int share, int newattvs, CELL *ptf, /* restore our nice, friendly, term to its original state */ clean_dirty_tr(TR0); - /* follow chain of multi-assigned variables */ - if (dvarsmin) { - dvarsmin += 1; - do { - CELL *newv; - Bind(dvarsmin+1, dvarsmin[1]); - if (IsUnboundVar(dvarsmin)) - break; - newv = CellPtr(*dvarsmin); - RESET_VARIABLE(dvarsmin); - dvarsmin = newv; - } while (TRUE); - HB = HB0; - } + close_attvar_chain(dvarsmin, dvarsmax); + HB = HB0; return ground; overflow: @@ -339,6 +327,8 @@ copy_complex_term(CELL *pt0, CELL *pt0_end, int share, int newattvs, CELL *ptf, } #endif reset_trail(TR0); + /* follow chain of multi-assigned variables */ + reset_attvars(dvarsmin, dvarsmax); return -1; trail_overflow: @@ -359,6 +349,7 @@ trail_overflow: { tr_fr_ptr oTR = TR; reset_trail(TR0); + reset_attvars(dvarsmin, dvarsmax); if (!Yap_growtrail((oTR-TR0)*sizeof(tr_fr_ptr *), TRUE)) { return -4; } @@ -381,6 +372,7 @@ trail_overflow: } #endif reset_trail(TR0); + reset_attvars(dvarsmin, dvarsmax); Yap_Error_Size = (ADDR)AuxSp-(ADDR)to_visit0; return -3; }