0.6.7.22: removed CVS dollar-Header-dollar tags from sources
[sbcl.git] / src / runtime / dynbind.c
1 /*
2  * support for dynamic binding from C
3  */
4
5 /*
6  * This software is part of the SBCL system. See the README file for
7  * more information.
8  *
9  * This software is derived from the CMU CL system, which was
10  * written at Carnegie Mellon University and released into the
11  * public domain. The software is in the public domain and is
12  * provided with absolutely no warranty. See the COPYING and CREDITS
13  * files for more information.
14  */
15
16 #include "runtime.h"
17 #include "sbcl.h"
18 #include "globals.h"
19 #include "dynbind.h"
20
21 #if defined(ibmrt) || defined(__i386__)
22 #define GetBSP() ((struct binding *)SymbolValue(BINDING_STACK_POINTER))
23 #define SetBSP(value) SetSymbolValue(BINDING_STACK_POINTER, (lispobj)(value))
24 #else
25 #define GetBSP() ((struct binding *)current_binding_stack_pointer)
26 #define SetBSP(value) (current_binding_stack_pointer=(lispobj *)(value))
27 #endif
28
29 void bind_variable(lispobj symbol, lispobj value)
30 {
31         lispobj old_value;
32         struct binding *binding;
33
34         old_value = SymbolValue(symbol);
35         binding = GetBSP();
36         SetBSP(binding+1);
37
38         binding->value = old_value;
39         binding->symbol = symbol;
40         SetSymbolValue(symbol, value);
41 }
42
43 void unbind(void)
44 {
45         struct binding *binding;
46         lispobj symbol;
47         
48         binding = GetBSP() - 1;
49                 
50         symbol = binding->symbol;
51
52         SetSymbolValue(symbol, binding->value);
53
54         binding->symbol = 0;
55
56         SetBSP(binding);
57 }
58
59 void unbind_to_here(lispobj *bsp)
60 {
61     struct binding *target = (struct binding *)bsp;
62     struct binding *binding = GetBSP();
63     lispobj symbol;
64
65     while (target < binding) {
66         binding--;
67
68         symbol = binding->symbol;
69
70         if (symbol) {
71             SetSymbolValue(symbol, binding->value);
72             binding->symbol = 0;
73         }
74
75     }
76     SetBSP(binding);
77 }