]> gitweb.factorcode.org Git - factor.git/blob - vm/contexts.hpp
Merge branch 'master' into conditional
[factor.git] / vm / contexts.hpp
1 namespace factor
2 {
3
4 static const cell context_object_count = 10;
5
6 enum context_object {
7         OBJ_NAMESTACK,
8         OBJ_CATCHSTACK,
9 };
10
11 static const cell stack_reserved = 1024;
12
13 struct context {
14
15         // First 4 fields accessed directly by compiler. See basis/vm/vm.factor
16
17         /* Factor callstack pointers */
18         stack_frame *callstack_top;
19         stack_frame *callstack_bottom;
20
21         /* current datastack top pointer */
22         cell datastack;
23
24         /* current retain stack top pointer */
25         cell retainstack;
26
27         /* C callstack pointer */
28         cell callstack_save;
29
30         /* context-specific special objects, accessed by context-object and
31         set-context-object primitives */
32         cell context_objects[context_object_count];
33
34         segment *datastack_seg;
35         segment *retainstack_seg;
36         segment *callstack_seg;
37
38         context(cell datastack_size, cell retainstack_size, cell callstack_size);
39         ~context();
40
41         void reset_datastack();
42         void reset_retainstack();
43         void reset_callstack();
44         void reset_context_objects();
45         void reset();
46         void fix_stacks();
47
48         cell peek()
49         {
50                 return *(cell *)datastack;
51         }
52
53         void replace(cell tagged)
54         {
55                 *(cell *)datastack = tagged;
56         }
57
58         cell pop()
59         {
60                 cell value = peek();
61                 datastack -= sizeof(cell);
62                 return value;
63         }
64
65         void push(cell tagged)
66         {
67                 datastack += sizeof(cell);
68                 replace(tagged);
69         }
70 };
71
72 VM_C_API context *new_context(factor_vm *parent);
73 VM_C_API void begin_callback(factor_vm *parent);
74 VM_C_API void end_callback(factor_vm *parent);
75
76 }