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;
 }