sw_envs.h

00001 /* File:      sw_envs.h
00002 ** Author(s): Terry Swift, Rui Marques, Kostis Sagonas
00003 ** Contact:   xsb-contact@cs.sunysb.edu
00004 ** 
00005 ** Copyright (C) The Research Foundation of SUNY, 1998
00006 ** 
00007 ** XSB is free software; you can redistribute it and/or modify it under the
00008 ** terms of the GNU Library General Public License as published by the Free
00009 ** Software Foundation; either version 2 of the License, or (at your option)
00010 ** any later version.
00011 ** 
00012 ** XSB is distributed in the hope that it will be useful, but WITHOUT ANY
00013 ** WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00014 ** FOR A PARTICULAR PURPOSE.  See the GNU Library General Public License for
00015 ** more details.
00016 ** 
00017 ** You should have received a copy of the GNU Library General Public License
00018 ** along with XSB; if not, write to the Free Software Foundation,
00019 ** Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00020 **
00021 ** $Id: sw_envs.h,v 1.14 2005/10/03 13:26:43 tswift Exp $
00022 ** 
00023 */
00024 
00025 #ifdef PROFILE
00026 #define PROFILE_SWITCH_ENV num_switch_envs++;
00027 #define PROFILE_SWITCH_ENV_ITER num_switch_envs_iter++;
00028 #else
00029 #define PROFILE_SWITCH_ENV 
00030 #define PROFILE_SWITCH_ENV_ITER
00031 #endif
00032 
00033 #define freeze_and_switch_envs(tbreg, CPsize)   \
00034   if (bfreg > breg) {                           \
00035     CPtr local_top;                             \
00036     bfreg = breg + CPsize;                      \
00037     if (trfreg < trreg)  trfreg = trreg;        \
00038     if (hfreg < hreg)  hfreg = hreg;            \
00039     local_top = top_of_localstk;                \
00040     if (efreg > local_top) efreg = local_top;   \
00041   }                                             \
00042   switch_envs(tbreg)
00043 
00044 /*
00045  * If PRE_IMAGE_TRAIL is never used, the line of untrail2 in the following
00046  * macro should be changed to:
00047  *      untrail((CPtr) trail_variable(start_trreg));
00048  */
00049 #define switch_envs(tbreg) {                                            \
00050   CPtr *start_trreg, *end_trreg, *parent, *tmp;                         \
00051                                                                         \
00052   PROFILE_SWITCH_ENV                                                    \
00053   start_trreg = trreg;                                                  \
00054   end_trreg = trreg = cp_trreg(tbreg);                                  \
00055   parent = trail_parent(end_trreg);                                     \
00056   if (start_trreg != end_trreg) {                                       \
00057     do {                                                                \
00058       while (start_trreg > end_trreg) {                                 \
00059         PROFILE_SWITCH_ENV_ITER                                         \
00060         untrail2(start_trreg, (Cell) trail_variable(start_trreg));      \
00061         start_trreg = trail_parent(start_trreg);                        \
00062       }                                                                 \
00063       while (end_trreg > start_trreg) {                                 \
00064         PROFILE_SWITCH_ENV_ITER                                         \
00065         tmp = parent;                                                   \
00066         parent = trail_parent(parent);                                  \
00067         *tmp = (CPtr) end_trreg;                                        \
00068         end_trreg = tmp;                                                \
00069       }                                                                 \
00070     } while (start_trreg != end_trreg);                                 \
00071     tmp = trail_parent(end_trreg);                                      \
00072     *end_trreg = (CPtr) parent;                                         \
00073     parent = tmp;                                                       \
00074     while (end_trreg < trreg) {                                         \
00075       PROFILE_SWITCH_ENV_ITER                                         \
00076       tmp = parent;                                                     \
00077       cell((CPtr)((Cell)trail_variable(tmp) & ~PRE_IMAGE_MARK)) =       \
00078         (Cell) trail_value(tmp);                                        \
00079       parent = trail_parent(parent);                                    \
00080       *tmp = (CPtr) end_trreg;                                          \
00081       end_trreg = tmp;                                                  \
00082     }                                                                   \
00083   }                                                                     \
00084 }
00085 
00086 #define undo_bindings(TBREG) {                  \
00087    CPtr *old_trreg = cp_trreg(TBREG);           \
00088    table_undo_bindings(old_trreg);              \
00089 }
00090 
00091 /*
00092  * If PRE_IMAGE_TRAIL is never used, the line of untrail2 in the following
00093  * macro should be changed to:
00094  *      untrail((CPtr) trail_variable(trreg));
00095  */
00096 #define table_undo_bindings(old_trreg) {                \
00097   while (trreg > (CPtr *) old_trreg) {                  \
00098     untrail2(trreg, (Cell) trail_variable(trreg));      \
00099     trreg = trail_parent(trreg);                        \
00100   }                                                     \
00101 }
00102 

Generated on Wed Jul 26 13:30:42 2006 for XSB by  doxygen 1.4.5