00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00046
00047
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
00093
00094
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