Add `UNWIND_PROTECT' macro.
authorChris Hanson <org/chris-hanson/cph>
Thu, 23 Jul 1987 21:48:38 +0000 (21:48 +0000)
committerChris Hanson <org/chris-hanson/cph>
Thu, 23 Jul 1987 21:48:38 +0000 (21:48 +0000)
v7/src/microcode/interp.h

index e8562437387b3bb6a69528ee2193f3091cb7bc96..4f9d96c1123b11ebad6469c96330f0ec8af3ec96 100644 (file)
@@ -30,7 +30,7 @@ Technology nor of any adaptation thereof in any advertising,
 promotional, or sales literature without prior written consent from
 MIT in each case. */
 
-/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/interp.h,v 9.23 1987/04/16 02:25:05 jinx Rel $
+/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/interp.h,v 9.24 1987/07/23 21:48:38 cph Exp $
  *
  * Macros used by the interpreter and some utilities.
  *
@@ -405,3 +405,22 @@ MIT in each case. */
   /* Save_Cont(); */                                                   \
   Compiler_New_Subproblem();                                           \
 }
+\f
+#define UNWIND_PROTECT(body_statement, cleanup_statement) do           \
+{                                                                      \
+  jmp_buf UNWIND_PROTECT_new_buf, *UNWIND_PROTECT_old_buf;             \
+  int UNWIND_PROTECT_value;                                            \
+                                                                       \
+  UNWIND_PROTECT_old_buf = Back_To_Eval;                               \
+  Back_To_Eval = ((jmp_buf *) UNWIND_PROTECT_new_buf);                 \
+  UNWIND_PROTECT_value = (setjmp (*Back_To_Eval));                     \
+  if (UNWIND_PROTECT_value != 0)                                       \
+    {                                                                  \
+      Back_To_Eval = UNWIND_PROTECT_old_buf;                           \
+      cleanup_statement;                                               \
+      longjmp ((*Back_To_Eval), UNWIND_PROTECT_value);                 \
+    }                                                                  \
+  body_statement;                                                      \
+  Back_To_Eval = UNWIND_PROTECT_old_buf;                               \
+  cleanup_statement;                                                   \
+} while (0)